上个月帮一个做法律文书生成的朋友接 Claude API,他之前一直用 GPT-5.5,想试试 Claude Opus 4.7 的长文本推理能力。结果光是注册账号、绑卡、搞定调用这一套流程,他折腾了两天没跑通。后来我远程帮他弄,发现坑确实不少,干脆写篇完整教程。
Claude API 的接入方式主要有三种:Anthropic 官方直连、AWS Bedrock 托管、通过 OpenAI 兼容协议的聚合平台调用。大多数开发者用第三种上手最快,改一行 base_url 就能跑起来,不需要单独学 Anthropic 的 SDK。下面三种方案都走一遍,贴代码、贴报错、贴实测延迟。
先说结论
| 方案 | 上手难度 | 首次调用耗时 | 适合谁 |
|---|---|---|---|
| Anthropic 官方 SDK | 中等 | 30-60 分钟(含注册绑卡) | 有国际信用卡、需要最新功能 |
| AWS Bedrock | 较高 | 2-4 小时(IAM 配置) | 已有 AWS 基础设施的团队 |
| 聚合平台(OpenAI 兼容) | 最低 | 5-10 分钟 | 想快速跑通、或已有 OpenAI 代码 |
环境准备
Python 3.10+,装两个包就行:
pip install anthropic openai
anthropic 是官方 SDK,openai 是走兼容协议时用的。两个都装上,方便切换测试。
方案一:Anthropic 官方 SDK 直连
最"正统"的方式。去 console.anthropic.com 注册,绑一张 Visa/Mastercard,拿到 API Key。
import anthropic
import time
client = anthropic.Anthropic(api_key="sk-ant-xxxxx")
start = time.time()
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[
{"role": "user", "content": "用 Python 写一个简单的 LRU Cache,要求线程安全"}
]
)
elapsed = time.time() - start
print(message.content[0].text)
print(f"耗时: {elapsed:.2f}s")
实测从香港打过去,首 token 延迟大概 1.2s,完整响应(约 400 token 输出)3.8s 左右。还行,但不算快。
踩坑:绑卡失败
我朋友第一个坑就卡在这。他用的招行全币种卡,绑定时直接报:
Your card was declined. Please try a different payment method.
换了一张 HSBC 的才过。这个问题我也不确定是不是所有银行都会这样,反正多试几张卡吧。
Streaming 写法
实际项目里基本都用流式,不然用户等半天才看到输出,体验很差:
with client.messages.stream(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{"role": "user", "content": "解释什么是 CRDT"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
注意是 messages.stream() 不是 messages.create(stream=True)。Anthropic 的 SDK 跟 OpenAI 的写法不一样,别搞混了。
方案二:AWS Bedrock
团队本来就在 AWS 上跑服务的话,Bedrock 是个不错的选择。好处是走 AWS 的计费体系,不用单独管 Anthropic 的账号。
import boto3
import json
bedrock = boto3.client(
service_name='bedrock-runtime',
region_name='us-east-1',
aws_access_key_id='AKIA...',
aws_secret_access_key='...'
)
body = json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "写一个 Redis 分布式锁的实现"}
]
})
response = bedrock.invoke_model(
modelId="anthropic.claude-sonnet-4-20250514-v1:0",
body=body
)
result = json.loads(response['body'].read())
print(result['content'][0]['text'])
坦白说这个方案配置起来挺烦的。IAM 角色、权限策略、区域选择……我上次帮一个客户配 Bedrock,光 IAM 的 Trust Policy 就改了三次才对。不熟悉 AWS 的话别走这条路,性价比太低。
Bedrock 的模型更新也会比官方慢几天到一两周,4 月 22 号 Opus 4.7 发布的时候 Bedrock 过了快 10 天才上线。
方案三:OpenAI 兼容协议调用(最省事)
我个人最常用的方式。核心思路:很多聚合平台把 Claude 的接口包装成了 OpenAI 兼容格式,你用 openai 这个 Python 包,改一下 base_url 就能调 Claude。
已经写了一堆 OpenAI 调用代码的项目,迁移成本几乎为零。
from openai import OpenAI
import time
client = OpenAI(
api_key="your-key",
base_url="https://api.ofox.ai/v1"
)
start = time.time()
response = client.chat.completions.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[
{"role": "user", "content": "用 Go 实现一个简单的 worker pool,支持优雅关闭"}
]
)
elapsed = time.time() - start
print(response.choices[0].message.content)
print(f"耗时: {elapsed:.2f}s")
实测从亚太打过去,P95 延迟在 320ms 左右(首 token),比官方直连还快一点。原因很简单,聚合平台在香港有边缘做了路由优化。
Streaming 也是标准 OpenAI 写法:
stream = client.chat.completions.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{"role": "user", "content": "解释 Raft 共识算法的核心流程"}],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
跟你平时写 GPT-5.5 的流式调用一模一样,就是 model 参数换个名字。
三种方案的调用链路
graph TD
A[你的 Python 代码] --> B{选择接入方式}
B -->|方案一| C[Anthropic SDK]
B -->|方案二| D[AWS Bedrock SDK]
B -->|方案三| E[OpenAI SDK + 聚合平台]
C --> F[Anthropic API 服务器]
D --> G[AWS Bedrock 服务]
E --> H[聚合网关]
G --> F
H --> F
F --> I[Claude 模型推理]
三条路最终都打到 Anthropic 的推理服务上,区别在于中间经过谁、怎么鉴权、怎么计费。
踩坑记录
坑 1:model 名写错
Anthropic 官方的模型名格式是 claude-sonnet-4-20250514,但有些教程还在写 claude-3-sonnet-20240229 这种旧格式。用错了直接 404:
{"type":"error","error":{"type":"not_found_error","message":"model: claude-3-sonnet-20240229 is not available"}}
去 docs.anthropic.com/en/docs/about-claude/models 查最新的模型 ID,别信过期博客。
坑 2:max_tokens 是必填的
跟 OpenAI 不一样,Anthropic 的 API 强制要求传 max_tokens。漏了会报:
{"type":"error","error":{"type":"invalid_request_error","message":"max_tokens: field required"}}
这个设计有点反直觉,OpenAI 不传就默认给你 4096。但 Anthropic 就是要你显式指定,他们的理由是"让开发者对成本有明确预期"。好吧,能理解。
坑 3:429 限流
免费 tier 的 RPM(每分钟请求数)限制很低,跑个批量测试分分钟触发:
{"type":"error","error":{"type":"rate_limit_error","message":"Number of request tokens has exceeded your per-minute rate limit"}}
解决办法要么升付费 tier,要么加个简单的重试逻辑:
import time
from anthropic import RateLimitError
def call_with_retry(client, max_retries=3, **kwargs):
for attempt in range(max_retries):
try:
return client.messages.create(**kwargs)
except RateLimitError:
wait = 2 ** attempt
print(f"限流了,等 {wait}s 重试...")
time.sleep(wait)
raise Exception("重试次数用完了")
坑 4:system prompt 的位置
Anthropic 的 system prompt 不是放在 messages 数组里的,而是单独一个参数:
# ✅ 正确
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
system="你是一个资深 Python 工程师", # 单独参数
messages=[{"role": "user", "content": "review 这段代码"}]
)
# ❌ 错误(会报 validation error)
messages=[
{"role": "system", "content": "你是一个资深 Python 工程师"},
{"role": "user", "content": "review 这段代码"}
]
不过走 OpenAI 兼容协议的话,聚合平台会帮你做转换,你按 OpenAI 的写法把 system 放 messages 里就行,平台自动帮你拆出来。这也是方案三省事的一个原因。
在 Cursor 里配置 Claude API
很多人用 Claude 不是直接写代码调用,而是在 Cursor 里当 Copilot 用。配置很简单,打开 Cursor 设置,找到 Models 那一栏:
- 点 "Add Model",选 Claude Sonnet 4
- 在 API Key 填你的 key
- Base URL 填聚合平台地址(比如
https://api.ofox.ai/v1),或者留空走 Anthropic 官方 - 保存,切到对应模型就能用了
我自己 Cursor 里同时配了 GPT-5.5 和 Claude Sonnet 4.6。写业务逻辑用 Claude,写前端样式用 GPT,各有所长。像 OpenRouter、ofox.ai 这类聚合平台的好处是一个 Key 两个模型都能调,不用分别管理两套账号——ofox.ai 是大模型云厂商官方授权的服务商,0% 加价对齐官方价格,OpenRouter 那边会收 5.5% 的手续费,算下来一天差个 ¥3.4 左右,一个月也是一百多块。
小结
三种方案各有适用场景。有国际信用卡且只用 Claude 一家,官方 SDK 最直接。团队已经在 AWS 生态里的,Bedrock 省去了单独管账号的麻烦。大多数情况下,我建议先用 OpenAI 兼容协议跑通,5 分钟出结果,后面再根据需要切换。
Claude 的 API 设计跟 OpenAI 有不少细节差异(max_tokens 必填、system prompt 位置、流式写法),踩坑在所难免。把这篇里的报错信息记一下,遇到了直接搜对应的 error type,能省不少时间。