错误
了解 Webway 的错误响应、状态码和安全重试方式。
错误使用一个简洁的 JSON 封装,OpenAI 兼容 SDK 可以解析:
{
"error": {
"message": "insufficient credit",
"type": "insufficient_quota",
"code": "insufficient_quota"
}
}
type 是客户端库用于分支处理的粗粒度值。code 更精确,
只有当故障来自提供商时才会与 type 不同。
封装格式取决于端点。/v1/messages 返回 Anthropic 的格式,因此
Anthropic SDK 和 Claude Code 可以解析它并应用各自的重试逻辑,
无需为此网关添加特殊处理:
{
"type": "error",
"error": {
"type": "overloaded_error",
"message": "the provider is over capacity, retry shortly (request 4f2ab910)",
"code": "overloaded"
}
}
状态码
| 状态码 | 含义 | 重试? |
|---|---|---|
400 |
JSON、字段或参数无效 | 否;修正请求 |
401 |
API 密钥缺失、无效、已过期或已撤销 | 否;更换 API 密钥 |
402 |
余额不足以支付此次请求 | 充值后重试 |
403 |
该模型要求使用你自己的提供商 API 密钥 | 否;在控制面板中添加 |
404 |
找不到模型或端点 | 否;检查 ID 和路径 |
413 |
请求正文过大 | 否;减小负载 |
429 |
已达到速率限制 | 是;等待后重试 |
502 / 503 |
提供商不可用 | 是;使用退避策略 |
504 |
提供商响应超时 | 是;使用退避策略 |
402 只表示你的余额不足。Webway 与提供商之间的计费问题会返回
502,因为这不是你能处理的问题。
提供商故障
如果故障来自提供商,而不是你的请求,code 会指明具体故障:
code |
状态码 | 含义 | 重试? |
|---|---|---|---|
model_unavailable |
502 |
提供商无法提供此模型。由我们修复 | 否 |
context_length_exceeded |
400 |
请求长度超过模型的上下文窗口 | 否 |
content_filtered |
400 |
提供商的安全层拒绝了请求 | 否 |
invalid_request |
400 |
提供商拒绝了请求 | 否 |
rate_limited |
429 |
在提供商处触发速率限制 | 是 |
overloaded |
503 |
提供商容量已满 | 是 |
timeout |
504 |
提供商未能及时响应 | 是 |
transport_error |
502 |
与提供商的连接失败 | 是 |
upstream_error |
502 |
未分类。始终会调查 | 视情况而定 |
提供商的错误文本绝不会原样传递。上游会用自己的术语描述故障, 有时使用其他语言,往往还会提及与你无关的基础设施,而且这些文本 可能随时更改。每个错误都会归类到上表中的类型并重写,因此你收到的 消息足够稳定,可以作为日志记录依据。
每条消息末尾都有一个 Webway 请求 ID。联系支持时请提供该 ID: 它是真正可以用于查询的标识符。
流式传输期间的错误
请求可能在响应头已发送后失败。此时已无法更改状态码,因此故障会以
事件形式出现在流中,并使用与其余内容相同的协议——/v1/messages
上的 event: error、/v1/responses 上的 error 事件,以及
/v1/chat/completions 上的 error 数据块。code 值与上表相同。
如果流结束时没有终止事件,应将其视为失败,而不是简短回答。
重试规则
只重试 429 和暂时性的 5xx 响应。使用带抖动的指数退避策略,
限制尝试次数,并在存在 Retry-After 时遵循其要求。
不要在请求内容不变的情况下重试 400、401、402、403、
404 或 413。同一请求仍会失败。
在提供商开始处理之前被拒绝的请求不会收费。如果生成开始后请求失败, 则可能会对已经生成的 token 收费,包括你在流式传输过程中取消的请求。