快速结论:当 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 级别日志可能才可见)。
解决步骤
- 先按原样复现问题:向该部署发一次请求,确认响应为 200 且 token 计数正常,同时 spend 行为 0、
response_cost为 null。 - 在
model_info中增加pricing_provider,填入定价行实际所属的 provider(示例中为tencent),使费用查询走正确的价格表,而不是被custom_llm_provider: anthropic带偏。 - 使用支持该字段的 LiteLLM 版本(讨论中称随下一个稳定版发布);若当前版本无法识别,可优先尝试升级到已包含该字段的版本。
- 升级或修改配置后重启 LiteLLM Proxy,重新发送一次真实请求。
- 如暂不能使用
pricing_provider,可关注讨论中的另一个修复方向:在 provider 不匹配抛出ModelNotMappedError时回退到裸模型名查找。该方向在讨论中仅被确认为“正确的第一步修复”,尚未验证为可用方案。 - 不要依赖
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', ...) 与写入结果做交叉核对。
参考来源
LiteLLM 文档:当路由 provider 与定价 provider 不同时设置 pricing_provider
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: Proxy exits at startup when TZ is Asia/Calcutta on a pip install, tzdata isn't installed](https://www.chat-gpts.plus/wp-content/uploads/2026/11/49813-c5b26def-768x403.jpg)
![[Bug]: Admin UI header search bar renders overlapping text and icons](https://www.chat-gpts.plus/wp-content/uploads/2026/11/51177-3fc387b5-768x403.jpg)
