错误码
先看三样东西:HTTP 状态码、响应里的 error.type 或 error.code、以及 request_id。HTTP 状态告诉你大类,业务码告诉你具体原因,request_id 用来对账和找支持。
响应长什么样
不同入口的包装略有差别,但错误信息都在 error 里。
| 入口 | 典型响应 |
|---|---|
| 文本、图片、视频、音频接口 | {"error":{"type":"...","message":"...","request_id":"..."}} |
| Messages 协议入口 | {"type":"error","error":{"type":"...","message":"..."}} |
| 限流中间件 | {"success":false,"code":"RATE_LIMITED","message":"...","retry_after":30} |
| 会话鉴权 | {"success":false,"code":"LOGIN_REQUIRED","message":"..."} |
程序里请按 type 或 code 分支,不要按 message 的措辞分支。message 可能调整,request_id 和业务码更适合做稳定判断。
错误码表
按 HTTP 状态码排序。
| HTTP 状态 | 业务码 | 含义 | 你该怎么办 |
|---|---|---|---|
| 400 | invalid_request_error / INVALID_REQUEST | 请求体不合法,字段缺失、类型不对或 JSON 解析失败 | 对照接口文档检查字段;不要原样重试 |
| 400 | OUTPUT_BUDGET_CONFLICT | max_tokens 和 max_completion_tokens 同时传了不同的值 | 只传一个;两个都传时必须相同 |
| 400 | CONTEXT_LENGTH_EXCEEDED | 输入超过模型安全上下文容量 | 缩短输入、减少工具结果或换上下文更大的模型 |
| 400 | MODEL_PROTOCOL_MISMATCH | 当前入口的协议与模型要求不一致 | 换用模型支持的入口。文本有两个入口,不要一直重试同一种写法 |
| 400 | MEDIA_MODEL_MODE_UNSUPPORTED | 视频模型不支持你选的长视频/图生视频模式 | 换模型,或去掉 image_url 改用文生视频 |
| 400 | MEDIA_MODEL_PARAMS_INVALID / MEDIA_VIDEO_TASK_INVALID | 图片/视频参数不合法,或任务 ID 格式不对 | 按模型列表支持的参数重填;任务 ID 用创建时返回的那个 |
| 401 | API_KEY_INVALID | 密钥无效、已撤销或已过期 | 重新创建密钥;确认 Authorization: Bearer sk-loko-... 没有截断 |
| 401 | LOGIN_REQUIRED / TOKEN_INVALID | 没有带登录态,或登录态已失效 | 重新登录,或改用长期 API 密钥 |
| 402 | INSUFFICIENT_CREDITS | 可用积分不足 | 充值或减少本次请求的规模;402 不会调用上游,也不会扣钱 |
| 403 | MODEL_ACCESS_DENIED | 当前账号或团队无权使用这个模型 | 换模型,或让管理员开通权限;不要靠重试解决 |
| 403 | CHAT_ACCESS_DENIED | 当前账号没有开通 AI 对话能力 | 开通对话能力后再调用 |
| 403 | TEAM_ACCESS_DENIED / TEAM_PROJECT_ACCESS_DENIED | 企业空间或企业项目上下文无权限 | 检查 x-lokospace-team-id、x-lokospace-project-id 和成员关系 |
| 404 | MEDIA_MODEL_NOT_FOUND / AUDIO_MODEL_NOT_FOUND | 模型不存在、已停用,或用错了模型类型 | 到对应的模型列表确认 id;图片、视频、音频不要混用入口 |
| 404 | MEDIA_VIDEO_TASK_NOT_FOUND | 视频任务不存在,或不属于当前账号 | 用创建时返回的任务 ID,并且用同一账号查询 |
| 409 | REQUEST_ALREADY_SETTLED | 同一个请求已经结算完成 | 不要重复调用;需要结果就查原请求或换新的业务请求 |
| 409 | REQUEST_IN_PROGRESS | 相同幂等键的请求正在执行 | 等原请求结束;不要用新幂等键并发重发 |
| 409 | REQUEST_SETTLEMENT_PENDING | 上游已经返回,账单正在核对 | 不要重放;保留 request_id,等账单核对完成 |
| 409 | MEDIA_RESULT_NOT_CACHED | 图片已完成并扣费,但 base64 结果没有缓存 | 同一幂等键拿不到旧结果;要重新生成就换新幂等键,这会是新费用 |
| 413 | AUDIO_TOO_LARGE | 音频文件超过 25MB | 压缩、切分或改用 audio_url |
| 429 | RATE_LIMITED | 入口请求频率或并发超过限制 | 按 Retry-After 或 retry_after 退避后重试 |
| 429 | IP_BLOCKED | 当前来源 IP 被限制 | 不要继续重试;联系管理员处理 |
| 502 | UPSTREAM_REQUEST_FAILED | 上游返回错误、超时或响应格式不可用;上游 4xx 时也可能透传 4xx | 先看 upstream_status;5xx 可退避重试,4xx 先改请求 |
| 502 | UPSTREAM_CREDENTIAL_INVALID / UPSTREAM_CREDENTIAL_QUOTA_EXHAUSTED | 平台侧渠道凭证失效或额度耗尽 | 这不是你的密钥问题;带 request_id 联系支持,不要反复重试 |
| 502 | CHANNEL_POOL_BUSY | 模型并发已满,排队超过 queue_timeout_seconds | 降低客户端并发或稍后重试;不要瞬间放大并发 |
| 502 | CHANNEL_POOL_EXHAUSTED | 当前渠道没有未尝试的可用凭证 | 稍后重试;持续出现就带 request_id 联系支持 |
| 503 | MODEL_PRICING_MISSING / MODEL_PRICING_INVALID | 模型没有按 Token 定价,或定价配置无效 | 换模型;这是平台配置问题,不是改请求参数能解决的 |
| 503 | CHANNEL_CREDENTIAL_MISSING | 模型渠道没有可用凭证 | 稍后重试或联系支持 |
| 503 | MEDIA_MODEL_UNAVAILABLE / MEDIA_PRICING_MISSING | 图片/视频模型没有活跃定价、渠道停用或模型映射不可用 | 到 /images/models 或 /videos/models 确认模型是否可售 |
| 504 | OFFICIAL_LLM_APPLICATION_TIMEOUT | 请求超过应用截止时间 | 可以退避重试;如果已经收到部分流式内容,不要盲目重发 |
| 504 | OFFICIAL_LLM_UPSTREAM_STALL / OFFICIAL_LLM_STREAM_STALL | 上游首字节超时,或流式响应中途长时间没有数据 | 未收到内容时可重试;已收到内容时保留 request_id 对账 |
几个典型响应
密钥无效:
{
"error": {
"type": "invalid_request_error",
"code": "API_KEY_INVALID",
"message": "密钥无效、已撤销或已过期"
}
}
积分不足:
{
"error": {
"type": "INSUFFICIENT_CREDITS",
"message": "积分余额不足",
"available_credits": 5,
"request_id": "..."
}
}
模型无权限:
{
"error": {
"type": "MODEL_ACCESS_DENIED",
"message": "当前账号或团队无权使用官方模型 xxx",
"request_id": "..."
}
}
限流:
HTTP/1.1 429 Too Many Requests
Retry-After: 30
Content-Type: application/json
{
"success": false,
"code": "RATE_LIMITED",
"message": "请求过于频繁,请稍后再试",
"retry_after": 30
}
排查顺序
- 看 HTTP 状态。4xx 先改请求、密钥、余额或权限;429 和 5xx 才考虑退避重试。
- 看业务码。
MODEL_ACCESS_DENIED和MODEL_PRICING_MISSING是两种完全不同的问题,不要都当成“模型不存在”。 - 看
request_id。把它和lokospace_billing.requestId对上,确认是不是同一次调用。 - 看
upstream_status。它表示平台到上游那一段的状态,不是你这次请求的最终状态。 - 仍然无法判断时,把
request_id、时间、模型名、HTTP 状态和业务码一起给支持。不要发完整密钥。
哪些不要重试
| 情况 | 原因 |
|---|---|
| 400、401、402、403、404、413 | 请求、密钥、余额、权限或资源本身有问题,重试不会变好 |
409 REQUEST_IN_PROGRESS | 原请求还在跑,重发只会增加并发 |
409 REQUEST_SETTLEMENT_PENDING | 账单待核对,重放可能干扰结算 |
409 REQUEST_ALREADY_SETTLED | 已经结算,重复调用不会产生新结果 |
| 已收到部分流式内容后的中断 | 可能已经产生真实用量,重发可能产生第二笔费用 |
429 和 502、503、504 可以重试,但要用退避,不要固定间隔猛打。具体策略见「限流」页。