Claude API 怎么调用?3 种方案实测,附完整 Python 代码(2026)

23 阅读5分钟

上个月帮朋友的创业团队搭一个客服摘要系统,指定要用 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 月实测能跑的,遇到问题评论区聊。