[Bug]: /v1/messages still answers auth, model-access and malformed-JSON errors in the OpenAI error shape

调用 LiteLLM 代理的 Anthropic 兼容端点 /v1/messages (以及 /v1/messages/count_tokens )时,如果错误发生在进入 handler 之前(无效虚拟密钥、模型无权访问、请求体不是合法 JSON),返回体仍是 OpenAI 错误结构,而不是 Ant

快速结论:调用 LiteLLM 代理的 Anthropic 兼容端点 /v1/messages(以及 /v1/messages/count_tokens)时,如果错误发生在进入 handler 之前(无效虚拟密钥、模型无权访问、请求体不是合法 JSON),返回体仍是 OpenAI 错误结构,而不是 Anthropic 的 {"type":"error","error":{...}},导致 Anthropic SDK 无法识别 error.type。优先确认 LiteLLM 版本是否已包含修复 PR #48466。

适用环境:LiteLLM v1.105.1,后端为 vLLM 0.31.0 开发构建(hosted_vllm 模型 zai-org/GLM-5.3),已启用 virtual keys,使用团队密钥且模型白名单仅含 glm-5.3。Issue 未提供操作系统、Python、CUDA、显卡信息。

最快修复方案:升级到包含 PR #48466 的 LiteLLM 版本。该修复已由维护者确认合并,但 Issue 未给出对应发布版本号。

注意事项:状态码本身是正确的(401/403/400),问题只在响应体结构;不要通过放宽鉴权或模型白名单来绕过。若升级后仍复现,需确认实际运行的镜像/容器是否已更新,以及前置网关是否改写了响应体。

问题场景

用户在 LiteLLM Proxy 上调用 Anthropic 兼容接口 /v1/messages,请求在业务 handler 执行前就被代理层拒绝,包括三类情况:

  • 携带的 Bearer Token 不是有效的 LiteLLM virtual key(HTTP 401);
  • 请求的 model 不在该密钥的允许列表内(HTTP 403),/v1/messages/count_tokens 表现相同;
  • 请求体是被截断的非法 JSON(HTTP 400)。

对照:能进入 handler 的请求,其上游返回的错误(例如非法的 thinking 值)已经正确使用 Anthropic 错误结构。

报错原文

HTTP 401
{"error":{"message":"LiteLLM Virtual Key expected. Received=not-****-key, expected to start with 'sk-'.","type":"auth_error","param":"None","code":"401"}}

HTTP 403
{"error":{"message":"The requested model 'no-such-model' is not available for this API key, or the model name is invalid. Check the models available to you and try again.","type":"team_model_access_denied","param":"model","code":"403"}}

HTTP 400
{"error":{"message":"Invalid JSON payload: unexpected end of data: line 1 column … (char …)","type":"invalid_request_error","param":"request_body","code":"400"}}

Expected for all three: {"type":"error","error":{"type":"<authentication_error|permission_error|invalid_request_error>","message":"..."}}

原因分析

最可能的原因是:自 #39037 起,只有 /v1/messages handler 内部抛出的异常被包装成 Anthropic envelope;#46815 同样处理了 /v1/messages/count_tokens 的响应体。但在 handler 运行之前由代理层产生的错误(virtual key 校验、模型访问权限校验、JSON 解析失败)仍走通用异常处理,输出 OpenAI 结构的 {"error":{"message","type","param","code"}}。

结果是 Anthropic SDK 找不到顶层 "type": "error" 和 error.type,无法据此判断 401/403 不应重试,按 Messages 错误 schema 校验响应体的客户端也会直接判为不合法。另外,客户端拿到的 error.type 值(auth_error、team_model_access_denied)也不是 Anthropic 对应状态码规定的类型。

环境排查

  • 确认 LiteLLM Proxy 实际版本:Issue 复现版本为 v1.105.1,重点核查是否包含 PR #48466 的修复。
  • 确认部署镜像/容器标签与启动时实际加载的包版本一致,避免“已升级但跑的还是旧镜像”。
  • 确认 virtual keys 已启用,并核对所用团队密钥的模型白名单(Issue 中仅含 glm-5.3)。
  • 确认后端 vLLM 版本与 hosted_vllm 模型配置(api_base、model)是否正确,用于区分“代理层错误”与“上游错误”。
  • 如前面还有反向代理/API 网关,确认它没有改写错误响应体。
  • 用支持 Anthropic Messages 错误格式的 SDK 客户端复现,而非只看 curl 输出。

解决步骤

  1. 先只用 curl 复现三类请求(无效密钥、无权限模型、截断 JSON),记录各自的 HTTP 状态码与响应体结构,作为基线。
  2. 将 LiteLLM 升级到包含 PR #48466 的版本;由于 Issue 未给出具体发布版本号,以该 PR 的合并记录和对应 release 为准,并重新部署。
  3. 重启代理后确认运行版本已变化(例如查看启动日志或版本查询接口)。
  4. 用相同三条请求再次测试,检查响应体是否变为 {"type":"error","error":{"type":"...","message":"..."}},且 401 对应 authentication_error、403 对应 permission_error、400 对应 invalid_request_error。
  5. 若升级后仍为旧结构,排查是否命中旧容器、缓存或前置网关改写;也可考虑在前置层对这两条路由的错误响应做结构转换(可优先尝试,属变通方案)。

验证方法

用 curl 重跑 Issue 中的三个复现命令:401、403、400 的状态码保持不变,但响应体应带有顶层 "type": "error",且 error.type 分别为 authentication_error、permission_error、invalid_request_error,不再出现 auth_error / team_model_access_denied 或 OpenAI 的 error.param、error.code 字段。随后用 Anthropic SDK 客户端请求同一端点,确认客户端能识别错误类型,并在 401/403 时按预期不重试。对 /v1/messages/count_tokens 的 403 场景也做同样验证。

参考来源

BerriAI/litellm #47948

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 32053

发表回复

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