← 所有文章

Anthropic Python SDK 1.0迁移:手动操作还是使用Claude Code

来自指南: Claude Code Comprehensive Guide

将Python项目从anthropic 0.x迁移到1.0,只需一条安装命令pip install --upgrade "anthropic>=1,<2",然后逐项处理一份固定的破坏性变更清单:HTTP层现在运行在httpx2之上,异步.with_raw_response的读取方法变成了协程,Text Completions以及temperature/top_p/top_k参数已被移除,AnthropicBedrock在未指定区域时拒绝构造。1 您可以对照官方迁移指南手动逐项处理,也可以让Claude Code通过/claude-api upgrade python完成修改,然后审阅diff。13 Claude Code的发布说明将其称为/claude-api upgrade;迁移指南加上了python参数,这才是实际要输入的形式。13 两条路线殊途同归,下文分别介绍,内容以anthropic 1.0.0为准(2026年8月20日发布于PyPI;8月25日核对)。2 {.answer-block}

TL;DR

  • 使用pip install --upgrade "anthropic>=1,<2"升级,然后运行pyrightmypy:迁移指南指出,类型检查器几乎能标记出每一处破坏性变更,这就是一份现成的检查清单。1
  • Python 3.10是新的最低版本。 环境的其他方面无需改动;SDK仍然同时支持Pydantic v1和v2。1
  • httpx变成了httpx2timeout=30.0这样的普通值继续可用;传给客户端的httpx对象必须来自httpx2,而那些给httpx打补丁的库在您调用httpx2.alias_httpx()之前将看不到SDK的请求。1
  • 已移除:Text Completions、采样参数,以及output_format中的schema字典。 client.completions.create()temperaturetop_ptop_k均已移除;schema字典改为放入output_config={"format": {...}}1
  • Claude Code v2.1.239(2026年8月21日)新增了/claude-api upgrade,用于将Python项目从anthropic 0.x迁移到1.x。3 对待它的输出要像对待任何自动化迁移一样:提交之前先阅读diff。

升级到anthropic 1.0时会有哪些破坏性变更?

六项变更占据了大部分分量;我将指南中的快速参考浓缩为这六项,较小的移除项随后列出。1 其中最大的一项原因很简单:SDK的HTTP层从已不再积极维护的httpx迁移到了httpx2,后者是由Pydantic团队维护的API兼容分支,类相同、行为相同,并包含安全修复。1

变更 表现形式 修复方法
不再支持Python 3.9 低于3.10的版本不受支持 升级到Python 3.10或更高版本
httpxhttpx2取代 传入旧的httpx.Client时在构造阶段抛出TypeError;监测工具失效 import httpx2 as httpx;为追踪和mock调用httpx2.alias_httpx()
.with_raw_response返回APIResponse 异步的parse()/text()/json()/read()需要await.text.content变成了方法 异步端使用await response.parse()/await response.text();同步端使用response.text()/response.read()
移除Text Completions client.completions.create()HUMAN_PROMPTAI_PROMPT不复存在 改用client.messages.create()
移除已弃用的参数 temperaturetop_ptop_k抛出TypeErroroutput_format中的schema字典同样抛错 删除它们(或对较旧模型使用extra_body);output_config={"format": {...}}
Bedrock必须指定区域 未指定区域时AnthropicBedrock()抛出ValueError 传入aws_region=或设置AWS_REGION

此外还有一些较小的移除项和一处行为变更,每一项都有对应的替代方案:1

已移除或已变更 替代方案
messages.parse(stream=True)(从未真正可用) messages.stream(..., output_format=Order),然后使用stream.get_final_message().parsed_output
tool_runner(compaction_control=...) 服务端压缩:betas=["compact-2026-01-12"]加上一个context_management字典
client.get/post/put/patch/delete上以原始bytes作为body= content=b"...",并在同一调用中加上cast_to=httpx2.Response
对消息流使用isinstance(x, Stream) from anthropic.lib.streaming import MessageStreamisinstance(x, MessageStream)
bytes类型的header值 对其调用.decode();header值必须是str
BetaBase64PDFBlockParam BetaRequestDocumentBlockParam
anthropic.Transport/ProxiesTypes httpx2.BaseTransport/httpx2.Proxy/httpx2.AsyncBaseTransport
agent_toolset.READ_MAX_BYTES DEFAULT_MAX_FILE_BYTES
同一header名称的两种大小写写法被作为两个header发送 后出现的条目会替换先出现的,包括SDK自行设置的header;若两者都需要,请自行合并值

最后一行的影响不易察觉:default_headers={"USER-AGENT": "my-app/1.0"}现在会替换SDK自身的User-Agent,而不是两者同时发送。1

如何手动迁移?

三个步骤,按顺序进行:升级,让类型检查器找出破坏之处,然后按类别修复。

pip install --upgrade "anthropic>=1,<2"
pyright   # or mypy

先修复httpx的导入,因为它们的报错最为显眼。SDK自身的重新导出(anthropic.Timeoutanthropic.DefaultHttpxClientanthropic.DefaultAsyncHttpxClientanthropic.DefaultAioHttpClient)已经指向httpx2并继续可用;只有直接从httpx构建的对象才需要别名。1

# Before
import httpx
from anthropic import Anthropic, DefaultHttpxClient

client = Anthropic(
    timeout=httpx.Timeout(60.0, connect=5.0),
    http_client=DefaultHttpxClient(
        proxy="http://my.proxy.example",
        transport=httpx.HTTPTransport(local_address="0.0.0.0"),
    ),
)

# After
import httpx2 as httpx  # or `import httpx2` and rename the references
from anthropic import Anthropic, DefaultHttpxClient

client = Anthropic(
    timeout=httpx.Timeout(60.0, connect=5.0),
    http_client=DefaultHttpxClient(
        proxy="http://my.proxy.example",
        transport=httpx.HTTPTransport(local_address="0.0.0.0"),
    ),
)

如果应用中的其他代码仍然导入httpx并与SDK共享客户端或异常类型,或者您使用了OpenTelemetry的HTTPXClientInstrumentor、Sentry的httpx集成、respxpytest-httpxvcrpy,请在入口文件的开头调用一次httpx2.alias_httpx()。它必须在任何代码导入httpx之前运行(否则会抛出RuntimeError),而且指南将其限定为应用程序专用:库绝不应代替其用户调用它。1 在pytest环境下,指南给出的侵入性最小的方案是一个早期加载的插件,即一个调用httpx2.alias_httpx()tests/_alias_httpx.py模块,并在pyproject.toml中注册,使其先于respxpytest-httpx和您的测试模块加载:1

# tests/_alias_httpx.py
import httpx2

httpx2.alias_httpx()  # makes `import httpx` / `import httpcore` resolve to httpx2 / httpcore2
# pyproject.toml
[tool.pytest.ini_options]
addopts = "-p tests._alias_httpx"
pythonpath = ["."]

响应和错误对象现在都是httpx2类型。 这次包的更换不仅影响您传入的内容,也影响SDK返回的内容。APIStatusError.responseAPIConnectionError.request、原始响应上的response.http_response/.headers/.url,以及自定义http_client事件hook接收到的response=参数,全都是httpx2对象。它们携带的属性与之前完全相同,因此只有那些明确写出httpx.Response/httpx.Request/httpx.Headersisinstance检查和类型注解需要改为httpx21 isinstance这种情况值得再看一眼。指南只说这类检查必须改过来;1 而它们之所以重要,是因为除非httpx2.alias_httpx()已经让httpx解析为httpx2,否则像isinstance(err.response, httpx.Response)这样针对旧包的检查会静默返回False而不抛出任何异常,处理程序随即跳过对应的分支。

# Before
def log_failure(err: anthropic.APIStatusError) -> None:
    response: httpx.Response = err.response
    print(response.status_code, response.headers.get("request-id"))


# After
def log_failure(err: anthropic.APIStatusError) -> None:
    response: httpx2.Response = err.response
    print(response.status_code, response.headers.get("request-id"))

接下来是原始响应的读取方法。 .with_raw_response过去对两种客户端都返回LegacyAPIResponse;现在它返回的是.with_streaming_response早已在用的APIResponse/AsyncAPIResponse类。1

LegacyAPIResponse(之前) APIResponse(同步,之后) AsyncAPIResponse(异步,之后)
response.parse() response.parse() await response.parse()
response.text response.text() await response.text()
response.content response.read() await response.read()
response.http_response.json() response.json() await response.json()
.headers.status_code.url.request_id 不变 不变

然后是已移除的参数。 当前的模型不再使用temperaturetop_ptop_k,因此生成的方法不再接受它们。早于这一变更的模型仍然可以通过extra_body识别这些参数,SDK会将其原样合并进请求JSON。1

# Before
client.messages.create(..., model="claude-sonnet-4-6", temperature=0.2)

# After
client.messages.create(..., model="claude-sonnet-4-6", extra_body={"temperature": 0.2})

schema字典的迁移方式相同:beta.messages.create()上的output_format={"type": "json_schema", "schema": ...}变为output_config={"format": {"type": "json_schema", "schema": ...}}parse()/stream()/count_tokens()/tool_runner()这些辅助方法在传入类时仍使用output_format=Order,而在那里传入schema字典现在会抛出TypeError1

最后处理Bedrock。 AnthropicBedrockAsyncAnthropicBedrock过去会记录一条警告并回退到us-east-1;现在它们会在构造时抛出ValueError。区域的解析顺序为:先看aws_region=,再看AWS_REGION/AWS_DEFAULT_REGION,最后看指定aws_profile对应的boto3会话。1 SDK现在还会跳过过去会产出的未知Bedrock流式事件;目前已知的唯一案例是amazon-bedrock-invocationMetrics1

如何使用Claude Code迁移?

迁移指南本身就点明了这条捷径:在项目中运行/claude-api upgrade python,然后审阅diff。1 该命令随2026年8月21日发布的Claude Code v2.1.239落地;发布说明全文如下:“Added /claude-api upgrade to migrate Python projects from anthropic 0.x to 1.x, and updated the skill’s Python reference for 1.x (timeouts use anthropic.Timeout, not httpx.Timeout)”(大意:新增/claude-api upgrade用于将Python项目从anthropic 0.x迁移到1.x,并将该skill的Python参考更新至1.x,超时设置使用anthropic.Timeout而非httpx.Timeout)。3

这句话就是全部已验证的信息:一条/claude-api skill命令,把项目中的0.x用法迁移到1.x。关于它如何决定所做的修改,我没有找到更多文档,所以就把它当作它本来的样子:一次由您来审阅diff的自动化迁移。更新到v2.1.239或更高版本(执行claude update,或参阅安装与更新参考),在项目根目录打开一个会话,然后运行:

/claude-api upgrade python

然后逐块阅读diff,运行类型检查器,再运行测试套件,就像审阅贡献者提交的迁移PR一样。类型检查这一步在这里比平时更重要,因为几乎每一处1.0的破坏性变更都是类型错误,而类型检查并不在乎修改出自谁手。1 发布说明特别点出的一个细节,即使用anthropic.Timeout而非httpx.Timeout,与指南一致:该重新导出已经指向httpx213

手动迁移 /claude-api upgrade python
所需条件 迁移指南、pyrightmypy Claude Code v2.1.239或更高版本
由谁修改 您自己 Claude Code,在您的工作树中
审阅步骤 类型检查器加测试 审阅diff,然后类型检查器加测试
我的建议 改动面小,或有大量自定义httpx接线 调用点众多且改动机械化

初次接触Claude Code?快速入门介绍了第一次会话,完整指南则涵盖内置skills和slash命令。

常见问题

anthropic 1.0是否仍然支持Pydantic v1?

是的。SDK仍然同时支持Pydantic v1和v2;Python 3.10的最低版本要求是唯一的环境变化。1

为什么升级后我的OpenTelemetry或respx配置看不到SDK的请求了?

这些库给httpx打补丁,而SDK已不再使用httpx。请在任何代码导入httpx之前调用httpx2.alias_httpx();此后整个进程中的import httpx都会解析为httpx21

我还能向较旧的模型传递temperature吗?

可以,通过extra_body={"temperature": 0.2}传递,SDK会将其合并进请求JSON。对于messages.batches.create(),请将该键直接放入请求的params字典中。1

tool_runner中的客户端压缩被什么取代了?

服务端压缩:向tool_runner()传入betas=["compact-2026-01-12"]context_management={"edits": [{"type": "compact_20260112", "trigger": {"type": "input_tokens", "value": 100_000}}]}。在指南的示例中,这一对参数取代了compaction_control={"enabled": True, "context_token_threshold": 100_000};触发阈值必须至少为50,000个token。1

我需要从requirements中移除httpx_aiohttp吗?

需要。anthropic[aiohttp]http_client=DefaultAioHttpClient()的用法与之前相同,但该extra不再安装httpx_aiohttp,因为它现在已随SDK内置。1

要点回顾

对于应用开发者: - 锁定"anthropic>=1,<2",运行类型检查器,然后按类别依次修复:httpx导入、原始响应的await、已移除的参数、Bedrock区域。1 - 如果进程中还有其他代码与SDK共享httpx对象或对httpx进行监测埋点,请把httpx2.alias_httpx()放在入口文件的最前几行。1

对于库维护者: - 绝不要在库内部调用httpx2.alias_httpx();改用导入别名(import httpx2 as httpx)。1 - 弃用anthropic.Transport/ProxiesTypes,改用httpx2.BaseTransport/httpx2.Proxy1

对于使用Claude Code的团队: - 更新到v2.1.239或更高版本,在项目根目录运行/claude-api upgrade python;审阅diff,然后在提交前运行类型检查器和测试。13

参考资料


  1. Anthropic,“Migrating to v1”,anthropic-sdk-python MIGRATION.md:升级命令、Python 3.10最低版本、httpx2.with_raw_response类、已移除的API和参数、Bedrock变更,以及指向/claude-api upgrade python的说明。2026年8月25日核实。 

  2. PyPI,anthropic:1.0.0于2026年8月20日发布;截至2026年8月25日仍为最新版本。 

  3. Anthropic,Claude Code v2.1.239发布说明,2026年8月21日:“Added /claude-api upgrade to migrate Python projects from anthropic 0.x to 1.x, and updated the skill’s Python reference for 1.x (timeouts use anthropic.Timeout, not httpx.Timeout)”。 

相关文章

The Skills My Agent Could Not See

Five skills in my Claude Code setup reached the model as bare names. The description budget drops routing information si…

14 分钟阅读

Ralph循环:我如何在夜间运行自主AI代理

我构建了一个使用停止钩子、生成预算和文件系统记忆的自主代理系统。以下是失败经验以及真正能交付代码的方法。

3 分钟阅读