settleTaskBillingOnComplete 任务完成时的统一计费调整。 优先级:1. adaptor.AdjustBillingOnComplete 返回正数 → 使用 adaptor 计算的额度 2. taskResult.TotalTokens > 0 → 按 token 重算 3. 都不满足 → 保持预扣额度不变
(ctx context.Context, adaptor TaskPollingAdaptor, task *model.Task, taskResult *relaycommon.TaskInfo)
| 631 | // 2. taskResult.TotalTokens > 0 → 按 token 重算 |
| 632 | // 3. 都不满足 → 保持预扣额度不变 |
| 633 | func settleTaskBillingOnComplete(ctx context.Context, adaptor TaskPollingAdaptor, task *model.Task, taskResult *relaycommon.TaskInfo) { |
| 634 | // 0. 按次计费的任务不做差额结算 |
| 635 | if bc := task.PrivateData.BillingContext; bc != nil && bc.PerCallBilling { |
| 636 | logger.LogInfo(ctx, fmt.Sprintf("任务 %s 按次计费,跳过差额结算", task.TaskID)) |
| 637 | return |
| 638 | } |
| 639 | // 1. 优先让 adaptor 决定最终额度 |
| 640 | if actualQuota := adaptor.AdjustBillingOnComplete(task, taskResult); actualQuota > 0 { |
| 641 | RecalculateTaskQuota(ctx, task, actualQuota, "adaptor计费调整") |
| 642 | return |
| 643 | } |
| 644 | // 2. 回退到 token 重算 |
| 645 | if taskResult.TotalTokens > 0 { |
| 646 | RecalculateTaskQuotaByTokens(ctx, task, taskResult.TotalTokens) |
| 647 | return |
| 648 | } |
| 649 | // 3. 无调整,保持预扣额度 |
| 650 | } |