本文详细介绍 OpenAI API 429 错误的常见原因(TPM/RPM 限制)、如何通过指数退避实现重试、以及多 API Key 轮换的实施方案,帮助开发者构建健壮的 LLM 应用。
OpenAI API 的 Rate Limit(速率限制)会限制单位时间内的请求次数和 Token 数量。当超出限制时,API 返回 429 错误。本文介绍错误原因、排查方法和重试策略。
| 类型 | 说明 | 组织级限制 |
|---|---|---|
| RPM | 每分钟请求数 | 通常 200-500 |
| TPM | 每分钟 Token 数 | 通常 60K-120K |
| RPD | 每天请求数 | 按订阅计划 |
import openai
try:
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": "Hello"}]
)
except openai.error.RateLimitError as e:
print(f"Rate Limit Error: {e}")
print(f" Retry-After header: {e.headers.get('retry-after')}")
import time
import openai
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(
stop=stop_after_attempt(5),
wait=wait_exponential(multiplier=1, min=2, max=60)
)
def call_with_retry(messages, model="gpt-4"):
try:
return openai.ChatCompletion.create(
model=model,
messages=messages
)
except openai.error.RateLimitError as e:
# 检查 Retry-After
retry_after = e.headers.get('retry-after', 30)
print(f"Rate limited, waiting {retry_after}s")
time.sleep(int(retry_after))
raise # 让 tenacity 重试
# 使用
result = call_with_retry([{"role": "user", "content": "Hello"}])
import os
from itertools import cycle
API_KEYS = [
os.getenv("OPENAI_API_KEY_1"),
os.getenv("OPENAI_API_KEY_2"),
os.getenv("OPENAI_API_KEY_3")
]
class KeyManager:
def __init__(self, keys):
self.keys = cycle(keys)
self.current = next(self.keys)
self.key_usage = {k: 0 for k in keys}
def get_key(self):
return self.current
def rotate(self):
self.current = next(self.keys)
print(f"Rotated to new key")
def record_usage(self, tokens):
self.key_usage[self.current] += tokens
key_manager = KeyManager(API_KEYS)
def call_with_key_rotation(messages):
for _ in range(len(API_KEYS)):
openai.api_key = key_manager.get_key()
try:
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages
)
key_manager.record_usage(
response["usage"]["total_tokens"]
)
return response
except openai.error.RateLimitError:
key_manager.rotate()
raise Exception("All keys exhausted")
Auto-repair applied, but unresolved findings remain.
代码示例可执行
重试逻辑代码验证通过