故障排查
按症状列出 EZAT Router 的常见问题(base URL 错误、401、402、未知模型、429 和 529、工具不使用你的设置、流式输出中断),以及原因和解决方法。
何时阅读本页
请求或工具出错时使用本页。在下面找到对应的状态码或症状;每一项都给出了原因和解决方法。完整的错误类型列表见错误。
先做两个快速检查,可以缩小大多数问题的范围:
- 请求到达 EZAT Router 了吗?用有效 key 发出的每个 Messages 或 Chat Completions 请求,都会在几秒钟内出现在控制台的用量页面上,包括被拒绝的请求(状态为已拒绝)。如果什么都没有出现,说明工具把请求发到了别处,或者没有带上有效的 key。
- 错误是哪种格式?API 错误带有错误
type,例如{"type":"error","error":{"type":"not_found_error",…}}或{"error":{"code":"model_not_found",…}}。如果响应体类似{"statusCode":404,"message":"…"},说明 URL 路径本身就错了。
Base URL
404 并提示 Cannot POST /v1/v1/messages
原因:base URL 以 /v1 结尾。Anthropic SDK 和 Claude Code 会自己加上 /v1/messages,所以路径重复了。
解决方法:使用 https://api.router.ezat.io,后面不加任何内容:ANTHROPIC_BASE_URL=https://api.router.ezat.io、base_url="https://api.router.ezat.io"。
OpenAI 客户端或工具返回 404
响应体是 {"statusCode":404,…},消息类似 Cannot POST /v1/chat/completions 或 Cannot POST /openai/chat/completions,或者只有 Not Found。
原因:OpenAI base URL 缺少 /openai/v1,或者只写了其中一部分。OpenAI 客户端会在 base URL 后面加上 /chat/completions 和 /models。
解决方法:原样使用 https://api.router.ezat.io/openai/v1,例如 OpenAI(base_url="https://api.router.ezat.io/openai/v1") 或 OPENAI_BASE_URL=https://api.router.ezat.io/openai/v1。见 OpenAI 兼容 base URL。
认证
401 缺少 API key
消息为 Missing API key. Send it in the x-api-key or Authorization: Bearer header.
原因:没有收到 key。请求头缺失或拼写错误,或者本应保存 key 的环境变量在发出请求的进程中为空。从 Dock、开始菜单或 IDE 启动的应用,读不到在终端中 export 的变量。
解决方法:以 x-api-key 或 Authorization: Bearer 发送 key。在运行工具的同一个 shell 或应用中检查变量是否已设置,同时不打印 key:
printf 'length %s, prefix %s\n' "${#EZAT_API_KEY}" "${EZAT_API_KEY:0:8}"应该输出 length 48, prefix ezat_sk_。
401 无效的 API key
原因:收到的值不是有效的 EZAT Router key:
- 输错了、复制不完整,或者 key 中间有引号、空格或换行(两端的空格会被忽略);
- 其他服务商的 key,例如 Anthropic 或 OpenAI 的 key;
- 同时发送了两个 key。当请求同时带有
x-api-key和Authorization时,EZAT Router 读取x-api-key。如果工具里还设置着旧的ANTHROPIC_API_KEY,它会以x-api-key发送,从而盖过ANTHROPIC_AUTH_TOKEN中的 EZAT Router key。
解决方法:按上面的方法检查长度和前缀。取消设置工具同时会读取的其他服务商的 key(unset ANTHROPIC_API_KEY),或者也把它设为你的 EZAT Router key。如果 key 仍然无效,在 API Key 页面创建一个新的。
401 key 已吊销或已过期
消息为 This API key has been revoked 或 This API key has expired。
原因:有人吊销了这个 key,或者它已超过创建时选择的有效期。
解决方法:在 API Key 页面创建一个新 key,并更新工具的配置。key 无法重新启用。
403 权限错误
原因:以下情况之一:
This API key is not allowed to use …:这个 key 创建时选择了仅限选中的模型,而这个模型不在其中。This organization is suspended. Contact support@ezat.io.:该组织的 key 全部会被拒绝。
解决方法:第一种情况,使用这个 key 允许的模型(用这个 key 调用 GET /v1/models 可以列出它们),或者创建一个可以使用所有模型的 key。第二种情况,发邮件到 support@ezat.io。
余额和限制
402 余额不足
消息为 Your credit balance is too low. Add credits in the EZAT Router dashboard. OpenAI 格式中的错误类型为 insufficient_quota。
原因:组织余额为零或负数。在余额大于零之前,请求都会被拒绝。
解决方法:在账单页面充值(所有者、管理员和财务可以充值)。付款几秒钟后额度就会到账。如果充值后仍然收到 402,检查你是否充到了 key 所属的组织:顶栏的组织切换器会显示你当前查看的是哪个组织。见计费方式。
402 达到消费上限
消息为 This API key reached its daily spend limit of …(或 monthly、total)。
原因:这个 key 设置了消费上限,并且在当前周期内的花费已经达到上限。
解决方法:按天或按月的上限会在下一个 UTC 日或 UTC 月开始时重置。否则,换用上限更高的 key,或者创建一个。见消费上限。
429 速率限制
错误类型为 rate_limit_error,并带有以秒为单位的 retry-after 响应头。消息会说明是哪种限制:
This API key exceeded its requests-per-minute limit(retry-after: 30):这个 key 每分钟发出的请求数超过了限制。Rate limited upstream. Please retry shortly.(retry-after: 10):该模型的容量此刻正被限流。
解决方法:等待 retry-after 中的秒数,然后按退避策略重试。Anthropic 和 OpenAI 的 SDK 会自动重试这类错误。如果是你自己的流量触发了单个 key 的限制,请把请求分散到更长的时间里。见速率限制。
529 过载(OpenAI 格式中为 503)
错误类型为 overloaded_error(OpenAI 格式中为 server_error,code 为 overloaded),并带有 retry-after 响应头。消息中可能会说该模型 has no available capacity right now。
原因:该模型此刻没有空闲的容量。返回这个错误之前,EZAT Router 已经尝试过它为该模型准备的其他容量。
解决方法:等待 retry-after 秒后,按退避策略重试。如果持续出现,换一个模型试试。
模型和请求
404 未知模型
Anthropic 格式中为 not_found_error,消息为 model: <the name you sent>。OpenAI 格式中 code 为 model_not_found。
原因:这个名称不是 EZAT Router 为这个 key 提供的模型 id 或别名。常见原因:拼写错误;使用了其他服务商的名称,或者云服务商自己的 id;模型已经下线;模型处于预览阶段,只有拥有预览权限的 key 才能调用。
解决方法:用 GET https://api.router.ezat.io/v1/models 列出你的 key 可以使用的模型,并发送其中一个 id。模型页面列出了每个模型可接受的其他名称。名称不区分大小写。在 Claude Code 中,如果你选择的模型没有提供,把 ANTHROPIC_MODEL 设为列表中的一个 id。
模型返回 400
错误类型为 invalid_request_error,消息中会指出某个字段或值。
原因:请求中有模型不接受的内容。EZAT Router 只检查 model、max_tokens 和 messages,其他内容按你发送的原样传给模型,所以适用的是模型自己的校验:例如模型不支持的采样参数(temperature、top_p、top_k),或者模型不提供的 anthropic-beta 功能。Message Batches、Files API、由 Anthropic 运行的服务端工具(网页搜索、代码执行)和 MCP connector 都不可用。
解决方法:去掉消息中指出的字段。如果 Claude Code 收到提示未知字段或 beta 功能的 400 错误,在它的环境中设置 CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1。在兼容 OpenAI 的 API 上,少数 OpenAI 字段会被有意拒绝(例如大于 1 的 n、logprobs、logit_bias、音频和旧版的 functions):见 Chat Completions。
413 请求过大
错误类型为 request_too_large。
原因:请求体超过 32 MB。
解决方法:发送更小的图片或文档,或者减少每个请求中的图片或文档数量。
工具和设置
工具仍在使用自己的 key 或 base URL
症状:请求没有出现在用量页面上,工具报出的是其他服务商的错误,或者 key 明明正确却收到 401。
原因:工具从某个优先级更高的地方读取设置,覆盖了你设置的值:
- Claude Code 优先使用其设置文件中的
env块,而不是你在 shell 中 export 的变量。已保存的 claude.ai 登录,或者你没有批准的ANTHROPIC_API_KEY,也可能在起作用。 - SDK 代码如果在构造函数中传入了 base URL 或 key,就会忽略环境变量(
ANTHROPIC_BASE_URL、ANTHROPIC_API_KEY、OPENAI_BASE_URL、OPENAI_API_KEY)。 - 不是从终端启动的应用(编辑器、桌面应用)读不到你在 shell 中 export 的变量。
- 同时发送了两个 key:见 401 无效的 API key。
解决方法:
- 在 Claude Code 中运行
/status。Anthropic base URL一行应该显示https://api.router.ezat.io,Auth token或API key一行应该指向保存你的 EZAT Router key 的那个变量。如果没有 base URL 这一行,说明变量没有传到 Claude Code。检查~/.claude/settings.json、项目的.claude/settings.json和.claude/settings.local.json中是否有覆盖你设置的env值。如果 Claude Code 提示存在两个凭据,运行/logout清除已保存的登录。见 Claude Code。 - 在你的代码中,要么显式传入
base_url和 key,要么去掉显式传入的值,让环境变量生效。 - 对于编辑器和桌面应用,在应用自己的设置中填写这些值。
流式输出提前中断
原因:以下情况之一:
- 模型在流式输出中途失败。输出开始后,EZAT Router 无法再切换到其他容量,所以流会以一个错误事件结束:Anthropic 格式中是
event: error,OpenAI 格式中是带有error对象的data:块。这样失败的请求不收费。 - 你的客户端或代理关闭了连接。EZAT Router 会停止模型。你需要为输入和截至当时已生成的输出付费;如果流在最终计数之前就结束了,输出量是估算的:用量页面会把这类请求标记为估算值,状态为已取消。
- 客户端的读取超时短于事件之间的间隔。如果 15 秒内没有输出,EZAT Router 会发送一个保活消息(Anthropic 格式中是
event: ping,OpenAI 格式中是一条 SSE 注释)。
解决方法:以错误事件结束的请求,重试即可。确保客户端的读取超时远大于 15 秒,并且没有代理缓冲或切断长响应。
长请求返回 504
错误类型为 timeout_error,消息为 The model took longer than 590 seconds. Send long requests with "stream": true.
原因:不使用流式输出的请求,在模型完成之前收不到任何响应,EZAT Router 会在 590 秒后结束它。
解决方法:长请求请使用 "stream": true 发送(或者使用 SDK 的流式调用)。
联系支持
如果你无法自行解决问题,请发邮件到 support@ezat.io,并提供:
- 响应的
request-id响应头;如果没有request-id,提供x-request-id响应头(Anthropic 格式的错误响应体中,request_id带有相同的值); - 请求的时间(含时区)、端点、状态码和错误消息;
- 如果是计费问题,提供设置中的组织 ID。
不要发送你的 API key:支持团队从不需要它。
给 AI agent 的说明
- 在做任何修改之前,先读取状态码和错误
type。不要重试400、401、402、403、404或413。 - 对于
429、500和529(OpenAI 格式中为503),至少等待retry-after秒,然后按退避策略重试。 - 带有
statusCode字段的404表示 URL 路径错误:Anthropic 格式的客户端用https://api.router.ezat.io,OpenAI 格式的客户端用https://api.router.ezat.io/openai/v1。 - 检查 key 时,只打印它的长度和前 8 个字符,然后调用
GET https://api.router.ezat.io/v1/models。 - 向用户求助时,给他们
request-id(或x-request-id)和错误消息,绝不要给 key。