From 0fbc9a44d3cec5f9d0634d9a272844f37f6c48fc Mon Sep 17 00:00:00 2001 From: erio Date: Mon, 30 Mar 2026 23:04:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(billing):=20=E6=8C=89=E6=AC=A1=E8=AE=A1?= =?UTF-8?q?=E8=B4=B9=E5=9B=9E=E9=80=80=E5=88=B0=E9=BB=98=E8=AE=A4=20PerReq?= =?UTF-8?q?uestPrice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ResolvedPricing 新增 DefaultPerRequestPrice,当无层级匹配时使用渠道的默认按次价格 --- backend/internal/service/billing_service.go | 5 +++++ backend/internal/service/model_pricing_resolver.go | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/backend/internal/service/billing_service.go b/backend/internal/service/billing_service.go index d256102c..458788fd 100644 --- a/backend/internal/service/billing_service.go +++ b/backend/internal/service/billing_service.go @@ -542,6 +542,11 @@ func (s *BillingService) calculatePerRequestCost(resolved *ResolvedPricing, inpu unitPrice = input.Resolver.GetRequestTierPriceByContext(resolved, totalContext) } + // 回退到默认按次价格 + if unitPrice == 0 { + unitPrice = resolved.DefaultPerRequestPrice + } + totalCost := unitPrice * float64(count) actualCost := totalCost * input.RateMultiplier diff --git a/backend/internal/service/model_pricing_resolver.go b/backend/internal/service/model_pricing_resolver.go index 67f2684c..55387809 100644 --- a/backend/internal/service/model_pricing_resolver.go +++ b/backend/internal/service/model_pricing_resolver.go @@ -19,6 +19,9 @@ type ResolvedPricing struct { // 按次/图片模式:分层定价 RequestTiers []PricingInterval + // 按次/图片模式:默认价格(未命中层级时使用) + DefaultPerRequestPrice float64 + // 来源标识 Source string // "channel", "litellm", "fallback" @@ -136,6 +139,9 @@ func (r *ModelPricingResolver) applyTokenOverrides(chPricing *ChannelModelPricin // applyRequestTierOverrides 应用按次/图片模式的渠道覆盖 func (r *ModelPricingResolver) applyRequestTierOverrides(chPricing *ChannelModelPricing, resolved *ResolvedPricing) { resolved.RequestTiers = chPricing.Intervals + if chPricing.PerRequestPrice != nil { + resolved.DefaultPerRequestPrice = *chPricing.PerRequestPrice + } } // GetIntervalPricing 根据 context token 数获取区间定价。