用免费 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 也逃不掉同一个池子,扩容前先确认项目级额度。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189