首页 > 编程开发 > Python    日期:2026-07-11 / 浏览:次

上个月帮朋友的创业团队搭一个客服摘要系统,指定要用 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。我的建议是先用方案二跑通,后面有特殊需求再切方案一或三。

以上就是使用Python调用Claude API的三种方案实测的详细内容,更多关于Python调用Claude API的资料请关注其它相关文章!

觉得上面的内容有用吗?快来点个赞吧!

点赞() 我要打赏

温馨提示 : 本站内容来自会员投稿以及互联网,所有源码及教程均为作者总结编辑,请大家在使用过程中提前做好备份,以免发生无法预知的错误,源码类教程请勿直接用于生产环境!

 可能感兴趣的文章