📌 本文讲 SDK 用法。访问 Anthropic 等海外服务请遵守你所在地区的网络法规。

装 SDK

pip install anthropic

配置

export ANTHROPIC_API_KEY="sk-ant-..."

第一个对话

from anthropic import Anthropic
client = Anthropic()

msg = client.messages.create(
    model="claude-opus-4-7",
    max_tokens=1024,
    system="你是简洁的助手。",
    messages=[
        {"role": "user", "content": "Python 的 list 和 tuple 区别?"},
    ],
)

print(msg.content[0].text)

注意:

  • max_tokens 必填(OpenAI 是可选)
  • system 是顶级参数,不放在 messages 里

Claude 模型家族

模型 特点
claude-opus-4-7 最强,长文 / 复杂推理
claude-sonnet-4-6 平衡,日常工作主力
claude-haiku-4-5 最快最便宜,分类 / 简单任务

Prompt Caching(重要省钱)

把长 system / 上下文标记成可缓存:

msg = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": "你是 Python 老师。<上千字详细规则>",
            "cache_control": {"type": "ephemeral"},
        }
    ],
    messages=[{"role": "user", "content": "怎么学装饰器?"}],
)

5 分钟内重复用同一 system → 缓存命中 → 价格降到 1/10、速度翻倍

多轮对话

history = []

while True:
    user_input = input("你: ")
    history.append({"role": "user", "content": user_input})

    msg = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        system="你是助手",
        messages=history,
    )
    answer = msg.content[0].text
    print(f"AI: {answer}")
    history.append({"role": "assistant", "content": answer})

流式输出

with client.messages.stream(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "讲个长故事"}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)
print()

Vision(多模态)

import base64

with open("photo.jpg", "rb") as f:
    img_b64 = base64.standard_b64encode(f.read()).decode()

msg = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "image",
                "source": {
                    "type": "base64",
                    "media_type": "image/jpeg",
                    "data": img_b64,
                },
            },
            {"type": "text", "text": "这张图里是什么?"},
        ],
    }],
)
print(msg.content[0].text)

Tool Use(工具调用)

tools = [{
    "name": "get_weather",
    "description": "查询某城市天气",
    "input_schema": {
        "type": "object",
        "properties": {"city": {"type": "string"}},
        "required": ["city"],
    },
}]

msg = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    tools=tools,
    messages=[{"role": "user", "content": "北京今天天气如何?"}],
)

# 找 tool_use 块
for block in msg.content:
    if block.type == "tool_use":
        print(block.name)         # 'get_weather'
        print(block.input)         # {'city': '北京'}

完整工具循环:

def call_tool(name, args):
    if name == "get_weather":
        return f"{args['city']} 晴 25 度"

messages = [{"role": "user", "content": "北京今天天气?"}]

while True:
    msg = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        tools=tools,
        messages=messages,
    )

    if msg.stop_reason == "end_turn":
        for b in msg.content:
            if b.type == "text":
                print(b.text)
        break

    if msg.stop_reason == "tool_use":
        messages.append({"role": "assistant", "content": msg.content})
        tool_results = []
        for b in msg.content:
            if b.type == "tool_use":
                result = call_tool(b.name, b.input)
                tool_results.append({
                    "type": "tool_result",
                    "tool_use_id": b.id,
                    "content": result,
                })
        messages.append({"role": "user", "content": tool_results})

异步并发

from anthropic import AsyncAnthropic
import asyncio

aclient = AsyncAnthropic()

async def ask(prompt):
    msg = await aclient.messages.create(
        model="claude-haiku-4-5",
        max_tokens=200,
        messages=[{"role": "user", "content": prompt}],
    )
    return msg.content[0].text

async def main():
    answers = await asyncio.gather(*[ask(f"问题 {i}") for i in range(10)])
    return answers

asyncio.run(main())

OpenAI vs Claude:什么时候用哪个

  • 长文档处理 / 复杂推理 / 编程:Claude Opus
  • 日常对话 / 客服 / 内容生成:Claude Sonnet 或 GPT-4o
  • 简单分类 / 快响应:Claude Haiku 或 GPT-4o-mini
  • 生态成熟度:OpenAI 略强(更多教程 / 库)
  • 代码 / 长文档:Claude 优势明显

下一篇讲 Prompt Engineering——决定模型表现的关键。