本文是 Claude API 错误码的完整参考,覆盖所有错误类型的触发原因和解决方案。
错误响应格式
所有错误都以统一格式返回:
json
{
"type": "error",
"error": {
"type": "rate_limit_error",
"message": "Number of request tokens has exceeded your per-minute rate limit."
}
}完整错误类型速查表
| HTTP 状态码 | 错误类型 | 可重试? |
|---|---|---|
| 400 | invalid_request_error | ❌ 不可重试,需修复请求 |
| 401 | authentication_error | ❌ 不可重试,检查 API Key |
| 403 | permission_error | ❌ 不可重试,检查权限 |
| 404 | not_found_error | ❌ 不可重试,检查 URL |
| 413 | request_too_large | ❌ 不可重试,减小请求 |
| 422 | unprocessable_entity_error | ❌ 不可重试,修复参数 |
| 429 | rate_limit_error | ✅ 等待后重试 |
| 500 | api_error | ✅ 稍后重试 |
| 529 | overloaded_error | ✅ 稍后重试 |
各错误详细说明
400 invalid_request_error
含义:请求格式或参数有误。
常见原因:
messages数组格式错误(role 只能是 user/assistant)max_tokens超过模型上限- 不支持的参数(typo 或使用了已废弃的字段)
- messages 中出现两个连续的 user 或 assistant 角色
python
# 错误示例(导致 400)
messages = [
{"role": "user", "content": "Hello"},
{"role": "user", "content": "World"}, # ❌ 连续两个 user
]
# 正确格式
messages = [
{"role": "user", "content": "Hello"},
{"role": "assistant", "content": "Hi!"},
{"role": "user", "content": "World"},
]401 authentication_error
含义:API Key 无效或未提供。
排查步骤:
python
import anthropic
import os
# 检查 Key 是否正确加载
api_key = os.environ.get("ANTHROPIC_API_KEY")
print(f"Key 前缀: {api_key[:10] if api_key else 'None'}")
# Key 格式应为 sk-ant-api03-xxxxx
# 如果不是这个格式,说明 Key 有误
client = anthropic.Anthropic(api_key=api_key)403 permission_error
含义:API Key 无权限执行该操作。
常见原因:
- 尝试访问未开通的功能(如 Extended Thinking 的 beta 功能)
- 账户被限制或暂停
- 请求了需要特殊审批的模型
413 request_too_large
含义:请求体超过大小限制(通常是 Token 数过多)。
python
# 解决方案:分块处理大文件
def split_large_content(content: str, max_tokens: int = 100000) -> list:
# 粗略估算:1 token ≈ 4 字符(英文)或 1.5 字符(中文)
chunk_size = max_tokens * 3
return [content[i:i+chunk_size] for i in range(0, len(content), chunk_size)]429 rate_limit_error
含义:超过速率限制(RPM 或 TPM)。
python
import time
import random
def retry_with_backoff(func, max_retries=5):
for attempt in range(max_retries):
try:
return func()
except anthropic.RateLimitError as e:
if attempt == max_retries - 1:
raise
# 读取 retry-after header(如果有)
wait = float(e.response.headers.get("retry-after", 2 ** attempt))
jitter = random.uniform(0, 0.5)
time.sleep(wait + jitter)响应头中的限流信息:
x-ratelimit-remaining-requests: 0
x-ratelimit-remaining-tokens: 0
x-ratelimit-reset-requests: 2026-03-18T09:30:00Z
retry-after: 30
500 api_error
含义:Anthropic 服务端内部错误。
python
# 适合指数退避重试
# 但不要无限重试——设置最大重试次数
try:
response = client.messages.create(...)
except anthropic.APIStatusError as e:
if e.status_code == 500:
# 服务端错误,等待后重试
time.sleep(5)529 overloaded_error
含义:API 服务器当前过载,无法处理请求。
python
except anthropic.APIStatusError as e:
if e.status_code == 529:
# 过载错误,需要更长的等待时间
time.sleep(30) # 等待 30 秒再重试生产环境错误处理最佳实践
python
import anthropic
import time
import random
import logging
logger = logging.getLogger(__name__)
client = anthropic.Anthropic()
def safe_create_message(messages: list, model: str = "claude-sonnet-4-6",
max_tokens: int = 1024, max_retries: int = 3):
# 带完整错误处理的 Claude API 调用封装
for attempt in range(max_retries):
try:
return client.messages.create(
model=model,
max_tokens=max_tokens,
messages=messages
)
except anthropic.AuthenticationError:
# 认证错误:不重试,立即报警
logger.critical("API Key 无效!请检查 ANTHROPIC_API_KEY 环境变量")
raise
except anthropic.BadRequestError as e:
# 请求格式错误:不重试,记录并抛出
logger.error(f"请求格式错误: {e.message}")
raise
except anthropic.RateLimitError as e:
# 速率限制:指数退避
if attempt == max_retries - 1:
raise
wait = (2 ** attempt) + random.uniform(0, 1)
logger.warning(f"触发速率限制,{wait:.1f}s 后重试(第 {attempt+1} 次)")
time.sleep(wait)
except anthropic.APIStatusError as e:
if e.status_code in (500, 529):
# 服务端错误/过载:重试
if attempt == max_retries - 1:
raise
wait = 10 * (attempt + 1)
logger.warning(f"服务端错误 {e.status_code},{wait}s 后重试")
time.sleep(wait)
else:
raise
except anthropic.APIConnectionError:
# 网络连接错误:重试
if attempt == max_retries - 1:
raise
time.sleep(5)来源:Anthropic 官方文档 - docs.anthropic.com/en/docs/about-claude