[Bug]: Custom `input_cost_per_token_above_ _tokens` tiers are silently dropped unless N is 128k/200k/272k

用户在使用 litellm.register_model 注册自定义模型时,配置了 input_cost_per_token_above_500k_tokens 之类的分层定价键,但在调用 litellm.cost_calculator.cost_per_token 计算成本时,系统并未使用该分层价

[Bug]: Custom `input_cost_per_token_above_ _tokens` tiers are silently dropped unless N is 128k/200k/272k

[Bug]: Custom `input_cost_per_token_above__tokens` tiers are silently dropped unless N is 128k/200k/272k

快速结论:该问题发生在 LiteLLM SDK 的计费模块中,当用户为自定义模型配置非标准的上下文长度分层定价阈值(例如 500k、90k)时,该配置会被静默丢弃,导致计费回退到基础价格。优先排查 get_model_info 函数中的硬编码白名单是否覆盖了你的自定义阈值。

问题场景

用户在使用 litellm.register_model 注册自定义模型时,配置了 input_cost_per_token_above_500k_tokens 之类的分层定价键,但在调用 litellm.cost_calculator.cost_per_token 计算成本时,系统并未使用该分层价格,而是使用了 input_cost_per_token 的基础价格。该问题在 LiteLLM SDK(Python 包)中触发,无需实际模型调用,仅通过成本跟踪 API 即可重现。

报错原文

configured key kept by get_model_info: False
expected per-token cost (500k tier): 9e-06
actual   per-token cost: 1e-06

上述输出表明:get_model_info 未保留自定义的 500k 分层配置,导致实际每 token 成本为基础价格(1e-06),而非配置的分层价格(9e-06)。

原因分析

根本原因在于 litellm/utils.pyget_model_info 函数的实现。该函数在重建 ModelInfo 时,使用了一个固定的白名单逐字段复制键。对于输入 token 的分层计费,它仅复制以下键:

  • input_cost_per_token_above_128k_tokens
  • input_cost_per_token_above_200k_tokens
  • input_cost_per_token_above_272k_tokens

(输出 token 的分层计费也有类似的固定白名单)。任何不在这个白名单中的阈值(例如 input_cost_per_token_above_500k_tokens)都不会被复制到 ModelInfo 中,导致下游解析器 _get_token_base_cost(位于 litellm/litellm_core_utils/llm_cost_calc/utils.py)即使支持任意阈值,也永远无法接收到这些自定义配置。因此配置被静默丢弃,计费回退到基础价格。

环境排查

  • LiteLLM 版本:1.89.0 rc2(影响范围可能包括该版本前后的所有版本)
  • 检查 litellm/utils.pyget_model_info 函数的版本,确认白名单是否包含自定义阈值。
  • 确认 litellm.types.utils.ModelInfo 是否包含你配置的分层计费键。

解决步骤

  1. 检查你的自定义模型配置:确认你配置的 input_cost_per_token_above__tokens 键中的 N 是否为 128、200、272 或 512(这些是硬编码支持的阈值)。如果不是,你的配置将被静默丢弃。
  2. 临时解决方案:将你的自定义阈值映射到可用的硬编码阈值之一。例如,如果你需要 500k 阈值,目前无法直接使用;建议将模型配置的上下文大小调整为 512k 并改用 input_cost_per_token_above_512k_tokens(注意:512k 也是硬编码支持的阈值之一,根据 Issue 中的描述)。
  3. 最佳解决方案:等待 LiteLLM 官方修复此问题。修复方案已在 Issue 中讨论:修改 get_model_info 函数,使其不再使用固定的硬编码白名单,而是转发模型配置中所有以 input_cost_per_token_above_ 开头的键到下游解析器。你可以关注 Issue #30344 或相关的 PR 更新。
  4. 自行修补(仅限熟悉代码库的高级用户):编辑 litellm/utils.pyget_model_info 函数的相关部分(约第 5908-5916 行和 5960-5971 行),去除硬编码白名单,改为动态复制所有以 input_cost_per_token_above_ 开头的键。注意:这需要您熟练操作且自行承担风险。

验证方法

使用 Issue 中提供的 repro.py 脚本运行测试。确认输出显示:

  • configured key kept by get_model_info: True
  • actual per-token cost 等于你配置的分层价格,而非基础价格。

你也可以直接打印 get_model_info 返回的字典,确认自定义阈值键存在于结果中且值非 None

参考来源

BerriAI/litellm #30344

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 9748

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注