开发文档
报错与换线
每个报错都有 HTTP 状态码和一个便于程序判断的错误码。有些报错在你看到之前就已经处理过:承接请求的线路出错时,会换另一条线路再试同一个模型。
报错格式
{
"error": {
"message": "Insufficient credits.",
"type": "insufficient_balance",
"code": "insufficient_balance"
}
}/v1/chat/completions和/v1/responses使用上面的 OpenAI 格式,部分报错还会带param。- 鉴权和限额类报错使用
{"error": {"code": ..., "message": ...}}。 /v1/messages使用 Anthropic 的格式,HTTP 状态码和报错信息相同。见 Messages。
鉴权与限额
| 状态码 | 错误码 | 含义 |
|---|---|---|
| 401 | missing_api_key | Authorization 和 x-api-key 里都没有 Key。 |
| 401 | invalid_api_key | 无法识别这个 Key。 |
| 403 | disabled_api_key | Key 已停用。请在控制台重新启用或新建一个。 |
| 403 | expired_api_key | Key 已过有效期。 |
| 403 | organization_frozen | 组织已被冻结或停用,请联系客服。 |
| 429 | org_rate_limit_exceeded | 整个组织一分钟内超过 600 次请求。请按 retry-after 响应头给出的秒数稍后重试。 |
| 429 | key_rate_limit_exceeded | 触发了你在控制台给这个 Key 设的每分钟上限。没设上限的 Key 只计入组织的 600 次。请按 retry-after 响应头给出的秒数稍后重试。 |
| 429 | key_spend_limit_exceeded | Key 达到了控制台里设的每日或每月花费上限。可以调高上限,或者等待:retry-after 指向下一个 UTC 日或月。 |
请求与余额报错
| 状态码 | 错误码 | 含义 |
|---|---|---|
| 400 | invalid_request | 请求体不符合接口格式,例如缺少 model,或 n 不等于 1。 |
| 400 | unsupported_parameter | 带了无法支持的字段,例如 audio、store: true 或 previous_response_id。能定位到字段时,param 会给出字段名。 |
| 400 | model_not_found | 目录里没有这个模型 ID。 |
| 400 | context_length_exceeded | 输入超出模型上限。报错信息会写明上限和估算值。 |
| 400 | model_price_not_configured | 这个模型暂时无法计费,请联系客服。 |
| 402 | insufficient_balance | 余额不够覆盖这个请求。见 余额与 max_tokens。 |
| 400 | byok_credential_required | 这个模型只能用你自己的 Key 调用,而账号里没有该厂商可用的 Key。 |
| 402 | byok_quota_exhausted | 只能用自带 Key 调用的模型上,本月的 BYOK 请求额度已经用完。每月 1 日(UTC)重置。 |
| 400 | byok_billing_config_incomplete | 这个只能用自带 Key 调用的模型暂时无法计费,请联系客服。 |
来自模型线路的报错
| 状态码 | 错误码 | 含义 |
|---|---|---|
| 502 | provider_error | 模型服务出错,尝试过的每条线路都失败了。 |
| 504 | provider_timeout | 请求超时。见 时限。 |
| 429 | provider_rate_limited | 模型服务在限流,尝试过的每条线路都是如此。请退避后重试。 |
| 4xx | provider_invalid_request | 模型服务拒绝了这个请求本身,例如模型不接受某个参数。状态码和报错信息按收到的原样返回。 |
模型服务返回了自己的报错原文时,message 会保留原话,这样根据特定报错文字做处理的客户端库(例如超出上下文后自动恢复)可以照常工作。
换线
承接请求的线路出错时,BoostRail 会在向你发送任何内容之前,换另一条线路再试同一个模型。不会换成别的模型。
- 会换线:服务端错误、限流,以及线路拒绝了 BoostRail 自己的访问。
- 不换线:
provider_invalid_request,因为换一条线路也会拒绝同样的请求;以及非流式请求超时,因为已经超时的请求换线后还会超时。 - 流式请求:45 秒内没有收到第一个事件,就换到下一条线路。最后一条尝试的线路不设首个事件时限。
- 一旦已经向你发送了任何数据,请求就不再换线。
- 所有线路都失败时,你收到最后一次尝试的报错,冻结的余额退回,不收任何费用。
- 出过错的线路,在它恢复成功之前,后续请求会把它排在最后尝试。
已经开始返回数据后中断的流式请求,按 价格页 的规则计费。
时限
| 请求 | 时限 | 结果 |
|---|---|---|
| 非流式 | 180 秒 | 504 provider_timeout,不换线。 |
| 流式,首个事件 | 每条线路 45 秒 | 换到下一条线路;最后一条线路不设首个事件时限。 |
会话保持
会话 ID 相同的请求,会尽量留在这个会话上一次成功请求所用的线路上,有利于提示词缓存命中。会话 ID 依次从这几处读取:x-claude-code-session-id 请求头、x-session-id 请求头,然后是 user(Chat Completions 和 Responses)或 metadata.user_id(Messages)。
什么时候重试
- 400 和 402:先改请求或补余额,原样重试结果不会变。
- 429 并带
retry-after:等待对应的秒数。 - 502、504 和
provider_rate_limited:按指数退避重试。BoostRail 这边已经尝试过换线。 - 联系客服时请附上
x-request-id的值。