事故报告:主分支上的无效模型成本映射
日期:2026年1月27日 持续时间:~20分钟 严重程度:低 状态:已解决
摘要
一个格式错误的JSON条目被合并到main分支 (562f0a0) 。这导致LiteLLM无声地回退到模型成本映射的陈旧本地副本。使用旧版本软件包的用户仅丢失了对新模型的成本跟踪(例如 azure/gpt-5.2)。没有LLM调用被阻止。
- LLM调用和代理路由:无影响。
- 成本跟踪:对本地备份中不存在的新模型有影响。旧模型不受影响。事件持续了约20分钟,直到提交被回滚。
背景
模型成本映射(model cost map)不在请求路径中。它是在 LLM 响应返回后,在 try/catch 块内部用于计算费用的。条目缺失绝不会阻塞调用。
两条路径都会向调用方返回响应。当成本映射查找失败时,唯一的区别是该请求的 cost=0。
根本原因
LiteLLM 在导入时会从 GitHub main 分支获取模型成本映射。如果获取失败,它会回退到包中自带的本地备份。在此次事故之前,该回退过程是完全静默的——没有任何警告日志。
一位贡献者的 PR 引入了一个多余的 { 括号,导致 JSON 无效。远程获取因 JSONDecodeError 而失败,触发了静默回退。使用旧版本软件包的用户因为备份文件中缺少较新的模型,从而受到影响。
时间轴
- 格式错误的 JSON 被合并到
main分支 - LiteLLM 安装在下一次导入时回退到本地备份
- 用户报告较新模型出现
"This model isn't mapped yet"(该模型尚未映射)错误 - 识别并回滚错误提交(耗时约 20 分钟)
补救措施
| # | 操作 | 状态 | 代码 |
|---|---|---|---|
| 1 | 对 model_prices_and_context_window.json 进行 CI 验证 | ✅ 已完成 | test-model-map.yaml |
| 2 | 回退到本地备份时记录警告日志 | ✅ 已完成 | get_model_cost_map.py#L57-L68 |
| 3 | 带有完整性验证辅助功能的 GetModelCostMap 类 | ✅ 已完成 | get_model_cost_map.py#L24-L149 |
| 4 | 韧性测试套件(错误的托管映射、回退、补全) | ✅ 已完成 | test_model_cost_map_resilience.py#L150-L291 |
| 5 | 测试备份模型成本映射始终存在且包含常用模型 | ✅ 已完成 | test_model_cost_map_resilience.py#L213-L228 |
要求在导入时零外部依赖的企业可以设置 LITELLM_LOCAL_MODEL_COST_MAP=True,以完全跳过 GitHub 获取操作。
对外部资源的其他依赖
| 依赖项 | 不可用时的影响 | 回退方案 |
|---|---|---|
| 模型成本映射 (GitHub) | 较新模型的成本跟踪 | 本地备份(现已包含警告) |
| JWT 公钥 (IDP/SSO) | 身份验证失败 | 无 |
| OIDC UserInfo (IDP/SSO) | 身份验证失败 | 无 |
| HuggingFace 模型 API | HF 提供程序调用失败 | 无 |
| Ollama 标签 (localhost) | Ollama 模型列表过期 | 静态列表 |
