文档指南错误处理与重试

错误处理与重试

按状态码分支、指数退避重试,让集成经得起限流与上游抖动。

两条原则:按 HTTP 状态码与错误 type/status 字段分支(错误文案是本地化的,匹配文本必然踩坑);只重试值得重试的——参数错误重试一万次也不会变对。

按状态码的处置

HTTP典型原因处置
400请求体格式错误、缺字段修请求,不重试
401 / 403Key 无效/停用/IP 拦截检查 Key 与配置,不重试
402余额或 Key 额度用尽充值/调额度,不要自动重试(结果不会变)。
404模型不存在/入口不支持对照模型列表检查拼写。
413请求体过大压缩内联媒体或换接口,不重试
429RPM/并发限流指数退避 + 抖动后重试
502 / 503上游故障/网关过载退避后重试;网关本身也会先做故障转移。

指数退避示例

retry.py
import random
import time

from openai import OpenAI, APIStatusError

client = OpenAI(api_key="sk-sole-...", base_url="https://api.soleapi.com/v1")

RETRYABLE = {429, 502, 503}

def create_with_retry(**kwargs):
    delay = 1.0
    for attempt in range(5):
        try:
            return client.responses.create(**kwargs)
        except APIStatusError as e:
            if e.status_code not in RETRYABLE or attempt == 4:
                raise
            time.sleep(delay + random.random())  # jitter
            delay = min(delay * 2, 30)

OpenAI 与 Anthropic 官方 SDK 自带对 429/5xx 的自动重试(max_retries 参数),多数场景直接用即可;自己写重试时务必加抖动,避免多个客户端同拍重试形成惊群。

排查建议

  • 记录完整错误响应体与发生时间:type/status 字段 + HTTP 状态码足以定位类别,见错误码
  • 偶发 5xx 属正常抖动,持续出现再排查;控制台的用量明细能对照到每次失败请求。
  • 频繁 429 时先降并发、再考虑联系管理员调整限额,见速率限制与配额