使用Python调用Claude API的三种方案实测

 更新时间:2026年04月29日 08:26:26   作者:键盘飞飞  
文章主要介绍了如何调用Anthropic公司的ClaudeSonnet4.6模型的API,提供了三种方法,包括Anthropic官方Python SDK、OpenAI兼容接口以及直接通过HTTP请求,详细解释了每种方法的适用场景、代码实现及注意事项,并总结了调用过程中遇到的问题和解决方案

上个月帮朋友的创业团队搭一个客服摘要系统,指定要用 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的资料请关注脚本之家其它相关文章!

相关文章

  • python常用的时间模块之datetime模块示例详解

    python常用的时间模块之datetime模块示例详解

    这篇文章主要介绍了python常用的时间模块之datetime模块,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Python 遍历字典的8种方法总结

    Python 遍历字典的8种方法总结

    遍历字典是Python中常见的操作,可以很方便的访问字典中的键和值,以执行各种任务,本文将介绍Python中遍历字典的8种方法,包括for循环、字典方法和推导式等,需要的朋友可以参考下
    2023-10-10
  • Python3.9安装gmpy2的步骤

    Python3.9安装gmpy2的步骤

    gmpy2是一个Python扩展模块,是对GMP的封装,它的前身是gmpy,接下来通过本文给大家讲解Python3.9安装gmpy2的步骤,安装gmpy2之前需要提前安装python3环境,安装python请自行百度搜索,不同的python版本会对应的gmpy库也是不同的,需要的朋友可以参考下
    2023-05-05
  • Python class类@staticmethod及@classmethod区别浅析

    Python class类@staticmethod及@classmethod区别浅析

    这篇文章主要为大家介绍了Python class类@staticmethod及@classmethod区别浅析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Django中如何用xlwt生成表格的方法步骤

    Django中如何用xlwt生成表格的方法步骤

    这篇文章主要介绍了Django中如何用xlwt生成表格的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Python实现的微信支付方式总结【三种方式】

    Python实现的微信支付方式总结【三种方式】

    这篇文章主要介绍了Python实现的微信支付方式,结合实例形式总结分析了Python实现的三种微信支付方式及相关操作步骤、原理、注意事项,需要的朋友可以参考下
    2019-04-04
  • Python中优雅地处理JSON5文件的方法详解

    Python中优雅地处理JSON5文件的方法详解

    JSON5 是 JSON 的一个超集,通过引入部分 ECMAScript 5.1 的特性来扩展 JSON 的语法,以减少 JSON 格式的某些限制,同时,保持兼容现有的 JSON 格式,本文给大家介绍了Python中如何优雅地处理 JSON5 文件,需要的朋友可以参考下
    2024-04-04
  • PyTorch的安装与使用示例详解

    PyTorch的安装与使用示例详解

    本文介绍了热门AI框架PyTorch的conda安装方案,与简单的自动微分示例,并顺带讲解了一下PyTorch开源Github仓库中的两个Issue内容,需要的朋友可以参考下
    2024-05-05
  • 使用pytorch和torchtext进行文本分类的实例

    使用pytorch和torchtext进行文本分类的实例

    今天小编就为大家分享一篇使用pytorch和torchtext进行文本分类的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python自动生成model文件过程详解

    python自动生成model文件过程详解

    这篇文章主要介绍了python自动生成model文件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
    2019-11-11

最新评论