📌 本文讲 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——决定模型表现的关键。