先把当时的情况摆出来。openai 1.55 的 Python SDK 调 gpt-4o-mini,触发限流后日志里连着出现 4 行 Retrying request,最后仍抛 RateLimitError,业务代码外层还有一个 for 循环重试,一分钟打了 60 次。
这类报错背后常见的原因有几处,逐个排除就行。SDK 的 max_retries 默认是 2,等于首次之外再试两次。也可能是业务层自己又包了一层重试,两层乘起来次数被放大。
另外,SDK 会读 Retry-After,但没有把等待时间写进自己的日志。少数情况下是多个线程各自重试,瞬时并发反而更高。
动手时先确认客户端实例上的重试次数
python -c "from openai import OpenAI;c=OpenAI();print(c.max_retries,c.timeout)"
再往下把重试收敛到外层,SDK 设成 0
python -c "from openai import OpenAI;c=OpenAI(max_retries=0,timeout=30);print(c.max_retries)"
单独抓一次 429 的响应头看 Retry-After
curl -s -D - -o /dev/null https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $OPENAI_API_KEY" -H 'Content-Type: application/json' -d @one.json
等前面都确认过,再按请求 id 统计真实调用次数
python -c "import json;print(len(open('calls.jsonl').readlines()))"
恢复的判定其实很直接。同一批失败请求的总调用次数等于外层重试次数乘以 1,日志里 Retrying request 只剩一行,429 恢复后第一次重试就成功。
容易忽略的是,SDK 自带重试是为了扛偶发网络抖动,业务层再叠一层就会放大流量,重试只能留在一处。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
