Claude Codeの応答が止まったときのタイムアウト調整方法
Claude Codeがストリーミング応答の停止をどう検知するか、3層のタイマーと関連する環境変数、症状別の調整先をまとめます。
Claude Codeは、APIからのストリーミング応答の停止を、応答受信中の3層+応答開始前の1層、計4種類の独立したタイマーで検知します。既定のタイムアウトは接続経路によって180秒から300秒まで幅があり、CLAUDE_STREAM_IDLE_TIMEOUT_MSをはじめとする環境変数で個別に調整できます。プロキシ経由で頻繁に打ち切られる・Bedrockの拡張思考中に接続が切れるといった症状は、原因がどの層にあるかを見分ければ、当てるべき変数もほぼ一意に決まります。
ストリーミングアイドルウォッチドッグとは何を見張っているか
「ストリーミングアイドルウォッチドッグ」は、公式ドキュメントがこの検知の仕組みに付けた呼び名です。ストリーミング応答を受け取っている最中、接続は生きているのにデータだけが止まる状態を、Claude Codeは3種類のタイマーで別々に監視します。
- イベント単位のウォッチドッグ: パース済みのイベントが来ているかを見ます。全プロバイダーで動作し、既定は300秒です。SSEのkeep-aliveピングのような、意味のあるイベントにならない小さなバイトが届いてもこのタイマーはリセットされますが、それはパース済みイベントが来ないまま約5分までで、それを超えると打ち切られます
- バイト単位のウォッチドッグ: 配線上に1バイトでも届いているかを見ます。keep-aliveピングもバイトとして数えてリセットされてしまうため、keep-aliveだけが来て本体データが来ない接続を見分けることはできません。本当に1バイトも流れていない接続の検知に向いています。直接のAnthropic API・Claude Platform on AWS・
ANTHROPIC_BASE_URLを含むゲートウェイ接続で動作します。Amazon Bedrockのvnd.amazon.eventstream応答では既定で無効で、Google CloudのAgent PlatformやMicrosoft Foundryでは動作しません。既定は直接APIで180秒、それ以外の経路で300秒です - ボディアイドルタイムアウト: 5分間バイトが来なければ切る、もっと粗い監視です。直接のAnthropic APIとClaude Platform on AWS以外のプロバイダーで既定有効です
これらのタイマーとは別に、応答が始まる前――最初の1バイトが届くまでの待ち時間だけを見る「最初の1バイト猶予」という層もあります(後述)。複数層に分かれているのは、接続経路によって「何が正常なシグナルか」が違うためです。SSEのkeep-aliveだけを送ってくるプロキシもあれば、バイト単位でしか死活を判定できない経路もあります。1つのタイマーだけに頼ると、健全な接続を誤って切るか、本当に止まった接続を長時間放置するかのどちらかに寄ってしまいます。
監視対象ごとの既定タイムアウト早見表
| 監視レイヤー | 検知条件 | 対象接続 | 既定タイムアウト |
|---|---|---|---|
| 最初の1バイト猶予 | 検知条件応答開始前、最初のバイトが届かない | 対象接続直接Anthropic API・Claude Platform on AWS(HTTPSプロキシ経由を含む)。ANTHROPIC_BASE_URL / ANTHROPIC_AWS_BASE_URLでゲートウェイ経由にした場合は動作しない。BedrockはCLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1でオプトイン、Vertex AI・Foundryでは動作しない | 既定タイムアウト直接APIで180秒、それ以外で300秒。リクエストボディ32KBごとに1秒加算 |
| イベント単位 | 検知条件パース済みイベントが来ない | 対象接続全プロバイダー | 既定タイムアウト300秒 |
| バイト単位 | 検知条件配線上にバイトが来ない(keep-alive含む) | 対象接続直接API・Claude Platform on AWS・ゲートウェイ接続(CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1でBedrockもオプトイン可) | 既定タイムアウト直接APIで180秒、それ以外で300秒 |
| ボディアイドル | 検知条件5分間バイトが来ない | 対象接続直接API・Claude Platform on AWS以外 | 既定タイムアウト5分 |
同じ「応答が来ない」という体感でも、内部でどのレイヤーが反応したかによって、効く設定が変わります。
症状別に効く環境変数の早見表
| 症状 | 効く設定 | 補足 |
|---|---|---|
| 遅いプロキシ経由で「No response from API」が頻発する | 効く設定CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MSを伸ばす | 補足最初の1バイトが届くまでの猶予そのものを広げる(v2.1.242以降) |
| Bedrockのイベントストリーム応答で拡張思考中に切れる | 効く設定CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1を設定しCLAUDE_STREAM_IDLE_TIMEOUT_MSで猶予を調整 | 補足Bedrockのバイト単位監視は既定オフなので、まずオプトインが要る |
| 自前ゲートウェイでkeep-aliveだけ来て本体が来ない接続を早く検知したい | 効く設定専用の設定は無い | 補足バイト単位ウォッチドッグはkeep-aliveをバイトとして数えるため検知できない。イベント単位ウォッチドッグはパース済みイベントが約5分来なければ打ち切るので、それが実質の検知上限になる |
| CIなど無人運用で早期に失敗を確定させたい | 効く設定CLAUDE_BYTE_STREAM_IDLE_TIMEOUT_MSを短縮 | 補足明示指定時の下限は5分にクランプされるCLAUDE_STREAM_IDLE_TIMEOUT_MSと異なり、こちらは下限10秒まで短縮できる(思考の長い沈黙を吸収する用途には向かない) |
| 5分超データが来ない自前ゲートウェイでボディアイドルだけ止めたい | 効く設定API_FORCE_IDLE_TIMEOUT=0 | 補足ウォッチドッグ自体はこの設定と無関係に動き続ける点に注意 |
環境変数の設定方法
環境変数はセッション開始前にエクスポートするか、settings.jsonに書きます。組織全体に配る場合はmanaged settings経由が確実です。
export CLAUDE_STREAM_IDLE_TIMEOUT_MS=600000
export CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1主要な変数の役割は次の通りです。
| 変数 | 効果 | 必要バージョン |
|---|---|---|
CLAUDE_STREAM_IDLE_TIMEOUT_MS | 効果両ウォッチドッグの猶予を一括変更。明示指定時の下限は5分、バイト単位は上限30分でクランプ | 必要バージョン- |
CLAUDE_BYTE_STREAM_IDLE_TIMEOUT_MS | 効果バイト単位のみ個別変更。指定時はCLAUDE_STREAM_IDLE_TIMEOUT_MSより優先。10秒〜30分でクランプ | 必要バージョンv2.1.210以降 |
CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS | 効果最初の1バイトが届くまでの猶予を直接指定。10秒〜30分でクランプ、リクエストボディ32KBごとに1秒加算 | 必要バージョンv2.1.242以降 |
CLAUDE_ENABLE_STREAM_WATCHDOG | 効果イベント単位ウォッチドッグを1で強制有効・0で強制無効 | 必要バージョン- |
CLAUDE_ENABLE_BYTE_WATCHDOG | 効果バイト単位ウォッチドッグを1で強制有効・0で強制無効(0は最初の1バイト猶予も同時に無効化) | 必要バージョン- |
CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK | 効果Bedrockのイベントストリーム応答でバイト単位監視をオプトイン | 必要バージョン- |
API_FORCE_IDLE_TIMEOUT | 効果ボディアイドルタイムアウトを0で無効・1で全プロバイダー有効 | 必要バージョンv2.1.169以降 |
CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MSを明示せずにAPI_TIMEOUT_MSだけを上げても、値がバイト単位ウォッチドッグの猶予を上回っていれば、最初の1バイト猶予はその値から1秒引いた値へ連動します。最初のバイトの猶予だけを個別に調整したいなら、CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MSを直接指定するほうが意図が明確です。
settings.jsonで書く場合
環境変数の代わりにsettings.jsonへ直接書くこともできます。CIジョブやコンテナイメージのように、シェルのexportを経由させたくない環境で使いやすい形です。
{
"env": {
"CLAUDE_STREAM_IDLE_TIMEOUT_MS": "600000",
"CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK": "1"
}
}組織全体で同じ値を配りたい場合は、ユーザーごとの~/.claude/settings.jsonではなくmanaged settingsに書きます。管理者が配った値は、ユーザーがシェルで上書きしようとしても優先されます。
ウォッチドッグが作動するとClaude Codeはどう振る舞うか
タイマーが打ち切ったあとの挙動は、応答がどこまで進んでいたかで変わります。
- 応答ヘッダーが届く前(最初の1バイト猶予が切れた場合): 1回だけ自動で再送し、それでも応答がなければ
No response from APIでターンを終了します。CLAUDE_CODE_RETRY_WATCHDOG=1を設定している場合は、この1回だけの上限が外れます - テキストブロックやツール呼び出しを完了した後、応答全体が終わる前に切れた場合: 完了済みの出力は保持し、「応答が不完全な可能性があります」という通知を出します。同じツール呼び出しの二重実行を避けるため、リクエストをやり直すことはしません
- 応答がすでに完了した後に接続が切れた場合: 通知なしでそのままターンを正常終了します
非対話セッション(-p実行やAgent SDK経由)では、テキストだけで途切れツール呼び出しを含まない応答に限り、Claude Codeが自動で最大3回まで続きを促してから通知を出します。応答が不完全になったときの詳しい見え方は「Response incomplete」の通知にまとめています。
CLAUDE_CODE_RETRY_WATCHDOGとの関係
CLAUDE_CODE_RETRY_WATCHDOG=1を設定していると、ウォッチドッグが検知した失敗の扱いも変わります。応答ヘッダーが届く前の1回限りの再送上限が外れます。429・529のようなキャパシティ関連のエラーは無期限にリトライし続け、それ以外の一過性エラー(サーバーエラー・タイムアウト・接続断)のリトライ上限も既定の10回から300回まで引き上がります。CIジョブや常駐ワーカーのように、人が張り付いていない環境で長時間の障害を待ち切りたい場合に向いた設定です。ただし、支出上限や利用クレジット枯渇を理由にした429だけは例外で、リトライせずその場でエラーを返します。無制限リトライがコストの歯止めを失わないための線引きです。
ウォッチドッグはバージョンを重ねて拡張されてきた
3層のウォッチドッグと関連変数は、一度に導入されたものではなく、バージョンを重ねて拡張されてきました。
| バージョン | 変更点 |
|---|---|
| v2.1.169 | 変更点API_FORCE_IDLE_TIMEOUTを導入。ボディアイドルタイムアウトの有効・無効を明示指定できるように |
| v2.1.186 | 変更点CLAUDE_CODE_RETRY_WATCHDOGを導入。旧CLAUDE_CODE_CONNECT_TIMEOUT_MSはno-op化 |
| v2.1.196 | 変更点イベント単位ウォッチドッグの既定を「全プロバイダーで有効」に統一。以前は直接API以外では既定オフだった |
| v2.1.199 | 変更点ストリーム中盤のサーバーエラーで、完了済み出力を破棄せず保持するように変更 |
| v2.1.210 | 変更点CLAUDE_BYTE_STREAM_IDLE_TIMEOUT_MSを導入し、バイト単位だけを個別調整できるように |
| v2.1.222 | 変更点ANTHROPIC_BASE_URL等のゲートウェイ接続にもバイト単位ウォッチドッグを既定適用。keep-aliveが来ているのにイベント単位の誤検知で切れる問題を解消 |
| v2.1.242 | 変更点CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MSを導入。それ以前は最初の応答がAPI_TIMEOUT_MS(既定10分)を使い切るまで待っていた |
v2.1.229では、Vertex AIやBedrockを上流に持つゲートウェイ接続で、拡張思考中の無通信をSSE keepaliveピングが埋める改善も入りました。こちらはクライアント側のウォッチドッグ設定ではなくサーバー側の対策ですが、同じ「拡張思考中に接続が切れる」症状への対応として関連します。詳細はClaude Code v2.1.229のリリースノートにまとめています。
よくあるつまずき
CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCKだけ設定してタイムアウト値を変えていない場合、既定のCLAUDE_STREAM_IDLE_TIMEOUT_MS(300秒)が適用されます。拡張思考が5分を超えるタスクでは、オプトインと同時に猶予も伸ばす必要がありますCLAUDE_STREAM_IDLE_TIMEOUT_MSを5分未満に指定しても、明示指定時の下限として自動的に5分へ引き上げられます。短い値で早期検知させたい場合はCLAUDE_BYTE_STREAM_IDLE_TIMEOUT_MS側(下限10秒)を使いますCLAUDE_ENABLE_BYTE_WATCHDOG=0はバイト単位ウォッチドッグだけでなく最初の1バイト猶予そのものも無効化します。イベント単位の監視だけを残したい場合の設定として意図せず両方を消してしまう組み合わせですAPI_FORCE_IDLE_TIMEOUT=0でボディアイドルタイムアウトを切っても、ウォッチドッグ2種は別枠で動き続けます。無通信を無期限に許容したい場合は、ウォッチドッグ側の値も一緒に見直す必要があります
よくある質問
CLAUDE_STREAM_IDLE_TIMEOUT_MSとAPI_TIMEOUT_MSはどう違いますか
API_TIMEOUT_MSはリクエスト1本全体のタイムアウト(既定10分)で、Request timed outエラーの原因になる値です。CLAUDE_STREAM_IDLE_TIMEOUT_MSは、応答が始まった後に「データが止まる」ことだけを監視するウォッチドッグの猶予です。応答開始前の遅さは前者、開始後の停止は後者が担当します。
プロキシ環境ではどちらを優先して調整すべきですか
社内プロキシ経由の接続は、プロキシ自体がバッファリングして届く間隔が空きやすいため、まずCLAUDE_STREAM_IDLE_TIMEOUT_MSを伸ばすのが最初の一手です。プロキシ設定全体の要点はClaude Codeプロキシ設定で扱っています。
VertexやFoundry経由でもバイト単位ウォッチドッグは動きますか
動きません。バイト単位ウォッチドッグの対象は、直接のAnthropic API・Claude Platform on AWS・ANTHROPIC_BASE_URL等のゲートウェイ接続だけです。Google CloudのAgent PlatformやMicrosoft Foundryでは動作しません。これらの経路ではイベント単位ウォッチドッグとボディアイドルタイムアウトの2層だけが監視を担います。
全部の変数を大きくしておけば安全ですか
猶予を伸ばすほど、本当に応答不能になった接続を検知するまでの時間も延びます。CI等で早期に失敗を検知したい用途では、逆に短めの値との組み合わせが向きます。用途に応じて上げ下げを使い分ける前提の設定です。
まとめ
ストリーミングアイドルウォッチドッグは、応答受信中をイベント単位・バイト単位・ボディアイドルの3層で検知する仕組みです。既定タイムアウトは接続経路によって180秒から300秒まで違います。症状が「最初の応答が来ない」のか「途中で止まる」のかを見分ければ、触るべき変数はほぼ一意に決まります。前者ならCLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS、後者ならCLAUDE_STREAM_IDLE_TIMEOUT_MSです。Bedrock経由だけは既定でバイト単位監視がオフなので、拡張思考の長いタスクを回すならオプトインを忘れずに設定してください。