2 つの組み込みプロバイダーが Claude Code を xAI の Grok モデルへルーティングします。両者はどう認証し、どの xAI サーフェスにアクセスするかだけが異なります — どちらか一方を選んでください。
| プロバイダー | 認証 | バックエンド | 課金 |
|---|---|---|---|
grok |
xai_oauth — あなたの SuperGrok / X Premium+ ログイン |
cli-chat-proxy.grok.com/v1(Grok CLI チャットプロキシ) |
あなたのサブスクリプション — トークン単位の課金なし |
xai |
api_key(XAI_API_KEY) |
api.x.ai/v1(開発者 API) |
従量制の API クレジット |
どちらも xAI の Responses 方言を話す kind = "responses" プロバイダーです — Codex と同じ変換パスであり、このページはそれをミラーしています。各トピックを繰り返すのではなく、より深いトピックページ(Effort とコンテキスト、モデルディスカバリー、プロバイダー)へリンクします。
クイックスタート
コーディングエージェントにセットアップを任せることもできます。shunt add はどちらのパスについてもセットアップ用ブループリントを出力します(オフラインかつ読み取り専用で、設定を編集するのはエージェントです。このコマンド自体は編集しません)。
shunt add upstream grok --print | claude # SuperGrok / X Premium+ subscription (OAuth)
shunt add upstream xai --print | claude # xAI developer API (XAI_API_KEY)または、以下の手順に沿って手動で設定してください。
仕組み
shunt は Claude Code の Anthropic Messages リクエストを OpenAI Responses API へ変換し、xAI へ送信し、ストリーミングされる応答を変換して返します。xai の Responses フレーバー(xAI が拒否するパラメータを落とし、ツールを関数ツールとして保持)は 2 通りで選択されます。api.x.ai ホストによる方法、または auth = "xai_oauth" による方法です(grok プロキシは x.ai ホストではないため、その方言は認証をキーにします)。
| 側面 | grok(サブスクリプション) |
xai(API キー) |
|---|---|---|
| エンドポイント | cli-chat-proxy.grok.com/v1/responses |
api.x.ai/v1/responses |
| 認証 | ~/.shunt/xai-auth.json からの Grok CLI OAuth、または ~/.shunt/accounts/xai/ 配下の名前付きログインのプール。自動リフレッシュ |
Bearer $XAI_API_KEY |
| identity ヘッダー | プロキシがサブスクリプションを尊重するための Grok CLI ヘッダー(x-xai-token-auth、x-grok-client-identifier、x-grok-client-version) |
なし |
パス A — SuperGrok サブスクリプション(grok)
1. ログイン
shunt 独自のデバイスコードログイン(RFC 8628)を実行します。URL とコードが表示されるので、任意のデバイスのブラウザで承認します — ループバックのコールバックサーバーは不要です。
shunt login xai成功すると shunt はトークンを ~/.shunt/xai-auth.json に 0600 のパーミッションで書き込み、自動的にリフレッシュします(5 分の有効期限バッファ。xAI はリフレッシュのたびにリフレッシュトークンをローテーションするため、shunt はシングルフライトロックの下でローテーション後のものを永続化します)。リフレッシュトークンが失われているか、応答がローテーション後のトークンを省略している場合、shunt は再度 shunt login xai を実行するよう伝えます。
2. プロバイダーブロック(オプション)
grok は組み込みです — 宣言する必要はありません。以下が完全なデフォルトです。部分的なテーブルは、設定したキーだけをオーバーライドします(設定マップはディープマージします)。
[providers.grok]
kind = "responses"
base_url = "https://cli-chat-proxy.grok.com/v1" # shunt が後ろに /responses を追加
auth = "xai_oauth" # ~/.shunt/xai-auth.json の読み込み + 自動リフレッシュ
# effort = "high" # オプション — 推論エフォートの有効化(§ 推論エフォート)3. モデルを grok へルーティングする
[[routes]]
model = "grok-4.6"
provider = "grok"
# upstream_model = "grok-4.6" # オプション: 異なるスラッグを上流に転送複数の SuperGrok アカウント
shunt は、複数の SuperGrok ログインを grok プロバイダーの背後でプールし、それらの間でフェイルオーバーできます。Claude、Codex、Kimi のアカウントをプールする方法と同じです。各ログインには個別の名前を付けてください。
shunt login xai --name main
shunt login xai --name backup各ログインは ~/.shunt/accounts/xai/<name>.json に保存されます(0600、0700 のディレクトリ内。ディレクトリは $SHUNT_XAI_ACCOUNTS_DIR でオーバーライドできます)。追加の設定がなければ、grok はそのディレクトリ内のすべてのアカウントを使います。一部だけを使うには、プロバイダーにリストしてください:
[[providers.grok.accounts]]
name = "main"
[[providers.grok.accounts]]
name = "backup"
priority = 200 # オプション: 小さいほど優先(デフォルトは 100)[[upstreams]] の設定では、代わりに auth マップでそれらの名前を指定します: auth = { mode = "xai_oauth", accounts = ["main", "backup"] }(1 つだけなら account = "main")。
shunt はセッション(x-claude-code-session-id)を 1 つのアカウントに固定し、それ以外ではラウンドロビンします。アカウントが 401、402、429、5xx で応答した場合、またはトークンをリフレッシュできない場合、shunt はそのアカウントをクールダウンさせ、次のアカウントでリクエストを再試行します。401 の後は、そのアカウントを再び使う前にトークンもリフレッシュします。それ以外の 4xx(403 を含む)はそのまま返されます。403 はコンテンツポリシーによる拒否の可能性があり、すべてのアカウントに再送するとすべてにフラグが立つおそれがあるためです。応答したアカウントは、x-shunt-account レスポンスヘッダーで、またはストリーミング応答の前の account イベントで示されます。
[server.pool] usage_refresh_seconds を設定すると、shunt は名前付きの各アカウントの Grok 使用量(クレジット合計と、Grok Build などの製品別の使用量)も読み取り、管理ダッシュボードにそのアカウントの使用量バーとして表示します。バーは表示専用で、どのアカウントがリクエストを処理するかは変わりません。Grok CLI のログイン(~/.grok/auth.json)が名前付きアカウントと同じ xAI ユーザーのものである場合、ダッシュボードは両者をそのアカウント名の 1 行にまとめて表示します。
パス B — xAI 開発者 API(xai)
1. キーをエクスポートする
export XAI_API_KEY=xai-…2. プロバイダーブロック(オプション)
[providers.xai]
kind = "responses"
base_url = "https://api.x.ai/v1" # shunt が後ろに /responses を追加
auth = "api_key"
api_key_env = "XAI_API_KEY"3. モデルを xai へルーティングする
[[routes]]
model = "grok-4.6"
provider = "xai"モデルスラッグ
スラッグのカタログは shunt のものではなく xAI のものです — shunt はあなたがルーティングしたスラッグをそのまま転送します。現在のコーディング/フロンティアのスラッグは grok-4.6、grok-4.5、grok-build-0.1 です。ルート内で upstream_model を使えば、Claude Code の環境に触れずにエイリアスをライブのスラッグへマッピングできます。(モデル discovery は宣言した claude- 名のエイリアスのみを公開するため、生の Grok スラッグをリストできません — 以下の ANTHROPIC_CUSTOM_MODEL_OPTION または tier リマップ経由でアクセスしてください。)
Claude Code でモデルを選択する
Grok スラッグは claude- で始まらないため、Claude Code の /model ピッカーは discovery からそれらをリストしません。仕組みは Codex と同一です — id をピッカーに直接追加します。
export ANTHROPIC_CUSTOM_MODEL_OPTION="grok-4.6" # [models.upstream_model]、[[routes]]、または [[route_prefixes]] で解決する必要あり残りは同じ Codex のセクションがそのままカバーします。model: フロントマターでサブエージェントを Grok スラッグに乗せること、そしてセッション全体で tier エイリアス(ANTHROPIC_DEFAULT_SONNET_MODEL、…)を Grok スラッグへリマップすることです。
推論エフォート
Codex とは異なり、Grok ではエフォートはオプトインです。 いくつかの Grok モデル(grok-4*、grok-3、grok-code-fast、…)はネイティブに推論するにもかかわらず reasoning.effort フィールドで 400 を返すため、shunt はダイヤルをあなたがプロバイダーまたはルートに設定したとき(あるいはリクエストごとに渡したとき)にのみ送信します — そうでなければモデルはネイティブの推論を使います。
[providers.grok]
effort = "high" # すべての grok トラフィックに適用
# …またはルートごとに
[[routes]]
model = "grok-4.6"
provider = "grok"
effort = "high"grok-4.6 は reasoning.effort を受け入れます(ライブ検証済み)。それで 400 になるスラッグでは effort を未設定のままにしてください。完全な優先順位とエフォートの表: Effort とコンテキスト。
コンテキストウィンドウ
Claude Code はマッピングされた id に対して、コンテキストバーを固定の 200k でサイズします。Grok スラッグの実際のウィンドウがそれより大きい場合は引き上げてください — 値は非 claude- id に自動的に追随します。
export CLAUDE_CODE_MAX_CONTEXT_TOKENS=256000 # スラッグの実際のウィンドウを設定、xAI のモデルドキュメントを参照これはグローバル(セッションごとに 1 つの値)です。実際のウィンドウを超えると prompt is too long のオーバーフローによる無駄なやり取りが発生するため、マッピングされたモデルのうち最も小さい実ウィンドウに合わせてください。詳細と count_tokens の挙動: Effort とコンテキスト。
ウェブ検索
Claude Code の組み込み ウェブ検索は Grok ルートでは動作しません。 xAI の Responses API は関数ツールのみを受け付けるため、shunt は xai フレーバー(grok と xai の両方)でホスト型の web_search ツールを削除します。ホスト型のウェブ検索が必要なときは codex または openai ルートを使ってください。
完全な例(サブスクリプションパス)
shunt.toml:
[server]
bind = "127.0.0.1:3001"
default_provider = "anthropic"
[providers.grok]
effort = "high" # オプション: すべての Grok トラフィックで推論エフォートを有効化
[[routes]]
model = "grok-4.6"
provider = "grok"シェル(shunt と Claude Code の両方をこれらで実行します):
shunt login xai # 一度きりのデバイスコードログイン
./target/release/shunt run # ゲートウェイを起動
export ANTHROPIC_BASE_URL=http://127.0.0.1:3001
export ANTHROPIC_CUSTOM_MODEL_OPTION="grok-4.6" # /model ピッカーに追加/model から grok-4.6 を選びます。セッション内のそれ以外のすべては引き続き変更なしで Anthropic へ流れます。マッピングされたモデルの推論だけが、あなたの SuperGrok サブスクリプションによって応答されます。
トラブルシューティング
| 症状 | 原因 / 対処 |
|---|---|
起動時に run shunt login xai |
~/.shunt/xai-auth.json がない(または $SHUNT_XAI_AUTH_FILE が違う)。shunt login xai を実行。 |
xAI refresh response missing refresh_token; run shunt login xai |
保存されていたリフレッシュトークンが消費/ローテーションされて失われた。再度ログイン。 |
402 … personal-team-blocked:spending-limit / “need a Grok subscription” |
API クレジットのない xai(開発者 API)パス上。console.x.ai でクレジットを追加するか、grok へルーティングしてサブスクリプションを使う。 |
403 … not authorized for API access(サブスクリプション tier のゲート) |
grok パス上で、あなたのサブスクリプション tier に API アクセスが含まれていない — 再ログインしても解決しません。XAI_API_KEY を設定して xai パスを使うか、x.ai/grok でアップグレードする。複数アカウントの場合、アカウントのトークンをリフレッシュする際に現れた tier ゲートは、そのアカウントをクールダウンさせ、shunt は次のアカウントへ移ります。リクエスト上の 403 はそのまま返されます。コンテンツポリシーによる拒否の可能性もあるためです。 |
refusing to send a subscription token off-origin(shunt check から) |
xai_oauth プロバイダーの base_url ホストが x.ai/grok.com でない、HTTPS でない、または kind = "responses" でない。ブロックを修正する。 |
名前付き xAI アカウントを使う場合の all upstreams failed (N attempted) |
どの上流も応答する前に、プール内のすべてのアカウントが失敗しました。各アカウントは、認証情報の読み込みまたはリフレッシュに失敗したか、トランスポートエラーまたはタイムアウトに遭ったかのいずれかです。認証情報の失敗の場合は shunt login xai --name <account> を再実行するか、~/.shunt/accounts/xai/ 配下のファイルを確認してください。アカウントが 401、429、5xx で応答していた場合、shunt は再試行を止め、このメッセージの代わりにその最後の応答をゲートウェイのマッピングを経て返します。すべてのアカウントが 402 を返した場合、クライアントには 502 として届きます。 |
xAI account scope references missing store account "<name>" |
account/accounts が、ストアにファイルのないアカウント名を指定しています。shunt login xai --name <name> でログインするか、名前を修正してください。 |
effort を設定すると 400 |
その Grok スラッグは reasoning.effort を拒否します。それについてはプロバイダー/ルートから effort を削除する。 |
model <slug> is not enabled for this account |
entitle されていないスラッグ — xAI のカタログと照合してスラッグを確認する。 |
| ウェブ検索が何も返さない | Grok ルートでは非対応で、shunt がツールを削除します。codex/openai ルートを使う。 |
さらに詳しくは完全な Troubleshooting リファレンスを参照してください。