错误与限额

所有路由——/v1、/v1beta 以及未鉴权端点——都返回同一种错误结构:

{ "error": { "message": "invalid api key", "type": "authentication_error", "code": "invalid_api_key", "param": null } }
字段用途
code用它做分支。稳定、机器可读、具体。
typeOpenAI 兼容的分类,给已经在 switch 的客户端。
message给人看。已脱敏,但格式自由、不构成契约。
param当前始终为 null,保留是为兼容 OpenAI SDK。

type 取值为 invalid_request_error、authentication_error、permission_error、not_found_error、rate_limit_error、insufficient_quota、upstream_error、timeout_error、server_error。message 在离开我们之前会做清洗:供应商名称、base URL、上游模型名与凭证都不会出现。上游的原始文本只留在我们的日志里——这就是为什么工单里贴 X-Request-Id 比贴 message 更有用。

状态码

状态码含义
400请求格式错误:字段缺失、枚举非法、URL 不可用
401没有凭证、key 未知或已停用,或账号被停用
402积分不足
403OAuth token 缺少该路由所需 scope
404未知路由、未知模型,或任务不属于你
409幂等冲突,或在资产存在之前请求 /content
413请求体或上传文件超过上限
425相同的幂等请求仍在准备中——稍后重试
429触发速率、并发或未完成任务数上限
499调用方在我们完成前断开
500我方缺陷
502上游失败或返回不可用内容
503当前没有可用供应商,或我们的数据库短暂不可读
504上游未及时响应

402 与 503 都不能用同一形状重试:402 需要积分;而 no_available_provider 或 precheck_failed 导致的 503 应当带退避重试,因为它表示我方短暂无法服务,而不是你的请求写错了。

限流:两条,都按 API key 计

限制默认值被拒时
每分钟请求数60429 rate_limited,Retry-After: 60
并发请求数15429 too_many_concurrent_requests,Retry-After: 1

这是默认值,部署方可以调高。实现上分别是令牌桶与信号量——请求会被拒绝,而不会被排队。OAuth access token 没有 key 记录,因此按账号限流。另有一条限制只作用于异步媒体任务(未完成任务数)。

中文内容导航

继续阅读

常见问题

message 里为什么看不到上游报错原文?

出于安全与脱敏考虑,供应商名称、URL 与模型名不会外泄;原文只存在我们的日志里。用 X-Request-Id 定位即可。

收到 429 应该怎么处理?

按 Retry-After 退避,并把工作合并成更少、更长的任务;并发提交时通常先撞到未完成任务上限。

反复 504 怎么办?

重试一次;若持续出现,把该步骤切换到另一个模型或供应商,而不是无限重试同一家。