anthropic の Python SDK が 1.0.0 になりました。移行ガイドで手が止まります。
The SDK's HTTP layer moved from
httpx, which is no longer actively maintained, tohttpx2- an API-compatible fork maintained by the Pydantic team.
(SDK の HTTP 層をhttpxからhttpx2へ移行した。httpx はもはや活発に保守されていない。 httpx2 は Pydantic チームが保守する API 互換のフォークである)
httpx が保守されていない。 広く使われているライブラリです。
実測すると、書き換えは1行で済みました。 ただし途中で「動いているのに壊れている」状態を踏み、
「保守されていない」という記述自体も、裏を取ると少し違いました。
検証環境: Windows 10 / Python 3.12.3 / anthropic 0.125.0 → 1.0.0
まず結果
| 検証 | 結果 |
|---|---|
| 0.125.0 が入れる HTTP 層 | httpx 0.28.1 |
| 1.0.0 が入れる HTTP 層 | httpx2 2.12.0 |
| 上げた直後 | httpx が残り、古いコードが動く |
その httpx の Required-by
|
空(誰も依存していない残骸) |
| httpx を消すと | ModuleNotFoundError |
/claude-api upgrade python |
1行だけ書き換え |
| httpx 本家の開発版 | 2026-08-21 に出ている(保守終了ではない) |
上げても、古いコードが動いてしまう
0.x で典型的なコードを書きます。
import httpx
from anthropic import Anthropic, DefaultHttpxClient
client = Anthropic(
timeout=httpx.Timeout(60.0, connect=5.0),
http_client=DefaultHttpxClient(
transport=httpx.HTTPTransport(local_address="0.0.0.0"),
),
)
1.0.0 に上げます。移行ガイドはこう書いています。
Anything you construct from
httpxand pass to the client must now come fromhttpx2.
(httpxから生成してクライアントに渡すものは、すべてhttpx2由来でなければならない)
壊れるはずです。動きました。
client OK: Anthropic
timeout : Timeout(connect=5.0, read=60.0, write=60.0, pool=60.0)
依存を見て分かりました。
anthropic 1.0.0
httpx 0.28.1 ← 残っている
httpx2 2.12.0 ← 追加された
httpx が残っています。 そのおかげで import httpx が通っていただけでした。
残った httpx は誰も必要としていない
なぜ残るのか調べました。
Version: 0.28.1
Required-by:
Required-by が空。 どのパッケージも依存していない、0.x 時代の残骸でした。消します。
pip uninstall -y httpx
Traceback (most recent call last):
File "C:\hx\app.py", line 1, in <module>
import httpx
ModuleNotFoundError: No module named 'httpx'
ここで壊れます。
直後は動くので、移行できたと思ってしまいます。 実際は残骸に依存しているだけで、
環境を作り直した瞬間(CI、Docker、pip install のやり直し)に落ちます。
クリーンな venv に 1.0.0 を入れて確認しました。 httpx2 だけが入り、httpx は入りません。
書き換えは1行だった
Claude Code 2.1.239 の移行コマンドを使いました。
claude -p '/claude-api upgrade python'
差分がこれです。
-import httpx
+import httpx2 as httpx
1行だけでした。Timeout も HTTPTransport も呼び出し側はそのままです。
移行後、httpx が無い状態で実行します。
client OK: Anthropic
timeout : Timeout(connect=5.0, read=60.0, write=60.0, pool=60.0)
通りました。 import httpx2 as httpx と書けば、以降のコードを触らずに済みます。
「保守されていない」の裏を取る
anthropic の書き方は他より強めでした。
| 出典 | 表現 |
|---|---|
| anthropic の MIGRATION.md |
no longer actively maintained(もはや活発に保守されていない) |
| httpx2 本家の README |
With HTTPX itself seeing limited activity recently(活動が限定的になっている) |
httpx2 側は「利用者が確実に保守される移行先を持てるよう、Pydantic が維持を引き受ける」としています。
リリース履歴も見ました。
| 最新 | 公開日 | |
|---|---|---|
| httpx(安定版) | 0.28.1 | 2024-12-06 |
| httpx(開発版) | 1.0.dev5 | 2026-08-21 |
| httpx2 | 2.12.0 | 2026-08-18 |
安定版は1年8か月前ですが、開発版は今週も出ています。 本家 README にも保守終了の記述はありません。
「保守終了」と読むのは行き過ぎでした。実態は「安定版の更新が長く止まっている」で、その評価が分かれています。
自分の環境を確認する
pip show httpx | grep -E "Version|Required-by"
Required-by が空なら残骸です。消して動くか試してください。
依存されているなら、そのパッケージの移行待ちになります。
まとめ
-
anthropic1.0.0 から HTTP 層が httpx2(Pydantic が維持を引き継いだフォーク)に変わった - ただし「httpx は保守終了」は言い過ぎ。安定版は 2024-12 で止まっているが、開発版は 2026-08-21 に出ている
- 上げた直後は古いコードが動いてしまう。 0.x 時代の httpx が残骸として残っているため
-
その httpx は
Required-byが空。 消すとModuleNotFoundError。
クリーンな環境では入らないので、手元だけ動く状態になりやすい - 書き換えは
import httpx2 as httpxの1行で済んだ。TimeoutもHTTPTransportもそのまま使える - 破壊的変更は3つ。Python 要件が 3.9 → 3.10、HTTP 層、
Timeout(anthropic.Timeoutが実在) - Claude Code 2.1.239 の
/claude-api upgrade pythonが自動でやってくれる
(Git Bash ではMSYS_NO_PATHCONV=1が要る。/claude-apiがパスに変換される)
anthropic を使っていなくても、pip show httpx は一度見ておく価値があります。
参考
- anthropic-sdk-python の MIGRATION.md
- pydantic/httpx2
- Claude Code changelog — 2.1.239 の項
- 検証環境: Windows 10 / Python 3.12.3 / anthropic 0.125.0 → 1.0.0 / httpx2 2.12.0
※ 引用は原文と日本語訳を併記しています。訳は読みやすさを優先しているので、正確な表現は原典をご確認ください。
関連記事
- Claude Code の設定でハマる箇所まとめ — 同じく Windows で踏んだ落とし穴をまとめました
-
14MBのAIモデルは本当に動いた — 同じく
pipまわりで詰まった話
JQITのエンジニアの95%以上は未経験からの採用です。
よければコーポレートサイトにも遊びに来てください。
エンジニア採用も行っています。もしご興味あれば覗いてみてください。
▶ 採用サイト