错误码与限流
两种协议下的错误结构、错误码对照、重试建议与限流策略。
错误按你调用的协议返回:OpenAI 兼容接口(/v1/chat/completions、/v1/responses、/v1/embeddings、/v1/videos 等)按 OpenAI 的定义,Anthropic 兼容接口(/v1/messages)按 Anthropic 的定义。官方 SDK 可以直接按各自的异常类处理。
错误结构
OpenAI 兼容接口:
{
"error": {
"message": "Your organization's balance is used up — top up in the console to continue; retrying will not help(组织余额已用完,请在控制台充值后继续;重试无效)",
"type": "insufficient_quota",
"param": null,
"code": "credit_balance_exhausted",
"goodput_reason": "balance_exhausted",
"goodput_scope": "org"
}
}Anthropic 兼容接口(/v1/messages、/v1/messages/count_tokens):
{
"type": "error",
"error": {
"type": "billing_error",
"message": "Your organization's balance is used up — …(组织余额已用完…)",
"goodput_reason": "balance_exhausted",
"goodput_scope": "org"
},
"request_id": "5b1d…"
}| 字段 | 说明 |
|---|---|
error.type / error.code | 与 OpenAI、Anthropic 官方取值一致,官方 SDK 按它们抛对应的异常 |
error.goodput_reason | 拒绝原因,两种协议下取值相同,适合跨协议统一处理(见下表) |
error.goodput_scope | 额度类错误撞的是哪一层(见额度类错误) |
error.message | 中英双语说明,供人排查,不要用于程序判断 |
错误码对照
| 状态码 | goodput_reason | OpenAI type / code | Anthropic error.type | 常见原因 | 处理建议 |
|---|---|---|---|---|---|
| 400 | invalid_request | invalid_request_error | invalid_request_error | 请求体不合法:缺 model / messages、参数取值不合法 | 按错误信息修正请求 |
| 400 | unsupported_option | invalid_request_error / unsupported_value | invalid_request_error | 模型不提供请求的选项,如视频模型没有该分辨率档位 | 按错误信息里列出的可用值修改 |
| 400 | context_length_exceeded | invalid_request_error / context_length_exceeded | invalid_request_error(message 以 prompt is too long 开头) | 输入超出模型上下文窗口 | 精简输入或换更大窗口的模型 |
| 400 | content_policy | invalid_request_error / content_policy_violation | invalid_request_error | 内容被安全策略拦截 | 调整输入 |
| 401 | authentication_failed | invalid_request_error / invalid_api_key | authentication_error | 未携带 Key,或 Key 无效、已删除、已过期、已被停用 | 检查 Authorization: Bearer(或 x-api-key)头 |
| 403 | permission_denied | invalid_request_error / permission_denied | permission_error | Key 无权访问该资源 | 检查 Key 的权限设置 |
| 404 | model_not_found | invalid_request_error / model_not_found | not_found_error | 模型 ID 不存在、未上架、未对你的账户开通,或该模型不支持这个接口 | 对照模型库确认模型 ID;ID 无误请联系客服开通 |
| 404 | not_found | invalid_request_error / not_found | not_found_error | 请求的资源不存在,如视频任务 ID | 检查 ID |
| 409 | conflict | invalid_request_error / conflict | conflict_error | 与资源当前状态冲突,如视频还没生成完就下载 | 等状态变化后再请求 |
| 413 | request_too_large | invalid_request_error / request_too_large | request_too_large | 请求体字节数超过上限 | 缩小请求体 |
| 429 | balance_exhausted | insufficient_quota / credit_balance_exhausted | billing_error | 余额用完,含欠费冻结 | 充值后自动恢复,无需重建 Key;重试无效 |
| 429 | spend_limit_reached | insufficient_quota / 见额度类错误 | billing_error | Key、团队、成员或套餐的额度到顶(余额可能还有) | 调高对应额度,或等额度刷新;重试无效 |
| 429 | rate_limited | rate_limit_error / rate_limit_exceeded | rate_limit_error | 请求频率、token 速率或并发超限 | 按 retry-after 头等待后重试 |
| 500 | internal_error | server_error | api_error | 平台内部错误 | 稍后重试 |
| 502 | upstream_error | server_error | api_error | 上游模型服务出错 | 稍后重试;可配置 fallbacks 自动降级 |
| 503 | overloaded | service_unavailable_error / server_is_overloaded | —(见下一行) | 模型当前负载过高、暂无可用容量 | 按 retry-after 头等待后重试 |
| 529 | overloaded | — | overloaded_error | 同上(Anthropic 协议用 529) | 同上 |
| 503 | internal_error | server_error | api_error | 服务暂时不可用 | 稍后重试 |
| 504 | upstream_timeout | server_error / timeout | timeout_error | 上游模型超时 | 重试;长输出建议使用流式 |
余额用完返回 429,不是 402。 429 也用于限流,请按 goodput_reason(或 OpenAI 的 code、Anthropic 的 error.type)区分:余额和额度类错误重试无效,限流可以按 retry-after 重试。
额度类错误
balance_exhausted 与 spend_limit_reached 的区别在于钱是不是真的没了:前者是付款方(个人账户或组织)的余额用完,后者是某一层设定的上限到了、余额可能还有。goodput_scope 说明撞的是哪一层:
goodput_scope | 含义 | OpenAI code |
|---|---|---|
org | 组织余额用完 | credit_balance_exhausted |
account | 个人账户余额用完 | credit_balance_exhausted |
key | 这把 Key 的额度上限 | api_key_spend_limit_exceeded |
team / project | 团队或项目的额度上限 | project_spend_limit_exceeded |
member | 你在该团队的成员额度 | member_spend_limit_exceeded |
subscription | 套餐额度 | subscription_quota_exceeded |
user | 组织内成员个人的额度上限 | spend_limit_exceeded |
end_user | 你为终端用户(请求里的 user 字段)设的额度上限 | spend_limit_exceeded |
tag | 按标签设的额度上限 | spend_limit_exceeded |
重试建议
错误响应会带上重试相关的头,官方 SDK 会自动遵守:
x-should-retry: false:重试没有意义(参数错、Key 无效、余额或额度用完等)。官方 OpenAI / Anthropic SDK 看到它就不会自动重试。retry-after:限流、过载时建议等待的秒数。
| 可重试 | 不可重试 |
|---|---|
rate_limited、overloaded、upstream_timeout、upstream_error、internal_error | 其余所有 goodput_reason,包括余额和额度类的 429 |
跨模型容灾建议直接用请求级 fallbacks 参数,由网关自动完成切换。
流式请求中的错误
- 还没有输出任何内容就失败时,返回的是普通的错误响应(真实状态码 + 上面的 JSON 结构)。
- 已经开始输出后才失败时,HTTP 状态码已是 200,错误以一个事件发出:OpenAI 兼容接口是
data: {"error": {…}},Anthropic 兼容接口是event: error+ 上面的 Anthropic 结构。官方 SDK 都会把它转成异常。
限流策略
限流按账户与项目层级设定(请求频率与 token 速率双维度)。组织管理员可在控制台为项目配置独立限速。
报障时提供什么
每个错误响应都带请求 ID:响应头 x-goodput-request-id(OpenAI 兼容接口另有 x-request-id,Anthropic 兼容接口另有 request-id,body 里也有 request_id)。它和控制台「调用日志」里的 request_id 是同一个(见用量与调用日志)。报障时连同时间点、模型 ID 一起提供给支持人员,可以最快定位问题。