Claude Platform Docs
CLI、SDK 和库客户端 SDK

Python SDK

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

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

安装

pip install anthropic

如需特定平台的集成或更好的异步性能,请使用附加依赖进行安装:

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

# 用于 Google Cloud 支持
pip install "anthropic[vertex]"

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

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

# 用于通过 aiohttp 提升异步性能
pip install "anthropic[aiohttp]"

要求

需要 Python 3.10 或更高版本。如果您正在从 SDK 的 0.x 版本升级,请参阅 v1 迁移指南了解破坏性变更列表。

用法

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-5",
)

for block in message.content:
    if block.type == "text":
        print(block.text)

有关包括 Workload Identity Federation(工作负载身份联合)在内的身份验证选项,请参阅身份验证。如果您的 API 密钥是可访问多个工作区的个人密钥或服务账户密钥,请在 anthropic-workspace-id 请求头中设置工作区 ID;选择工作区展示了此 SDK 的按请求设置选项。

异步用法

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-5",
    )
    print(message.content)


asyncio.run(main())

使用 aiohttp 获得更好的并发性能

为了提升异步性能,您可以使用 aiohttp HTTP 后端来替代默认的 httpx2

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-5",
        )
        print(message.content)


asyncio.run(main())

流式传输响应

SDK 支持使用 "Server-Sent Events"(服务器发送事件),即 SSE 进行流式传输响应。

client = Anthropic()

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

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

client = AsyncAnthropic()

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

流式传输辅助工具

SDK 还提供了流式传输辅助工具,它们使用上下文管理器,并提供对累积文本和最终消息的访问:

async def main() -> None:
    async with client.messages.stream(
        max_tokens=1024,
        messages=[
            {
                "role": "user",
                "content": "Say hello there!",
            }
        ],
        model="claude-opus-5",
    ) 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),它只返回流中事件的可迭代对象,并且占用更少的内存(它不会为您构建最终的消息对象)。

令牌计数

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

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

您也可以在发出请求之前计算令牌数:

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

工具使用

此 SDK 支持 tool use(工具使用),也称为函数调用。更多详情请参阅使用 Claude 进行工具使用

工具辅助工具

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

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-5",
    tools=[get_weather],
    messages=[
        {"role": "user", "content": "What is the weather in SF?"},
    ],
)
for message in runner:
    print(message)

每次迭代都会发出一个 API 请求。如果响应中包含对给定工具之一的调用,该工具会被自动调用,其结果会在下一次迭代中直接返回给模型。

消息批处理

此 SDK 在 client.messages.batches 下提供对批处理的支持。

创建批处理

Message Batches 接受一个请求数组,其中每个对象都有一个 custom_id 标识符,以及与标准 Messages API 相同的请求 params

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

获取批处理结果

一旦 Message Batch 处理完成(由 .processing_status == 'ended' 表示),您就可以使用 .batches.results() 访问结果:

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.files.upload(
    file=Path("/path/to/file"),
)

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

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

错误处理

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

import anthropic

try:
    message = client.messages.create(
        max_tokens=1024,
        messages=[
            {
                "role": "user",
                "content": "Hello, Claude",
            }
        ],
        model="claude-opus-5",
    )
except anthropic.APIConnectionError as e:
    print("The server could not be reached")
    print(e.__cause__)  # an underlying Exception, likely raised within httpx2
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-5",
)
print(message._request_id)  # e.g., req_018EeWyXxfu5pfWkrYcMdjWG

重试

某些错误默认会自动重试 2 次,并采用短暂的指数退避。连接错误(例如由于网络连接问题)、408 Request Timeout、409 Conflict、429 Rate Limit 以及 >=500 的内部错误默认都会重试。

您可以使用 max_retries 选项来配置或禁用此行为:

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

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

超时

默认情况下,请求在 10 分钟后超时。您可以通过 timeout 选项进行配置,该选项接受一个浮点数或 httpx2.Timeout 对象:

import httpx2
from anthropic import Anthropic

# 为所有请求配置默认值:
client = Anthropic(
    timeout=20.0,  # 20 seconds (default is 10 minutes)
)

# 更细粒度的控制:
client = Anthropic(
    timeout=httpx2.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-5",
)

超时时,SDK 会抛出 APITimeoutError

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

长时间请求

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

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

对于非流式传输请求,如果预期请求延迟超过超时时间,客户端将终止连接并在未收到响应的情况下重试。

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

自动分页

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

client = Anthropic()

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

异步迭代:

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 请求头。

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

# 为客户端上的所有请求设置默认请求头
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-5",
    extra_headers={"anthropic-version": "My-Custom-Value"},
)

类型系统

请求参数

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

类型化的请求和响应可在您的编辑器中提供自动补全和文档。如果您希望在 VS Code 中看到类型错误以便更早发现 bug,请将 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-5",
    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")

高级用法

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

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

client = Anthropic()

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

print(response.headers.get("request-id"))
message = (
    response.parse()
)  # get the object that `messages.create()` would have returned
print(message.content)

这些方法返回一个 APIResponse 对象。在异步客户端上,它们返回 AsyncAPIResponse,并且 .parse().read().text().json() 必须使用 await。

流式传输响应体

.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-5",
) 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 httpx2

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

print(response.json())

未文档化的请求参数

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

未文档化的响应属性

要访问未文档化的响应属性,您可以像 response.unknown_prop 这样访问额外字段。您还可以通过 response.model_extra 以字典形式获取 Pydantic 模型上的所有额外字段。

配置 HTTP 客户端

SDK 使用 httpx2 发送请求,它是 httpx 的一个 API 兼容分支。要自定义 HTTP 客户端(包括代理和传输),请将您自己的 httpx2 客户端作为 http_client 传入:

import httpx2
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=httpx2.HTTPTransport(local_address="0.0.0.0"),
    ),
)

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

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

httpx 本身进行补丁的追踪和模拟工具(例如 OpenTelemetry 的 HTTPXClientInstrumentor、Sentry 的 httpx 集成、respxpytest-httpx)默认情况下看不到 SDK 的请求。要使用它们,请在启动时、在任何代码导入 httpx 之前调用一次 httpx2.alias_httpx()。这会使整个进程中的 import httpx 解析为 httpx2

管理 HTTP 资源

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

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

# HTTP 客户端会自动关闭

Beta 功能

Beta 功能在正式发布之前提供,以便获取早期反馈并测试新功能。您可以在使用 Claude 构建概览中查看 Claude 所有能力和工具的可用性。

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

例如,要启用上下文编辑

client = Anthropic()

response = client.beta.messages.create(
    model="claude-opus-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello, Claude"}],
    betas=["context-management-2025-06-27"],
)

平台集成

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

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

AnthropicAWS 客户端处于 beta 阶段。请将 workspace_id 传递给构造函数,或设置 ANTHROPIC_AWS_WORKSPACE_ID 环境变量。

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

语义化版本

此包总体上遵循 SemVer 约定,但某些向后不兼容的变更可能会作为次要版本发布:

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

确定已安装的版本

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

print(anthropic.__version__)

其他资源

Was this page helpful?