Anthropic Python SDK 1.0遷移:手動處理或交給Claude Code
將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"升級,然後執行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專案從anthropic0.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
參考資料
-
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日核實。 ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Anthropic,Claude Code v2.1.239版本說明,2026年8月21日:「Added
/claude-api upgradeto migrate Python projects fromanthropic0.x to 1.x, and updated the skill’s Python reference for 1.x (timeouts useanthropic.Timeout, nothttpx.Timeout)」。 ↩↩↩↩↩↩