mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-16 07:33:06 +08:00
删除 GPT/Gemini 系列写死的阶梯规则,阶梯一律由目录数据驱动: - 解析层折算 LiteLLM 的 *_above_XXXk_tokens 绝对价字段为阈值+倍率 (阈值取自字段名,倍率 = above/基础价,cache 侧跟随输入倍率, xAI 按 provider 用达到即进高档语义);显式 long_context_* 字段 按"字段存在"优先,显式 threshold=0 或 multiplier=1 可关闭阶梯 - 删除 OpenAI 272K 常量与 applyModelSpecificPricingPolicy 的长上下文 强补分支、fallbackPrices/静态兜底条目的 LongContext 字段、Gemini 旧 边际规则全链路(CalculateCostWithLongContext / RecordUsageWithLongContext / 阶梯表 marginal 基准);保留 fastRatio 与 GPT-5.6 cache_write 1.25x 防御分支、grok 静态兜底阶梯 - 渠道配置定价区间时完全以渠道区间为准,不再叠加目录阶梯 - 长上下文倍率 ≤0 在应用点按 1 计,防止显式字段残缺把分项乘 0 免费 - 目录重载时对比新旧数据,原有阶梯丢失打 WARN 哨兵告警 行为变化:Gemini 由边际 2x(仅 /v1beta、全模型)改为整单换档(数据 驱动、仅带 above_200k 的 pro 系),渠道平价之上叠加目录阶梯;Claude sonnet-4/4.5 随目录数据获得 200K 整单阶梯(与官方定价一致);模型广场 官方参考价列与实付列同源展示目录阶梯。
34 lines
1.4 KiB
Go
34 lines
1.4 KiB
Go
package service
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// openAILadderCatalogJSON 镜像真实同步目录的形态:长上下文用 above_272k 绝对价字段表达,
|
|
// 由解析层折算成阈值+倍率。静态 Go 兜底价不再携带阶梯,阶梯计费一律走目录数据。
|
|
const openAILadderCatalogJSON = `{
|
|
"gpt-5.4": {"litellm_provider": "openai", "mode": "chat",
|
|
"input_cost_per_token": 2.5e-06, "output_cost_per_token": 1.5e-05,
|
|
"cache_read_input_token_cost": 2.5e-07, "cache_creation_input_token_cost": 2.5e-06,
|
|
"input_cost_per_token_above_272k_tokens": 5e-06,
|
|
"output_cost_per_token_above_272k_tokens": 2.25e-05,
|
|
"cache_read_input_token_cost_above_272k_tokens": 5e-07},
|
|
"gpt-5.5-pro": {"litellm_provider": "openai", "mode": "chat",
|
|
"input_cost_per_token": 3e-05, "output_cost_per_token": 1.8e-04,
|
|
"input_cost_per_token_above_272k_tokens": 6e-05,
|
|
"output_cost_per_token_above_272k_tokens": 2.7e-04}
|
|
}`
|
|
|
|
// newStubPricingServiceFromJSON 用与生产一致的解析路径(含 above_XXXk 阶梯折算)
|
|
// 从原始目录 JSON 构造目录 stub。无 build tag:带 unit 标签与默认构建的测试文件都会用到。
|
|
func newStubPricingServiceFromJSON(t *testing.T, body string) *PricingService {
|
|
t.Helper()
|
|
s := &PricingService{}
|
|
data, err := s.parsePricingData([]byte(body))
|
|
require.NoError(t, err)
|
|
s.pricingData = data
|
|
return s
|
|
}
|