先把当时的情况摆出来。日志里频繁出现 429 rate limit reached for gpt-4o-mini in organization org-xxx on tokens per min (TPM),但代码里看不到任何显式限速逻辑,单条请求都不大。
真正麻烦的地方在于,几个原因的现象几乎一样。TPM 按每分钟累计的输入加输出 token 计算。少数情况下是多台实例共用一个 key,配额被合并消耗。
另外,重试请求也会计入配额,越重试越超。少数情况下是并发长输出把 max_tokens 设得过大,提前占满预算。
先在响应头里读出剩余配额
curl -i https://api.openai.com/v1/models -H "Authorization: Bearer $KEY" | grep -i ratelimit
再往下把请求速率折算成每分钟 token 预算
python -c "print(120000//60, 'tokens per second')"
接着用令牌桶在客户端做前置限速
python -c "import time;print(time.monotonic())"
等前面都确认过,再把实际 usage 汇总成分钟级曲线
print({'tokens': used, 'minute': m})
别只看报错消失,验证要多做一步。429 基本消失,响应头里的剩余 token 稳定保持在正数区间,高峰期也能维持稳定吞吐。
补一句。TPM 是输入输出合并计算的,长输出任务把 max_tokens 设得太大会提前占满预算,即使实际只用了很少,也会被判定为超限。报错文案容易误导,真正的原因往往在相邻那一层的日志里。