错误码对照

HTTP 状态码 + detail 含义 + 客户端应该怎么处理。

错误响应格式

当前 Router/API 使用 FastAPI 标准错误结构,错误描述主要位于 detail 字段。 客户端应优先按 HTTP 状态码处理,再读取 detail 做日志和提示。

json
{
  "detail": "Insufficient wallet balance"
}

完整错误码表

HTTPdetail / 语义含义客户端动作
400invalid request请求 JSON 格式错 / 必填参数缺失不重试,修代码
400context length exceededprompt + max_tokens 超过模型上下文换更大窗口模型,或截断 prompt
400model not foundmodel 名称不存在GET /v1/models 确认可用模型
400content policy violation内容被审核模块拦截(仅开启审核时)调整 prompt,或换审核宽松的模型
401Missing / invalid API keyAuthorization header 缺失 / Key 拼错检查 Bearer token
401Invalid API keyKey 已删除 / 已过期Console 重新生成
402Insufficient wallet balance钱包余额不足本次预扣去 Console 充值
403Model not available请求的模型未上架、不可见,或没有平台价格到模型列表确认模型状态和定价
403Model not available请求中的模型当前不可调用换用已上架且已定价的模型
404Not FoundURL 写错,比如少了 /v1检查 base_url
429Rate limit exceededRPM 或 TPM 超限Retry-After header 指数退避
500Internal Server ErrorRouter 内部错(已被监控)立即重试 1-2 次
502Upstream unavailable当前模型没有可用上游候选退避 10s+ 重试,或检查模型、provider 控制和上游状态
503Service unavailableRouter 过载 / 维护窗口退避 30s+ 重试
504Upstream timeout上游超过 timeout 阈值仍未返回退避 5s 重试,或换模型
499Client closed request客户端主动断连(Nginx 约定码)日志里有记录,按实际消耗结算

429 响应

速率限制触发时当前返回 429 和 detail。不要依赖X-RateLimit-* 响应头;如果后续版本补充这些头,会在本文档中单独标注。

http
HTTP/1.1 429 Too Many Requests
content-type: application/json
x-request-id: req_xxxx

{"detail":"Rate limit exceeded (600/min)"}

如何排查具体故障

请求 ID 是线索
每次响应头都有 x-request-id: req_xxxx。复制后到 Console → 请求日志搜,能看到:
  • 实际命中的上游厂商和 key(脱敏)
  • 完整的延迟分解(auth / select / upstream / billing)
  • 失败候选、冷却状态和重试尝试
  • 错误 detail 和堆栈(如果是 500)