429 一分钟几十次,是我该退避还是中转站的问题?

环境: openai sdk 并发 5
RPM 设的 60

报错全文:

// OpenAI
Error code: 429 - {'error': {'message': 'Rate limit reached for gpt-4o in organization org-xxx on requests per min (RPM): Limit 500, Used 500.', 'type': 'requests', 'code': 'rate_limit_exceeded'}}

// Anthropic
{"type":"error","error":{"type":"rate_limit_error","message":"Number of request tokens has exceeded your per-minute rate limit"}}

// 中转站常见(new-api / one-api 系)
当前分组上游负载已饱和,请稍后再试

查了下资料,说最常见原因是「客户端并发太高 / 没有退避重试」,但我这个场景……求大佬指点。

这个我们在报错百科里做过完整排查,直接给结论:

429 是限速,不是你的 Key 有问题。 直连官方时它代表"你请求太快";走中转站时,多数情况是中转站那个分组的并发上限到了,跟你无关。

判断方法:等 60 秒再发一次同样的请求。好了就是限速,没好才需要往下查。

修法(节选自百科,完整版见正文链接):

场景 A:你在直连官方

  1. 加指数退避重试。不要立刻重试,第一次等 1 秒,之后 2、4、8 秒。
  2. 把并发降到 1-3,逐步加。
  3. 查一下你的 RPM / TPM 配额,是不是真的打满了。
import time, random

def with_retry(fn, max_attempts=5):
    for i in range(max_attempts):
        try:
            return fn()
        except Exception as e:
            if "429" not in str(e) or i == max_attempts - 1:
                raise
            wait = min(2 ** i, 30) + random.random()
            time.sleep(wait)

场景 B:你用中转站

  1. 换分组:很多中转站同一个模型有多个分组,价格不同、限流也不同。
  2. 换站点:我们的中转站实测里有各家 429 的实际发生率。
  3. 如果只有某个模型 429,说明是这个模型的渠道限流,不是你的问题。

完整排查文档(含全部概率排序和责任判定):429 Too Many Requests:请求太频繁怎么解决 · 报错百科 · docai.cc
按这个改完基本就通了。还报错的话把你改后的完整报错贴上来,我再看。