上个月帮朋友的创业团队搭一个客服摘要系统,指定要用 Claude Sonnet 4.6 做底层模型。我寻思这不简单嘛,结果从注册到真正跑通第一个请求,前前后后折腾了大半天。主要是 Anthropic 官方的 SDK 和 OpenAI 兼容接口混在一起,文档又散落在好几个地方,踩了不少坑。这篇把我实际跑通的 3 种调用方式全部整理出来,代码直接能复制跑。
调用 Claude API 有三种主流方式:Anthropic 官方 Python SDK、OpenAI 兼容接口、以及通过 HTTP 直接请求。SDK 最省心,OpenAI 兼容接口方便从 GPT 迁移,HTTP 方式最灵活。下面逐个讲。
先说结论
| 方案 | 上手难度 | 适用场景 | 是否支持 Streaming |
|---|---|---|---|
| Anthropic 官方 SDK | 最简单 | 纯用 Claude 的项目 | ✅ |
| OpenAI 兼容接口 | 简单 | 从 GPT 迁移、多模型切换 | ✅ |
| HTTP 直接请求 | 稍麻烦 | 不想装 SDK、Serverless 场景 | ✅ |
我个人日常开发用方案二最多,因为改个 model 参数就能在 Claude 和 GPT-5.5 之间切换,不用维护两套代码。
环境准备
Python 3.9+,装两个包就行:
pip install anthropic openai
API Key 的获取——去 Anthropic Console 注册,绑卡之后在 Settings → API Keys 里生成。没什么好说的,但有个细节:Anthropic 的 Key 格式是 sk-ant-api03- 开头的,别跟 OpenAI 的搞混了。
方案一:Anthropic 官方 SDK
最正统的调用方式,代码很短:
import anthropic
client = anthropic.Anthropic(api_key="sk-ant-api03-xxxxx")
message = client.messages.create(
model="claude-sonnet-4-6-20260414",
max_tokens=1024,
messages=[
{"role": "user", "content": "用 Python 写一个快速排序,要有注释"}
]
)
print(message.content[0].text)
跑起来没什么悬念。但我第一次调的时候遇到了一个报错:
anthropic.AuthenticationError: Error code: 401 - {'type': 'error', 'error': {'type': 'authentication_error', 'message': 'invalid x-api-key'}}
查了半天,发现是我把 Key 粘贴的时候多了一个空格。这种低级错误排查起来最浪费时间。
Streaming 版本也贴一下,做聊天界面的时候基本都要用:
with client.messages.stream(
model="claude-sonnet-4-6-20260414",
max_tokens=1024,
messages=[{"role": "user", "content": "解释一下 RLHF 是什么"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
响应延迟方面,我 4 月 22 号晚上测了几次,首 token 到达时间大概在 800ms-1.2s 之间,波动挺大的。
方案二:OpenAI 兼容接口(推荐)
这个方案是我用得最多的。原因很简单——我手上同时有用 Claude 和 GPT-5.5 的项目,用 OpenAI SDK 统一调用,切模型只改一行代码。
from openai import OpenAI
client = OpenAI(
api_key="sk-ant-api03-xxxxx",
base_url="https://api.ofox.ai/v1"
)
response = client.chat.completions.create(
model="claude-sonnet-4-6-20260414",
max_tokens=1024,
messages=[
{"role": "system", "content": "你是一个资深 Python 开发者"},
{"role": "user", "content": "帮我写一个 Redis 缓存装饰器"}
]
)
print(response.choices[0].message.content)
注意这里 base_url 指向的是聚合 API 网关。聚合平台可以选 OpenRouter、Together AI、ofox.ai 这几家,OpenRouter 收 5.5% 手续费,ofox.ai 是 0% 加价对齐官方价格,看自己需求选。
这个方案有个好处:你之前写的所有 OpenAI 调用代码,把 model 换成 Claude 的模型名就能跑,system 消息也正常支持(Anthropic 原生 SDK 里 system 消息要单独传参数,不在 messages 列表里)。
Streaming 版本:
stream = client.chat.completions.create(
model="claude-sonnet-4-6-20260414",
max_tokens=1024,
messages=[{"role": "user", "content": "写一篇 500 字的技术博客大纲"}],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
方案三:HTTP 直接请求
有些场景不想装 SDK——比如在 Cloudflare Workers 或者一些极简的 Lambda 函数里。直接用 requests 发请求:
import requests
import json
url = "https://api.anthropic.com/v1/messages"
headers = {
"x-api-key": "sk-ant-api03-xxxxx",
"anthropic-version": "2023-06-01",
"content-type": "application/json"
}
payload = {
"model": "claude-sonnet-4-6-20260414",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "什么是向量数据库?简单解释"}
]
}
response = requests.post(url, headers=headers, json=payload, timeout=30)
result = response.json()
print(result["content"][0]["text"])
这里有个坑:anthropic-version 这个 header 是必填的,不传会报 400。版本号不是随便写,要用 Anthropic 文档里列出的有效版本。我第一次随手写了个 2026-01-01,直接返回:
{"type":"error","error":{"type":"invalid_request_error","message":"Invalid API version: 2026-01-01. Valid versions: 2023-06-01, 2024-10-22, ..."}}
反正记住用 2023-06-01 就行,虽然看着旧但一直能用。
整体调用链路
graph LR
A[你的 Python 代码] --> B{选择调用方式}
B -->|方案一| C[Anthropic SDK]
B -->|方案二| D[OpenAI SDK + 聚合网关]
B -->|方案三| E[HTTP requests]
C --> F[Anthropic API]
D --> G[聚合网关 API]
G --> F
E --> F
F --> H[Claude Sonnet 4.6 / Opus 4.7]
踩坑记录
1. max_tokens 是必填参数
跟 OpenAI 不一样,Claude API 的 max_tokens 不填会直接报错,不会给你默认值。我从 GPT 迁移过来的代码全部挂了一遍,挨个加上这个参数,挺烦人的。
2. 图片传参格式
如果要用 Claude 的视觉能力,图片要 base64 编码后放在 messages 里:
message = client.messages.create(
model="claude-sonnet-4-6-20260414",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": base64_string}},
{"type": "text", "text": "这张图里画的是什么?"}
]
}]
)
注意 content 从字符串变成了列表,第一次写容易忘。
3. 429 限流
高并发调的时候经常遇到 429。Anthropic 的限流策略是按 Tier 分级的,刚注册的账号 Tier 1 只有每分钟 50 次请求。我跑批量摘要任务的时候直接撞上了:
anthropic.RateLimitError: Error code: 429 - {'type': 'error', 'error': {'type': 'rate_limit_error', 'message': 'Number of request tokens has exceeded your per-minute rate limit'}}
解决办法要么升 Tier(充值越多 Tier 越高,很现实),要么加个 retry 逻辑,我用的 tenacity:
from tenacity import retry, wait_exponential, stop_after_attempt
@retry(wait=wait_exponential(min=1, max=60), stop=stop_after_attempt(5))
def call_claude(prompt):
return client.messages.create(
model="claude-sonnet-4-6-20260414",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}]
)
4. system prompt 长度问题
Anthropic 文档说 system prompt 支持很长的内容,但我实测超过 4000 token 之后响应质量会有点飘,不知道是不是个例。目前我的做法是 system prompt 控制在 2000 token 以内,复杂的上下文塞到 user message 里。不确定这是不是最佳实践,有经验的老哥可以评论区说说。
小结
三种方案各有各的用处。纯 Claude 项目用官方 SDK 最省心;多模型切换或者从 GPT 迁移过来,OpenAI 兼容接口改动最小;极简部署环境就直接 HTTP。我的建议是先用方案二跑通,后面有特殊需求再切方案一或三。
踩了一天坑终于搞定了,希望这篇能帮你少走点弯路。代码都是 4 月实测能跑的,遇到问题评论区聊。