公式の Connect Claude Code to an LLM gateway ガイドに基づいています — shunt こそが、あなたが接続するゲートウェイです。
1. Claude Code を shunt へ向ける
稼働中のゲートウェイ(デフォルトのバインド 127.0.0.1:3001)へ base URL を設定します。シェル内、または 設定ファイルの env ブロックに永続化します。
export ANTHROPIC_BASE_URL=http://127.0.0.1:3001// ~/.claude/settings.json
{
"env": {
"ANTHROPIC_BASE_URL": "http://127.0.0.1:3001"
}
}既存の Anthropic 認証情報はそのまま保ってください — shunt は、マッピングしなかったすべてのモデルについて、それを変更なしで api.anthropic.com へ転送するため、マッピングされていないモデルはこれまでとまったく同じように動作します。マッピングされたモデルのプロバイダー認証情報は shunt 自身が注入します。Claude Code がそれらを送ることは決してありません。
2. Anthropic 認証情報を選ぶ
Claude Code が shunt へ送る認証情報は 2 つの役割を果たします。Claude パススルーモデルを認証すること、そして model discovery をゲートすることです — Claude Code は ANTHROPIC_AUTH_TOKEN、API キー、または apiKeyHelper が設定されているときのみ GET /v1/models リクエストを発行します。マッピングされたモデル(gpt-* など)はどちらの場合も影響を受けません。
| 認証情報 | トークンのリフレッシュ | Discovery | Claude パススルー | 課金 |
|---|---|---|---|---|
| claude.ai OAuth ログインのみ | 自動 | ❌ 発火しない | ✅ | サブスクリプション |
claude setup-token による ANTHROPIC_AUTH_TOKEN — 推奨 |
不要(1 年トークン) | ✅ | ✅ | サブスクリプション |
apiKeyHelper = shunt token |
ヘルパーがリフレッシュ | ✅ | ✅ | サブスクリプション |
ANTHROPIC_AUTH_TOKEN=<real API key> |
不要 | ✅ | ✅ | API(サブスクリプションではない) |
sk-dummy のようなダミー値は discovery ゲートを満たしますがパススルーを壊します — それは Anthropic へ転送され、401 を返します。
claude setup-token を推奨します。 これは1 年の OAuth トークンを発行するため(authentication docs)、リフレッシュするものは何もなく、1 つの値で両方の役割をカバーします。
claude setup-token # browser sign-in → prints sk-ant-oat…
export ANTHROPIC_AUTH_TOKEN=sk-ant-oat… # or persist it in a settings `env` blockshunt token 認証情報ヘルパー
shunt token は Claude サブスクリプションの OAuth トークンを stdout に出力するため、Claude Code の apiKeyHelper に直接組み込めます。
// ~/.claude/settings.json
{
"apiKeyHelper": "/path/to/shunt token"
}- 静的モード —
SHUNT_GATEWAY_TOKENまたはCLAUDE_CODE_OAUTH_TOKENが設定されている場合、その値を変更せずにそのまま出力します。claude setup-tokenの値を指定すれば、何もリフレッシュされません。 - 自動リフレッシュモード — それ以外の場合、
~/.claude/.credentials.json(CLAUDE_CREDENTIALSでオーバーライド)を読み込み、アクセストークンを返し、期限切れの 5 分前以内のときのみリフレッシュして、0600でアトミックに書き戻します。
静的 + setup-token のルートが、最もシンプルで安全なデフォルトのままです。
3. マッピングされたプロバイダーの認証情報を用意する
これらは Claude Code ではなく shunt の環境へ渡します。
export OPENAI_API_KEY=sk-... # openai provider
codex login # codex/ChatGPT provider (auto-refreshed thereafter)4. マッピングされたモデルを選択する
Claude Code の model discovery は claude/anthropic で始まる id のみを尊重するため、OpenAI/Codex の id(gpt-*)には ANTHROPIC_CUSTOM_MODEL_OPTION を使います — これは、id が検証をスキップするピッカーエントリを追加します。
export ANTHROPIC_CUSTOM_MODEL_OPTION="gpt-5.6-sol"そして Claude Code で /model から選びます。その id は shunt がルーティングに使うものなので、一致する [models.upstream_model] エントリ、[[routes]]、または [[route_prefixes]] ルールで解決される必要があります。
2 つのピッカー公開方法は claude-/anthropic- プレフィックスできれいに分かれます — 重複しません。discovery は claude-/anthropic- の id のみを尊重します。ANTHROPIC_CUSTOM_MODEL_OPTION と CLAUDE_CODE_MAX_CONTEXT_TOKENS のウィンドウオーバーライドは、そのプレフィックスで始まらない id のみに適用されます。
| 何 | claude-/anthropic- id(discovery エイリアス) |
非 claude- id(例 gpt-5.6-sol) |
|---|---|---|
/v1/models discovery → /model ピッカー |
✅ 自動リスト(「From gateway」)、多数のモデル | ❌ Claude Code が落とす |
ANTHROPIC_CUSTOM_MODEL_OPTION |
❌ 尊重されない | ✅ ピッカーに追加(1 つの id のみ) |
CLAUDE_CODE_MAX_CONTEXT_TOKENS ウィンドウ |
❌ 無視 → 200k デフォルト | ✅ 適用 → 実際のウィンドウを設定 |
したがって、claude-…-via-codex の discovery エイリアスは便利(自動リスト、ワンタップ)ですが、そのコンテキストウィンドウは 200k デフォルトに固定されます — オーバーライドは claude- プレフィックスの id には届きません(Effort & Context)。複数のモデルにまたがるピッカーの便利さには discovery エイリアスを選び(200k の分母を受け入れる)、正確なウィンドウには ANTHROPIC_CUSTOM_MODEL_OPTION 経由の非 claude- id を、一度に 1 モデルずつ選んでください。
エージェント単位の振り分け
コンテキスト単位の選択は Claude Code 自身のノブで機能します — メインセッションが Claude のまま残る一方で、1 つのエージェントをマッピングされたモデルへ振り分けます。
# .claude/agents/researcher.md
---
name: researcher
model: gpt-5.6-sol # this agent's inference is diverted; the main session stays on Claude
---名前付きサブエージェントの model: フロントマターは、サブエージェントを gpt-* id に乗せる唯一の方法です。そのフィールドは任意の文字列を取りますが、Agent/Task ツールの model パラメータは組み込みエイリアス(opus/sonnet/haiku/fable)に制限され、ゲートウェイ id を取れません。エージェントをそのタイプで model オーバーライドなしにスポーンしてください — ツールパラメータがフロントマターより優先されるため(CLAUDE_CODE_SUBAGENT_MODEL > ツールの model > フロントマター > inherit)、渡すとマッピングされたモデルを覆い隠してしまいます。CLAUDE_CODE_SUBAGENT_MODEL はすべてのサブエージェントを 1 つのモデルに強制します。ウィンドウはモデル id に自動的に追随するため、1 つのグローバルな CLAUDE_CODE_MAX_CONTEXT_TOKENS がマッピングされたサブエージェントをサイズし、Claude のメインは自身のものを保ちます。
5. 検証
# Unmapped model -> forwarded to Anthropic (uses your Anthropic credential)
curl -s -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":"."}]}'
# Mapped model -> diverted to the provider (uses shunt's provider credential)
curl -s -X POST "$ANTHROPIC_BASE_URL/v1/messages" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"gpt-5.6-sol","max_tokens":16,"messages":[{"role":"user","content":"hi"}]}'その後 claude を起動し、/status を実行して、Anthropic base URL の行にあなたのゲートウェイが表示されていることを確認します。reasoning エフォートとコンテキストウィンドウのチューニングについては Effort & Context も参照してください。