English ← MyDocs

Python SDK

安装和配置 Anthropic Python SDK,支持同步和异步客户端


Anthropic Python SDK 为 Python 应用程序提供对 Anthropic REST API 的便捷访问。它支持同步和异步操作、流式传输,以及与 Amazon Bedrock、Vertex AI、Microsoft Foundry 和 Claude Platform on AWS 的集成。

Info

有关带有代码示例的 API 功能文档,请参阅 API 参考。本页面介绍 Python 特定的 SDK 功能和配置。

安装

pip install anthropic

对于平台特定的集成或改进的异步性能,请安装扩展:

# Amazon Bedrock 支持
pip install "anthropic[bedrock]"

# Vertex AI 支持
pip install "anthropic[vertex]"

# Claude Platform on AWS 支持
pip install "anthropic[aws]"

# Microsoft Foundry 支持已包含在基础包中

# 使用 aiohttp 提升异步性能
pip install "anthropic[aiohttp]"

要求

需要 Python 3.9 或更高版本。

用法

import os
from anthropic import Anthropic

client = Anthropic(
    # 这是默认值,可以省略
    api_key=os.environ.get("ANTHROPIC_API_KEY"),
)

message = client.messages.create(
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": "Hello, Claude",
        }
    ],
    model="claude-opus-4-7",
)
print(message.content)
Tip

建议使用 python-dotenvANTHROPIC_API_KEY="my-anthropic-api-key" 添加到 .env 文件中,这样你的 API 密钥就不会存储在源代码管理中。

有关认证选项(包括 Workload Identity Federation),请参阅认证

异步用法

import os
import asyncio
from anthropic import AsyncAnthropic

client = AsyncAnthropic(
    api_key=os.environ.get("ANTHROPIC_API_KEY"),
)


async def main() -> None:
    message = await client.messages.create(
        max_tokens=1024,
        messages=[
            {
                "role": "user",
                "content": "Hello, Claude",
            }
        ],
        model="claude-opus-4-7",
    )
    print(message.content)


asyncio.run(main())

使用 aiohttp 提升并发性能

要提升异步性能,你可以使用 aiohttp HTTP 后端替代默认的 httpx

import os
import asyncio
from anthropic import AsyncAnthropic, DefaultAioHttpClient


async def main() -> None:
    async with AsyncAnthropic(
        api_key=os.environ.get("ANTHROPIC_API_KEY"),
        http_client=DefaultAioHttpClient(),
    ) as client:
        message = await client.messages.create(
            max_tokens=1024,
            messages=[
                {
                    "role": "user",
                    "content": "Hello, Claude",
                }
            ],
            model="claude-opus-4-7",
        )
        print(message.content)


asyncio.run(main())

流式响应

SDK 提供使用 Server-Sent Events (SSE) 的流式响应支持。

from anthropic import Anthropic

client = Anthropic()

stream = client.messages.create(
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": "Hello, Claude",
        }
    ],
    model="claude-opus-4-7",
    stream=True,
)
for event in stream:
    print(event.type)

异步客户端使用完全相同的接口:

from anthropic import AsyncAnthropic

client = AsyncAnthropic()

stream = await client.messages.create(
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": "Hello, Claude",
        }
    ],
    model="claude-opus-4-7",
    stream=True,
)
async for event in stream:
    print(event.type)

流式辅助函数

SDK 还提供了使用上下文管理器的流式辅助函数,可以访问累积的文本和最终消息:

import asyncio
from anthropic import AsyncAnthropic

client = AsyncAnthropic()


async def main() -> None:
    async with client.messages.stream(
        max_tokens=1024,
        messages=[
            {
                "role": "user",
                "content": "Say hello there!",
            }
        ],
        model="claude-opus-4-7",
    ) as stream:
        async for text in stream.text_stream:
            print(text, end="", flush=True)
        print()

        message = await stream.get_final_message()
        print(message.to_json())


asyncio.run(main())

使用 client.messages.stream(...) 进行流式传输会暴露各种辅助函数,包括累积和 SDK 特定事件。

或者,你可以使用 client.messages.create(..., stream=True),它只返回流中事件的可迭代对象,使用更少的内存(它不会为你构建最终消息对象)。

Token 计数

你可以通过 usage 响应属性查看给定请求的精确使用量:

message = client.messages.create(...)
print(message.usage)
# Usage(input_tokens=25, output_tokens=13)

你也可以在发送请求之前计算 token:

count = client.messages.count_tokens(
    model="claude-opus-4-7", messages=[{"role": "user", "content": "Hello, world"}]
)
print(count.input_tokens)  # 10

工具使用

此 SDK 提供工具使用支持,也称为函数调用。有关更多详情,请参阅与 Claude 的工具使用

工具辅助函数

SDK 提供了将工具定义和运行为纯 Python 函数的辅助函数。@beta_tool 装饰器从函数签名和文档字符串生成工具模式:

import json
from anthropic import Anthropic, beta_tool

client = Anthropic()


@beta_tool
def get_weather(location: str) -> str:
    """Get the weather for a given location.

    Args:
        location: The city and state, for example, San Francisco, CA
    Returns:
        A JSON-encoded string with the location, temperature, and weather condition.
    """
    return json.dumps(
        {
            "location": location,
            "temperature": "68°F",
            "condition": "Sunny",
        }
    )


# 使用 tool_runner 自动处理工具调用
runner = client.beta.messages.tool_runner(
    max_tokens=1024,
    model="claude-opus-4-7",
    tools=[get_weather],
    messages=[
        {"role": "user", "content": "What is the weather in SF?"},
    ],
)
for message in runner:
    print(message)

每次迭代都会发出一个 API 请求。如果 Claude 想要调用给定的工具之一,它会被自动调用,结果会在下一次迭代中直接返回给模型。

消息批处理

此 SDK 在 client.messages.batches 下提供消息批处理 API 支持。

创建批处理

消息批处理接受一个请求数组,其中每个对象都有一个 custom_id 标识符和与标准 Messages API 相同的请求 params

client.messages.batches.create(
    requests=[
        {
            "custom_id": "my-first-request",
            "params": {
                "model": "claude-opus-4-7",
                "max_tokens": 1024,
                "messages": [{"role": "user", "content": "Hello, world"}],
            },
        },
        {
            "custom_id": "my-second-request",
            "params": {
                "model": "claude-opus-4-7",
                "max_tokens": 1024,
                "messages": [{"role": "user", "content": "Hi again, friend"}],
            },
        },
    ]
)

从批处理获取结果

消息批处理处理完成后(由 .processing_status == 'ended' 表示),你可以使用 .batches.results() 访问结果:

import anthropic

client = anthropic.Anthropic()
batch_id = "batch_abc123"
result_stream = client.messages.batches.results(batch_id)
for entry in result_stream:
    if entry.result.type == "succeeded":
        print(entry.result.message.content)

文件上传

对应文件上传的请求参数可以以多种形式传递:

  • PathLike 对象(例如 pathlib.Path
  • (filename, content, content_type) 元组
  • BinaryIO 文件类对象
from pathlib import Path
from anthropic import Anthropic

client = Anthropic()

# 使用文件路径上传
client.beta.files.upload(
    file=Path("/path/to/file"),
)

# 使用字节上传
client.beta.files.upload(
    file=("file.txt", b"my bytes", "text/plain"),
)

异步客户端使用完全相同的接口。如果你传递 PathLike 实例,文件内容会自动异步读取。

错误处理

当库无法连接到 API,或 API 返回非成功状态码(即 4xx 或 5xx 响应)时,会抛出 APIError 的子类:

import anthropic
from anthropic import Anthropic

client = Anthropic()

try:
    message = client.messages.create(
        max_tokens=1024,
        messages=[
            {
                "role": "user",
                "content": "Hello, Claude",
            }
        ],
        model="claude-opus-4-7",
    )
except anthropic.APIConnectionError as e:
    print("The server could not be reached")
    print(e.__cause__)  # 底层异常,可能在 httpx 中抛出
except anthropic.RateLimitError as e:
    print("A 429 status code was received; we should back off a bit.")
except anthropic.APIStatusError as e:
    print("Another non-200-range status code was received")
    print(e.status_code)
    print(e.response)

错误代码如下:

状态码错误类型
400BadRequestError
401AuthenticationError
403PermissionDeniedError
404NotFoundError
409ConflictError
422UnprocessableEntityError
429RateLimitError
>=500InternalServerError
N/AAPIConnectionError

请求 ID

有关调试请求的更多信息,请参阅请求 ID

SDK 中的所有对象响应都提供 _request_id 属性,该属性从 request-id 响应头添加,以便你可以快速记录失败的请求并向 Anthropic 报告。

message = client.messages.create(
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello, Claude"}],
    model="claude-opus-4-7",
)
print(message._request_id)  # 例如 req_018EeWyXxfu5pfWkrYcMdjWG
Note

与使用 _ 前缀的其他属性不同,_request_id 属性是公开的。除非另有文档说明,所有其他 _ 前缀的属性、方法和模块都是私有的。

重试

某些错误默认会自动重试 2 次,带有短暂的指数退避。连接错误(例如,由于网络连接问题)、408 请求超时、409 冲突、429 速率限制和 >=500 内部错误默认都会重试。

你可以使用 max_retries 选项来配置或禁用此功能:

from anthropic import Anthropic

# 为所有请求配置默认值:
client = Anthropic(
    max_retries=0,  # 默认为 2
)

# 或者按请求配置:
client.with_options(max_retries=5).messages.create(
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello, Claude"}],
    model="claude-opus-4-7",
)

超时

请求默认在 10 分钟后超时。你可以使用 timeout 选项配置此值,它接受浮点数或 httpx.Timeout 对象:

import httpx
from anthropic import Anthropic

# 为所有请求配置默认值:
client = Anthropic(
    timeout=20.0,  # 20 秒(默认为 10 分钟)
)

# 更精细的控制:
client = Anthropic(
    timeout=httpx.Timeout(60.0, read=5.0, write=10.0, connect=2.0),
)

# 按请求覆盖:
client.with_options(timeout=5.0).messages.create(
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello, Claude"}],
    model="claude-opus-4-7",
)

超时时会抛出 APITimeoutError

请注意,超时的请求默认会重试两次

长请求

Warning

对于较长时间运行的请求,请考虑使用流式 Messages API

避免在不使用流式传输的情况下设置较大的 max_tokens 值。某些网络可能会在一段时间后断开空闲连接,这可能导致请求失败或超时而无法收到来自 Anthropic 的响应。

如果非流式请求预计超过大约 10 分钟,SDK 会抛出 ValueError。传递 stream=True 或在客户端或请求级别覆盖 timeout 选项会禁用此错误。

非流式请求的预期请求延迟超过超时时间将导致客户端终止连接并在未收到响应的情况下重试。

SDK 设置了 TCP socket keep-alive 选项以减少某些网络上空闲连接超时的影响。可以通过向客户端传递自定义 http_client 选项来覆盖此设置。

自动分页

Claude API 中的列表方法是分页的。你可以使用 for 语法遍历所有页面的项目:

from anthropic import Anthropic

client = Anthropic()

all_batches = []
# 根据需要自动获取更多页面。
for batch in client.messages.batches.list(limit=20):
    all_batches.append(batch)
print(all_batches)

异步迭代:

import asyncio
from anthropic import AsyncAnthropic

client = AsyncAnthropic()


async def main() -> None:
    all_batches = []
    async for batch in client.messages.batches.list(limit=20):
        all_batches.append(batch)
    print(all_batches)


asyncio.run(main())

或者,你可以使用 .has_next_page().next_page_info().get_next_page() 方法进行更精细的页面控制:

first_page = await client.messages.batches.list(limit=20)

if first_page.has_next_page():
    print(f"will fetch next page using these details: {first_page.next_page_info()}")
    next_page = await first_page.get_next_page()
    print(f"number of items we just fetched: {len(next_page.data)}")

# 对于非异步用法,请移除 `await`。

或直接使用返回的数据:

first_page = await client.messages.batches.list(limit=20)

print(f"next page cursor: {first_page.last_id}")
for batch in first_page.data:
    print(batch.id)

# 对于非异步用法,请移除 `await`。

默认头

SDK 自动发送设置为 2023-06-01anthropic-version 头。

如果需要,你可以通过在客户端对象或每个请求上设置默认头来覆盖它。

Warning

覆盖默认头可能导致 SDK 中的类型不正确和其他意外或未定义行为。

from anthropic import Anthropic

# 在客户端上为所有请求设置默认头
client = Anthropic(
    default_headers={"anthropic-version": "My-Custom-Value"},
)

# 或按请求覆盖
client.messages.with_raw_response.create(
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello, Claude"}],
    model="claude-opus-4-7",
    extra_headers={"anthropic-version": "My-Custom-Value"},
)

类型系统

请求参数

嵌套的请求参数是 TypedDict。响应是 Pydantic 模型,它还提供了辅助方法,例如将响应序列化回 JSON(v1v2)。

类型化的请求和响应在编辑器中提供自动完成和文档。如果你想在 VS Code 中看到类型错误以帮助更早地捕获错误,请将 python.analysis.typeCheckingMode 设置为 basic

响应模型

要将 Pydantic 模型转换为字典,请使用辅助方法:

message = client.messages.create(...)

# 转换为 JSON 字符串
json_str = message.to_json()

# 转换为字典
data = message.to_dict()

处理 null 与缺失字段

在响应中,你可以区分显式 null 的字段和未返回(缺失)的字段:

response = client.messages.create(
    model="claude-opus-4-7",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello"}],
)
if response.my_field is None:
    if "my_field" not in response.model_fields_set:
        print("field was not in the response")
    else:
        print("field was null")

高级用法

访问原始响应数据(例如头)

httpx 返回的"原始" Response 可以通过客户端上的 .with_raw_response 属性访问。这对于访问响应头或其他元数据很有用:

from anthropic import Anthropic

client = Anthropic()

response = client.messages.with_raw_response.create(
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello, Claude"}],
    model="claude-opus-4-7",
)

print(response.headers.get("request-id"))
message = (
    response.parse()
)  # 获取 `messages.create()` 本应返回的对象
print(message.content)

这些方法返回 APIResponse 对象。

流式响应体

.with_raw_response 方法在你发出请求时会立即读取完整的响应体。要改为流式传输响应体,请使用 .with_streaming_response,它需要上下文管理器,并且只在你调用 .read().text().json().iter_bytes().iter_text().iter_lines().parse() 时才读取响应体。在异步客户端中,这些是异步方法。

with client.messages.with_streaming_response.create(
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello, Claude"}],
    model="claude-opus-4-7",
) as response:
    print(response.headers.get("request-id"))

    for line in response.iter_lines():
        print(line)

需要上下文管理器以确保响应会被可靠地关闭。

日志记录

SDK 使用标准库 logging 模块。

你可以通过将环境变量 ANTHROPIC_LOG 设置为 debuginfo 来启用日志记录:

export ANTHROPIC_LOG=debug

发送自定义/未文档化的请求

此库针对已文档化 API 的便捷访问进行了类型化。如果你需要访问未文档化的端点、参数或响应属性,该库仍然可以使用。

未文档化的端点

要向未文档化的端点发送请求,你可以使用 client.getclient.post 和其他 HTTP 动词。客户端上的选项(如重试)在发送这些请求时会被遵守。

import httpx

response = client.post(
    "/foo",
    cast_to=httpx.Response,
    body={"my_param": True},
)

print(response.json())

未文档化的请求参数

如果你想显式发送额外参数,可以使用 extra_queryextra_bodyextra_headers 请求选项。

Warning

extra_ 参数会覆盖同名的已文档化参数。出于安全原因,确保这些方法仅用于受信任的输入数据。

未文档化的响应属性

要访问未文档化的响应属性,你可以使用 response.unknown_prop 访问额外字段。你也可以使用 response.model_extra 将 Pydantic 模型上的所有额外字段作为字典获取。

配置 HTTP 客户端

你可以直接覆盖 httpx 客户端 以根据你的用例进行自定义,包括对代理和传输的支持:

import httpx
from anthropic import Anthropic, DefaultHttpxClient

client = Anthropic(
    # 或使用 `ANTHROPIC_BASE_URL` 环境变量
    base_url="http://my.test.server.example.com:8083",
    http_client=DefaultHttpxClient(
        proxy="http://my.test.proxy.example.com",
        transport=httpx.HTTPTransport(local_address="0.0.0.0"),
    ),
)

你也可以使用 with_options() 按请求自定义客户端:

client.with_options(http_client=DefaultHttpxClient(...))
Note

使用 DefaultHttpxClientDefaultAsyncHttpxClient 而不是原始的 httpx.Clienthttpx.AsyncClient,以确保保留 SDK 的默认配置(超时、连接限制等)。

管理 HTTP 资源

默认情况下,当客户端被垃圾回收时,库会关闭底层 HTTP 连接。如果需要,你可以使用 .close() 方法手动关闭客户端,或使用退出时关闭的上下文管理器。

from anthropic import Anthropic

with Anthropic() as client:
    message = client.messages.create(...)

# HTTP 客户端自动关闭

测试功能

测试功能在正式发布前可用,以获取早期反馈和测试新功能。你可以在构建 Claude 概述中查看 Claude 所有功能和工具的可用性。

你可以通过客户端的 beta 属性访问大多数测试 API 功能。要启用特定的测试功能,你需要在创建消息时将适当的测试头添加到 betas 字段中。

例如,要使用 Files API

from anthropic import Anthropic

client = Anthropic()

response = client.beta.messages.create(
    model="claude-opus-4-7",
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Please summarize this document for me."},
                {
                    "type": "document",
                    "source": {
                        "type": "file",
                        "file_id": "file_abc123",
                    },
                },
            ],
        },
    ],
    betas=["files-api-2025-04-14"],
)

平台集成

Note

有关带有代码示例的详细平台设置指南,请参阅:

所有五个客户端类都包含在基础 anthropic 包中:

提供商客户端额外依赖
Bedrockfrom anthropic import AnthropicBedrockMantlepip install "anthropic[bedrock]"
Bedrock(bedrock-runtime 路径)from anthropic import AnthropicBedrockpip install "anthropic[bedrock]"
Vertex AIfrom anthropic import AnthropicVertexpip install "anthropic[vertex]"
Foundryfrom anthropic import AnthropicFoundry
Claude Platform on AWSfrom anthropic import AnthropicAWSpip install "anthropic[aws]"

AnthropicAWS 客户端处于测试阶段。向构造函数传递 workspace_id 或设置 ANTHROPIC_AWS_WORKSPACE_ID 环境变量。

新项目请使用 AnthropicBedrockMantleAnthropicBedrock 保留给使用 Bedrock InvokeModel API 的现有应用程序。

语义化版本控制

此包通常遵循 SemVer 约定,但某些不向后兼容的更改可能作为次要版本发布:

  1. 仅影响静态类型而不破坏运行时行为的更改。
  2. 对库内部的更改,这些更改在技术上是公开的,但不打算或不对外部使用进行文档化。
  3. 在实践中预计不会影响绝大多数用户的更改。

确定已安装的版本

如果你已升级到最新版本但没有看到预期的新功能,你的 Python 环境可能仍在使用旧版本。你可以使用以下方法确定运行时使用的版本:

import anthropic

print(anthropic.__version__)

附加资源