快速结论:调用 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 输出。
解决步骤
- 先只用 curl 复现三类请求(无效密钥、无权限模型、截断 JSON),记录各自的 HTTP 状态码与响应体结构,作为基线。
- 将 LiteLLM 升级到包含 PR #48466 的版本;由于 Issue 未给出具体发布版本号,以该 PR 的合并记录和对应 release 为准,并重新部署。
- 重启代理后确认运行版本已变化(例如查看启动日志或版本查询接口)。
- 用相同三条请求再次测试,检查响应体是否变为
{"type":"error","error":{"type":"...","message":"..."}},且 401 对应authentication_error、403 对应permission_error、400 对应invalid_request_error。 - 若升级后仍为旧结构,排查是否命中旧容器、缓存或前置网关改写;也可考虑在前置层对这两条路由的错误响应做结构转换(可优先尝试,属变通方案)。
验证方法
用 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 场景也做同样验证。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


