← 所有文章

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

TL;DR

  • 使用pip install --upgrade "anthropic>=1,<2"升級,然後執行pyright或mypy:遷移指南指出,型別檢查器幾乎能標記出每一處破壞性變更,這等於一份現成的檢查清單。1
  • Python 3.10是新的最低版本。 環境的其他部分無需更動;SDK仍同時支援Pydantic v1與v2。1
  • httpx變成了httpx2。 像timeout=30.0這樣的一般值照常可用;交給用戶端的httpx物件必須來自httpx2,而那些對httpx打補丁的函式庫,在您呼叫httpx2.alias_httpx()之前將看不到SDK的請求。1
  • 已移除:Text Completions、取樣參數,以及output_format中的schema字典。 client.completions.create()、temperature、top_p與top_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或更新版本
httpx被httpx2取代 傳入舊的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_PROMPT、AI_PROMPT不復存在 改用client.messages.create()
移除已棄用的參數 temperature、top_p、top_k引發TypeError;output_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 MessageStream;isinstance(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.Timeout、anthropic.DefaultHttpxClient、anthropic.DefaultAsyncHttpxClient、anthropic.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整合、respx、pytest-httpx或vcrpy,請在進入點的開頭呼叫一次httpx2.alias_httpx()。它必須在任何程式碼匯入httpx之前執行(否則會引發RuntimeError),而且指南將它保留給應用程式使用:函式庫絕不應代替其使用者呼叫它。1 在pytest之下,指南提出的最不具侵入性的做法是一個提早載入的外掛,也就是一個呼叫httpx2.alias_httpx()的tests/_alias_httpx.py模組,並在pyproject.toml中註冊,讓它先於respx、pytest-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.response、APIConnectionError.request、原始回應上的response.http_response/.headers/.url,以及您自訂的http_client事件hook所收到的response=引數,全都是httpx2物件。它們帶有的屬性與先前完全相同,因此只有那些明確寫出httpx.Response/httpx.Request/httpx.Headers的isinstance檢查與型別註解需要改為httpx2。1 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 不變 不變

然後是已移除的參數。 目前的模型不使用temperature、top_p或top_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字典現在會引發TypeError。1

最後處理Bedrock。 AnthropicBedrock與AsyncAnthropicBedrock過去會記錄一則警告並回退到us-east-1;現在它們會在建構時引發ValueError。區域的解析順序是:先看aws_region=,再看AWS_REGION/AWS_DEFAULT_REGION,最後看指定aws_profile所對應的boto3工作階段。1 SDK現在也會略過過去會產出的未知Bedrock串流事件;目前唯一已知的案例是amazon-bedrock-invocationMetrics。1

如何使用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,與指南一致:該重新匯出已經指向httpx2。13

手動遷移 /claude-api upgrade python
所需條件 遷移指南、pyright或mypy 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都會解析為httpx2。1

我還能對較舊的模型傳入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.Proxy。1

給使用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)」。 ↩↩↩↩↩↩

相關文章

我的代理程式看不見的那五個技能

我的 Claude Code 設定裡有五個技能,抵達模型時只剩下一個名稱。description 的字元預算會默默丟掉路由資訊,而且不會給出任何警告。

13 分鐘閱讀

Ralph 迴圈:我如何在夜間運行自主 AI 代理

我建構了一套自主代理系統,搭配停止鉤子、生成預算與檔案系統記憶體。以下是失敗經驗與真正能交付程式碼的方法。

9 分鐘閱讀