※本記事では所属企業の製品について言及します。
※本記事の構成整理には生成AIを利用していますが、記載しているコマンド・出力・バージョン番号はすべて筆者の環境で実際に実行して確認したものです。
はじめに
Claude Code の推論リクエストを公式エンドポイントから別のゲートウェイに向ける設定は、環境変数を6つ書き込むだけで完了します。手順そのものは難しくありません。
ただ、設定した後に「本当に切り替わっているのか」を確認する方法があまり整理されていないと感じました。claude --version がバージョン番号を返したので成功、と判断してしまうケースをよく見かけますが、これはクライアントがインストールされていることしか証明していません。エンドポイントに到達できるか、認証情報が有効か、モデルが応答を返すか——これらは一切確認できていません。
本記事では設定手順に加えて、「インストールできた」と「実際に通った」を切り分けて確認する4つのコマンドをまとめます。特に4つ目が本題です。
環境
本記事のコマンドはすべて下記の環境で実行し、出力を確認しています。
| 項目 | バージョン |
|---|---|
| OS | Windows 10 Pro 22H2 (build 19045) |
| PowerShell | 7.x(スクリプトは 5.1 にも対応、後述) |
| Node.js | v24.21.0 |
| Claude Code | 2.1.283 |
| Git | 未インストール |
最後の行は誤りではありません。この環境には Git が入っていませんが、claude コマンドは正常に動作し、後述する4つ目のエンドツーエンド確認も通ります。Git は Claude Code の実行時依存ではありません。
手順
1. 現在の状態を確認して、使うスクリプトを決める
まずこれを実行します。
claude --version
| 出力 | 使うスクリプト |
|---|---|
| バージョン番号が出る |
configure — 設定のみ書き込む |
| コマンドが見つからない |
setup — 依存関係のインストールから行う |
configure 側は最初に PATH 内の claude を検査し、見つからない場合はその場でエラー終了します。つまり選択を間違えても壊れることはなく、単に実行を拒否されます。逆方向(既に構築済みの環境に setup を流す)は依存関係を再インストールすることになるので、この確認は省略しないほうがよいです。
2. スクリプトを実行する
既に Claude Code がある場合(設定のみ):
curl -fsSL https://raw.githubusercontent.com/xujfcn/crazyrouter-claude-code/main/configure.sh | bash
irm https://raw.githubusercontent.com/xujfcn/crazyrouter-claude-code/main/windows/configure.ps1 | iex
環境がまったくない場合は、同じリポジトリの同じディレクトリにフルインストール版があります。上記コマンドの configure を setup に置き換えてください(setup.sh / windows/setup.ps1)。こちらは Git・Node.js・Claude Code をインストールしたうえで設定を書き込みます。
逆は避けてください。構築済みの環境に setup を流すと依存関係が再インストールされます。
| bash や | iex の形式である以上、実行前にブラウザで中身を確認することを推奨します。以下に書く挙動は、実際にソースを読んで確認した内容です。
スクリプトが聞いてくるのは3項目のみです。
| 項目 | 必須 | 挙動 |
|---|---|---|
| Token | 必須 | 入力はエコーバックされません。貼り付けても画面に何も表示されませんが正常です。空のまま進めるとエラー終了します |
| Base URL | 任意 | デフォルト値あり。末尾のスラッシュは自動的に除去されます |
| モデル | 任意 | デフォルト値あり。後から変更可能です |
補足として、Token には形式のプレチェック(sk- / cr- / rk- のいずれかで始まるか)がありますが、一致しない場合も警告を出すだけでブロックはしません。警告が出てもその後にエラーが出ていなければ問題ありません。また、日本語のドキュメントを見ていてもスクリプトの出力は英語です。
Windows 版のフルインストールは winget を優先し、winget がない環境では直接ダウンロードにフォールバックします(Node.js は固定バージョンの LTS インストーラ、Git は公式リリース)。PowerShell 5.1 向けに TLS 1.2 / 1.3 を明示的に有効化する処理も入っています。
3. 何が書き込まれたかを確認する
書き込まれるのはユーザーレベルの環境変数6つです。
ANTHROPIC_BASE_URL ゲートウェイのアドレス(/v1 なし)
ANTHROPIC_AUTH_TOKEN トークン
ANTHROPIC_MODEL デフォルトモデル
CLAUDE_MODEL デフォルトモデル
OPENAI_API_KEY 同じトークン
OPENAI_BASE_URL ゲートウェイのアドレス(/v1 あり)
2セット書かれるのは、Claude Code が Anthropic 側の規約を読み、OpenAI 互換のツール群が後者を読むためです。1つのトークンで両方をカバーします。
書き込み先は、Windows ではユーザー環境変数(User scope)、macOS / Linux では ~/.crazyrouter-claude-code.env と、それを読み込む1行を shell の起動ファイルに追加する形です。起動ファイルの選択はファイルの存在ではなく実際のログインシェルを見て決めています。使っていない .zshrc が残っているサーバーでも書き先を間違えません。
スクリプトを使わず手動で設定する場合はこうなります。
[Environment]::SetEnvironmentVariable('ANTHROPIC_BASE_URL','https://api.crazyrouter.com','User')
[Environment]::SetEnvironmentVariable('ANTHROPIC_AUTH_TOKEN','sk-あなたのトークン','User')
[Environment]::SetEnvironmentVariable('OPENAI_BASE_URL','https://api.crazyrouter.com/v1','User')
プロジェクト単位で切り替えたい場合は、プロジェクトルートに .claude/settings.json を置く方法もあります。
{
"env": {
"ANTHROPIC_BASE_URL": "https://api.crazyrouter.com",
"ANTHROPIC_AUTH_TOKEN": "sk-あなたのトークン",
"ANTHROPIC_MODEL": "claude-opus-4-8"
}
}
4. デスクトップ版の GUI から設定する
デスクトップアプリを使う場合、環境変数を触らずに設定できます。ただしこの画面はデフォルトでは表示されません。設定画面をいくら探しても出てこないのは、開発者モードの下にあるためです。
Help → Troubleshooting → Enable Developer Mode
確認するとアプリが1回再起動し、左上のハンバーガーメニューに Developer 項目が現れます。
そこから Configure third-party inference を開きます。
左側の Connection を選択すると、下記の画面になります。
| フィールド | 入力内容 |
|---|---|
| Credential kind |
Static API key。「認証情報のソースを固定する」という意味で、以降はログイン状態や環境変数にフォールバックしません |
| Gateway base URL | 末尾スラッシュなし、/v1 を自分で付けない、クエリパラメータを付けない |
| Gateway API key | 貼り付け後、右の目のアイコンで確認することを推奨します |
| Gateway auth scheme |
bearer または x-api-key
|
| Artifact preview iframe origin | 特に要件がなければ空欄 |
右上の Test connection を通してから、右下の Apply Changes を押します。 2つ目を押し忘れると設定が保存されません。
なお、GUI はスクリプトと違って URL の書式を自動補正しません。末尾スラッシュや余分な /v1 はそのまま送信されます。
(補足:左側には Sandbox & workspace と Egress という区分もあり、デスクトップ版はツールの通信をサンドボックス化しています。フィールドが正しいのに Test connection が通らない場合、許可される送信先ホストの一覧を確認する価値があります。筆者の環境では再現していないため、切り分けの方向性としてのみ記載します。)
5. 4つのコマンドで「実際に通った」ことを確認する
本記事の主題です。
1つ目:クライアントが入っているか
claude --version
2つ目:ランタイムがあるか
node --version
3つ目:設定が書き込まれているか
'ANTHROPIC_BASE_URL','ANTHROPIC_AUTH_TOKEN','ANTHROPIC_MODEL','CLAUDE_MODEL','OPENAI_API_KEY','OPENAI_BASE_URL' |
ForEach-Object { "{0,-22} {1}" -f $_, [Environment]::GetEnvironmentVariable($_,'User') }
env | grep -E 'ANTHROPIC|OPENAI'
6つすべてが存在すること、そして OPENAI_BASE_URL の末尾に /v1 があり、ANTHROPIC_BASE_URL にはないことを確認します。
4つ目:エンドポイント・認証情報・モデルを同時に検証する
curl -s https://api.crazyrouter.com/v1/messages \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-4-8",
"max_tokens": 16,
"messages": [{"role": "user", "content": "reply with: pong"}]
}'
max_tokens=16 の最小リクエストを送り、200 が返り、本文に応答が含まれることを確認します。
1〜3が全部通って4つ目だけ落ちるのはよくあるパターンです。トークンの期限切れ、残量不足、モデル ID が受け付けられない、プロキシがドメインを別経路に流している——いずれもここで初めて表面化し、1〜3では何のエラーも出ません。
ハマった点と解決方法
設定したのに claude: command not found が出る
claude : 用語 'claude' は、コマンドレット、関数、スクリプト ファイル、または
操作可能なプログラムの名前として認識されません。
環境変数は新しく起動したプロセスにしか反映されません。同じウィンドウで確認している限り、必ずこの結果になります。Windows では PowerShell のウィンドウごと閉じて開き直します(タブを増やすのでは不十分です)。macOS / Linux では新しいターミナルを開くか、source ~/.crazyrouter-claude-code.env を実行します。
スクリプトが最後に出す Next step の1行目が "Open a NEW PowerShell window" なのですが、英語の出力が1画面分流れた後なので見落としやすいです。
404 が返る
ANTHROPIC_BASE_URL に /v1 を自分で足しているケースです。Claude Code はルートドメインに対して /v1/messages を組み立てるため、https://api.crazyrouter.com/v1 を設定すると https://api.crazyrouter.com/v1/v1/messages になります。これは誤った書き方です。ただし必ずエラーになるとは限りません。パスを厳密にルーティングするゲートウェイなら 404 が返りますが、寛容なゲートウェイはそのまま 200 を返すこともあります。手元のゲートウェイを実際に確認したところ後者でした。画面にエラーが出ないぶん、こちらのほうが気づきにくいです。
一方 OPENAI_BASE_URL のほうは /v1 が必要です。この2つは非対称です。手動設定で書式を揃えてしまうと、「Claude Code は通るのに他のツールが 404」あるいはその逆という状態になります。
401 / トークンが無効というエラー
この環境で実際に遭遇したのは、サブプロセス内で $env:ANTHROPIC_AUTH_TOKEN が空になっていたケースです。エンドポイントからは「トークンが提供されていない」という応答が返り、一見するとトークンが失効したように見えますが、原因はスコープでした。明示的にユーザースコープから読み直すと解決します。
[Environment]::GetEnvironmentVariable('ANTHROPIC_AUTH_TOKEN','User')
他に考えられるのは、認証ヘッダの種類の間違いと、Web からコピーした際に紛れ込む不可視の空白文字です。
認証ヘッダについて補足すると、本記事の環境では bearer と x-api-key の両方で実際にリクエストを送り、どちらも 200 が返りました。ただしこれは一般則ではありません。多くのゲートウェイは片方しか受け付けず、間違えた場合のエラーメッセージはトークン無効とほぼ区別がつきません。サービス提供元のドキュメントに従うのが確実です。
エンドポイントの URL にクエリパラメータが付いている
共有リンクからコピーすると ?utm_source=... のような文字列が末尾に残ることがあります。ブラウザでは問題になりませんが、API エンドポイントとして設定すると無視されるか検証に失敗します。個人的には、貼り付けた URL は一度目視で末尾まで確認する習慣をつけたほうが早いと感じています。
スクリプトが途中で終了したが、設定は壊れていないか
非対話環境で実行したところ、トークンの読み取り段階で終了コード 1 で終了しました。その後6つの環境変数を確認したところ、1つも変更されていませんでした。3項目をすべて収集してから書き込む設計になっているため、途中で中断しても中途半端な設定は残りません。再試行しても問題ないという意味で、この挙動は把握しておくと安心できます。
Git のインストールに失敗した
やり直す必要はありません。冒頭の環境表のとおり、この環境には Git が入っていませんが claude は動作し、4つ目のエンドツーエンド確認も通ります。フルインストールスクリプトが Git を入れるのは、その後の開発作業で使うためであって、実行前提ではありません。
まとめ
設定自体は環境変数6つで終わりますが、確認を claude --version で止めると「設定できたつもり」になります。
押さえておく点は3つです。
-
ANTHROPIC_BASE_URLに/v1は付けない、OPENAI_BASE_URLには付ける - 設定後は必ずターミナルを開き直す
- エンドポイントの URL にクエリパラメータを残さない
そして、確認は4つ目まで行います。max_tokens=16 の最小リクエストが 200 を返した時点で、エンドポイント・認証情報・モデルの3つが同時に検証されたことになります。
認証情報の扱いについても一言添えておきます。トークンはリポジトリにコミットしない、スクリーンショットに写り込ませない、マシンを移行したら旧キーを失効させる——この3点は最初に習慣化しておくのがよいと思います。





