← 所有文章

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相容的分支(fork),類別相同、行為相同,並納入了安全性修正。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型別的標頭值 對其呼叫.decode();標頭值必須是str
BetaBase64PDFBlockParam BetaRequestDocumentBlockParam
anthropic.Transport/ProxiesTypes httpx2.BaseTransport/httpx2.Proxy/httpx2.AsyncBaseTransport
agent_toolset.READ_MAX_BYTES DEFAULT_MAX_FILE_BYTES
同一個標頭名稱的兩種大小寫寫法被當成兩個標頭送出 後出現的項目會取代先出現的,包括SDK自行設定的標頭;若兩者都需要,請自行合併值

最後一列的影響不易察覺: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與斜線指令。

常見問題

anthropic 1.0是否仍支援Pydantic v1?

是的。SDK仍同時支援Pydantic v1與v2;Python 3.10的最低版本要求是唯一的環境變化。1

為什麼升級後我的OpenTelemetry或respx設定看不到SDK的請求了?

這些函式庫對httpx打補丁,而SDK已不再使用它。請在任何程式碼匯入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 分鐘閱讀