用免费 key 跑 200 条短文本批处理,跑到三十几条开始返回 429 RESOURCE_EXHAUSTED,detail 里的 quotaId 是 GenerateRequestsPerMinutePerProjectPerModel,单条请求单独发却正常。
一开始怀疑是「失败后立即重试,把剩余配额瞬间耗尽」,查了一圈,方向不对。
原因不止一个,得分开看。免费档按每分钟请求数计配额,跑批很快打满。少数情况下是多个脚本共用同一个项目,配额被合并消耗。
另外,同一项目下不同模型共享部分配额项。
限制并发,把速率压到配额以内
async with asyncio.Semaphore(3): await call_gemini(p)
再往下查询当前可用模型与配额口径
curl "https://generativelanguage.googleapis.com/v1beta/models?key=$KEY"
随后对 429 做带抖动的退避而不是立即重发
time.sleep(min(2 ** i, 60) + random.uniform(0, 1))
剩下的就是把批处理改成夜间低峰跑,并记录每分钟用量
print(requests_per_minute)
别只看报错消失,验证要多做一步。批处理全部跑完,日志里 429 只出现在个别峰值时刻,最终产物条数与输入一致,耗时落在可接受范围。
配额是按项目统计的,不是按 key,团队里几个人各建一个 key 也逃不掉同一个池子,扩容前先确认项目级额度。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。