问题出现得很突然,日志倒是留得挺全。用 openai-python 1.60 的 AsyncClient(max_retries=5) 调接口,遇到 429 只重试一次就抛 RateLimitError,同步客户端用同样参数能重试五次。
刚开始盯着「替换了自定义 httpx 客户端,重试没传下去」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。重试次数配在客户端,但单次请求传了别的值覆盖。也可能是429 返回的 Retry-After 很长,请求超时先到。
不容易想到的是,异常被业务层的 try 捕获后直接抛出。
第一件事是打印客户端实际生效的配置
python -c "import openai;print(openai.AsyncOpenAI(api_key='x',max_retries=5).max_retries)"
显式传 httpx 客户端时保留重试
python async_client.py --max-retries 5 --timeout 60
随后在日志里记录每次重试的时间戳
python retry_log.py --attempts 5
末了用可复现的 429 端点验证次数
python mock429.py --status 429 --times 5
别只看报错消失,验证要多做一步。日志里能看到五次重试记录,最终成功或用尽次数后抛错,同步与异步客户端行为一致。
提醒一点。SDK 的重试只覆盖连接错误和 408、409、429、5xx,4xx 参数错误不会重试,别指望它救回写错的请求体。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
