Skip to content

refactor(billing): 长上下文阶梯计价改为价格目录数据驱动 - #6353

Open
feeeei wants to merge 1 commit into
Wei-Shaw:mainfrom
feeeei:main
Open

refactor(billing): 长上下文阶梯计价改为价格目录数据驱动#6353
feeeei wants to merge 1 commit into
Wei-Shaw:mainfrom
feeeei:main

Conversation

@feeeei

@feeeei feeeei commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

⚠️ 合并依赖

请先合并 Wei-Shaw/model-price-repo#19 再合并本 PR。

本 PR 删除了代码侧的全部长上下文阶梯兜底,阶梯完全依赖价格目录数据(*_above_XXXk_tokens 字段)。#19 是配套的目录数据修正;若本 PR先合并,依赖那批修正条目的部署会在间隙期按基础价计费(少收)。

之前错了什么

1. 阶梯规则写死在代码里,与数据源长期脱节

  • 目录数据(LiteLLM → model-price-repo)自 v0.1.133 起就携带标准input/output_cost_per_token_above_272k_tokens 等绝对价字段,但代码从未解析过它们(全仓 rg above_272k 零命中)
  • 代码实际依赖的是 v0.1.92 与硬编码同 commit 引入的自定义 long_context_input_token_threshold / *_cost_multiplier 三字段——这套约定在远程目录数据里出现 0 次,唯一载体是 resources fallback 文件里 gpt-5.6 三个条目(运行时被同步数据遮蔽,等于死配置)
  • 结果是每适配一个新模型都要改一次代码(gpt-5.4 → 5.5 → 5.5-pro → 5.6 系共四次扩展),且 applyModelSpecificPricingPolicy 对 GPT 系强补 272K,目录数据无法关闭它

2. Gemini 旧规则与 Google 官方定价存在三处偏差

  • 边际计价(仅超出部分 ×2)≠ 官方整单换档
  • 只对 input/cache_read 加倍,漏了官方的 output ×1.5 档
  • 规则套在全部 gemini 模型上(Flash 系被误加价),且仅 /v1beta 入口生效

3. Grok 阶梯从未生效:目录条目(无阶梯字段)优先遮蔽了带阶梯的 Go 兜底价卡——数据侧已在 #19 修复,本 PR 合并后自然生效,无需再改代码。

改成了什么

  • 解析层通用折算deriveLongContextFromAboveTierFields 把目录的 above_XXXk 绝对价折算成阈值+倍率——阈值取自字段名,倍率 = above 价 ÷ 基础价,cache 侧跟随输入倍率;_flex/_priority 变体与 above_1hr(缓存时长)不参与。语义与 LiteLLM 官方 cost calculator 同构:整单换档、严格 >、唯 xAI 用
  • 显式 long_context_* 字段按"字段存在"优先:写 threshold: 0multiplier: 1 即可在数据层显式关闭某模型的阶梯
  • 删除全部模型专属硬编码:272K 常量、policy 强补分支、usesOpenAILegacyLongContextPricing、六个 fallback 价卡的 LongContext 字段、Gemini 旧边际链路(CalculateCostWithLongContext / RecordUsageWithLongContext / 阶梯表 marginal 基准)。保留 fastRatio 与 GPT-5.6 cache_write 1.25x 两个分支——它们防御的目录数据缺陷(LiteLLM 把 5.5 priority 错标 2x、5.6 缺 cache_write 价)至今存在
  • 两道防御:长上下文倍率 ≤0 在应用点按 1 计(防显式字段残缺把分项乘 0 免费);目录重载时对比新旧数据,原有阶梯丢失即打 WARN 哨兵(数据驱动后字段误删的 fail 方向是静默少收)
  • 渠道配置了定价区间时仍完全以渠道区间为准,不叠加目录阶梯

净效果 17 files,+594/−627。

影响了什么

范围 变化
OpenAI GPT 系 计费数值不变(目录字段与原硬编码等值),控制权移交数据层
Gemini pro 系 >200K 边际 → 整单换档、output 补上 ×1.5 档、由 /v1beta 扩展到所有 token 计费入口——三处均对齐 Google 官方口径;阈值处账单存在跳变,用户可感知
Gemini Flash 系 不再被误加价
Claude sonnet-4 / 4.5 目录带 above_200k → 获得 200K 整单阶梯(与 Anthropic 官方 1M 长上下文定价一致),仍受分组长上下文开关约束
渠道平价(未配区间) 之上叠加目录阶梯,与 OpenAI/分组价卡既有语义对齐(此前 gemini 渠道价会豁免旧规则)
模型广场 官方参考价列与实付列同源展示目录阶梯(gemini 官方列此前无阶梯展示);marginal 计价基准不再产生,前端枚举保留兼容

测试

  • make test-unit 54 个包全绿
  • 阶梯场景表改用真实解析路径(含 above 折算)构造目录 stub,探针对账测试覆盖每个档界 ±1 与随机点
  • 新增:above 折算派生(多阈值/变体排除/无附加费/显式优先)、显式字段残缺的乘 0 保护、渠道区间优先于目录阶梯、Claude sonnet 阶梯行为声明、xAI ≥ 语义

删除 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 整单阶梯(与官方定价一致);模型广场
官方参考价列与实付列同源展示目录阶梯。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant