[Bug]: response_cost is null and spend stays $0 when custom_llm_provider=anthropic and the priced row lives under a different provider

当 LiteLLM 部署的 custom_llm_provider=anthropic ,但该模型的定价行在 model_prices_and_context_window.json 里归属于另一个 provider 时,费用查询会命中 ModelNotMappedError 并被静默吞掉,导致 [

快速结论:当 LiteLLM 部署的 custom_llm_provider=anthropic,但该模型的定价行在 model_prices_and_context_window.json 里归属于另一个 provider 时,费用查询会命中 ModelNotMappedError 并被静默吞掉,导致 [Bug]: response_cost is null and spend stays $0 when custom_llm_provider=anthropic and the priced row lives under a different provider 这类现象。优先检查定价行所属 provider 与部署 provider 是否一致。

适用环境:Issue 中已确认 LiteLLM litellm==1.106.1(容器内复现),并在 current main (3bb35f0) 上复现根因;其余操作系统、Python、CUDA、显卡信息未在讨论中给出。

最快修复方案:在 model_info 中增加可配置的 pricing_provider 字段,指向定价行实际所属的 provider;讨论中已确认该字段在 current main 上可干净地解决此问题,并将随下一个稳定版发布。

注意事项:pricing_provider 需要版本支持(讨论中称“随下一个稳定版发布”),旧版本可能不认识该字段;在未升级前,把 model_info.base_model 当作绕过手段并不可靠,Issue 已确认它仍会失败。修改后要按“验证方法”确认实际写入的 response_cost 和 spend,而不是只看请求是否成功。

问题场景

在 LiteLLM Proxy 中通过 POST /model/new 注册一个 chat 部署:实际上游是 Anthropic 兼容接口(例如 custom_llm_provider: anthropic),但底层模型(如 tencent/deepseek-v4.1-flash)的定价行在成本表中归属于另一个 provider。请求本身返回 200 并带有真实 token 用量,但每次请求写入的 spend 行都是 spend: 0.0、response_cost: null、cost_breakdown: null,响应头 x-litellm-key-spend 也显示 0.0,预算与仪表盘读数随之静默失真。

报错原文

ModelNotMappedError: This model isn't mapped yet.
  model=deepseek/deepseek-v4.1-flash-1017, custom_llm_provider=anthropic

该异常在日志路径中被吞掉,因此业务请求不会报错,只会表现为:

response_cost:    null
spend:            0.0
cost_breakdown:   null
x-litellm-key-spend: 0.0

对比同一模型按正确 provider 查询时是有价格的:

>>> cost_per_token(model='tencent/deepseek-v4.1-flash',
...                custom_llm_provider='tencent',
...                prompt_tokens=52656, completion_tokens=221)
(0.007898, 0.000133)        # total 0.008031 — silently lost

原因分析

费用查询会用 (model, custom_llm_provider) 组合构造查找键,而 custom_llm_provider 会覆盖 base_model 本身隐含的 provider。成本表里在 anthropic 名下没有这个 DeepSeek 模型的定价行,于是查找抛出 ModelNotMappedError;日志路径吞掉异常,把 response_cost 置为 None,最终 spend 记为 0.0。讨论中还确认:get_model_info('tencent/deepseek-v4.1-flash') 本身能解析出价格,问题仅在于 provider 不匹配的查找没有回退到裸模型名。

环境排查

  • 确认 LiteLLM 版本:Issue 在 litellm==1.106.1 复现,根因在 current main (3bb35f0) 上复现;检查所用版本是否已包含 pricing_provider 支持。
  • 确认部署配置中 litellm_params.custom_llm_provider 的取值。
  • 确认 model_info.base_model 指向的模型,并核对其在 model_prices_and_context_window.json 中登记的 provider 名称。
  • 确认 model_info 中 input_cost_per_token / output_cost_per_token 是否已设置(Issue 中已设置,但仍不影响 provider 不匹配导致的查找失败)。
  • 查看服务日志中是否有被吞掉的 ModelNotMappedError(debug 级别日志可能才可见)。

解决步骤

  1. 先按原样复现问题:向该部署发一次请求,确认响应为 200 且 token 计数正常,同时 spend 行为 0、response_cost 为 null。
  2. 在 model_info 中增加 pricing_provider,填入定价行实际所属的 provider(示例中为 tencent),使费用查询走正确的价格表,而不是被 custom_llm_provider: anthropic 带偏。
  3. 使用支持该字段的 LiteLLM 版本(讨论中称随下一个稳定版发布);若当前版本无法识别,可优先尝试升级到已包含该字段的版本。
  4. 升级或修改配置后重启 LiteLLM Proxy,重新发送一次真实请求。
  5. 如暂不能使用 pricing_provider,可关注讨论中的另一个修复方向:在 provider 不匹配抛出 ModelNotMappedError 时回退到裸模型名查找。该方向在讨论中仅被确认为“正确的第一步修复”,尚未验证为可用方案。
  6. 不要依赖 model_info.base_model 单独解决此问题:Issue 已确认它会被正确转发但依然失败,因为查找时仍会重新应用 custom_llm_provider。

验证方法

重新发起一次请求后,检查 spend 行中 response_cost 不再是 null、spend 不再为 0.0,且数值与按正确 provider 计算的预期价格一致(Issue 中的对照预期为 prompt 0.007898、completion 0.000133,合计 0.008031);同时确认响应头 x-litellm-key-spend 已随实际费用更新,仪表盘与预算读数不再显示 $0。也可用 cost_per_token(model='tencent/deepseek-v4.1-flash', custom_llm_provider='tencent', ...) 与写入结果做交叉核对。

参考来源

BerriAI/litellm #47675

LiteLLM 文档:当路由 provider 与定价 provider 不同时设置 pricing_provider

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 34280

发表回复

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