ネットワークと LLM ゲートウェイ
プロキシ・CA 証明書・mTLS・ストリームの待ち時間・通信先の許可リストといった社内ネットワークの設定と、LLM ゲートウェイの接続・導入・互換性の要件をまとめます。
社内ネットワークの制約(プロキシ、TLS 検査、クライアント証明書、外向き通信の制限)の下で Claude Code を動かす設定と、組織が運用するゲートウェイ(Claude Code とモデル提供元の間に置くプロキシ)を使う方法のページです。主な読者はネットワーク・セキュリティの管理者で、開発者向けの接続手順も含みます。
要点#
- 設定は環境変数で行い、
settings.jsonのenvブロックにも書ける。シェルで export した値は起動時に1回だけ読まれる - ゲートウェイを使うと、認証・利用状況の把握・予算・監査ログを1か所に集められる。開発者は提供元の資格情報を持たない
- ゲートウェイは、Claude Code に含まれる自前のもの(Claude apps gateway)か、すでに組織が運用しているもの(このページの「ほかの LLM ゲートウェイ」)から選ぶ
- バックグラウンドのエージェントは、シェルの環境変数を引き継がないことがある。ネットワーク関連の変数は設定ファイルの
envに書く - 通信先の許可リスト(allowlist)は、利用する機能と導入方法によって必要なホストが変わる
プロキシ#
標準のプロキシ環境変数に従います。
# HTTPS プロキシ(推奨)
export HTTPS_PROXY=https://proxy.example.com:8080
# HTTP プロキシ(HTTPS が使えない場合)
export HTTP_PROXY=http://proxy.example.com:8080
# プロキシを迂回する(空白区切りでもカンマ区切りでもよい)
export NO_PROXY="localhost,192.168.1.1,example.com,.example.com"
# すべての要求で迂回する
export NO_PROXY="*"
| 項目 | 内容 |
|---|---|
| 小文字の変数 | 使える。https_proxy・HTTPS_PROXY・http_proxy・HTTP_PROXY の順で、最初に設定されたものを使う |
| ループバック | localhost・::1・127.0.0.0/8 への WebSocket 接続は、プロキシを通らない。NO_PROXY に書かなくてよい |
| SOCKS | 非対応 |
| ベーシック認証 | URL に資格情報を入れる(http://username:password@proxy.example.com:8080)。スクリプトにパスワードを直書きしない |
| NTLM・Kerberos などの高度な認証 | 対応するゲートウェイを使うことを検討する |
プロキシの URL は、起動時に確認される唯一の設定です。解釈できない値(http:// が無いなど)は、直すべき変数名を示して起動を止めます。
CA 証明書#
既定では、同梱の Mozilla の CA 証明書と OS の証明書ストアの両方を信頼します。OS ストアの読み取りには tls.getCACertificates のある実行環境が要ります(ネイティブインストーラは常に対応。npm 版は Node 22.15 以降)。古い Node では、同梱のセットと NODE_EXTRA_CA_CERTS だけが効きます。OS ストアにルート証明書が入っていれば、企業の TLS 検査プロキシは追加設定なしで動きます。
| 変数 | 内容 |
|---|---|
CLAUDE_CODE_CERT_STORE |
信頼する元のカンマ区切りの一覧。bundled(同梱の Mozilla の CA)と system(OS ストア)。既定は bundled,system。専用の設定キーは無く、env ブロックか環境変数で設定する |
NODE_EXTRA_CA_CERTS |
独自の CA 証明書(PEM)のパスを追加で信頼する |
export CLAUDE_CODE_CERT_STORE=bundled # 同梱のセットだけ
export NODE_EXTRA_CA_CERTS=/path/to/ca-cert.pem
mTLS(クライアント証明書)#
| 変数 | 内容 |
|---|---|
CLAUDE_CODE_CLIENT_CERT |
クライアント証明書のパス |
CLAUDE_CODE_CLIENT_KEY |
クライアント秘密鍵のパス |
CLAUDE_CODE_CLIENT_KEY_PASSPHRASE |
暗号化された秘密鍵のパスフレーズ(省略可) |
CLAUDE_CODE_DISABLE_MTLS_RELOAD_ON_STALE_CONNECTION |
1 で、接続エラー時の再読み込みをやめる |
証明書と鍵は、起動時と設定を適用するたびに(たとえば managed settings の env がセッション中に変わったとき)読み直します。更新するときは、同じパスのファイルを置き換えます。接続リセットや TLS ハンドシェイクのエラーで API リクエストが失敗すると、両方を読み直し、新しい組でやり直します(v2.1.232 以降)。
- ファイルの監視はしない。置き換えた瞬間には何も起きず、失敗後のやり直し、または次に設定を適用するときに新しい組を使う
- ゲートウェイが接続リセットや TLS の拒否を返したときは読み直す。ハンドシェイクを完了して HTTP エラーを返したときは読み直さない(次に設定を適用するか再起動したときに読まれる)
- 書き換え途中で証明書と鍵が食い違っていたら、前の組を保ち、次の失敗で読み直す
- OTLP テレメトリのエクスポーターは、最初の使用時に読んだ証明書を保つ。更新を届けるには Claude Code を再起動する
- 更新が反映されたか確かめるには、デバッグログを有効にして、
Stale connection — reloaded rotated mTLS client materialを探す。設定の適用で拾った場合はこの行が出ないので、無いだけでは失敗とは言えない - 現在の組が期限切れになる前にファイルを置き換える
設定ファイルの env を無視する場面#
| 場面 | 扱い |
|---|---|
| クラウドセッション | ホスティング環境が API 接続を管理するので、設定ファイルの env にある CLAUDE_CODE_CLIENT_CERT・CLAUDE_CODE_CLIENT_KEY・CLAUDE_CODE_CLIENT_KEY_PASSPHRASE・NODE_EXTRA_CA_CERTS・NODE_TLS_REJECT_UNAUTHORIZED・CLAUDE_CODE_OAUTH_SCOPES を無視し、無視したキーをデバッグログに残す |
| デスクトップアプリがプロバイダ接続を管理するセッション(サードパーティのプロバイダの Code タブや Cowork) | これらの変数と HTTP_PROXY・HTTPS_PROXY・NO_PROXY を、managed settings と ~/.claude/settings.json からだけ読む。リポジトリの設定では無視する(v2.1.217 より前は、接続を管理するときはすべての設定ファイルで無視した) |
| claude.ai でサインインしたローカル・SSH・WSL の Code タブ | アプリは接続を管理しないので、通常のターミナルと同じく全スコープから読む |
設定の確認#
プロキシの間違いや証明書のパスの誤りは、たいてい後のリクエストで接続エラーや証明書エラーとして出ます。確認するには、デバッグログを付けて起動します。出力は ~/.claude/debug/<session-id>.txt(または --debug-file <path> で指定した場所)に出ます。
claude --debug
CA certs: Appended extra certificates from NODE_EXTRA_CA_CERTS (/etc/ssl/certs/corp-ca.pem)
mTLS: Loaded client certificate from CLAUDE_CODE_CLIENT_CERT
mTLS: Loaded client key from CLAUDE_CODE_CLIENT_KEY
読めなかったときは、理由とともに Failed to read か Failed to load の行が出ます。対話セッションの /status でも、次の行を見られます。
| 行 | 内容 |
|---|---|
Proxy |
有効なプロキシの URL。解釈できない値は「無効で無視」と表示する |
mTLS client cert / mTLS client key |
ファイルを読めたときだけ出る。無ければ読み込みに失敗している(理由はデバッグログ) |
Additional CA cert(s) |
NODE_EXTRA_CA_CERTS のパス。読めたかは確認しないので、デバッグログで確かめる |
バックグラウンドのエージェントに適用する#
バックグラウンドエージェントは、起動したターミナルの中では動きません。ユーザーごとのスーパーバイザーのプロセスがオンデマンドで起動し、シェルより長く生きます。そのため、シェルで export しただけのプロキシ・CA・mTLS の変数は、そのシェルがたまたまスーパーバイザーを最初に起動したときだけ届き、別のシェルが起動したときは黙って届きません。OS にインストールされたスーパーバイザーは、シェルの環境を全く受け取りません。
ヒント
同じ変数を ~/.claude/settings.json か managed settings の env に書きます。このページの変数はすべてここに書け、全マシンの全バックグラウンドセッションに届く唯一の設定です。
社内ランチャーを設定で指定する#
すべての Claude Code のプロセスを、サンドボックスやネットワーク制御、資格情報の注入を行う社内ランチャー経由で起動させたい組織向けの設定です。スーパーバイザーとワーカーは PATH の claude ではなく固定のパスから起動するので、PATH の手前に置いたラッパーは迂回されます。processWrapper 設定(環境変数は CLAUDE_CODE_PROCESS_WRAPPER。両方あれば環境変数が優先)が、それらをランチャーの下で起動します。
| 項目 | 内容 |
|---|---|
CLAUDE_CODE_PROCESS_WRAPPER |
ランチャーの絶対パス。v2.1.208 以降。古い版は無視して、ラップなしで起動する |
processWrapper 設定 |
同じ値を持つトップレベルの設定キー。v2.1.210 以降。古い版は未知のキーとして黙って無視する |
ランチャーが対象にするプロセス#
claude agentsとバックグラウンドセッションが、必要に応じて起動するバックグラウンドサービス- エージェントビューの各行の端末ホストと Claude Code のセッション(待機中のウォームスタンバイを含む)
- 更新や異常終了のあとで、サービスが再起動するセッション
- 更新を完了するための Claude Code の自己再起動(エージェントビューの「更新のため再起動」を含む)
- リモートコントロールが起動するセッションのプロセス(v2.1.210 以降)
- tmux や iTerm2 でエージェントチームが起動する分割ペインのチームメイト(v2.1.210 以降)
Windows では変数が無視され、ラップなしで起動します(exec に依存するため。デバッグログに警告が出るだけ)。展開の計画では、Windows のマシンは「ラップされない」と数えてください。
ランチャーを通らないプロセス#
- ランチャーの設定前に作られたユニットファイルから、
launchdやsystemdが起動するインストール済みのバックグラウンドサービス。/statusとclaude daemon statusが、不一致の間は警告を出す。サービスが再起動してからは、サービスが起動するセッションはランチャーを通る - 自分でターミナルから起動したセッション。カバーするには、
PATHの手前に、実体を呼ぶランチャーを実行するclaudeというスクリプトを置く(管理されたシンボリックリンクは置き換えない) claude-cli://のディープリンクの最初のプロセス(OS のプロトコルハンドラが直接起動する)。その後にバックグラウンドで起動するものはランチャーを通る。この経路を完全に閉じるには、disableDeepLinkRegistration設定でハンドラの登録を止める(ディープリンク)--worktreeと--tmuxを組み合わせたときの再起動(ターミナルマルチプレクサが起動する)- Claude in Chrome が登録するネイティブメッセージングホスト(ブラウザが起動する)
ランチャーを設定すると、ps などで claude bg-pty-host と claude bg-spare のラベルが見えなくなります(ランチャーの exec が引数を作り直すため)。隠す意図のある動作ではありません。
設定の手順#
- 絶対パスに実行可能なスクリプトを置く(例
/opt/corp/launcher)。Claude Code のコマンド全体を引数にして実行されるので、最後にexec "$@"で自分を置き換える - 設定ファイルの
envにCLAUDE_CODE_PROCESS_WRAPPERを書く(シェルの export では足りない)。1台なら~/.claude/settings.json、全社なら managed settings。複数の場所にあるときは managed settings の値が、~/.claude/settings.jsonとシェルの export より優先される - 動いているバックグラウンドサービスと開いているセッションを再起動する。
claude daemon stop --anyでオンデマンドのサービスを止める(インストール済みのサービスは--anyなし)。設定の配布のあとに最初に起動するセッションが、ラップされていない古いサービスを自動で退かせることもある /statusの Self-exec の行で、解決された起動コマンドと、動いているサービスとの不一致の警告を確認する。claude daemon statusも同じ情報を出し、変数を外したあとでも見られる
#!/bin/sh
# 組織の処理(サンドボックスへの入場・ネットワーク制御・資格情報の注入など)
exec "$@"
{
"env": {
"CLAUDE_CODE_PROCESS_WRAPPER": "/opt/corp/launcher"
}
}
processWrapperは、managed settings をキー単位で配る組織向け。リモートの managed settings で配ると、管理者提供の実行ファイルを動かす設定として、セキュリティの承認ダイアログに出る- プロジェクト・ローカルの設定では設定できない。
.claude/settings.jsonと.claude/settings.local.jsonのCLAUDE_CODE_PROCESS_WRAPPERは警告つきで無視され、processWrapperキーも読まれない ~/.local/bin/claudeのシンボリックリンクをランチャーに置き換えていたら、同じ変更で元に戻す(置き換えたままだと、バックグラウンドサービスが2つのランチャーを通り、インストールが外部管理の扱いになる)
ランチャーの契約#
起動できないランチャーでは、Claude Code はラップなしで起動せず、起動自体を拒否します。
| 規則 | 内容 |
|---|---|
最後に exec "$@" |
子を fork して終了するランチャーは、追跡できない孤児プロセスを残す。エージェントビューはそのセッションを失敗として、ランチャー名を出す |
| 引数を並べ替えない | 最初の引数が Claude Code のバイナリで、残りがその argv |
| 継承した環境変数をすべて渡す | 追加(資格情報の注入など)はよいが、落としてはいけない。セッションごとの認証トークン・モデルとプロバイダの選択・CLAUDE_CODE_PROCESS_WRAPPER 自身が環境で渡る。環境をリセットするサンドボックスに入るなら、中で継承した環境をそのまま再 export する |
約3秒以内に exec に到達する |
コールドなバックグラウンドの起動は、最初の出力までにランチャーを2回直列で実行する。シングルサインオンの交換のような遅い処理は、遅延かキャッシュにする |
| 自分の中から呼ばれても動く | Claude Code は入れ子の自己起動のすべてにランチャーを適用するので、排他的なリソースを取るランチャーは、すでに持っていることを検知する |
| 起動前に端末へ書かない | exec の前に出力したものは、初期化前にセッションが落ちたときの原因として報告される |
値の形式は、変数も設定も同じです。多くは絶対パスを書きます。ランチャーに引数を渡すなら、パスのあとに書きます。シェルのコマンドではなく引数のリストとして解釈されます。
- 空白でトークンを分け、空白を含むトークンは二重引用符で囲む
[で始まる値は、JSON の文字列の配列として読む(例["/opt/corp/launcher", "--profile", "cc"])- シェルの構文は使えない(変数展開・グロブなし)。引用符で囲んでいない
;・|・&・$(は、設定エラーとして拒否する
使えない値のときは、起動を拒否して理由を報告します。CLAUDE_CODE_SHELL_PREFIX との違いは、CLAUDE_CODE_PROCESS_WRAPPER が Claude Code 自身のプロセスを包んでコマンドを別々の argv として渡すのに対し、CLAUDE_CODE_SHELL_PREFIX は Claude が実行するシェルコマンド(Bash ツール・フック・stdio MCP サーバー)を包み、1つのシェルエスケープ済み文字列を $1 で渡す点です。片方向けに書いたランチャーはもう片方では動きません。
ストリームの無通信タイマー#
応答が静かになったストリームを、4つの独立したタイマーが中断します。死んだ接続がハングせず、失敗して再試行になるようにするためです。
| タイマー | 中断する条件 | 動く接続 | 既定の待ち時間 |
|---|---|---|---|
| 最初のバイトの期限 | リクエストを送ってから、応答ヘッダーが届かない | Anthropic の API への直接接続と Claude Platform on AWS(HTTPS プロキシ経由でも)。ANTHROPIC_BASE_URL や ANTHROPIC_AWS_BASE_URL でゲートウェイを通すときは動かない。Amazon Bedrock では CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1 で有効にする。Vertex AI と Foundry では動かない |
直接の Anthropic API は180秒、それ以外は300秒。さらにリクエスト本文の32KBごとに1秒 |
| イベント単位の監視 | 応答のイベントが解釈されない。バイト単位の監視が動く接続(Bedrock 以外)では、届いたバイト(keep-alive の ping を含む)もこの監視をリセットする(解釈されたイベントなしで最大5分ほど) | すべてのプロバイダ | 300秒 |
| バイト単位の監視 | ワイヤー上にバイトが届かない(SSE の keep-alive の ping を含む) | Anthropic API への直接接続・Claude Platform on AWS・ゲートウェイ接続(独自の ANTHROPIC_BASE_URL を含む)。Bedrock の vnd.amazon.eventstream では CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1 で有効にする。Vertex AI と Foundry では動かない |
直接の Anthropic API は180秒、それ以外は300秒 |
| 本文の無通信タイムアウト | 5分間、バイトが届かない | 直接の Anthropic API・Claude Platform on AWS・CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1 の Bedrock 以外のプロバイダ(API_FORCE_IDLE_TIMEOUT で変えない限り) |
5分 |
CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK=1 を設定すると、Bedrock ではバイト単位の監視が本文の無通信タイムアウトに置き換わります。CLAUDE_STREAM_IDLE_TIMEOUT_MS も、Bedrock のストリームが静かでいられる時間を決めます。Bedrock でバイトが届いても、イベント単位の監視はリセットされません。デバッグログには、ストリームごとに wire-heartbeat: _chunkTimes absent で始まるメッセージが出ます。
| 変数 | 内容 |
|---|---|
CLAUDE_ENABLE_STREAM_WATCHDOG |
イベント単位の監視を 1 で強制的に有効、0 で無効にする。表にある接続の範囲内でだけ効く |
CLAUDE_ENABLE_BYTE_WATCHDOG |
バイト単位の監視を 1 で有効、0 で無効にする。0 は最初のバイトの期限も止める |
CLAUDE_STREAM_IDLE_TIMEOUT_MS |
2つの監視のタイムアウト。5分未満の値は5分に引き上げられ、バイト単位の監視では30分で頭打ちになる |
CLAUDE_BYTE_STREAM_IDLE_TIMEOUT_MS |
バイト単位の監視だけのタイムアウト。10秒〜30分に丸められ、この監視では CLAUDE_STREAM_IDLE_TIMEOUT_MS より優先される |
CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS |
最初のバイトの期限を直接決める。未設定ならバイト単位の監視のタイムアウトを使う。丸め・アップロードの猶予・API_TIMEOUT_MS の上限はエラー一覧の「No response from API」を参照 |
API_FORCE_IDLE_TIMEOUT |
0 で本文の無通信タイムアウトを止め、1 ですべてのプロバイダで有効にする。監視は独立して動くので、ストリームをもっと長く止めたいなら、それらの閾値も上げるか止める |
CLAUDE_CODE_RETRY_WATCHDOG |
このセッションでは、Retry-After が60秒を超えても再試行を止めない(詳細は環境変数一覧) |
監視が止まったストリームを中断すると、ストリームの途中の失敗として扱われ、どこまで届いていたかに応じて、再試行するか、エラーでターンを終えるか、完了分を残して不完全な応答の通知を出すか、通常どおり終えるかが決まります。エラー一覧を見てください。
通信先の許可リスト#
次の URL へのアクセスを、プロキシとファイアウォールで許可します。コンテナや制限のある環境では特に重要です。初回の接続確認が api.anthropic.com か platform.claude.com へ届かないときは、このリストを見ます。
| ホスト | 用途 |
|---|---|
api.anthropic.com |
Claude API の呼び出し(WebFetch のドメイン安全確認・機能フラグの取得・テレメトリのイベントログを含む) |
claude.ai |
claude.ai アカウントの認証 |
claude.com |
claude.ai のサインインでブラウザに開くページ(claude.ai へリダイレクトされる)。事前承認された WebFetch のドキュメント参照も、CLI からこのホストへ行く |
platform.claude.com |
Anthropic Console アカウントの認証。claude.ai アカウントの OAuth トークンの交換・更新・失効もここへ行くので、どちらのサインインにも要る |
mcp-proxy.anthropic.com |
claude.ai の MCP コネクタ(管理者が設定したものを含む)。claude.ai 認証のユーザーでは既定で有効。取得をやめるには ENABLE_CLAUDEAI_MCP_SERVERS=false か disableClaudeAiConnectors 設定 |
downloads.claude.ai |
プラグインの実行ファイルのダウンロード・ネイティブインストーラ・ネイティブの自動更新・更新バージョンの確認 |
storage.googleapis.com |
/plugin に出るプラグインのインストール数とメタデータ。2.1.116 より前のネイティブインストーラと自動更新も |
registry.npmjs.org |
プラグインのインストール(npm ソースのパッケージ取得とプラグインの Node.js 依存の導入)・npx で起動する MCP サーバー・Claude Code 自体の npm と bun のインストールのパッケージレジストリ |
bridge.claudeusercontent.com |
Chrome 拡張の WebSocket ブリッジ |
*.frame.claudeusercontent.com |
アーティファクトの内容の読み取り。アカウントでツールが使えるときだけ。ツールを止めてこの要件を外すには、"enableArtifact": false か CLAUDE_CODE_DISABLE_ARTIFACT=1 |
github.com |
GitHub のプラグインのマーケットプレイスとプラグインの clone(HTTPS か SSH)。HTTPS だけで clone するには CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1 |
raw.githubusercontent.com |
/release-notes の変更履歴。対話セッションでは、起動時にキャッシュが実行中のバージョンに足りなければバックグラウンドでも取る。非対話とクラウドのセッションは取らない |
*-review.googlesource.com |
googlesource.com のチェックアウトでの Gerrit の変更の検索。省略可(CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC で止められる) |
http-intake.logs.us5.datadoghq.com |
運用テレメトリ。CLI が Anthropic API を直接使うときだけで、Bedrock・Vertex AI・Foundry では送らない。省略可(DISABLE_TELEMETRY か DO_NOT_TRACK で止める) |
browser-intake-us5-datadoghq.com |
運用エラーの報告。CLI が Anthropic API を直接使い、サーバー側の段階展開のゲートが有効にしているときだけ。省略可(DISABLE_ERROR_REPORTING か DISABLE_TELEMETRY) |
formulae.brew.sh |
Homebrew でのインストールの、更新バージョンの確認。ほかの方法では使わない |
code.claude.com |
組み込みの claude-code-guide エージェントと事前承認された WebFetch のドキュメント参照。止めても影響するのはドキュメント参照だけ |
- npm 経由か自前のバイナリ配布なら、エンドユーザーはネイティブインストーラと自動更新のための
downloads.claude.aiが要らない。一方、npm と bun のインストールには、組織がミラーしていなければregistry.npmjs.orgが要る - 2つの Datadog のホストは省略可のテレメトリだけで、
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFICで両方を止められる。サードパーティのプロバイダでは、ホストがCLAUDE_CODE_PROVIDER_MANAGED_BY_HOSTを設定してテレメトリの指標が既定でオンでも、これらには送らない - Bedrock・Vertex AI・Foundry、またはサインイン済みの Claude apps gateway のセッションでは、モデルの通信と認証は提供元かゲートウェイに行き、
api.anthropic.com・claude.ai・platform.claude.comへは行かない。WebFetch は、設定でskipWebFetchPreflight: trueにしない限り、ドメイン安全確認でapi.anthropic.comを呼ぶ ANTHROPIC_BASE_URLでゲートウェイを通していても、fast mode の可用性の確認はapi.anthropic.comを呼ぶ(HTTP プロキシには従う)。ブロックが原因なら、プロキシでapi.anthropic.comを許可する。ゲートウェイが発行した資格情報を Anthropic が拒否したときも同じ接続エラーになり、そのときは許可リストでは直らない(直す変数は fast mode の項を参照)
組織の IP 許可リストとプロキシの出口#
組織が Claude の IP 許可リストを有効にしているなら、bridge.claudeusercontent.com を claude.ai や api.anthropic.com と同じプロキシの出口へ通します(Zscaler の同じアプリセグメントや Netskope のステアリングポリシーなど)。それができないときは、プロキシがそのホストへ使う出口アドレスを許可リストに足します。ただし、そのアドレスが組織専用のときだけです。共有の出口の範囲は、プロキシ事業者の他の顧客も通します。Anthropic はそのホストへの接続を、届いたアドレスで IP 許可リストと照合するので、許可リストに無いアドレスから出ると、ほかが動いていても Chrome 拡張だけつながりません。
GitHub の許可リストとファイアウォール#
Anthropic ホストの環境のクラウドセッションとコードレビューは、Anthropic が管理するインフラからリポジトリへ接続します。セルフホスト環境のセッションは、Anthropic の git プロキシを選ばない限り、ネットワークの内側から接続します。
- GitHub Enterprise Cloud の組織が IP アドレスで制限しているなら、インストール済みの GitHub App への IP 許可リストの継承を有効にし、Anthropic の送信 IP アドレスも許可リストへ足す。継承が及ぶのは、Claude の GitHub App がインストールとして行うリクエストだけで、ユーザーに代わって行うリクエストには及ばない
- ファイアウォールの内側の GitHub Enterprise Server は、Anthropic の送信 IP アドレスを許可して、Anthropic のインフラから clone やレビューコメントの投稿ができるようにする。セルフホスト環境のセッションは内側から GHES に届くので、この公開が要るのは、Anthropic ホストのセッションと、リポジトリの選択などホスト側の事前フローと、Anthropic の git プロキシを選んだセルフホストのランナーだけ。SCM コネクタは使えないので、内側からしか届かない GHES には、ホスト側の事前フローが届かない
デスクトップと claude.ai#
上の表は単体の CLI の分です。デスクトップアプリとブラウザの claude.ai は、アプリのコードとユーザーのコンテンツを、ほかの Anthropic の CDN のホスト(assets-proxy.anthropic.com と、アーティファクトを配信するそのほかの *.claudeusercontent.com)から読み込みます。claude.ai だけ許可してこれらを止めると、エラーではなく白紙のページになります(デスクトップアプリも参照)。
デスクトップアプリと claude.ai は、会話の中の一部のツールの結果を、対話型のウィジェットとして描くこともあります(コネクタが提供する MCP Apps など)。そのウィジェットは claudemcpcontent.com の生成されたサブドメインから読み込まれるので、*.claudemcpcontent.com をワイルドカードのまま許可します。ブロックしても、アプリのほかの部分は動きますが、そのウィジェットは読み込まれません。
- Google Fonts の書体を使うアーティファクトは、
fonts.googleapis.comとfonts.gstatic.comも要求する。どちらも省略可。ブロックすると代替の書体で描画される - アーティファクトが読み込める JavaScript ライブラリの配信元は、
cdnjs.cloudflare.com・cdn.jsdelivr.net・cdn.tailwindcss.com・code.jquery.com・unpkg.comだけ。ブロックすると、ライブラリに依存する部分が動かず、フォントと違って代替が無い - どちらも、サイレントなドロップではなく即時の拒否でブロックする(初回描画が遅れず、すぐ失敗する)
ゲートウェイの全体像#
ゲートウェイは、組織が Claude Code とモデル提供元の間に置くプロキシです。Claude Code は API の通信を、提供元ではなくゲートウェイへ送り、ゲートウェイが組織の持つ資格情報で転送します。開発者は提供元の資格情報を持たず、ゲートウェイへ認証します。そのため、認証・利用状況の把握・予算・監査ログを、組織が管理する1か所で行えます。提供元は Anthropic の API でも、Bedrock・Vertex AI・Foundry でもよく、ゲートウェイの設定で決まります。
2種類の資格情報があります。
| 資格情報 | 持つ人 | 役割 |
|---|---|---|
| 開発者の資格情報 | 各開発者(ゲートウェイが発行) | ゲートウェイへの認証と、利用状況での識別 |
| 提供元の資格情報 | ゲートウェイ(提供元アカウント1つ分を共有) | 転送されるすべての通信 |
ゲートウェイの選び方#
| 選択肢 | 内容 |
|---|---|
| Claude apps gateway | Anthropic のセルフホストのゲートウェイで、claude のバイナリに含まれる。上流は Bedrock・Claude Platform on AWS・Google Cloud・Foundry・Anthropic API。開発者は /login で社内の IdP でサインインし、IdP のグループごとにモデルへのアクセスと managed settings を強制し、OTLP の使用量メトリクスを自前の可観測性基盤へ出す。Claude Code のリリースと一緒に作られテストされるので、転送するヘッダーとフィールドの更新を追う必要が無い |
| ほかのゲートウェイ | すでに組織が運用している LLM ゲートウェイや API ゲートウェイ。Anthropic は、他社製品を推奨も保守も監査もせず、ゲートウェイ経由で Claude 以外のモデルへ振ることもサポートしない |
Claude apps gateway のサインインはブラウザの SSO の段で、サービストークンの流れは無いので、承認する開発者のいない CI パイプラインは認証できません(提供元に直接設定します)。開発者がサインイン済みのマシンでの Agent SDK のセッションと claude -p は、そのマシンのゲートウェイのセッションを使い、そのポリシーに従います。
サブスクリプションとの関係#
ゲートウェイの資格情報で接続すると、使用量は組織の提供元アカウントへ API の料金で課金され、開発者の claude.ai のサブスクリプションは使われず、課金もされません。ゲートウェイ用に ANTHROPIC_AUTH_TOKEN を設定するか、Claude apps gateway へ /login でサインインすると、そのセッションではサブスクリプションのログインが止まります。apiKeyHelper が有効なときも同じです。
例外は、ANTHROPIC_BASE_URL だけを設定して、ゲートウェイの資格情報を設定しない場合です。リクエストはゲートウェイを通りますが、保存済みの claude.ai ログインが有効な資格情報のままなので、サブスクリプションの使用量の上限と課金が適用されます。この通信を Anthropic へ渡すゲートウェイは、anthropic-beta の OAuth の capability を転送しなければなりません。
ゲートウェイとは別に設定するもの#
- どのモデルが答えるか:
/modelかモデルの環境変数で選ぶ。ゲートウェイが決めるのは行き先で、開発者の選択ではない。Claude apps gateway はグループごとのavailableModelsで選択肢を絞れる - ほかのネットワーク通信:バージョン確認とダウンロードは、ゲートウェイを通らず Anthropic へ直接行く。上の通信先への出口を許可するか、
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFICで省略可のストリームを止める - クライアントのテレメトリ:Claude apps gateway にサインインしたセッションでは、Anthropic 宛てのクライアント分析を止める。サインイン前の起動時の分析も止めるには、各端末のクライアント側の managed settings で
DISABLE_TELEMETRYを配る。ほかのゲートウェイでは、提供元で決まる - 社内の HTTP プロキシ:
HTTPS_PROXYは、ゲートウェイを含むすべての相手との間に入る。必要ならゲートウェイとは別にプロキシも設定する。自前でホストする Claude apps gateway では、サインインがプロキシのホストも私設ネットワークにあるかを確かめる。そうでなければ、ゲートウェイのホストをNO_PROXYに足して、CLI が直接つなぐようにする
ほかの LLM ゲートウェイ#
サポートされる API 形式(下の「API 形式」)を公開していれば、どのゲートウェイでも使えます。ここでの「ゲートウェイ」は、Claude apps gateway ではなく、すでに組織が運用しているものです。ゲートウェイの製品はその文書に従って立て、Claude Code 側は次の手順で整えます。
ゲートウェイで1か所にまとめられるのは、資格情報(提供元のキーはサーバー側に置き、開発者はゲートウェイの資格情報を持つ)・利用状況(開発者やチーム単位)・コストの制御(予算とレート制限)・監査ログ・提供元の切り替え(開発者のマシンを触らずに)です。提供元の切り替えは、上流にかかわらず、ゲートウェイが単一の Anthropic 形式のエンドポイントを公開している場合のみです。代わりに、提供元独自の形式を公開すると、クライアントの設定がその提供元に結びつきます。代償は、ゲートウェイが組織の運用するインフラになることです。Claude Code はリリースごとに機能を足すので、それを転送しないゲートウェイでは、対応する機能が壊れます。
開発者向け:ゲートウェイへ接続する#
組織が管理者に配らせていれば、設定は何も要りません。確かめるには次の順に見ます。
claudeを起動する。ログイン画面が出たら、ゲートウェイの資格情報が配られていない- セッションが始まったら
/statusの「Status」タブで、Anthropic base URL(ゲートウェイのアドレスがあるときだけ出る)と、Auth tokenかAPI keyの行(ANTHROPIC_AUTH_TOKEN・ANTHROPIC_API_KEY・apiKeyHelperの名前)を見る。Login methodに claude.ai のアカウントが出ていれば、資格情報は配られていない - 適当なプロンプトを送って、エラー無しで応答が返ることを確かめる
自分で設定するには、ゲートウェイの担当者から、ベース URL と資格情報(キーかトークンの文字列、またはそれを取るコマンド)をもらいます。
| 資格情報を入れる場所 | 使う場面 |
|---|---|
ANTHROPIC_AUTH_TOKEN |
担当者が「bearer トークン」「Authorization ヘッダー」と言ったとき(種類が分からなければこちらを試す) |
ANTHROPIC_API_KEY |
担当者が「API キー」「x-api-key」と言ったとき |
apiKeyHelper |
資格情報が定期的に変わる、または保管庫から取るとき |
変数は、資格情報を送るヘッダーが違います。ANTHROPIC_AUTH_TOKEN は Authorization: Bearer、ANTHROPIC_API_KEY は x-api-key、apiKeyHelper は両方です。間違った変数だと、ゲートウェイが読まないヘッダーに入って 401 になります。
export ANTHROPIC_BASE_URL=https://llm-gateway.example.com
export ANTHROPIC_AUTH_TOKEN=sk-gateway-key
{
"env": {
"ANTHROPIC_BASE_URL": "https://llm-gateway.example.com",
"ANTHROPIC_AUTH_TOKEN": "sk-gateway-key"
}
}
- シェルの export はそのターミナルのセッションだけに効く。ドックやスタートメニューから起動したエディタには届かない。バックグラウンドエージェントにも確実には届かないので、必ず通したいゲートウェイは設定ファイルに書く
- 設定ファイルは
~/.claude/settings.json(全プロジェクト)か.claude/settings.local.json(1プロジェクト)。シェルの export と設定ファイルのenvで同じ変数を設定したときは、設定ファイルの値が効く - 手で作った
.claude/settings.local.jsonは、先に gitignore へ入れておく
注意
資格情報を、プロジェクトの .claude/settings.json に書かないでください。コミットされて、clone した全員に共有されます。
最初は、シェルの export のまま、Claude Code の前に直接 curl で確かめます。
curl -sS -w '\n%{http_code}\n' -X POST "$ANTHROPIC_BASE_URL/v1/messages" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model": "claude-sonnet-4-6", "max_tokens": 1, "messages": [{"role": "user", "content": "."}]}'
{"id":"msg_ で始まる JSON で "content":[...] があれば、到達できて資格情報も有効です。未知のモデル名のエラーでも、認証は通っているので、URL と資格情報は確認できます。401 なら資格情報が拒否されています。キーを x-api-key で受けるゲートウェイでは、Authorization のヘッダーを x-api-key: $ANTHROPIC_API_KEY に替えます。
既存のログインとの関係は次のとおりです。ゲートウェイの資格情報の変数は、保存済みの claude.ai ログインや Console のキーより優先され、変数を外せばログインに戻ります。ANTHROPIC_AUTH_TOKEN は即座に優先され、ANTHROPIC_API_KEY は対話モードで1回承認を求められます。どちらが有効かは /status で見ます。保存済みのログインを消して、ゲートウェイの資格情報だけにするには /logout です。
画面(サーフェス)ごとの設定#
| 画面 | 設定 |
|---|---|
| CLI | 上の環境変数と設定ファイル |
| VS Code 拡張 | VS Code 自体のユーザー設定(JSON)の claudeCode.environmentVariables に name と value の組で書く。拡張は起動前にここで資格情報を確認するので、確実な場所はここ。~/.claude/settings.json の値は、起動されるプロセスには届くが、拡張自身のログイン確認には届かない |
| デスクトップアプリ | ANTHROPIC_BASE_URL や settings.json ではなく、サードパーティ推論の設定から読む。管理者が配布した設定があれば設定不要。端末に無ければ、ヘルプ → Troubleshooting → Enable Developer Mode で再起動し、Developer → Configure Third-Party Inference にベース URL を入れる(管理者の配布が優先で、そのときフォームは読み取り専用)。ゲートウェイ設定が有効だと、セッションはローカルだけで、SSH とクラウド環境は選べず、リモートコントロールも使えない。起動時に Gateway was unreachable と出たら、URL と経路を curl で確かめる |
| GitHub Actions | ワークフローの env の ANTHROPIC_BASE_URL と ANTHROPIC_CUSTOM_HEADERS を読む。資格情報は、アクションの anthropic_api_key 入力に渡す(ANTHROPIC_API_KEY として x-api-key で届く)。bearer のゲートウェイでは、同じシークレットを anthropic_api_key と、ワークフローの env の ANTHROPIC_AUTH_TOKEN に渡す(アクションは ANTHROPIC_AUTH_TOKEN を読まず、anthropic_api_key は起動の確認を満たすためだけ) |
| Agent SDK | ゲートウェイ専用のオプションは無く、env オプションで、起動するプロセスの環境に変数を渡す。TypeScript は options.env を設定すると環境全体が置き換わるので process.env を展開して含める。Python の ClaudeAgentOptions(env=...) は継承した環境に重ねる |
| Slack・クラウドセッション | ゲートウェイの構成に含まれない。クラウドセッションの環境設定のゲートウェイ変数は適用されない。通信をゲートウェイに留めたいなら、これらを有効にしない |
| リモートコントロール・音声入力 | どちらも claude.ai の ID に依存し、ANTHROPIC_API_KEY・ANTHROPIC_AUTH_TOKEN・apiKeyHelper のどれかが有効なあいだは使えない。リモートコントロールは ANTHROPIC_BASE_URL が Anthropic 以外のホストを指しているときも無効(v2.1.196 より前は止まらなかった)。戻すには、claude.ai でログインして、その機能が見る変数を外す(音声入力は資格情報、リモートコントロールは資格情報と ANTHROPIC_BASE_URL)。claude doctor のリモートコントロールの節が、いま何が止めているかを出す |
env:
ANTHROPIC_BASE_URL: https://llm-gateway.example.com
steps:
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.GATEWAY_API_KEY }}
追加の設定#
| 設定 | 内容 |
|---|---|
ANTHROPIC_CUSTOM_HEADERS |
資格情報に加えて、テナント ID やルーティングキーのヘッダーを送る。1行に 名前: 値 を1組。設定ファイルでは \n で区切る("X-Org-Route: prod\nX-Tenant: example")。ルーティングやテナントのヘッダーは「承認が要るヘッダー」に数えられる |
CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY |
1 で、起動時にゲートウェイのモデル一覧を取り、/model に足す。modelPicker の replaceBuiltInOptions があると、見つかったモデルも隠れる。確認は claude --debug で [gatewayDiscovery] の行を探す |
apiKeyHelper |
資格情報を stdout に出すコマンド。資格情報だけを出す(v2.1.227 以降は、バナーやログ行が混ざると失敗する)。出力は既定で5分キャッシュされ、CLAUDE_CODE_API_KEY_HELPER_TTL_MS(ミリ秒)で変えられる。値は Authorization と x-api-key の両方で送られる |
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC |
1 で、ゲートウェイ経路の外の省略可の通信(バージョン確認・テレメトリ・リリースノートなど)を止める。自動更新も止まる。fast mode の可用性確認も省かれる(前の確認で有効になっていない限り、/fast は使えないと出る)。ゲートウェイのモデル検出には影響しない(v2.1.257 より前は更新が止まった)。WebFetch のドメイン安全確認は影響を受けないので、必要なら skipWebFetchPreflight: true で別に止める |
{
"apiKeyHelper": "~/bin/get-gateway-key.sh"
}
ANTHROPIC_BASE_URL がゲートウェイを指していると、Claude Code は自分のテレメトリを、ゲートウェイの資格情報なしで Anthropic へ送ります。資格情報の変数か apiKeyHelper も有効だと、Console の分析ダッシュボードへ使用量のメトリクスを報告しません(v2.1.246 より前は、Anthropic 宛てのテレメトリにゲートウェイの資格情報が付くことがあった。モデルのリクエストは常にゲートウェイ宛て)。
クラウドプロバイダ用のベース URL で通す#
ANTHROPIC_BASE_URL の代わりに、プロバイダ別のベース URL の変数でゲートウェイを指す構成です。担当者が Bedrock・Vertex AI・Foundry・Claude Platform on AWS を名指ししたときだけ使います。Bedrock と Vertex AI のゲートウェイは、そのプロバイダ独自のリクエスト形式を受け、Claude Code も、そのプロバイダが受けるベータヘッダーとリクエストのフィールドの範囲に絞って送ります。Foundry と Claude Platform on AWS のゲートウェイは、Anthropic Messages 形式を受けます。
| プロバイダ | 変数 |
|---|---|
| Amazon Bedrock | ANTHROPIC_BEDROCK_BASE_URL・CLAUDE_CODE_SKIP_BEDROCK_AUTH=1・CLAUDE_CODE_USE_BEDROCK=1。ゲートウェイ自身の資格情報なら AWS_BEARER_TOKEN_BEDROCK は未設定にする(設定すると、skip があってもその API キーが Authorization で送られる) |
| Google Vertex AI | ANTHROPIC_VERTEX_BASE_URL・ANTHROPIC_VERTEX_PROJECT_ID・CLAUDE_CODE_SKIP_VERTEX_AUTH=1・CLAUDE_CODE_USE_VERTEX=1・CLOUD_ML_REGION。プロジェクト ID とリージョンは、リクエストごとのパスに入る |
| Microsoft Foundry | ANTHROPIC_FOUNDRY_BASE_URL・ANTHROPIC_FOUNDRY_API_KEY(x-api-key で送る)・CLAUDE_CODE_USE_FOUNDRY=1。bearer なら ANTHROPIC_FOUNDRY_AUTH_TOKEN(v2.1.203 以降。両方あるとこちらが優先)。ゲートウェイが Authorization を自分で付けるなら CLAUDE_CODE_SKIP_FOUNDRY_AUTH=1 にして、両方の資格情報の変数を空にする(v2.1.203 より前は、API キー無しで送信できなかった) |
| Claude Platform on AWS | ANTHROPIC_AWS_BASE_URL・ANTHROPIC_AWS_WORKSPACE_ID・CLAUDE_CODE_SKIP_ANTHROPIC_AWS_AUTH=1・CLAUDE_CODE_USE_ANTHROPIC_AWS=1 |
- Bedrock・Vertex AI・Claude Platform on AWS のブロックにある skip の変数は、クラウドの資格情報で署名しないことを伝える(ゲートウェイが持つため)。ゲートウェイ自身のトークンも要るなら、ブロックのあとに
ANTHROPIC_AUTH_TOKENを足す(Authorization: Bearerで送られる)。別の方式ならANTHROPIC_CUSTOM_HEADERSを使う。どちらでも skip の変数は残す(無いと、ANTHROPIC_AUTH_TOKEN・apiKeyHelper・ANTHROPIC_CUSTOM_HEADERSが足したAuthorizationを外す) - Vertex AI でも、モデルごとのリージョン(
VERTEX_REGION_CLAUDE_*)とモデルの固定(ANTHROPIC_DEFAULT_OPUS_MODELなど)は、ゲートウェイ経由でも効く。Claude Code が知らないモデル ID を固定すると、effort や拡張思考などの機能が無効のままになることがある。その場合はANTHROPIC_DEFAULT_OPUS_MODEL_SUPPORTED_CAPABILITIES(Sonnet と Haiku にも同じ形の変数)で、モデルが持つ機能を宣言する - 確認は
/statusの Status タブ。Bedrock ならAPI provider: Amazon Bedrock・Bedrock base URL・AWS auth skippedの行が出る。ほかのプロバイダも同じ行を、そのプロバイダの名前で出す(Vertex AI はVertex base URLとGCP auth skipped)。ベース URL の行が無ければ、変数がセッションへ届いていない
ゲートウェイ経由のエラー#
| エラー | 原因と対処 |
|---|---|
認証元が2つあるという起動時の警告(auth may not work as expected) |
ゲートウェイの資格情報と保存済みのログインが両方有効。変数を外して保存済みのログインを使うか、/logout してゲートウェイの資格情報を使う |
無効なトークンという 401 |
ゲートウェイが発行した資格情報でないか、読まないヘッダーに入っている。変数を資格情報の種類に合わせる。失効していたらゲートウェイで再発行する |
Your apiKeyHelper script is failing |
コマンドが使えるキーを出していない。直接実行して理由を見て、期限切れなら認証し直す |
Connection refused …・Can't reach the API server … (ENOTFOUND) |
ベース URL に何も応答しない。アドレスの誤り、または VPN やファイアウォールが経路を塞いでいる。curl で確かめる |
API returned an empty or malformed response (HTTP 200) |
ゲートウェイか途中のプロキシが、API 以外の応答(HTML のエラーやログインページ)を返している。curl で確かめる |
context_management・Extra inputs are not permitted などの 400 |
上流が、Anthropic 形式向けのフィールドを拒否している。CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1。ゲートがかからないベータは、該当の CLAUDE_CODE_USE_* を設定する |
thinking・adaptive を名指しする 400(Input tag 'adaptive' found) |
上流のモデルが適応的な推論に対応していない。上流を更新する。Opus 4.6 と Sonnet 4.6 では CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1 でもよい |
ゲートウェイ独自の文言のコンテキスト・トークン上限の 400(ContextWindowExceededError など) |
ゲートウェイがモデルより小さいコンテキストを強制して、上流のエラーを書き換えている。自動の圧縮と再試行が働かない。/compact で復旧する。予防には CLAUDE_CODE_AUTO_COMPACT_WINDOW をゲートウェイの上限にし(100,000トークン以上、モデルのコンテキストウィンドウ以下に丸められる)、CLAUDE_CODE_MAX_OUTPUT_TOKENS をゲートウェイのモデルの出力上限より下にする |
ツールの入力スキーマや pattern を拒否する、毎回の 400(v2.1.265〜v2.1.267) |
アーティファクトのツールのスキーマが \p{...} の正規表現を含む(段階展開)。v2.1.268 以降に更新する。該当の版では、アーティファクトを無効にしてツールとスキーマをリクエストから外す |
未知のツール型(Input tag 'advisor_20260301')を拒否する、毎回の 400(v2.1.275) |
advisor ツールの宣言がリクエストに入る(段階展開)。v2.1.276 以降に更新する。v2.1.275 では CLAUDE_CODE_DISABLE_ADVISOR_TOOL=1 |
/model にモデルが出ない |
ゲートウェイのモデル名が内蔵の一覧に無いか、modelPicker の一覧が内蔵の選択肢を置き換えている。モデルの検出を有効にするか、モデルの環境変数で足す。置き換える modelPicker があれば、そこへ足す(managed settings が出しているなら管理者に頼む) |
/fast が Fast mode unavailable due to network connectivity issues |
fast mode の可用性確認が api.anthropic.com へ直接行く。ブロックされているなら許可する(ゲートウェイが発行したキーを Anthropic が拒否している場合は、skip の変数だけが効く) |
/fast が Fast mode has been disabled by your organization(ANTHROPIC_AUTH_TOKEN のみ) |
確認には claude.ai のログインか Anthropic の API キーが要る。CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1 |
| curl は通るのにログインを求められる | CLI は、到達できる URL を資格情報とは扱わない。対話セッションでは、プロジェクトの .claude/settings.json の env は、初回のウィザードと信頼の確認のあとにしか効かない。ANTHROPIC_AUTH_TOKEN を、初回設定の前に読まれる場所(シェルの export・~/.claude/settings.json の env・managed settings)に置く |
ANTHROPIC_API_KEY を設定したのに、確認なしで無視される |
対話セッションで1回の承認が要り、以前に断ったキーは、確認なしで無視される。/config の Use custom API key で有効にする |
This machine's managed settings require a first-party login、または Administrator policy requires a Cloud gateway sign-in |
managed settings に forceLoginMethod・forceLoginOrgUUID(または forceLoginGatewayUrl)があると、ANTHROPIC_API_KEY・ANTHROPIC_AUTH_TOKEN・apiKeyHelper と併用できない。管理者が外すか、ゲートウェイの資格情報をやめる |
HTML の本文の 403(ゲートウェイのログにはリクエストが無い) |
ゲートウェイの手前の WAF やリバースプロキシが、リクエスト本文を止めている。プロンプトに XML 風のタグとソースコードが入るので、クロスサイトスクリプティングの本文ルールに当たる。短い curl は通り、実際のセッションは止まる。/v1/messages のパスを本文の検査から除く(AWS WAF では CrossSiteScripting_Body のマネージドルール) |
SSL certificate verification failed・Self-signed certificate detected(curl は通る) |
Claude Code の実行環境が、curl と同じ CA を信頼していない。企業の TLS 検査プロキシで多い。NODE_EXTRA_CA_CERTS に CA バンドルのパスを設定する |
ゲートウェイの設定を外したあとも繰り返しログインを求められるなら、原因は資格情報の保存先であることが多く、ゲートウェイではありません(エラー一覧)。
管理者向け:ゲートウェイを導入する#
導入の順番は、どの製品でも同じです。
- ゲートウェイを立て、提供元の資格情報を持たせる
- 開発者ごとにゲートウェイの資格情報を発行する(利用の帰属と、退職時の失効が1つで済む)
- 設定を managed settings と秘密情報の配布の仕組みで配る。ベース URL と資格情報の両方を配れば、開発者の設定は不要になる
- 各開発者に、Claude Code で設定が届いているかを確認してもらう
配布の仕組みが無い場合は、開発者に上の接続手順で自分で設定してもらいます(組織の設定の配り方は組織への導入と管理設定)。
前提とゲートウェイの要件#
| 要件 | 内容 |
|---|---|
| HTTPS | 開発者へ配るのと同じアドレスで HTTPS を提供する(リダイレクト先ではなく)。Claude のモデル名を提供元へ振り分ける設定にする |
| 提供元の資格情報 | Anthropic API なら Console の API キー。クラウドなら、モデルへのアクセスのあるクラウドの資格情報 |
| 設定の配布手段 | MDM や構成管理など |
| サポートされる API 形式 | 下の「API 形式」の1つ以上。導入の手順は、ほとんどのゲートウェイが提供する POST /v1/messages の Anthropic Messages API を前提にしている |
| ストリーミング | SSE を、keep-alive の ping を含め、届いたまま通す。応答全体をバッファしない |
| モデル名の振り分け | 開発者が使う名前を上流のモデルに対応させる。claude-sonnet-4-6 のような名前がリクエストごとに送られる |
| ヘッダーと本文を変えずに転送 | anthropic-beta・anthropic-version・リクエスト本文を、両方向に通す |
| 上流のエラーを変えずに返す | 自動復旧がエラーの文言に一致して動く。独自の封筒で包むと壊れる(Claude apps gateway が代用する capability_rejected: のトークンが、封筒のメッセージに入っている場合を除く) |
| リクエスト本文の WAF 検査から外す | ソースコードと XML 風のタグが、クロスサイトスクリプティングのルールに当たる |
GET /v1/models を公開すれば、/model を、モデルの検出(上の追加の設定を参照)で埋められます。
導入は5段で、各段に確認があります。確認では、資格情報を次のように呼び分けます。
| 資格情報 | 持つ人 | 確認でのプレースホルダ |
|---|---|---|
| 提供元の資格情報 | ゲートウェイ | ゲートウェイ側の設定で、クライアントのコマンドには出ない |
| ゲートウェイの管理用の資格情報 | 管理者(製品が管理用・テスト用に発行するなら) | <gateway-key> |
| 開発者のキー | 各開発者(ゲートウェイが発行) | <developer-key> |
- ゲートウェイが、使うモデルを振り分けているか確かめる。次のリクエストを、設定した Claude のモデル名ごとに1回ずつ試す。
200とcontentがあれば提供元まで届いている。404はその名前が振り分けられていない。提供元から401なら、ゲートウェイの提供元の資格情報が間違っている。リダイレクトの後ろに置かない(本文や資格情報のヘッダーが落ちる。モデルの検出もリダイレクトを失敗とみなす) - 開発者ごとに資格情報を発行し、同じリクエストで、発行したキーを確かめる。ここで
401なら、キーが違うか、まだ有効になっていない。Bearer を読むゲートウェイなら開発者はANTHROPIC_AUTH_TOKEN、x-api-keyを読むならANTHROPIC_API_KEYを使う - 配る前に、自分の端末で、配る設定と同じ構成を、ターミナルに直接入力して試す(ファイルには書かない)。
claude -p "Reply with one word: connected"が応答を返し、ゲートウェイのログに/v1/messagesへのPOSTが200で残れば合格。Claude Code は?beta=trueのようなクエリを付けるので、パスで照合する。Not logged inは、ゲートウェイのログが空なら資格情報がセッションへ届いていない。x-api-keyの401が出ていればANTHROPIC_API_KEYに替える。Failed to authenticate. API Error: 401は、資格情報は送られて拒否された。api.anthropic.comや提供元を名指しする401なら、ゲートウェイの提供元の資格情報が違う。間違った URL は、バックオフで何分も無出力になる。止まって見えたらゲートウェイのログを見て、リクエストが無ければ URL が違う - ベース URL と資格情報を配る(下記)
- 開発者のマシンから、ストリーミングのリクエストを送り、エンドポイント・ストリーミングの通過・モデルの振り分けを一度に確かめる(
curl -Nで、data:の行が少しずつ届けば正常。一括で届くならバッファしていて、Claude Code が止まる)
curl -N -X POST "https://llm-gateway.example.com/v1/messages" \
-H "Authorization: Bearer <developer-key>" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model": "claude-sonnet-4-6", "max_tokens": 16, "stream": true, "messages": [{"role": "user", "content": "count to 3"}]}'
配る設定#
ほとんどの導入は、ANTHROPIC_BASE_URL と資格情報があれば足ります。必要なら次の行を足します。
| 変数・設定 | 内容 | 入れる場面 |
|---|---|---|
ANTHROPIC_BASE_URL |
API の送り先をゲートウェイにする | 常に |
apiKeyHelper、または ANTHROPIC_AUTH_TOKEN・ANTHROPIC_API_KEY |
認証(3つのうち1つ) | 常に |
ANTHROPIC_CUSTOM_HEADERS |
全リクエストに足す HTTP ヘッダー | ゲートウェイがテナントやルーティングのヘッダーを要求するとき |
CLAUDE_CODE_GATEWAY_HINT_HEADERS |
ヒントヘッダーを送る(v2.1.273 以降) | ゲートウェイがヒントヘッダーを読むとき |
CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY |
/v1/models から /model を埋める |
ゲートウェイが /v1/models を提供し、開発者の選択肢を埋めたいとき |
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS |
プレリリースの機能のヘッダーとフィールドを送らない | Bedrock や Vertex AI の上流が、ベータのフィールドを拒否するとき |
CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS / CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK |
fast mode の可用性確認が失敗・傍受・省略されるとき、fast mode を戻す | 組織が fast mode を使い、ANTHROPIC_AUTH_TOKEN だけで認証する・ゲートウェイが発行したキーを ANTHROPIC_API_KEY か apiKeyHelper で使う・ネットワークが api.anthropic.com への直接のリクエストを塞ぐか傍受するとき |
ANTHROPIC_MODEL・ANTHROPIC_DEFAULT_HAIKU_MODEL |
メインのセッションとバックグラウンドの通信で要求するモデル名 | ゲートウェイが、Claude Code の既定と違うモデル名を振り分けるとき。上書きの名前と、上書きが無いときに要求する内蔵のモデル ID の両方を振り分けておく(一部のバックグラウンドの呼び出しは、上書きにかかわらず内蔵 ID を要求する) |
ANTHROPIC_BEDROCK_BASE_URL・ANTHROPIC_VERTEX_BASE_URL・ANTHROPIC_FOUNDRY_BASE_URL・ANTHROPIC_AWS_BASE_URL と、そのプロバイダの変数 |
プロバイダ別のベース URL | ゲートウェイが各クラウドの手前にあるとき |
{
"env": {
"ANTHROPIC_BASE_URL": "https://llm-gateway.example.com"
},
"apiKeyHelper": "/usr/local/bin/get-gateway-key"
}
- managed settings の
envに入れて、MDM・レジストリポリシー・構成管理で配る。managed のANTHROPIC_BASE_URLは強制され、開発者のシェルの export では上書きできない - ゲートウェイの資格情報と一緒に、managed settings に
forceLoginMethod・forceLoginOrgUUID・forceLoginGatewayUrlを入れない。forceLoginMethodかforceLoginOrgUUIDは、値に関係なく、起動時にANTHROPIC_API_KEY・ANTHROPIC_AUTH_TOKEN・apiKeyHelperを拒否し、開発者は進めなくなる - サーバー管理の設定の配布は
api.anthropic.comへの直接接続が要るので、ゲートウェイ経由のセッションには届かない。ファイルの managed settings の経路を使う(同じキーを強制できる) - 資格情報は、
apiKeyHelperのコマンドを1つ配る(コマンドが、ローカルの開発者として秘密情報の置き場所へ認証するので、マシンごとに自分のキーが届く)。または、既存の仕組みで各開発者にキーを渡し、ANTHROPIC_AUTH_TOKENを自分で設定してもらう - 別に配るもの:デスクトップアプリは、サードパーティ推論の設定(managed settings ではなく)を読むので、そのファイルも MDM で配る。CI のランナーは、ランナーの環境に
ANTHROPIC_BASE_URLと資格情報が要る。管理された Windows の WSL は、wslInheritsWindowsSettingsがtrueのときだけ Windows の managed settings を読む - 配布の確認は、開発者のマシンで
claudeがログイン画面なしで始まり、/statusのAnthropic base URLにゲートウェイのアドレスが出て、Setting sourcesに managed settings が含まれること。ログイン画面やAnthropic base URLの行の欠落は、設定が届いていない
導入後の症状は1つの原因に絞れます。ログインを求められたら資格情報が足りない(/status の Setting sources に managed settings が無ければ配布が届いておらず、あれば開発者の資格情報が届いていない)。Failed to authenticate はゲートウェイのログで、どの資格情報が失敗かを見る(ゲートウェイが自分でログに残す拒否は開発者のキー、api.anthropic.com や提供元からの 401 はゲートウェイの提供元の資格情報)。x-api-key を読むゲートウェイで ANTHROPIC_API_KEY を使うと、初回は1回のキー承認が出る(ANTHROPIC_AUTH_TOKEN では出ず、静かに引き継ぐ)。fast mode を使うなら /fast も試す。最後に、ゲートウェイのログで、資格情報が開発者を表し、x-claude-code-session-id ヘッダーがセッション単位で束ねることを確かめます。
導入後の保守#
| 変化 | ゲートウェイが追いついていない症状 | 対処 |
|---|---|---|
新しい Claude Code が anthropic-beta の値と本文のフィールドを足す |
更新した開発者から、新しいフィールドを名指しする 400 |
anthropic-* のヘッダーとリクエスト本文を、許可リストではなくそのまま転送する。新しいリリースは、開発者に届く前にゲートウェイで試す |
| 新しい Claude モデルが出る | 新しいモデル名を選ぶと 404。/model に出ない |
ゲートウェイの振り分けに足して、モデルの確認をやり直す。ANTHROPIC_MODEL や既定のモデルの変数を配っているなら、managed settings も更新する |
| 資格情報の期限切れ・ローテーション | すべての開発者のリクエストが上流から 401 |
提供元の資格情報は独自の周期でローテーションする。開発者のキーはゲートウェイで回し、apiKeyHelper なら設定を配り直さずに、開発者ごとのローテーションができる |
クライアントは、一時的な失敗(429 を含む)を、バックオフしながら最大10回再試行し、Retry-After に従います。キーごとのレート制限を決めるときは、これを見込んでください。
バージョンアップで、ゲートウェイの設定が変わらなくても、挙動が変わることがあります。requiredMaximumVersion で試験済みのバージョンに固定するか、自前の配布経路なら DISABLE_UPDATES を使います。固定を上げる前に、変更履歴を読み、ゲートウェイに対して試します。エラーにならない、バージョン依存の変化は次のとおりです。
| 領域 | アップグレードで変わりうること | 一定に保つ設定 |
|---|---|---|
| 機能フラグの既定 | Anthropic から機能フラグを取らないセッション(クラウドプロバイダ・テレメトリを止めたセッション)は、インストール済みの版に内蔵のフラグの既定を使う。リリースがその既定を変えると、アップグレードとともに挙動が変わる | バージョンの固定(requiredMaximumVersion か DISABLE_UPDATES) |
| モデルの能力の前提 | インストール済みの版が認識しないモデル ID(ゲートウェイの別名 prod-opus など)は、適応的な推論・effort・コンテキストウィンドウについて既定の前提で動く |
Anthropic のモデル ID でゲートウェイへ振るか、modelOverrides で Anthropic のモデル ID をその別名へ対応づける。クラウドプロバイダ接続なら、固定したモデルの機能を宣言してもよい |
| 既定のモデルとエイリアス | 新しいセッションの既定のモデルと、opus・sonnet などの解決先は版に内蔵で、アップグレードで変わりうる |
ANTHROPIC_DEFAULT_MODEL(新しいセッションの既定。v2.1.236 以降)と ANTHROPIC_DEFAULT_*_MODEL |
特定のゲートウェイの管理者は、allowedProviders を managed settings で ["customEndpoint"] にし、同じファイルの env にゲートウェイの ANTHROPIC_BASE_URL を入れると、管理下のマシンが使える行き先を、ANTHROPIC_BASE_URL のゲートウェイだけにできます。Anthropic 直結や開発者自身のプロキシへ向けたセッションは拒否され、ANTHROPIC_BASE_URL はそこで設定した値だけを受け入れます(v2.1.285 以降)。プロバイダ別のエンドポイント変数(ANTHROPIC_BEDROCK_BASE_URL など)で通すゲートウェイでは、allowedProviders の項目が、どの変数を固定するかを示します。
ゲートウェイの互換性(運用者向け)#
API 形式#
ゲートウェイは、次の形式のうち少なくとも1つを公開しなければなりません。
| 形式 | 選ぶ変数 | エンドポイント | そのまま転送するもの |
|---|---|---|---|
| Anthropic Messages | ANTHROPIC_BASE_URL |
/v1/messages・/v1/messages/count_tokens(省略可) |
anthropic-beta と anthropic-version のリクエストヘッダー |
| Amazon Bedrock InvokeModel | ANTHROPIC_BEDROCK_BASE_URL と CLAUDE_CODE_USE_BEDROCK=1 |
/model/{model}/invoke・/model/{model}/invoke-with-response-stream・/model/{model}/count-tokens(省略可) |
anthropic_beta と anthropic_version のリクエスト本文のフィールド |
| Google Vertex AI rawPredict | ANTHROPIC_VERTEX_BASE_URL と CLAUDE_CODE_USE_VERTEX=1 |
:rawPredict・:streamRawPredict・count-tokens:rawPredict(省略可) |
anthropic-beta と anthropic-version のリクエストヘッダー、anthropic_version の本文のフィールド |
Foundry と Claude Platform on AWS は、Anthropic Messages 形式です。Claude Code は専用の変数(ANTHROPIC_FOUNDRY_BASE_URL・ANTHROPIC_AWS_BASE_URL)で届けますが、手前に置くゲートウェイは、上の Anthropic Messages の行を実装します。Claude Platform on AWS の手前のゲートウェイは、すべてのリクエストで必要な anthropic-workspace-id ヘッダーも転送しなければなりません。
- トークン計数のエンドポイントだけが省略可能。無ければ、コンテキストの使用量を、文字数ベースの推定にする
- 照合はフルの URL ではなくパスで行う。推論は
/v1/messages?beta=trueへ POST される - 起動時に、拒否しても問題ない通信が届く。Anthropic Messages 形式のゲートウェイには
HEAD /api/hello(接続のウォームアップ。HTTP プロキシかクライアント証明書があるときは省く)。Bedrock 形式にはGET /inference-profiles?type=SYSTEM_DEFINEDと、設定したモデルが推論プロファイルのときのGET /inference-profiles/{profile} - fast mode の可用性確認と WebFetch のドメイン安全確認は、ゲートウェイを通らず
api.anthropic.comを直接呼ぶ
ストリーミング#
Claude Code は、ストリームで返る推論の応答を、イベントごとに届いた順に読むので、ゲートウェイがストリームをどう中継するかが、ユーザーに見えるものを左右します。
- ゲートウェイが応答を完了するまでバッファすると、Claude Code は止まる
- Claude Code は、各応答の全イベントを、順に、最後の
message_deltaとmessage_stopまで受け取る前提で動く。コンテンツブロックが始まったあと、最後のmessage_deltaの前に本文がクリーンに終わると、Claude Code はその応答を切断と同じに扱う(そのときユーザーに見えるものはエラー一覧の「The response above may be incomplete」、リクエストを出し直す条件は同じページの自動の再試行) - Amazon Bedrock のガードレールが返信をブロックするとき、Bedrock が送るイベントが、すでに
content_block_stopが届いたコンテンツブロックを参照することがある。Claude Code は、送られたとおりにそれらを受け取る前提で動く(その返信の終わり方はBedrockの AWS ガードレールの節) - Claude Code は、ストリーミングの応答に、ストリームの無通信のタイムアウトより長くバイトが届かないと中断する。長い思考の間は、上流の SSE の
pingだけがストリーム上のバイトになることがあり、それを外したりバッファしたりするゲートウェイは、応答の途中でそのタイムアウトに引っかかる。ping を持たない上流(Bedrock のバイナリのイベントストリームなど)から変換するゲートウェイも、自前のpingを出さなければ同じ隙間ができる - Amazon Bedrock の InvokeModel 形式では、Claude Code は
/model/{model}/invoke-with-response-streamの応答を、Bedrock が返すバイナリのapplication/vnd.amazon.eventstreamの本文として読む。ゲートウェイが SSE へ変換したり、そのContent-Typeヘッダーを書き換えたりすると、解析できない(そのときユーザーに見えるものはBedrockのゲートウェイやプロキシ越しのストリーミングのエラーの節)
形式の不一致#
クライアントが話す形式で、ゲートウェイが受けるものが決まります。よくある失敗は、クライアントがゲートウェイへ送る形式と、背後の提供元が受ける形式の不一致です。クライアントが Bedrock か Vertex AI の形式で話すなら、Claude Code は、それらが受け入れる機能の部分集合だけを送ります。Anthropic Messages 形式で話すなら、上流が Bedrock や Vertex AI でも、全部を送ります。その差を埋めるのはゲートウェイの仕事です。上流が Bedrock か Vertex AI なら、その提供元の形式を公開すれば、橋渡しは要りません。
接続方法による違い#
| 挙動 | Bedrock・Vertex AI 形式 | Anthropic Messages 形式 | Claude apps gateway のサインイン |
|---|---|---|---|
| リクエストのモデル ID(既定) | 提供元の形式(Bedrock の us.anthropic.claude-opus-4-8 など) |
Anthropic の ID(claude-opus-4-8 など) |
Anthropic の ID |
送る anthropic-beta |
Bedrock と Vertex AI が受け入れる部分集合 | 下の機能の通過で述べる全部(開発者が CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS を設定しない限り) |
Bedrock と Vertex AI が受け入れる部分集合 |
| 認識しないモデル ID(ゲートウェイの別名)のリクエストのフィールド | 固定の予算の思考で、適応的な推論なし。effort とコンテキスト管理のフィールドなし | 現在の Claude のモデルが Claude API で受けるすべて(適応的な推論・effort・コンテキスト管理。Bedrock や Vertex AI の上流は拒否しうる) | Bedrock・Vertex AI 形式と同じ |
| 開発者が有効にする1時間のキャッシュ TTL | cache_control の ttl フィールド。ベータ値なし |
ttl フィールドと、anthropic-beta の extended-cache-ttl(転送が要る) |
Claude apps gateway の「availability and limitations」の表 |
ANTHROPIC_DEFAULT_HAIKU_MODEL が無いときのバックグラウンドのモデル |
既定の Sonnet か、選択済みのメインのモデル | メインのモデル。ANTHROPIC_API_KEY か apiKeyHelper が Anthropic の Console キーを出し、ANTHROPIC_AUTH_TOKEN が未設定なら、既定の Haiku |
メインのモデル |
認識しないモデル ID については、コンテキストウィンドウは200K(ID に [1m] があれば1M)と仮定します。実際の値を宣言する方法は、モデルの設定(モデル)を見ます。モデルの機能を別名へ渡すには、そのモデルの Anthropic ID を別名へ対応づける modelOverrides を、配る設定に入れます。
リクエストヘッダー#
ヘッダー名は大文字小文字を区別しません。anthropic-version と anthropic-beta、上流が Claude Platform on AWS なら anthropic-workspace-id を変えずに転送します。それ以外は、ゲートウェイがルーティング・帰属・トレースのために読んでよく、転送は必須ではありません。
| ヘッダー | 内容 |
|---|---|
Authorization・x-api-key |
開発者のゲートウェイの資格情報。設定した変数で、片方か両方 |
anthropic-version |
API バージョン(現在 2023-06-01)。Bedrock と Vertex AI 形式では、anthropic_version の本文のフィールドも付く(値は提供元の方言で、このヘッダーの値ではない) |
anthropic-beta |
そのリクエストの capability の値(カンマ区切り)。そのまま転送し、値ごとの許可リストを作らない(リリースごとに増える)。claude.ai のログインで認証している場合(資格情報の変数なしで ANTHROPIC_BASE_URL を設定したとき)、上流が要る OAuth の capability も入る。外すと 401 になる |
x-claude-code-session-id |
現在のセッションの一意の ID。本文を解析せずに、1セッションのリクエストをまとめられる |
x-claude-code-agent-id |
リクエストを出したサブエージェントの ID。セッション内で Claude Code が起動したエージェントのリクエストにだけ付く |
x-claude-code-parent-agent-id |
そのエージェントを起動した親の ID。入れ子のエージェントだけ |
サブエージェントの ID は、起動のたびに新しく作られます。チームメイトのエージェントは、再接続しても名前ベースの安定した ID を使います。どちらもエージェントの ID で、人や端末の ID ではありません。開発者が ANTHROPIC_CUSTOM_HEADERS を設定していれば、それもリクエストに入ります。
ゲートウェイのヒントヘッダー#
ゲートウェイやルーターが、スケジュール・キャッシュ・帰属に使える、リクエストごとの情報です(v2.1.273 以降)。値は固定の語彙・ツール名・時間・ランダムなプロンプト識別子だけで、プロンプトの本文やファイルの内容は入りません。値は印字できる ASCII です。
- Anthropic の API への直接接続:既定で送る
- 独自のベース URL:既定ではオフ(未知のヘッダーを拒否するプロキシで失敗するため)。受け取るには、開発者向けに
CLAUDE_CODE_GATEWAY_HINT_HEADERS=1を設定する(managed settings のenvなど) - ほかのバックエンド(Bedrock・Vertex AI・Foundry・Claude Platform on AWS):
CLAUDE_CODE_GATEWAY_HINT_HEADERS=1のときだけ送る CLAUDE_CODE_GATEWAY_HINT_HEADERS=0で、どの接続でも止まる
| ヘッダー | 内容 |
|---|---|
x-claude-code-request-class |
リクエストの種類。main(メインの会話のターン)・subagent・workflow(ワークフロー内のエージェント)・compaction(会話を圧縮する要約のリクエスト)・auxiliary(セッション名・分類器・要約などの付随のリクエスト)。毎回送る |
x-claude-code-agent-type |
リクエストを出したサブエージェントの種類。内蔵の型の名前(Explore・Plan・general-purpose)、ユーザー定義なら custom、リードのプロセスで動くエージェントチームのメンバーなら teammate、フォークなら fork。サブエージェント自身のターンにだけ付き、圧縮や付随のリクエストでは ID は残るが型は付かない。ユーザーが付けたエージェント名は送らない |
x-claude-code-compaction |
圧縮中の要約リクエストに付く。値は引き金で、auto(コンテキストが上限に近づいた)・manual(/compact)・reactive(API がリクエストを長すぎるとして拒否した)。ほかのリクエストには無い |
x-claude-code-context-compacted |
圧縮後の最初のメイン会話のリクエストに1回だけ付く。値は x-claude-code-compaction と同じ。それより前の会話の接頭辞は使われなくなるので、それをキーにしたキャッシュは捨ててよい |
x-claude-code-prev-tool-durations |
このリクエストが結果を運ぶツール呼び出しの実行時間。<name>=<ms>;<name>=<ms> の形(例 Bash=742;Read=9)。ツール呼び出しの束のあと、同じ会話の次のリクエストに付く |
x-claude-code-prompt-id |
リクエストが対応するユーザーのプロンプトを識別するランダムな UUID。そのプロンプトが起動したサブエージェントのターンも含めて、同じ値を共有する。プロンプトに属さないリクエストには付かない。v2.1.283 以降 |
x-claude-code-prev-tool-durations を解釈する前に、作り方を確かめます。1つのツール呼び出しにつき1項目(結果が集まった順、ミリ秒の整数)。最大32項目と4KB(先頭から残す)。ツール名はパーセントエンコードされ、%・;・=・カンマ・空白・印字できる ASCII 以外が対象。解析は ; で分け、次に = で分け、名前をデコードする。圧縮の呼び出し・付随のリクエスト・新しいプロンプトの最初のリクエストには付かないので、無いことを「ツールを実行しなかったターン」と読まない。時間は、権限の確認とフックを除き、並列のツール呼び出しはそれぞれが自分の時間を報告するので、合計はリクエストの間隔と一致しない。
開いたリストとして扱う#
ヘッダーと本文のフィールドは、閉じた一覧ではなく開いた一覧として扱います。Claude Code は、リリースごとに、新しい anthropic-beta の値・本文のフィールド・ときに新しい anthropic-* や x-claude-code-* のヘッダーを足します。Anthropic 形式の上流へ転送するなら、anthropic-* のリクエストヘッダーと本文のフィールドを、いま見えているものを許可リストにせず、そのまま通します。例外は、Bedrock や Vertex AI のような Anthropic 以外の上流で、スキーマの差を埋めるのはゲートウェイの仕事です。
レスポンスヘッダー#
ストリームの停止の検出・再試行するかとその待ち時間・使用量の上限の表示に、これらを読みます。エラーの本文も、変えずに転送します。
| ヘッダー | 返す内容と理由 |
|---|---|
content-type |
Anthropic Messages 形式のストリームは text/event-stream。Bedrock 形式は application/vnd.amazon.eventstream を変えずに(別の型だとリクエストが失敗する) |
retry-after |
日付ではなく整数の秒数。Claude Code は、次の自動の再試行の前に少なくともその時間待つ。CLAUDE_CODE_RETRY_WATCHDOG のセッション以外では、60を超えると再試行を止めてすぐエラーを出す |
x-should-retry |
上流の値を変えずに通す。true は再試行可能、false は不可 |
anthropic-ratelimit-unified-* |
上流の値を、毎回の応答で変えずに転送する。claude.ai でサインインしている開発者に、プランの上限に対する使用量を表示するのと、429 がプランの上限・支出の上限・一時的な絞り込みのどれかを見分けるのに使う |
システムプロンプトの帰属ブロック#
Claude Code は、システムプロンプトの先頭に、クライアントのバージョンと会話から作る指紋を持つ短いブロックを付けます。api.anthropic.com は、最初の system ブロックとして変更なしで届いたとき、処理前にこのブロックを取り除きます。ほかの上流は、プロンプトの一部として受け取ります。この除去は位置で行うので、ゲートウェイが system 配列を変えずに転送したときだけ効きます。
system配列を、受け取ったまま、このブロックを先頭にして転送する。別の system ブロックを前に足す・並べ替える・1つの文字列にすると、除去が効かず、ブロックがモデルとプロンプトキャッシュのキーに届く- ブロックを配列の独立した1項目として保つ。帰属のヘッダーで始まる結合したブロックは、全体が帰属として扱われ、結合された残りのシステムプロンプトも落ちる
- ゲートウェイがシステムの内容を作り直さなければならないなら、
CLAUDE_CODE_ATTRIBUTION_HEADER=0でクライアントがブロックを省く。Anthropic とクラウドの Claude のエンドポイントは、帰属にこのブロックを読むので、ゲートウェイで外したり動かしたりせず、クライアントで省く - この変数は、ゲートウェイとサードパーティのキャッシュの互換のためで、プライバシーの制御ではない。リクエスト全体は、直接接続でも Anthropic の API に行く
- 次の両方が成り立つとき、
0にしても、auto モードの分類器のリクエストには、ブロックを残す:リクエストがapi.anthropic.comへ行く(ANTHROPIC_BASE_URLが未設定か、そのホストを指し、サードパーティのプロバイダが選ばれていない)・有効な資格情報が Anthropic のプロファイルやフェデレーションの資格情報でない。どちらかが成り立たない(LLM ゲートウェイ経由・サードパーティのプロバイダ・プロファイルやフェデレーションの資格情報)なら、0で分類器のリクエストからも外れる(v2.1.229 より前はこの例外が無く、API が拒否すると、auto モードが分類器へ送る全アクションで失敗した) - v2.1.181 から、独自のベース URL 経由なら、ブロックは会話のあいだ安定する。ゲートウェイ側の、リクエスト本文全体をキーにするプロンプトキャッシュも、無効にせずに使える。それより前は、リクエストごとのトークンが入って、システムプロンプトの先頭が毎回変わった。その版では、ゲートウェイが本文をキーにするキャッシュを持つとき、またはサードパーティの提供元(Bedrock・Foundry・Vertex AI)へ転送するときに、
CLAUDE_CODE_ATTRIBUTION_HEADER=0にする
機能の通過#
ANTHROPIC_BASE_URL のゲートウェイは、Anthropic 形式のエンドポイントとして扱われ、api.anthropic.com へ送るのと同じベータヘッダーと本文のフィールドを受け取ります(直接接続に限る診断や既定を除く。その集合はリリースで変わるので、内容に依存しない)。本文のフィールドを足す機能は、ベータヘッダーと対で動きます。ヘッダーだけ外して本文を通す、または Anthropic 形式の本文をスキーマの違う上流へ転送すると、400 で失敗します。両方がそろって無いときだけ、機能は黙ってオフになります。内容の検査のために本文を書き換える・伏せるゲートウェイも、同じように対を壊すので、変更せずに検査します。細粒度のツールストリーミングは、直接接続の既定の1つで、独自のベース URL ではオフです。開発者が CLAUDE_CODE_ENABLE_FINE_GRAINED_TOOL_STREAMING=1 にすると、ゲートウェイが受け取ります。
| 機能 | ヘッダーと本文の対 | 壊れたときの症状 | 対処 |
|---|---|---|---|
| 適応的な推論 | ベータヘッダーなし。Claude 4.6 以降に thinking: {"type": "adaptive"} を送り、ゲートウェイの別名のような未知のモデル名も現行のモデルとして送る |
上流のモデルが受けないと、thinking のフィールドか adaptive のタグを名指しする 400 |
上流を更新する。Opus 4.6 と Sonnet 4.6 では、開発者が CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1 にしてもよい |
| コンテキスト管理 | コンテキスト管理のベータヘッダーと context_management の本文のフィールド |
400 と Extra inputs are not permitted。Anthropic 形式を受けて Bedrock へ転送するゲートウェイで多い |
両方を転送するか、CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 |
| 拡張コンテキストとインターリーブ思考 | ベータヘッダーのみ(本文のフィールドなし) | ヘッダーが外れると、黙って使えなくなる(上流は要求を見ない) | anthropic-beta をそのまま転送する |
| ベータのツールのフィールド | ツール関連のベータヘッダーと、strict・defer_loading などのツールスキーマのフィールド |
ヘッダーなしで本文だけが通ると、未知のツールスキーマのフィールドを名指しする 400 |
両方を転送するか、CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 |
| effort と構造化出力 | output_config の本文のフィールドが、effort・構造化出力の形式・タスクの予算の設定を運ぶ。それぞれが自分のベータヘッダーと対 |
Bedrock と Vertex AI の上流で、output_config を名指しする 400(多くは Extra inputs are not permitted) |
フィールドとヘッダーを一緒に転送するか、開発者が CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 にする(形式とタスクの予算の設定は外れるが、effort は外れない)。形式だけを外すなら、代わりに CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS=1(v2.1.288 以降) |
| プロンプトキャッシュ | ベータの対は無い。system のブロックと messages の項目(会話の途中で足される role: "system" の項目を含む)に cache_control を付ける |
エラーは出ない。毎ターン、キャッシュされない入力として課金され、usage で input_tokens が多くキャッシュの動きがほぼ無い |
cache_control を、どこにあっても変えずに転送し、ブロック形式の system やメッセージの内容を、平らな文字列に変換しない |
| トークン計数 | ベータの対は無い。count_tokens のエンドポイントを使う |
エラーは出ない。文字数ベースの推定になり、/context が概算になる |
正確な数のためにエンドポイントを公開する |
ANTHROPIC_DEFAULT_*_MODEL_SUPPORTED_CAPABILITIES は、プロバイダ構成(CLAUDE_CODE_USE_BEDROCK・CLAUDE_CODE_USE_VERTEX・CLAUDE_CODE_USE_FOUNDRY・CLAUDE_CODE_USE_MANTLE)でだけ、モデルの機能を宣言できます。ANTHROPIC_BASE_URL のゲートウェイの背後では効きません。
上流が拒否したときの自動の再試行#
| 拒否されたもの | Claude Code の動き |
|---|---|
thinking のフィールド・会話の途中の system メッセージ・そのメッセージの cache_control |
リクエストを再試行し、その会話の残りで、拒否された機能を無効にする |
思考の署名(bound to a different conversation の 400 を含む) |
前の思考ブロックをリクエストから外して再試行し、以後のリクエストにも入れない。新しい応答には思考が含まれる |
tools の advisor ツールの項目を、未知のツール型として拒否 |
その項目と anthropic-beta の値を外して1回再試行する。以後、Claude Code が終了するまで、そのベース URL への advisor を外し、/advisor も使えない。拒否は Input tag のあとにツール型を示す 400 か 422 で認識する(v2.1.280 より前は再試行しなかった) |
output_config.effort |
effort なしでリクエストを再試行し、Claude Code が終了するまで、そのモデルへの以後のリクエストから effort を外す。400 のメッセージが output_config.effort と Extra inputs are not permitted を名指しする、またはモデルが effort パラメーターに対応しないと言うことで、この拒否を認識する |
| コンテキスト管理やツールスキーマのフィールド | 再試行しない。その 400 は開発者に届く |
bound to a different conversation は、API の保存された思考の確認が、system・tools・前の messages の内容が思考を作ったリクエストと違うと失敗するために出ます。それらを書き換えるゲートウェイが、この拒否を起こすことがあります。再試行の判断は上流のエラーの文言に一致して動くので、エラーの本文は変えずに転送します。独自の封筒で包むと、ステータスコードを保っても、復旧が壊れます。封筒のメッセージに、安定した capability_rejected: のトークンを入れれば別です(Claude apps gateway が、クラウドの文言の代わりに入れる。例 capability_rejected: prompt_too_long)。
プレリリースの機能を止める#
ゲートウェイか上流が、プレリリースの anthropic-beta の値や、それと対の本文のフィールドを拒否し、両方を転送できないときは、開発者に CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 を設定させます。設定すると、Claude Code は、プレリリースの機能と、それと対の anthropic-beta の値を送らなくなります。外れるものは次のとおりです。
- コンテキスト管理と、その
context_managementの本文のフィールド strict・defer_loadingなどのベータのツールスキーマのフィールド(標準のname・description・input_schema・cache_controlのツールのフィールドは残る)- 構造化出力の
output_config.formatフィールド(v2.1.287 以降) output_config.task_budgetフィールド- MCP のツール検索。組織が管理設定でオンのままにしていなければ、すべての MCP ツールが最初に読み込まれる
この変数は、すべての anthropic-beta の値を外すわけではありません。残るものは次のとおりです。
-
拡張コンテキスト・インターリーブ思考・effort の
anthropic-betaの値(クラウドプロバイダーも受け付ける) -
output_config.effortフィールド(上流が拒否したときは、上の自動の再試行の節) -
ベータヘッダーを持たない、適応的な推論の
thinkingフィールド -
サブスクリプションの認証が要る OAuth の
anthropic-betaの値 -
開発者が
ANTHROPIC_BETASやCLAUDE_CODE_EXTRA_BODYで自分で足したヘッダーの値と本文のフィールド -
組み込む側のホストのプラットフォームが
CLAUDE_CODE_PROVIDER_MANAGED_BY_HOSTを設定したとき、この変数は、Bedrock・Vertex AI・Foundry・Claude apps gateway での auto モードのセッションが、サーバーに分類器のレビューを求めるのを止めない。そのレビューは、anthropic-betaの値とsafeguardsのリクエストのフィールドを足す。止めるにはCLAUDE_CODE_AUTO_MODE_SERVER=0 -
v2.1.227 以降では、managed settings で、この変数の下でも、MCP のツール検索を有効のままにできる。直接接続か
ANTHROPIC_BASE_URLのゲートウェイでは、ツール検索のベータヘッダー・defer_loadingのツールのフィールド・tool_referenceのブロックを送り続け、残りを外す。クラウドプロバイダや Claude apps gateway のサインインでは、この上書きは効かない
モデルの検出#
ANTHROPIC_BASE_URL が Anthropic Messages 形式のゲートウェイを指すとき、起動時にゲートウェイの /v1/models を呼び、返ったモデルを /model に足せます。CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 で有効にします(開発者の環境か managed settings)。既定でオフなのは、共有の API キーで動くゲートウェイが、キーで見えるモデルをすべてのユーザーに出さないようにするためです。
- 動かない場面:
CLAUDE_CODE_USE_*のプロバイダ変数が設定されている(ANTHROPIC_BASE_URLも設定されていても)・ANTHROPIC_BASE_URLが未設定かapi.anthropic.comを指す。省略可の通信を止めていても動く(v2.1.257 より前は動かなかった) - リクエストは
GET /v1/models?limit=1000。既定のタイムアウトは3秒(CLAUDE_CODE_GATEWAY_MODEL_DISCOVERY_TIMEOUT_MSで延ばせる。v2.1.269 以降)。リダイレクトは、資格情報が漏れないよう失敗として扱う(httpからhttpsでも)。遅いゲートウェイやリダイレクトは、黙って失敗する。設定したベース URL で直接提供する - 資格情報は両方のヘッダーで送り、値が決まらないヘッダーは省く(v2.1.248 以降。それより前は
ANTHROPIC_AUTH_TOKENがあればAuthorizationだけ、なければx-api-keyだけ)。AuthorizationはANTHROPIC_AUTH_TOKEN、なければapiKeyHelperの値を bearer として。x-api-keyは解決した API キー(ANTHROPIC_API_KEYなど)。ヘルパーの値だけのときは両方に入る。ANTHROPIC_CUSTOM_HEADERSのヘッダーも送り、値が空でない同名のヘッダーは、組み込みのヘッダーに代わる。どちらの資格情報も決まらなければ、検出を省き、claude --debugのデバッグログに[gatewayDiscovery] skippedを書く。ANTHROPIC_CUSTOM_HEADERSだけで資格情報を渡しても省かれる - 応答は、
data配列の各項目から、id・省略可のdisplay_name・省略可のdescriptionを読む
{
"data": [
{
"id": "claude-sonnet-4-6",
"display_name": "Claude Sonnet 4.6",
"description": "Default model for everyday coding tasks"
},
{ "id": "claude-opus-4-8" }
]
}
idにclaudeかanthropicが(大文字小文字を区別せず)含まれる項目だけを残す。vertex_ai/claude-sonnet-4-6やbedrock/anthropic.claude-sonnet-4-5のように、提供元の接頭辞が付いた ID も通る(v2.1.223 より前は、claudeかanthropicで始まる ID だけ)- ピッカーの項目名は、
display_name(idと違うとき)。無ければ、Claude Code がidを認識するならモデル名、しないならid。たとえばmy-gateway-claude-sonnet-4-6でdisplay_nameなしならSonnet 4.6。説明は1行に縮め、無ければ「From gateway」(v2.1.257 より前は常に「From gateway」) - 検出が足すのは、
availableModelsの managed 設定が許可するモデルだけ - すでにある行と一致する ID は、独自の行にならない。同じ ID(または同じ Fable バージョンの別の綴り)。内蔵のエイリアスがいま解決するモデルと同じ明示の ID は、エイリアスの行だけが出る(例:
sonnetがclaude-sonnet-5-5に解決される間、見つかったclaude-sonnet-5-5はsonnetの行にまとまり、claude-sonnet-5は独自の行になる) - 結果は
~/.claude/cache/gateway-models.json(Windows は%USERPROFILE%\.claude\cache\gateway-models.json。CLAUDE_CONFIG_DIRがあればその下)にキャッシュされ、起動のたびに更新される。リクエストが失敗するか/v1/modelsが無ければ、前回の起動のキャッシュか内蔵の一覧に戻る。検出のフィルタに合わない別名で Claude のモデルを出すなら、開発者がモデルの環境変数で手動で足す
公式ドキュメント(英語)
- Enterprise network configuration
- Run Claude Code behind a corporate launcher
- Run Claude Code through a gateway
- Other LLM gateways
- Connect Claude Code to an LLM gateway
- Roll out an LLM gateway for your organization
- Claude Code gateway compatibility guide
2026年10月5日時点の内容をもとに、日本語でまとめています。