文档OriHub
错误码查询
三层错误分开看;能不能重试,看 error_code,不看文案。
报错时按三层的顺序看:HTTP 状态码 → error_code → 错误文案。文案是给人看的,程序判断只看前两层。
第一层:HTTP 状态码
先看状态码,它决定这个请求到底成没成:
| 状态码 | 含义 |
|---|---|
| 401 | 密钥无效 |
| 402 | 余额不足 |
| 403 | 账户没充值被闸门拦(error.code = recharge_required,充一次就放行),或密钥策略是「自定义」而白名单里没这个模型的线路 |
| 404 | 路径不对 —— 四种协议的端点不一样 |
| 429 | 请求过多 —— 退避重试 |
| 5xx | 服务端错误 —— 重试 |
非 200 时,响应里的 error 才是 {"message": "...", "type": "..."} 对象。
第二层:error_code
任务级失败会带一个顶层的 error_code,能不能重试看它:
| error_code | 含义 | 怎么办 |
|---|---|---|
content_policy_violation |
内容审核不过 | 改输入,别重试 |
invalid_request |
参数或素材有问题 | 改输入,别重试 |
insufficient_balance |
余额不足 | 去平台充值 |
quota_exceeded |
这把 Key 配额用完 | 提额或换 Key |
key_config_error |
这把 Key 没开这个模型,或白名单里排除了它所有线路 | 去密钥管理补配置 |
channel_unavailable |
这条线路没了 | 5–30 秒后重试,最多 3 次 |
upstream_error |
上游抽风 | 5–30 秒后重试,最多 3 次 |
server_error |
服务端错误 | 5–30 秒后重试,最多 3 次 |
两条规则:
- 表里没有的值一律按可重试处理。已有的值含义不会变,将来可能加新的
retryable是遗留字段,只有 API Key 配额不足那一种情况会带false;其他情况以error_code为准。data.reason_code存在时跟error_code一致
这个字段出现在三个地方:任务失败时(state=failed)、提交任务就失败时(code != 200,没建出任务)、以及 notify_url 回调的 body。
第三层:文案
error 字段和 msg 里的文字只给人看,别拿它做分支判断 —— 同样的失败在不同线路上文案可能不一样。
任务状态的判定
轮询 GET /v1/skills/task-status 时:
is_final = true就必须停,别再接着轮询- 间隔 5 秒一次,别太频繁
- 超过 7200 秒(2 小时)还没完成,当超时处理,停止轮询并告知用户
state和is_final才是终态依据;status/status_group是按请求语言翻译的,给人看的progress是数字字符串,没有百分号("0"、"99"、"100")cost随阶段变:跑着的时候是提交时预扣的量,成功后是实际结算量,失败退款后是 0(退款额看refunded_amount)。扣了多少以is_final = true之后的值为准- 老端点
GET /v1/media/status无错时error是空字符串"",跟/v1/skills/task-status的null不一样,别混
同步调用
四个聊天协议(/v1/chat/completions、/v1/responses、/v1/messages、Gemini generateContent)和图片同步生成(/v1/images/generations、/v1/images/edits)的响应体里没有 task id,它在响应头 X-Task-Id 里 —— 拿它调 task-status 就能查这次调用实际花了多少。