Claude API Python 调用示例(2026)

Claude API 在 Python 里怎么调?本文给你可复制即跑的示例:两种调用方式、流式输出、 工具调用(Function Calling)、多轮对话、常见错误处理。默认使用 TokenProvider 作为 base_url,直接比官方便宜一半以上。

最简版 3 行代码:安装 openai SDK,把 base_url 指到 tokenprovider.store, model 写 claude-sonnet-4。下方每个段落都是可运行的脚本。

准备工作

  • Python ≥ 3.8
  • 一个 TokenProvider API 密钥(免费注册,$1 起充)
  • 选一个 SDK:openai(推荐,通用)或 anthropic(官方)
pip install openai       # 方式 A:OpenAI SDK(同时支持 Claude / GPT / Gemini)
pip install anthropic    # 方式 B:Anthropic 官方 SDK(只用 Claude 时推荐)

方式 A:OpenAI SDK(推荐)

一个 SDK 调所有模型,切换只改 model 参数:

from openai import OpenAI

client = OpenAI(
    api_key="你的 TokenProvider密钥",
    base_url="https://tokenprovider.store/v1",
)

resp = client.chat.completions.create(
    model="claude-sonnet-4",   # 或 claude-opus, claude-haiku, gpt-4o, gemini-2-flash
    messages=[
        {"role": "system", "content": "你是资深 Python 工程师。"},
        {"role": "user", "content": "写一个高效的快速排序,含类型标注。"},
    ],
    max_tokens=800,
)

print(resp.choices[0].message.content)
print(f"花了 {resp.usage.total_tokens} token")

关键点:

  • base_url 末尾带 /v1,这是 OpenAI 协议的固定前缀
  • model 直接写 Anthropic 的模型名(不要加 anthropic/ 前缀)
  • resp.usage 会返回实际计费的 token 数

方式 B:Anthropic 官方 SDK

只调 Claude、用官方的 Messages 协议:

import anthropic

client = anthropic.Anthropic(
    api_key="你的 TokenProvider密钥",
    base_url="https://tokenprovider.store",   # 注意:不带 /v1
)

msg = client.messages.create(
    model="claude-sonnet-4",
    max_tokens=800,
    system="你是资深 Python 工程师。",
    messages=[
        {"role": "user", "content": "写一个高效的快速排序,含类型标注。"},
    ],
)

print(msg.content[0].text)
print(f"输入 {msg.usage.input_tokens} 输出 {msg.usage.output_tokens}")

注意 base_url 的差异: OpenAI SDK 用 /v1 后缀, Anthropic SDK 不带后缀。搞反了会收到 404。

流式输出(边生成边显示)

适合做聊天界面、CLI 工具:

from openai import OpenAI

client = OpenAI(
    api_key="你的密钥",
    base_url="https://tokenprovider.store/v1",
)

stream = client.chat.completions.create(
    model="claude-sonnet-4",
    messages=[{"role": "user", "content": "用 3 段话介绍 Python asyncio。"}],
    stream=True,
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)
print()

流式模式下 resp.usage 一般在最后一个 chunk 里给出。

工具调用(Function Calling)

让 Claude 返回结构化函数调用:

import json
from openai import OpenAI

client = OpenAI(api_key="你的密钥", base_url="https://tokenprovider.store/v1")

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "查询城市当前天气",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string", "description": "城市拼音或中文名"}
            },
            "required": ["city"],
        },
    },
}]

resp = client.chat.completions.create(
    model="claude-sonnet-4",
    messages=[{"role": "user", "content": "北京今天天气怎么样?"}],
    tools=tools,
)

tool_call = resp.choices[0].message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
print(f"Claude 请求调用 {tool_call.function.name}({args})")

后续把真实天气结果作为 tool 角色消息喂回去,Claude 会整合成最终答复。

多轮对话(维持上下文)

history = [
    {"role": "system", "content": "你是一个 Python 助教,回答要精炼。"},
]

def ask(question: str) -> str:
    history.append({"role": "user", "content": question})
    resp = client.chat.completions.create(
        model="claude-sonnet-4",
        messages=history,
    )
    answer = resp.choices[0].message.content
    history.append({"role": "assistant", "content": answer})
    return answer

print(ask("asyncio 里 await 和 yield from 有什么区别?"))
print(ask("那 asyncio.gather 和 wait 呢?"))   # 第二轮自动带上下文

错误处理

from openai import OpenAI, RateLimitError, AuthenticationError, APIError

client = OpenAI(api_key="你的密钥", base_url="https://tokenprovider.store/v1")

try:
    resp = client.chat.completions.create(
        model="claude-sonnet-4",
        messages=[{"role": "user", "content": "hello"}],
        timeout=30,
    )
except AuthenticationError:
    print("密钥错误 — 检查 API key 是否过期或写错")
except RateLimitError:
    print("频率限制 — 稍后重试或联系 TokenProvider 提额")
except APIError as e:
    print(f"API 错误: {e.status_code} {e.message}")

省钱技巧

  1. 长系统提示用 Haiku:分类、摘要类任务用 Haiku 3.5 足够,单价只有 Sonnet 的 1/10
  2. 开启提示缓存:同一段长系统提示重复请求时,缓存命中后输入成本降到约 10%
  3. 控制 max_tokens:Claude 输出按 token 计费,设合理上限避免过度生成
  4. 粘性会话:同密钥连续请求自动落到同一上游账号,缓存复用率更高

拿密钥,把上面的代码跑起来

注册送测试额度,无月费,按量扣费,支持 Sonnet 4 / Opus / Haiku。

免费注册 → 已有账号登录

常见问题

用哪个 SDK 更好?

如果项目里同时会调 GPT/Gemini,用 openai SDK 最省事。纯 Claude 项目且要用 MessagePart(图像、文档)等原生特性,用 anthropic SDK。

支持 Claude Vision 图像输入吗?

支持。OpenAI SDK 用 {"type": "image_url"},Anthropic SDK 用 {"type": "image", "source": {...}}

并发怎么控制?

httpx.AsyncClientasyncio.Semaphore 限制并发数。TokenProvider账号限流宽松,但突发太大仍会 429。

能调 Claude Code 吗?

Claude Code 是 CLI,不是直接的 API。接入方式看 Claude Code 配置教程