[Feature]: publish a signature for the remote model cost map so installs can verify what they fetched

该 Issue 是一个功能请求(Feature Request),而非缺陷报错。请求方希望 LiteLLM 为远程拉取的 model_prices_and_context_window.json 发布签名,以便安装方验证数据真实性。最终该请求被发起者主动关闭,因为深入调查后发现该请求针对的层级有误—

快速结论:该 Issue 是一个功能请求(Feature Request),而非缺陷报错。请求方希望 LiteLLM 为远程拉取的 model_prices_and_context_window.json 发布签名,以便安装方验证数据真实性。最终该请求被发起者主动关闭,因为深入调查后发现该请求针对的层级有误——当前 TLS 传输保护 + 发布节奏已满足需求,且签名无法覆盖最核心的供应链威胁。

适用环境:LiteLLM Python SDK(v1.93.0 至 v1.100.0 区间);导入 litellm 时默认通过 raw.githubusercontent.com 拉取远程价格表,未设置任何 LITELLM_* 环境变量。

最快修复方案:暂无确认的一步修复方案。该 Issue 已被作者关闭,未产生代码变更。若想减少对远程数据的无验证依赖,建议升级 LiteLLM 到最新版本,并在自己的部署侧跟进版本,而不是固定旧版本。

注意事项:Issue 作者明确指出了两个潜在改进点(发布时重新生成内置 JSON、将远程拉取改为可选),但均未落地,且作者明确表示不会开启替代 Issue。若你遇到相关问题,需自行评估是否要采纳这些建议。

问题场景

用户在 Python 环境中导入 litellm 包(例如 pip install litellm==1.93.0 后启动服务或执行 python -c "import litellm")。在导入过程中,LiteLLM 默认从 GitHub 原始链接拉取 model_prices_and_context_window.jsonmain 分支最新内容,并将这份远端数据用于价格、上下文窗口及能力标志的计算。

Issue 发起者发现一个安全盲区:LiteLLM 只发布了数据文件本身,而没有在数据文件旁边发布对应的数字签名(如 .sig.asc.sha256)——虽然有校验手段可以拦截截断/缩水的文件,但无法拦截一个被篡改(但内容完整)的文件。因此,生产环境中的运维人员无法确认自己的安装实际使用的数据是否确实是 BerriAI 官方发布的数据。

报错原文

[Feature]: publish a signature for the remote model cost map so installs can verify what they fetched

$ B=https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json
$ for ext in .sig .asc .sha256 .sig.json .intoto.jsonl; do
    printf "%-14s -> %s\n" "$ext" "$(curl -s -o /dev/null -w '%{http_code}' "$B$ext")"; done
.sig           -> 404
.asc           -> 404
.sha256        -> 404
...

原因分析

这是一个功能请求,不是运行时错误。可能原因:发起方在生产环境运行 LiteLLM 时,希望确认模型元数据(价格、上下文窗口、能力标志)是官方发布的内容,而不是被篡改过的数据。由于 LiteLLM 在每次导入时都会从 main 分支拉取最新 JSON(3817 个模型),而本地内置的备份 JSON 相对滞后(v1.93.0 固定为 2953 个模型),远程数据成为大部分安装实际使用的权威数据源,却没有任何校验其发布者身份的机制。

环境排查

  • Python / LiteLLM 版本:问题验证环境为 litellm==1.93.0,同批分析中也提到了 v1.100.0(内置 3408 个模型 vs 远端 3817 个)。
  • 环境变量:默认状态(未设置任何 LITELLM_* 环境变量)下,远程拉取生效。设置 LITELLM_LOCAL_MODEL_COST_MAP=True 会切换为使用本地内置 JSON。
  • 网络链路:远端地址为 https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json,依赖 TLS 传输保护。
  • 发布节奏:需要注意 LiteLLM 在 26 天内发布了 30 个版本——新版发布非常频繁,远端数据始终保持接近实时更新。

解决步骤

  1. 确认这是功能请求,不是 Bug:如果当前 LiteLLM 能正常导入并打印模型数量,代表功能未受损——不存在”修复”需求。
  2. 核对本地与远端模型数量差异:可优先尝试使用以下命令验证当前部署实际使用的是远端数据还是本地缓存:
    python -c "import litellm; print(len(litellm.model_cost))"
    LITELLM_LOCAL_MODEL_COST_MAP=True python -c "import litellm; print(len(litellm.model_cost))"

    数量差异即为远程拉取带来的”新鲜度增量”。

  3. 若在意供应链安全:可优先尝试保持 LiteLLM 版本为最新(例如 v1.100.0 以上),以缩小本地与远端数据间的滞后差距,降低对远程数据的依赖程度。
  4. 若需要完全确定性的环境:可优先尝试设置 LITELLM_LOCAL_MODEL_COST_MAP=True,并接受”新模型支持延迟”的代价。Issue 作者明确指出,在其验证的 v1.93.0 中,该方式会使模型数从 3817 降到 2953,即丢失约 400 个新模型的元数据。
  5. 等待官方进一步动作:Issue 作者已自行关闭请求,并承诺若后续仍有必要,会带上测量数据重新提出建议,而不是仅凭推测发言。

验证方法

该场景下并不存在需要修复的”故障”,因此验证目标变成:确认当前 LiteLLM 在导入时确实使用远程数据,且能正常完成导入。可以用以下方式确认:

$ curl -sI https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json | head -1
HTTP/2 200

$ python -c "import litellm; print(len(litellm.model_cost))"

如果期望切换到完全确定性模式,可设置 LITELLM_LOCAL_MODEL_COST_MAP=True 后再次打印模型数,确认数量减少且在可接受范围内。若上游 issue #36422(涉及 litellm/fallback_generalizations.json 的相同模式)落地,可再关注官方是否同步发布额外校验文件。

参考来源

BerriAI/litellm #40051

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22099

发表回复

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