两个团队各用自己的项目 key 打同一个模型,各自压测 QPS 都不高,合在一起却频繁 429,原文 rate limit reached for requests,看响应头剩余额度两边是同一组数字。

一开始怀疑是「不同模型的额度分开计算,切模型时看起来像整个组织被限」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。部分维度按组织汇总,项目只是组织额度里的一个子集。还有一种是组织级限流在项目之间共享,一个项目跑满就会挤到另一个。

还有一种情况,新建项目后仍在用默认项目的 key,等于两个团队共用一份额度。

第一件事是把响应头里的限流字段完整打出来

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 '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"hi"}]}' | grep -i ratelimit

接着换另一个项目的 key 打同一接口对比

curl -s -D - -o /dev/null https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $KEY_B" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"hi"}]}' | grep -i ratelimit

随后按项目维度拉最近一小时用量

curl -s "https://api.openai.com/v1/organization/usage/completions?start_time=$(date -d '-1 hour' +%s)&bucket_width=1h" -H "Authorization: Bearer $ADMIN_KEY" | jq '.data[0].results'

剩下的就是换一个模型确认额度是分开算的

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 '{"model":"gpt-4o","messages":[{"role":"user","content":"hi"}]}' | grep -i ratelimit

改完先别撤,确认这几项。两个项目在响应头里的剩余额度不再同步下降,压测时只有实际发压的那个项目出现 429,另一个项目的请求成功率保持百分之百。

补一句。限流维度是分层的,项目 key 只隔离调用身份不隔离全部额度,做容量规划时按组织峰值算,才不会在两边都正常的时候突然撞墙。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189