Claude Media
claude-agent-sdkのwheelが公開されず、pip installに失敗する原因と対処法

claude-agent-sdkのwheelが公開されず、pip installに失敗する原因と対処法

claude-agent-sdkのPyPI公開が一部失敗しwheelが欠けると、uvやpipのインストールが止まります。2026年3月の障害と9月の再発を、PyPIの実際のファイル一覧と切り分け手順で追います。

「wheel for the current platform」エラーの内容

pip install claude-agent-sdk や uv add claude-agent-sdk が、特定のバージョンだけ「現在のプラットフォーム向けのwheelが無い」というエラーで失敗することがあります。原因は手元の環境ではありません。PyPIへの公開ジョブが途中で止まり、一部のプラットフォームのファイルしかアップロードされていない状態です。2026年3月のv0.1.49で実際に起きました。

uvでは、Linux環境で次のように止まります。

uv pip install claude-agent-sdk==0.1.49
error: Distribution `claude-agent-sdk==0.1.49 @ registry+https://pypi.org/simple`
can't be installed because it
doesn't have a source distribution or wheel for the current platform
hint: You're on Linux (`manylinux_2_39_x86_64`), but `claude-agent-sdk`
(v0.1.49) only has wheels for the following platform: `macosx_11_0_arm64`

pipでは表示が変わります。プラットフォーム不一致だけが原因なら、No matching distribution found for claude-agent-sdk==0.1.49 と出ます。from versions には他のバージョンが並び、指定した0.1.49だけが入っていません。

当時のv0.1.49には、macOS ARM64のwheelしかありませんでした。ソース配布物(sdist)も、Linux・Windows・macOS x86_64向けの4つのwheelも欠けていたため、ソースからのビルドに逃げる道もありません。issue #687の報告では、影響を受けたのはLinux(x86_64とaarch64)、Windows、macOS x86_64です。

被害はCI/CDで大きく出ました。バージョンを固定せず最新版に追従する構成では、デプロイのタイミングで突然ビルドが落ちます。報告者も、本番デプロイがこのエラーで失敗したと書いています。

原因はPyPIの容量上限で公開ジョブが止まったこと

issue #687の時点では、twine upload の2番目のファイルで 400 Bad Request が出て、残りのアップロードが止まったところまでしか分かっていませんでした。経緯が明らかになったのは、後続の修正PR(#700・#707)です。

実際の原因は、PyPI上のプロジェクト容量が当時の上限10GiBに達したことでした。1つ目のmacOS ARM64向けwheelは容量内に収まり、2つ目で上限を超え、ジョブ全体が止まりました。PyPIが返したのは汎用の 400 Bad Request だけで、容量超過を示す文言はありません。issueの報告者も、原因を「メタデータの不備か、重複の検出か、ファイルサイズの上限か」と推測するしかありませんでした。

復旧を難しくしたのが、PyPIの「同じファイル名は再アップロードできない」という仕様です。ワークフローを再実行すると、すでに載っている1つ目のファイルで twine が「file exists」のエラーを返し、残りを再送できません。

あゆみ

v0.1.49が復旧するまで(時刻はUTC)

  1. 3月17日 00:42自動リリースが起動

    5種類のwheelのビルドはすべて成功しました。

  2. 3月17日 00:44macOS ARM64のwheelだけ公開

    2つ目のwheelで 400 Bad Request が出て、sdistと残りのwheelは未送信のままジョブが終わりました。タグとGitHub Releaseも作られていません。

  3. 3月20日容量上限が50GiBに

    PyPIが上限を10GiBから50GiBへ引き上げました。

  4. 3月20日 17:30再実行で残りの5ファイルが公開

    元のワークフローの再実行で、4つのwheelとsdistが一度にアップロードされました。

  5. 3月20日 23:01v0.1.50を公開

    6ファイルがそろった状態で公開されました。

issueの報告者が出した選択肢は2つでした。v0.1.49を「yank」して仕切り直す方法と、PyPIが部分アップロードを許すなら残りだけを手で足す方法です。yankは、公開済みのファイルを消さずにインストールの候補から外す操作で、== で厳密に固定した場合を除き、その版は選ばれなくなります。実際に採られたのは、容量を広げたうえで元のワークフローを再実行し、同じ番号のまま欠けていたファイルを足す形でした。

症状に出会ったら、まず公開ファイルの一覧を見る

同じ症状に出会ったとき、先に疑う対象は手元の環境よりも、そのバージョンの公開が完了しているかどうかです。PyPIのJSON APIなら、バージョンごとのファイル名を直接取れます。

curl -s https://pypi.org/pypi/claude-agent-sdk/json \
  | python3 -c "import json,sys; d=json.load(sys.stdin); \
    print([f['filename'] for f in d['releases']['0.1.49']])"

現在のv0.1.49では、次の6ファイルが返ります。

['claude_agent_sdk-0.1.49-py3-none-macosx_11_0_arm64.whl',
 'claude_agent_sdk-0.1.49-py3-none-macosx_11_0_x86_64.whl',
 'claude_agent_sdk-0.1.49-py3-none-manylinux_2_17_aarch64.whl',
 'claude_agent_sdk-0.1.49-py3-none-manylinux_2_17_x86_64.whl',
 'claude_agent_sdk-0.1.49-py3-none-win_amd64.whl',
 'claude_agent_sdk-0.1.49.tar.gz']

障害の間は、このリストがmacOS ARM64のwheel 1件だけでした。wheelとsdistの数が前後のバージョンより明らかに少なければ、公開ジョブの途中失敗です。もう一つの手がかりは、そのバージョンのタグとGitHub Releaseが無いことでした。障害の間のv0.1.49は、この2つも欠けていました。

どこで落ちるかは、環境によって分かれます。

手元の状況障害中のv0.1.49では
macOS ARM64で開発し、LinuxのCIで入れる障害中のv0.1.49では手元では通り、CIだけが落ちる
LinuxやWindows、Intel Macで入れる障害中のv0.1.49では最初の pip install から失敗する
ロックファイルでバージョンを固定済み障害中のv0.1.49では固定した版が完全なら影響なし
claude-agent-sdk を固定せず最新に追従障害中のv0.1.49では公開が完了するまでデプロイが失敗する

最初の行が最も紛らわしい点です。開発機で動いているので、CIの設定を疑いたくなります。

回避策は、動作確認済みの前のバージョンに固定することです。

# 問題のバージョンを除外して、直前の動作確認済みバージョンに固定する
pip install "claude-agent-sdk>=0.1.48,<0.1.49"

uvなら、pyproject.toml や uv add のバージョン指定で上限を切ります。ロックファイルを使っている構成では、公開直後の未完成なバージョンを自動では拾いません。ロックファイルの有無も合わせて見ておく価値があります。

2026年3月の障害後、公開パイプラインが強化された

障害の後、PyPIが返すファイル一覧は次のように変わりました。

バージョン公開されたファイル
v0.1.48(障害前)公開されたファイルwheel4種 + sdist、計5ファイル
v0.1.49(障害中)公開されたファイルmacOS ARM64のwheelのみ、計1ファイル
v0.1.49(3月20日以降)公開されたファイルwheel5種 + sdist、計6ファイル

macOS ARM64のwheelは、v0.1.48が57,559,306バイト、v0.1.49が57,620,663バイト、v0.2.153が90,323,861バイトです。macOS x86_64向けのwheelはv0.1.48にはなく、v0.1.49から加わっています。1バージョンで5つのwheelとsdistを送るため、容量の消費は版ごとに積み上がります。

同じJSONの upload_time(UTC)で、後から補われたかどうかを確かめられます。同じバージョンのファイルが3日も離れていれば、補完の印です。v0.1.49では、macOS ARM64のwheelが3月17日00:44、残りの5ファイルが3月20日です。

sdistを先に送る順序も、時刻に出ています。v0.1.50ではsdistが23:00:58、最初のwheelが23:01:01でした。v0.2.153でも、sdistが20:37:04で最初です。

復旧の裏では、もう一つの不具合が続いていました。再実行はバージョン番号を確定させるコミットを git push する段階で、他のコミットとの衝突により失敗しています。リポジトリ側の _version.py は0.1.48のままでした。そのため、CLI 2.1.78と2.1.79に追従する後続の自動リリースも「v0.1.49」を計算し、中身の違う同名ファイルをPyPIへ送り、400 Bad Request を返され続けました。PR #707がリポジトリ側の番号をPyPIの実態(0.1.49)に合わせて、ようやく解消しています。

再発防止は、PR #700で公開ワークフローに3つ入りました。

手順

公開ワークフローに入った3つの防護

  1. 1

    アップロード済みのファイルは飛ばす

    twine upload に --skip-existing を付け、再実行してもエラーにならないようにしました。

  2. 2

    sdistを先にアップロードする

    約87KBのsdistを先に送ります。wheelの途中で止まっても、pipがソースからビルドして入れられるようにするためです。以前は dist/* の並びでsdistが最後になり、失敗時には送られませんでした。

  3. 3

    公開前に容量を計算する

    PyPI JSON APIで既存リリースのサイズを合計し、今回のdistを足した予測が47.5GiB(50GiBの95%)を超えたら、公開前にエラーで止めます。実行のたびに使用率も出力します。

強化後の9月にも、同じ上限でリリースが止まった

事前チェックは、その後も実際に働いています。issue #1254によると、2026年9月9日にv0.2.153のリリースが「予測使用量47.567GiBが、安全閾値の47.5GiBを超える」という理由で公開前に止まりました。5種類のwheelのビルドはすべて成功していて、止まったのは公開の判断だけです。

3月と違うのは、止まる場所が公開の前だという点です。不完全なファイル一覧がユーザーの手元に届くことはありません。issueは9月23日にクローズされ、v0.2.153はPyPIで6ファイルすべてが公開されています。GitHub Releaseは9月15日20:38(UTC)、PyPIの6ファイルは20:37台のアップロードで、issueの報告から6日後です。

issueが求めたのは、容量の見直し、追加の容量か整理、そして再実行でした。3月のPR #700は、古いリリースの削除(PyPIのWeb画面での手作業)を対象外にしています。上限に近い状態は、その後も続いていたわけです。

閾値の47.5GiBは、PyPIの上限50GiBの95%にあたります。v0.2.153の予測使用量47.567GiBは、この線をわずかに超えていました。

似た別のエラーと混同しない — Pythonバージョン不一致との違い

pipやuvのインストールエラーには、原因の違う似たメッセージがあります。手元のPythonが、対応範囲の外にある場合です。pipはどちらの場合も No matching distribution found を返すため、この一行だけでは区別できません。違いは括弧内の from versions に出ます。claude-agent-sdk の最新版は Requires-Python >=3.10 を宣言しています。

原因エラーの手がかり確認先
公開ジョブが途中で止まったエラーの手がかりuvでは only has wheels for the following platform、pipでは from versions に指定バージョンだけが無い確認先公開ファイル一覧
手元のPythonが3.10未満エラーの手がかりfrom versions: none確認先python --version と Requires-Python

どちらも最初に公開ファイル一覧と Requires-Python を並べて見れば分かれます。前者はPyPI側の状態が原因なので、バージョン固定で対処します。後者は手元の環境が原因で、Pythonのアップグレードが要ります。uvではplatformのhintが出るかも手がかりになります。

同様のエラーに遭遇したときの切り分け手順

claude-agent-sdk 以外のPyPIパッケージで「特定プラットフォームのwheelが無い」と出たときも、次の順で切り分けると早いです。

  • PyPIの配布ファイル一覧を確認する。pypi.org/project/<パッケージ名>/<バージョン>/#files を開くか、JSON APIでファイル数を数える
  • 直前のバージョンで同じ操作を試す。直前のバージョンで再現しなければ、環境ではなく該当バージョンの公開に問題がある
  • 同じ問題を報告しているissueを検索する。パッケージ名と wheel や missing で、該当リポジトリのissueを探す
  • OSSなら公開ワークフローの実行ログを見る。公開リポジトリのActionsタブで該当リリースの実行を開けば、どのステップで止まったかが分かる
  • ロックファイルでバージョンを固定する。再現性が要るCI/CDは、公開直後のバージョンに自動追従しない設計にする

Agent SDKのインストールとセットアップの基本手順はClaude Agent SDK入門にあります。DockerのDEBUG環境変数でAgent SDKが動かなくなる別の既知バグはAgent SDKがDockerのDEBUG環境変数で動かなくなる原因と回避策、並列ツール呼び出しに起因するMCP接続エラーはMCP Stream closedエラーはAgent SDKの並列呼び出しで起きるで扱っています。ストリーミングモードでサブエージェントを使うときのエラーはonly prompt commands are supportedエラーの原因、レート制限イベント周りのパースエラーはrate_limit_eventでMessageParseErrorが発生し停止する原因と対処が参考になります。

まとめ

特定バージョンだけ「wheelが無い」で失敗するなら、手元の設定をいじる前にPyPIのファイル一覧を数えるのが最短です。前後のバージョンより数が少なければ公開側の問題なので、前のバージョンへ固定して復旧を待ちます。ロックファイルがあれば、この種の事故はデプロイ時に表に出ません。

この記事を共有:XはてブLinkedIn