Couldn't confirm model with the APIの原因と対処 — Claude Code
モデルを切り替えたときに出るCouldn't confirm modelの意味、似たエラーとの見分け方、再切替とAPIエンドポイントへの到達性確認の手順をまとめます。
Couldn't confirm model "claude-sonnet-5" with the API は、モデルを切り替えた直後に出るエラーです。モデルIDが間違っているという意味ではありません。IDが存在するかをAPIエンドポイントに問い合わせたところ、5秒以内に返事が来なかった、という意味です。
セッションは切り替え前のモデルのまま続きます。やることは、もう一度切り替えるか、APIエンドポイントに届いているかを調べるかのどちらかです。
このエラーが出る条件
出るのは、Agent SDKの setModel() か、Claude Code CLIを裏で動かすアプリ(Claude Desktopなど)から切り替えたときです。Claude Code v2.1.268以降は、これらの経路でローカルに受け入れられないモデルIDを、初めてそのモデルへ切り替える時点で提供元に確認します。カスタムモデルの選択肢として登録したIDは、ローカルで受け入れられるので確認の対象外です。
確認は、Anthropic API以外のプロバイダーでも実行されます。提供元にないIDは、次のリクエストを待たずに切り替えの時点で弾かれます。このエラーは、その確認リクエストが時間内に終わらなかった場合の表示です。
Couldn't confirm model "claude-sonnet-5" with the API. Try again, or run /model to see available models.Claude Desktopが起動したセッションでは、文末が Try again. で終わります。run /model to see available models という案内がないだけで、原因も対処も同じです。
似たメッセージとの見分け方
モデル切り替えまわりのエラーは文言が近く、取り違えやすいです。見るべきは、メッセージの前半に何が書かれているかです。
| メッセージ | 何が起きたか | 切り替え後のモデル |
|---|---|---|
Couldn't confirm model ... with the API | 何が起きたか確認リクエストが5秒以内に返らなかった | 切り替え後のモデル元のまま |
Model '...' not found | 何が起きたか確認したが、その名前のモデルが見つからなかった | 切り替え後のモデル元のまま |
Model "..." is not a recognized model id | 何が起きたかモデルIDになり得ない文字列で、リクエスト自体を送らなかった | 切り替え後のモデル元のまま |
API error: <ステータス> ... · model not changed | 何が起きたか確認リクエストが429や5xxなどで拒否された | 切り替え後のモデル元のまま |
Model '...' is restricted by your organization's settings | 何が起きたか管理者がそのモデルを無効にしている | 切り替え後のモデル元のまま |
Model switch ... blocked by a PreModelSwitch hook | 何が起きたかフックが切り替えを承認しなかった | 切り替え後のモデル元のまま |
Couldn't confirm だけが「答えがなかった」エラーで、IDの綴りは判定されていません。not found は答えが返った上でのエラーなので、綴りか提供元のモデル一覧を疑います。表示名 Sonnet 5 を渡して出る not a recognized model id の場合は、IDとして渡す文字列を直します。こちらは「is not a recognized model id」の意味と対処で扱っています。
下の2行は、確認リクエストを送る前後に別の仕組みが止めた場合です。詳しくは次の節に書きます。
切り替えに失敗したときの切り分け
- Qメッセージは Couldn't confirm model で始まっていますか?答えが別のメッセージです答えがはい
上の表で、どのエラーに当たるかを選び直します。
- Qもう一度切り替えても失敗しますか?答えが成功した答えが失敗する
一時的な遅延でした。そのまま使えます。
- Q同じシェルから api.anthropic.com に curl が通りますか?答えが通りません答えがはい
ネットワークの問題です。プロキシ、VPN、ファイアウォールを確認します。
- QANTHROPIC_BASE_URL は未設定ですか?答えが設定されています
指している先のゲートウェイやプロキシが、モデル確認のリクエストに時間内に応答するかを確かめます。
確認の前後で止まる別の原因
Couldn't confirm と同じ「切り替えたのに変わらない」状態でも、原因が組織の設定にある場合があります。ネットワークを調べる前に、メッセージの文言を見ます。
管理者がモデルを制限している
管理者がclaude.aiの管理コンソールでモデルを無効にしているか、managed settingsの availableModels や deniedModels で除外していると、/model <name> は拒否され、セッションは元のモデルのままです。文言は設定の出どころで分かれます。
- 管理コンソールで無効:
Model '<name>' is restricted by your organization's settings. Run /model to choose a different model. - managed settingsで除外:
Model '<name>' is not available. Your organization restricts model selection.
制限されたモデルは /model のピッカーに出ません。ピッカーから選べるものだけが、組織で許可されたモデルです。
PreModelSwitchフックが承認しなかった
組織やプロジェクトが PreModelSwitch フックを設定していると、フックは切り替えの前に走り、拒否や確認を返せます。ブロックされると Model switch to Opus 4.6 was blocked by a PreModelSwitch hook: <理由> のように、コロンの後ろに理由が付きます。SDKやRemote Controlからの切り替えでは、対象モデル名のない Model switch blocked by a PreModelSwitch hook になります。
理由の文言で原因が分かれます。
| コロンの後ろ | 意味 |
|---|---|
| フックが書いた理由 | 意味その指示に従うか、フックが許すモデルを選ぶ |
did not respond before its timeout | 意味フックが時間内に答えなかった。応答しないフックは切り替えを止める |
confirmation required, and this session cannot ask | 意味フックが確認(ask)を返したが、確認画面を出せない経路だった |
so organization-managed PreModelSwitch hooks could not be checked | 意味管理プラグインのフックを確認できず、未確認のまま適用しないために拒否した |
ask で確認を求められるのは、対話セッションで /model を実行したときだけです。それ以外の経路では拒否として扱われます。フック自体の書き方はPreModelSwitch・PostModelSwitchフックの解説にあります。
Couldn't confirm の「5秒」はモデルIDをAPIに問い合わせる確認の待ち時間で、フックのタイムアウトとは別物です。フックの既定タイムアウトは30秒です。
再切替で直らないときの調べ方
同じ操作を繰り返しても失敗するなら、確認リクエストがAPIエンドポイントに届いていません。確認する順は、到達性、ANTHROPIC_BASE_URL、プロキシの順です。
1. APIホストへの到達性
Claude Codeを動かしているのと同じシェルで確かめます。WindowsのPowerShellでは、組み込みの Invoke-WebRequest の別名を避けるため curl.exe と書きます。
curl -I https://api.anthropic.comここが通らなければ、ネットワーク側の問題です。Connection refused などの形で出る場合の見分け方は、Claude CodeでConnection refusedが出る原因と切り分けにまとめています。
2. ANTHROPIC_BASE_URLの残り
curl は通るのに失敗する場合、ANTHROPIC_BASE_URL を疑います。この変数があると、モデルへのリクエストは api.anthropic.com ではなく、そのアドレスに送られます。止まったローカルプロキシや使わなくなったゲートウェイを指したまま残っていると、curl が通ってもClaude Codeは届きません。
echo $ANTHROPIC_BASE_URLPowerShellでは echo $env:ANTHROPIC_BASE_URL です。シェルだけでなく、設定ファイルの env ブロックも見ます。意図してLLMゲートウェイを通している場合は、そのゲートウェイがモデル確認のリクエストに時間内に応答しているかが論点です。接続の組み方はClaude CodeをLLMゲートウェイに接続する方法を参照してください。
3. プロキシ経由の環境
社内プロキシを通す環境では、HTTPS_PROXY を設定した上でClaude Codeを起動します。Desktopのように別プロセスがCLIを起動する場合は、その環境変数が子プロセスに引き継がれているかも確認点になります。
プロキシがTLSを検査していたり、ゲートウェイが社内CAで署名されていたりすると、Claude Codeは証明書を信頼せず SSL certificate verification failed や Self-signed certificate detected で止まります。その場合は組織のCAバンドルを書き出し、NODE_EXTRA_CA_CERTS=/path/to/ca-bundle.pem で指します。証明書の検証失敗は再試行されず、最初の試行で表示されます。
4. OSやコンテナー側に残った設定
curl が通り、ANTHROPIC_BASE_URL も空で、プロキシも問題ない場合は、実行環境の側を疑います。
- LinuxやWSLでは
/etc/resolv.confが到達できないネームサーバーを指していることがあり、WSLはホストから壊れた設定を引き継ぐことがあります - macOSでは、切断またはアンインストールしたVPNクライアントが、トンネルインターフェースやルーティング規則を残すことがあります。
ifconfigで古いutunを探し、システム設定でVPNのネットワーク拡張を外します - Docker Desktopなどのコンテナー実行環境が、外向きの通信に割り込む場合があります。終了して再試行すると切り分けられます
プロバイダーとゲートウェイで変わること
モデルIDの確認はAnthropic APIだけでなく、すべてのプロバイダーで走ります。そのため、同じ症状でも見る場所がプロバイダーで変わります。
- BedrockやVertex AIなど独自のモデルIDを持つプロバイダー:
Model '...' not foundに、そのプロバイダーのIDで代わりのモデルを示すTry '...' insteadが付くことがあります。新しく出たモデルがAnthropic APIでは使えても、プロバイダーやリージョンではまだ提供されていない場合もあります - ゲートウェイや
ANTHROPIC_BASE_URLの先: モデルのリクエストは設定したアドレスに送られるので、確認リクエストもそこへ向かいます。ゲートウェイが確認に時間内に応答しなければCouldn't confirmになります。ゲートウェイ配下のnot a recognized model idは空文字列のときだけ出ます
SDKから使うときの扱い方
SDKで setModel() を呼ぶ側は、失敗してもセッションが前のモデルで動き続ける点を前提に書けます。モデルが変わったと思い込んで進めると、想定と違うモデルが答え続けるので、切り替えの成否を状態として持っておくのが安全です。
次は、失敗したときに1度だけやり直す形の一例です。q はstreaming inputモードで開始したクエリを指します。setModel() はstreaming inputモードでのみ使えます。
// 例示用の断片。モデルIDとリトライ回数は用途に合わせて変える
async function switchModel(q: Query, model: string) {
for (let attempt = 0; attempt < 2; attempt++) {
try {
await q.setModel(model);
return true;
} catch (err) {
const message = String(err);
// 確認が時間切れのときだけやり直す。not found は同じIDを繰り返しても直らない
if (!message.includes("Couldn't confirm model")) break;
}
}
return false; // 失敗時は元のモデルのまま
}Model '...' not found が返ったときは、同じIDで再試行しても結果は変わりません。TypeScript SDKでは supportedModels() で切り替え可能なモデルの一覧を取れるので、IDを渡す前に突き合わせる使い方ができます。
切り替え方で挙動が違う点
--model フラグ、ANTHROPIC_MODEL 環境変数、model 設定でモデルを指定した場合、Claude Codeは起動時に確認しません。綴りを間違えても、最初のリクエストで There's an issue with the selected model が出ます。
実行中の切り替えは、経路によって確認の有無が違います。
- Agent SDKの
setModel()とアプリ: v2.1.268以降は、ローカルで受け入れられないIDを提供元に確認します。Couldn't confirmが出るのはこの経路です - Remote Control: Anthropic APIでは値をローカルで確認するだけで、リクエストを送りません。したがってAnthropic APIでRemote Controlから切り替えたときは、このエラーは出ません
他のプロバイダーでRemote Controlから切り替えた場合に確認が走るかどうかは、モデル設定のドキュメントに書かれていません。