跳到正文

错误

了解 Webway 的错误响应、状态码和安全重试方式。

错误使用一个简洁的 JSON 封装,OpenAI 兼容 SDK 可以解析:

json
{
  "error": {
    "message": "insufficient credit",
    "type": "insufficient_quota",
    "code": "insufficient_quota"
  }
}

type 是客户端库用于分支处理的粗粒度值。code 更精确, 只有当故障来自提供商时才会与 type 不同。

封装格式取决于端点。/v1/messages 返回 Anthropic 的格式,因此 Anthropic SDK 和 Claude Code 可以解析它并应用各自的重试逻辑, 无需为此网关添加特殊处理:

json
{
  "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 时遵循其要求。

不要在请求内容不变的情况下重试 400401402403404413。同一请求仍会失败。

在提供商开始处理之前被拒绝的请求不会收费。如果生成开始后请求失败, 则可能会对已经生成的 token 收费,包括你在流式传输过程中取消的请求。