From db939deb79ae10f8219ad58161d14bf95a6b83cd Mon Sep 17 00:00:00 2001 From: fengsilin Date: Tue, 24 Mar 2026 11:27:38 +0800 Subject: [PATCH] feat: integrate channel pricing into ModelPriceHelper Integrate channel-specific pricing into the billing logic. - First tries to get channel pricing using model.GetEffectivePricing - If found, uses channel pricing (modelRatio, completionRatio, modelPrice, usePrice) - If not found, falls back to global pricing from ratio_setting Co-Authored-By: Claude Opus 4.6 --- relay/helper/price.go | 51 +++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/relay/helper/price.go b/relay/helper/price.go index 1cb0416..2734584 100644 --- a/relay/helper/price.go +++ b/relay/helper/price.go @@ -5,6 +5,7 @@ import ( "github.com/QuantumNous/new-api/common" "github.com/QuantumNous/new-api/logger" + "github.com/QuantumNous/new-api/model" relaycommon "github.com/QuantumNous/new-api/relay/common" "github.com/QuantumNous/new-api/setting/operation_setting" "github.com/QuantumNous/new-api/setting/ratio_setting" @@ -46,13 +47,32 @@ func HandleGroupRatio(ctx *gin.Context, relayInfo *relaycommon.RelayInfo) types. } func ModelPriceHelper(c *gin.Context, info *relaycommon.RelayInfo, promptTokens int, meta *types.TokenCountMeta) (types.PriceData, error) { - modelPrice, usePrice := ratio_setting.GetModelPrice(info.OriginModelName, false) + var modelPrice float64 + var usePrice bool + var modelRatio float64 + var completionRatio float64 + var channelPricingFound bool + + // 尝试获取渠道定价(优先于全局定价) + if info.ChannelMeta != nil && info.ChannelId > 0 { + cpRatio, cpCompletionRatio, cpPrice, cpUsePrice, found := model.GetEffectivePricing(info.OriginModelName, info.ChannelId) + if found { + modelRatio = cpRatio + completionRatio = cpCompletionRatio + modelPrice = cpPrice + usePrice = cpUsePrice + channelPricingFound = true + } + } + + // 如果没有渠道定价,使用全局定价 + if !channelPricingFound { + modelPrice, usePrice = ratio_setting.GetModelPrice(info.OriginModelName, false) + } groupRatioInfo := HandleGroupRatio(c, info) var preConsumedQuota int - var modelRatio float64 - var completionRatio float64 var cacheRatio float64 var imageRatio float64 var cacheCreationRatio float64 @@ -66,19 +86,22 @@ func ModelPriceHelper(c *gin.Context, info *relaycommon.RelayInfo, promptTokens if meta.MaxTokens != 0 { preConsumedTokens += meta.MaxTokens } - var success bool - var matchName string - modelRatio, success, matchName = ratio_setting.GetModelRatio(info.OriginModelName) - if !success { - acceptUnsetRatio := false - if info.UserSetting.AcceptUnsetRatioModel { - acceptUnsetRatio = true - } - if !acceptUnsetRatio { - return types.PriceData{}, fmt.Errorf("模型 %s 倍率或价格未配置,请联系管理员设置或开始自用模式;Model %s ratio or price not set, please set or start self-use mode", matchName, matchName) + // 如果没有找到渠道定价,需要获取全局 modelRatio 和 completionRatio + if !channelPricingFound { + var success bool + var matchName string + modelRatio, success, matchName = ratio_setting.GetModelRatio(info.OriginModelName) + if !success { + acceptUnsetRatio := false + if info.UserSetting.AcceptUnsetRatioModel { + acceptUnsetRatio = true + } + if !acceptUnsetRatio { + return types.PriceData{}, fmt.Errorf("模型 %s 倍率或价格未配置,请联系管理员设置或开始自用模式;Model %s ratio or price not set, please set or start self-use mode", matchName, matchName) + } } + completionRatio = ratio_setting.GetCompletionRatio(info.OriginModelName) } - completionRatio = ratio_setting.GetCompletionRatio(info.OriginModelName) cacheRatio, _ = ratio_setting.GetCacheRatio(info.OriginModelName) cacheCreationRatio, _ = ratio_setting.GetCreateCacheRatio(info.OriginModelName) cacheCreationRatio5m = cacheCreationRatio