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。自動リフレッシュ |
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.5"
provider = "grok"
# upstream_model = "grok-4.5" # オプション: 異なるスラッグを上流に転送パス 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.5"
provider = "xai"モデルスラッグ
スラッグのカタログは shunt のものではなく xAI のものです — shunt はあなたがルーティングしたスラッグをそのまま転送します。現在のコーディング/フロンティアのスラッグは grok-4.5、grok-4.3、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.5" # [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.5"
provider = "grok"
effort = "high"grok-4.5 は 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.5"
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.5" # /model ピッカーに追加/model から grok-4.5 を選びます。セッション内のそれ以外のすべては引き続き変更なしで 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 でアップグレードする。 |
refusing to send a subscription token off-origin(shunt check から) |
xai_oauth プロバイダーの base_url ホストが x.ai/grok.com でない、HTTPS でない、または kind = "responses" でない。ブロックを修正する。 |
effort を設定すると 400 |
その Grok スラッグは reasoning.effort を拒否します。それについてはプロバイダー/ルートから effort を削除する。 |
model <slug> is not enabled for this account |
entitle されていないスラッグ — xAI のカタログと照合してスラッグを確認する。 |
| ウェブ検索が何も返さない | Grok ルートでは非対応で、shunt がツールを削除します。codex/openai ルートを使う。 |
さらに詳しくは完全な Troubleshooting リファレンスを参照してください。