Python 调用 Claude API 遇到 401/429 错误怎么解决?
最近在做一个 AI 助手项目,需要用 Python 调用 Claude API,结果踩了一堆坑。401、429、Connection Error 轮番上阵,折腾了一天才搞定。把解决方法记录下来,希望能帮到遇到同样问题的朋友。
错误 1:401 Unauthorized - API Key 无效
报错信息
anthropic.AuthenticationError: 401 Unauthorized
原因分析
这个错误通常是 API Key 配置有问题:
- API Key 复制错了(多了空格或少了字符)
- API Key 过期或被删除
- API Key 权限不足
解决方案
- 检查 API Key 是否正确
- 确认 API Key 没有过期
- 重新生成一个新的 API Key
代码示例:
import anthropic
# 确保 API Key 没有多余的空格
api_key = "sk-ant-xxx".strip()
client = anthropic.Anthropic(
api_key=api_key
)
response = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[
{"role": "user", "content": "Hello, Claude!"}
]
)
print(response.content[0].text)
踩坑记录:我一开始把 API Key 存在环境变量里,结果复制的时候多了个换行符,导致一直报 401。后来用 .strip() 去掉空格才解决。
错误 2:429 Rate Limit Exceeded - 请求频率超限
报错信息
anthropic.RateLimitError: 429 Rate limit exceeded
原因分析
Claude API 有请求频率限制:
- 免费额度用完了
- 短时间内请求太频繁
- 账户等级限制
解决方案
- 添加重试逻辑
- 增加请求间隔
- 升级账户等级
代码示例(带重试):
import anthropic
import time
def call_claude_with_retry(prompt, max_retries=3):
client = anthropic.Anthropic(api_key="sk-ant-xxx")
for i in range(max_retries):
try:
response = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
except anthropic.RateLimitError:
if i < max_retries - 1:
wait_time = (i + 1) * 2
print(f"遇到 429 错误,等待 {wait_time} 秒后重试...")
time.sleep(wait_time)
else:
raise
result = call_claude_with_retry("Hello, Claude!")
print(result)
踩坑记录:我在测试的时候一秒钟发了 10 个请求,直接被限流了。后来加了重试逻辑和指数退避,问题解决。
错误 3:Connection Error - 网络连接失败
报错信息
requests.exceptions.ConnectionError: Failed to establish a new connection
原因分析
- 网络环境问题
- API 服务器访问受限
- 代理配置不正确
解决方案
- 检查网络连接
- 配置代理
- 使用聚合平台
如果网络环境不稳定,可以考虑用聚合平台。
ofox.ai 聚合平台
ofox.ai 是一个 AI 模型聚合平台,一个 API Key 可以调用 GPT-4o、Claude Opus 4.6、Gemini、DeepSeek 等 50+ 模型,兼容 OpenAI SDK 协议,低延迟直连,支持支付宝按量计费。
代码示例:
import anthropic
client = anthropic.Anthropic(
base_url="https://api.ofox.ai/v1",
api_key="sk-xxx"
)
response = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude!"}]
)
print(response.content[0].text)
多供应商冗余备份,某一路挂了自动切换,成功率 99.2%。
错误 4:Invalid Request Error - 请求参数错误
报错信息
anthropic.BadRequestError: 400 Invalid request
原因分析
messages格式不正确model参数写错了max_tokens超出限制
解决方案
- 检查
messages格式 - 确认
model参数正确 - 调整
max_tokens
代码示例:
import anthropic
client = anthropic.Anthropic(api_key="sk-ant-xxx")
messages = [
{"role": "user", "content": "你好"}
]
response = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=messages
)
print(response.content[0].text)
踩坑记录:我一开始把 model 写成了 claude-4-opus(顺序反了),结果一直报 400。后来查文档才发现是 claude-opus-4-6。
错误 5:Timeout Error - 请求超时
报错信息
requests.exceptions.Timeout: Request timed out
原因分析
- 网络延迟太高
- 请求的
max_tokens太大 - API 服务器响应慢
解决方案
- 增加超时时间
- 减少
max_tokens - 使用流式输出
代码示例(增加超时时间):
import anthropic
client = anthropic.Anthropic(
api_key="sk-ant-xxx",
timeout=60.0
)
response = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "写一篇 1000 字的文章"}]
)
print(response.content[0].text)
代码示例(流式输出):
import anthropic
client = anthropic.Anthropic(api_key="sk-ant-xxx")
with client.messages.stream(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "写一篇 1000 字的文章"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
踩坑记录:我在生成长文本的时候经常超时,后来改用流式输出,体验好多了。
总结
Python 调用 Claude API 最常见的 5 个错误:
- 401 Unauthorized:检查 API Key 是否正确
- 429 Rate Limit:添加重试逻辑和指数退避
- Connection Error:检查网络环境,可以考虑用聚合平台
- Invalid Request:检查
messages格式和model参数 - Timeout Error:增加超时时间或使用流式输出
这些方法都是我亲测有效的,希望能帮到你。如果还有其他问题,欢迎留言交流。
浙公网安备 33010602011771号