参考
速率限制
每把密钥都有档位,控制每分钟请求数、每分钟输入 token 数和并发流数。档位基于累计充值;提升自动完成。
档位
| 档位 | 处于该档位的条件 | RPM | TPM | 并发流 |
|---|---|---|---|---|
| free | 未充值前的新密钥。 | 5 | 20,000 | 1 |
| pay_as_you_go | 首次充值确认完成后。 | 60 | 100,000 | 5 |
| high_volume | 累计充值 $500 及以上。 | 300 | 500,000 | 20 |
| enterprise | 由人工授予的自定义额度。 | custom | custom | custom |
档位提升每 5 分钟运行一次,参考的是已确认的累计充值。没有手动按钮——当你的支出越过阈值时,下一次扫描就会上调档位。需要超过 high_volume 的额度上线?请通过页脚的支持入口联系我们。
每个响应都带的请求头
每次 /v1/* 响应都会带上你这把密钥实时的请求计数。可以用它在客户端节流,而不是等到 429。
X-RateLimit-Tier——产生这些限制的档位。X-RateLimit-Limit-Requests——你的 RPM 上限。X-RateLimit-Remaining-Requests——当前分钟内剩余请求数。X-RateLimit-Reset-Requests——距当前分钟窗口重置的秒数。Retry-After——仅在 429 时设置。表示重试前应等待的秒数。
示例
curl -i https://caicaini.com/v1/messages \
-H "Authorization: Bearer cai_api_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"caicaini/auto","max_tokens":50,"messages":[{"role":"user","content":"Hi"}]}'
# X-RateLimit-Tier: pay_as_you_go
# X-RateLimit-Limit-Requests: 60
# X-RateLimit-Remaining-Requests: 59
# X-RateLimit-Reset-Requests: 42 # seconds until the window resets超出限制时
超出限制时返回 type 为 rate_limit_error 的 429,并带上以秒为单位的 Retry-After 请求头。请求会在调用任何供应商之前就被拒绝,因此不消耗积分。
响应 · 429
{
"type": "error",
"error": {
"type": "rate_limit_error",
"message": "Requests per minute exceeded for this key. Retry after 12s."
}
}推荐的退避策略
用一个小的重试封装把所有调用包起来。存在 Retry-After 就读它,不存在则用带抖动的指数退避。重试上限 4–6 次,总等待约 30 秒。
# bash one-liner that retries on 429 with exponential backoff
delay=1
for i in 1 2 3 4 5; do
status=$(curl -s -o /tmp/body -w "%{http_code}" \
-X POST https://caicaini.com/v1/messages \
-H "Authorization: Bearer cai_api_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"caicaini/auto","max_tokens":50,"messages":[{"role":"user","content":"Hi"}]}')
if [ "$status" != "429" ]; then cat /tmp/body; exit 0; fi
sleep "$delay"
delay=$((delay * 2))
done
echo "rate-limited after retries" >&2
exit 1积分不足是另一种信号
积分不足返回 type 为 insufficient_quota 的 402。不要重试——余额不增加就过不了。请显式捕获 402,通知操作者并暂停作业。完整错误类型表见 错误。