fix: 管理员自定义价格的任务模型自动按次计费,不再乘 OtherRatios

当管理员为任务模型(如 sora_video2)设置了固定价格时,
之前会错误地将价格乘以 seconds/size 等 OtherRatios,
导致设置 $2/次 实际收费 $8($2 × 4秒)。

新增 IsTaskPerCallBilling() 判断逻辑:
- 模型在 TASK_PRICE_PATCH 环境变量中 → 按次(兼容旧逻辑)
- 模型有管理员配置的价格且不在默认价格表中 → 自动按次
默认价格表中的模型(如 sora-2: $0.3)仍按原逻辑乘 OtherRatios。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-24 17:01:12 +08:00
parent 9ae9040b3c
commit c41ca95a43
4 changed files with 24 additions and 5 deletions

View File

@@ -22,6 +22,7 @@ import (
"github.com/QuantumNous/new-api/service"
"github.com/QuantumNous/new-api/setting"
"github.com/QuantumNous/new-api/setting/operation_setting"
"github.com/QuantumNous/new-api/setting/ratio_setting"
"github.com/QuantumNous/new-api/types"
"github.com/bytedance/gopkg/util/gopool"
@@ -581,7 +582,7 @@ func RelayTask(c *gin.Context) {
ModelRatio: relayInfo.PriceData.ModelRatio,
OtherRatios: relayInfo.PriceData.OtherRatios,
OriginModelName: relayInfo.OriginModelName,
PerCallBilling: common.StringsContains(constant.TaskPricePatches, relayInfo.OriginModelName),
PerCallBilling: ratio_setting.IsTaskPerCallBilling(relayInfo.OriginModelName),
}
task.Quota = result.Quota
task.Data = result.TaskData