From 4033a2ba698923568597918e8129c7afc79cabd8 Mon Sep 17 00:00:00 2001 From: WangLiZhao <1838393649@qq.com> Date: Mon, 6 Jul 2026 16:31:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(billing):=20=E6=B7=BB=E5=8A=A0TTS=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E8=AE=A1=E8=B4=B9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/util/billing.go | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/common/util/billing.go b/common/util/billing.go index 1e8eb71..c3a09ca 100644 --- a/common/util/billing.go +++ b/common/util/billing.go @@ -22,6 +22,8 @@ func CalculateBilling(config map[string]any, billingData map[string]any) map[str return calculateInferenceTierBilling(config, billingData) case "video_resolution": //视频模型计费 return calculateVideoResolutionBilling(config, billingData) + case "tts": + return calculateTTSBilling(config, billingData) } return nil } @@ -116,6 +118,40 @@ func calculateVideoResolutionBilling(config map[string]any, data map[string]any) } } +func calculateTTSBilling(config map[string]any, data map[string]any) map[string]any { + unit, _ := config["unit"].(string) + usage := gconv.Float64(data["usage"]) + + tiers := config["pricing"].(map[string]any)["tiers"].([]any) + var matched map[string]any + for _, t := range tiers { + tier := t.(map[string]any) + if usage >= gconv.Float64(tier["min"]) && usage <= gconv.Float64(tier["max"]) { + matched = tier + break + } + } + if matched == nil { + return nil + } + + unitPrice := gconv.Float64(matched["unit_price"]) + totalFee := usage * unitPrice + + return map[string]any{ + "model_name": data["model_name"], + "total_tokens": int64(usage), + "total_fee": totalFee, + // 明细 + "prompt_tokens": 0, + "completion_tokens": int64(usage), + "usage": usage, + "unit": unit, + "unit_price": unitPrice, + "tier": fmt.Sprintf("[%v, %v]", matched["min"], matched["max"]), + } +} + // ======================== 数据提取 ======================== func ExtractRequestBilling(ctx context.Context, config map[string]any, requestPayload map[string]any) map[string]any {