了解 API 速率限制规则,合理使用配额,确保服务稳定性
为了确保服务的稳定性和公平性,我们对 API 调用实施了速率限制。速率限制基于订阅计划、API Key 和时间窗口进行计算。
当超过速率限制时,您将收到 HTTP 429 状态码,并在响应头中包含 X-RateLimit-* 信息。
每个 API 响应都会包含以下速率限制相关的响应头:
X-RateLimit-Limit
X-RateLimit-Remaining
X-RateLimit-Reset
X-RateLimit-Retry-After
HTTP/1.1 200 OK
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 599
X-RateLimit-Reset: 1711363200
Content-Type: application/json
当超过速率限制时,API 将返回 HTTP 429 状态码:
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Please retry after 60 seconds.",
"type": "rate_limit_error",
"retry_after": 60
}
}
收到 429 错误后,建议使用指数退避算法进行重试,并遵循 Retry-After 响应头中的建议等待时间。
始终检查 X-RateLimit-* 响应头,了解当前配额使用情况
在收到 429 错误后,使用指数退避策略进行重试,避免持续触发限制
合理组织批量请求,避免短时间内大量并发调用
对重复或相似的请求结果进行缓存,减少 API 调用次数
如果经常触及限制,考虑升级到更高的订阅计划以获得更大配额
import time
import openai
from openai import RateLimitError
def call_api_with_retry(max_retries=3):
for attempt in range(max_retries):
try:
response = openai.ChatCompletion.create(
model="gpt-4-turbo",
messages=[{"role": "user", "content": "Hello"}]
)
return response
except RateLimitError as e:
if attempt == max_retries - 1:
raise
# 指数退避:2^attempt * 1秒
wait_time = (2 ** attempt) * 1
print(f"Rate limited. Retrying in {wait_time}s...")
time.sleep(wait_time)
# 使用示例
try:
result = call_api_with_retry()
print(result)
except RateLimitError:
print("Rate limit exceeded after all retries")