使用Python調(diào)用Claude API的三種方案實測
上個月幫朋友的創(chuàng)業(yè)團隊搭一個客服摘要系統(tǒng),指定要用 Claude Sonnet 4.6 做底層模型。我尋思這不簡單嘛,結(jié)果從注冊到真正跑通第一個請求,前前后后折騰了大半天。主要是 Anthropic 官方的 SDK 和 OpenAI 兼容接口混在一起,文檔又散落在好幾個地方,踩了不少坑。這篇把我實際跑通的 3 種調(diào)用方式全部整理出來,代碼直接能復(fù)制跑。
調(diào)用 Claude API 有三種主流方式:Anthropic 官方 Python SDK、OpenAI 兼容接口、以及通過 HTTP 直接請求。SDK 最省心,OpenAI 兼容接口方便從 GPT 遷移,HTTP 方式最靈活。下面逐個講。
先說結(jié)論
| 方案 | 上手難度 | 適用場景 | 是否支持 Streaming |
|---|---|---|---|
| Anthropic 官方 SDK | 最簡單 | 純用 Claude 的項目 | ? |
| OpenAI 兼容接口 | 簡單 | 從 GPT 遷移、多模型切換 | ? |
| HTTP 直接請求 | 稍麻煩 | 不想裝 SDK、Serverless 場景 | ? |
我個人日常開發(fā)用方案二最多,因為改個 model 參數(shù)就能在 Claude 和 GPT-5.5 之間切換,不用維護兩套代碼。
環(huán)境準備
Python 3.9+,裝兩個包就行:
pip install anthropic openai
API Key 的獲取——去 Anthropic Console 注冊,綁卡之后在 Settings → API Keys 里生成。沒什么好說的,但有個細節(jié):Anthropic 的 Key 格式是 sk-ant-api03- 開頭的,別跟 OpenAI 的搞混了。
方案一:Anthropic 官方 SDK
最正統(tǒng)的調(diào)用方式,代碼很短:
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)
跑起來沒什么懸念。但我第一次調(diào)的時候遇到了一個報錯:
anthropic.AuthenticationError: Error code: 401 - {'type': 'error', 'error': {'type': 'authentication_error', 'message': 'invalid x-api-key'}}
查了半天,發(fā)現(xiàn)是我把 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)
響應(yīng)延遲方面,我 4 月 22 號晚上測了幾次,首 token 到達時間大概在 800ms-1.2s 之間,波動挺大的。
方案二:OpenAI 兼容接口(推薦)
這個方案是我用得最多的。原因很簡單——我手上同時有用 Claude 和 GPT-5.5 的項目,用 OpenAI SDK 統(tǒng)一調(diào)用,切模型只改一行代碼。
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 開發(fā)者"},
{"role": "user", "content": "幫我寫一個 Redis 緩存裝飾器"}
]
)
print(response.choices[0].message.content)
注意這里 base_url 指向的是聚合 API 網(wǎng)關(guān)。聚合平臺可以選 OpenRouter、Together AI、ofox.ai 這幾家,OpenRouter 收 5.5% 手續(xù)費,ofox.ai 是 0% 加價對齊官方價格,看自己需求選。
這個方案有個好處:你之前寫的所有 OpenAI 調(diào)用代碼,把 model 換成 Claude 的模型名就能跑,system 消息也正常支持(Anthropic 原生 SDK 里 system 消息要單獨傳參數(shù),不在 messages 列表里)。
Streaming 版本:
stream = client.chat.completions.create(
model="claude-sonnet-4-6-20260414",
max_tokens=1024,
messages=[{"role": "user", "content": "寫一篇 500 字的技術(shù)博客大綱"}],
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 函數(shù)里。直接用 requests 發(fā)請求:
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": "什么是向量數(shù)據(jù)庫?簡單解釋"}
]
}
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 就行,雖然看著舊但一直能用。
整體調(diào)用鏈路
graph LR
A[你的 Python 代碼] --> B{選擇調(diào)用方式}
B -->|方案一| C[Anthropic SDK]
B -->|方案二| D[OpenAI SDK + 聚合網(wǎng)關(guān)]
B -->|方案三| E[HTTP requests]
C --> F[Anthropic API]
D --> G[聚合網(wǎng)關(guān) API]
G --> F
E --> F
F --> H[Claude Sonnet 4.6 / Opus 4.7]踩坑記錄
1. max_tokens 是必填參數(shù)
跟 OpenAI 不一樣,Claude API 的 max_tokens 不填會直接報錯,不會給你默認值。我從 GPT 遷移過來的代碼全部掛了一遍,挨個加上這個參數(shù),挺煩人的。
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 限流
高并發(fā)調(diào)的時候經(jīng)常遇到 429。Anthropic 的限流策略是按 Tier 分級的,剛注冊的賬號 Tier 1 只有每分鐘 50 次請求。我跑批量摘要任務(wù)的時候直接撞上了:
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 越高,很現(xiàn)實),要么加個 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 支持很長的內(nèi)容,但我實測超過 4000 token 之后響應(yīng)質(zhì)量會有點飄,不知道是不是個例。目前我的做法是 system prompt 控制在 2000 token 以內(nèi),復(fù)雜的上下文塞到 user message 里。不確定這是不是最佳實踐,有經(jīng)驗的老哥可以評論區(qū)說說。
小結(jié)
三種方案各有各的用處。純 Claude 項目用官方 SDK 最省心;多模型切換或者從 GPT 遷移過來,OpenAI 兼容接口改動最??;極簡部署環(huán)境就直接 HTTP。我的建議是先用方案二跑通,后面有特殊需求再切方案一或三。
以上就是使用Python調(diào)用Claude API的三種方案實測的詳細內(nèi)容,更多關(guān)于Python調(diào)用Claude API的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Keras目標檢測mtcnn?facenet搭建人臉識別平臺
這篇文章主要為大家介紹了Keras目標檢測mtcnn?facenet搭建人臉識別平臺,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
django inspectdb 操作已有數(shù)據(jù)庫數(shù)據(jù)的使用步驟
這篇文章主要介紹了django inspectdb 操作已有數(shù)據(jù)庫數(shù)據(jù)的使用步驟,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
python實現(xiàn)讀取大文件并逐行寫入另外一個文件
下面小編就為大家分享一篇python實現(xiàn)讀取大文件并逐行寫入另外一個文件,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
Python 用__new__方法實現(xiàn)單例的操作
這篇文章主要介紹了Python 用__new__方法實現(xiàn)單例的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12

