使用 Claude API 时,速率限制(Rate Limits)是每个开发者都会遇到的问题。 本文提供完整的限额说明、错误处理最佳实践和绕限优化方案。
速率限制的类型
Claude API 有三种维度的限制:
| 限制类型 | 说明 | 计量方式 |
|---|---|---|
| RPM | Requests Per Minute,每分钟请求数 | 计请求次数 |
| TPM | Tokens Per Minute,每分钟 Token 数 | 输入+输出 Token 总和 |
| TPD | Tokens Per Day,每天 Token 数 | 24 小时累计 Token |
各使用层级的限额
Anthropic 按账户层级划分不同限额(以 claude-sonnet-4-5 为例):
| 层级 | 触发条件 | RPM | TPM | TPD |
|---|---|---|---|---|
| Tier 1 | 首次充值 $5 | 50 | 40K | 1M |
| Tier 2 | 消费满 $40 | 1000 | 80K | 2.5M |
| Tier 3 | 消费满 $200 | 2000 | 160K | 5M |
| Tier 4 | 消费满 $400 | 4000 | 400K | 无限制 |
| Enterprise | 企业协议 | 自定义 | 自定义 | 自定义 |
注:不同模型的限额不同,Haiku 通常更宽松,Opus 更严格。 以官方文档为准:docs.anthropic.com/en/docs/about-claude/rate-limits
429 错误:速率限制触发
当触发限制时,API 返回:
json
HTTP 429 Too Many Requests
{
"error": {
"type": "rate_limit_error",
"message": "Number of request tokens has exceeded your per-minute rate limit."
}
}响应头包含有用信息:
x-ratelimit-limit-requests: 50
x-ratelimit-limit-tokens: 40000
x-ratelimit-remaining-requests: 0
x-ratelimit-remaining-tokens: 0
x-ratelimit-reset-requests: 2026-03-18T08:30:00Z ← 何时重置
retry-after: 30 ← 建议等待秒数
标准处理方案:指数退避
python
import anthropic
import time
client = anthropic.Anthropic()
def call_with_retry(prompt: str, max_retries: int = 5):
for attempt in range(max_retries):
try:
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}]
)
return response
except anthropic.RateLimitError as e:
if attempt == max_retries - 1:
raise # 最后一次仍失败则抛出
# 指数退避:1s, 2s, 4s, 8s, 16s
wait_time = (2 ** attempt) + (random.random() * 0.5)
print(f"触发限速,等待 {wait_time:.1f}s 后重试...")
time.sleep(wait_time)
except anthropic.APIStatusError as e:
# 其他 5xx 错误也重试
if e.status_code >= 500:
time.sleep(2 ** attempt)
else:
raise提升限额的方法
方法一:通过消费升级层级(自动)
充值并消费 → 自动升级层级 → 限额提升
Tier 1 → 充值 $5 即可
Tier 2 → 累计消费 $40
Tier 3 → 累计消费 $200
Tier 4 → 累计消费 $400(TPD 无限制)
方法二:申请更高限额
在 Anthropic Console 的 Limits 页面提交申请:
- 登录 console.anthropic.com
- 进入 Settings → Limits
- 填写用量说明和申请原因
- 等待审核(通常 1-3 个工作日)
绕限优化技巧
技巧一:Prompt Caching(减少 TPM 消耗)
将重复的长提示词(系统提示、上下文)标记为可缓存, 缓存命中时不计入 TPM:
python
response = client.messages.create(
model="claude-sonnet-4-5",
system=[
{
"type": "text",
"text": "你是一个专业的代码助手...", # 长达 5000 tokens 的系统提示
"cache_control": {"type": "ephemeral"} # 标记为可缓存
}
],
messages=[{"role": "user", "content": user_input}]
)
# 后续请求如果系统提示相同,缓存命中只计输入价格的 10%技巧二:Batch API(异步处理,5x 更多吞吐)
对于不需要实时响应的任务,使用 Batch API:
python
# 创建批量请求(异步,24 小时内完成)
batch = client.messages.batches.create(
requests=[
{"custom_id": f"task-{i}", "params": {"model": "...", ...}}
for i in range(1000)
]
)
# 批量 API 有单独的、更宽松的限额,不占用普通 RPM/TPM
print(f"批次 ID:{batch.id}")技巧三:智能模型降级
python
def smart_request(prompt: str, complexity: str):
try:
# 先尝试高质量模型
return call_with_model("claude-opus-4-6", prompt)
except anthropic.RateLimitError:
# 降级到 Sonnet
return call_with_model("claude-sonnet-4-5", prompt)技巧四:请求队列(高并发场景)
python
import asyncio
from asyncio import Semaphore
# 限制并发请求数,防止瞬间触发限速
semaphore = Semaphore(10) # 最多 10 个并发
async def rate_limited_request(prompt: str):
async with semaphore:
return await async_client.messages.create(...)
# 批量处理 100 个请求
tasks = [rate_limited_request(p) for p in prompts]
results = await asyncio.gather(*tasks)来源:Anthropic 官方文档 - docs.anthropic.com/en/docs/about-claude/rate-limits