はじめに
普段は Claude Code をサブスク(Claude Pro/Max)で使っているが、Anthropic 以外のモデル(GPT系、Gemini系、DeepSeek、Qwenなど)も試したくなったので、OpenRouter を導入しました。本記事では、導入の経緯、料金の仕組み、安全に運用するための設定方法をまとめます。
OpenRouter とは
複数の LLM プロバイダー(OpenAI、Anthropic、Google、Meta、Mistral など)のモデルに、単一の API キーでアクセスできる「LLM ゲートウェイ」サービスです。
- モデルごとの推論価格にはマークアップ(上乗せ)なし。プロバイダーの価格をそのまま通す
- OpenRouter 独自にかかるのは**クレジット購入時の手数料(5.5%、最低0.80ドル)**のみ(モデルの利用料は、プロバイダーの価格どおりにクレジットから差し引かれる)
- 仮想通貨決済は手数料5%
- BYOK(自分のプロバイダーキーを持ち込む場合)は月100万リクエストまで無料、それ以降は5%の手数料
サブスクのような月額固定プランは存在せず、事前にクレジットを購入し、使った分だけ消費する従量課金が基本の仕組みです。
仕組みのイメージ図
ポイント:
- クレジットはアカウント全体で1つの財布として共有されるが、APIキーごとに個別の利用上限(ブレーキ)は設定できる
- Claude Code はターミナルの環境変数、Claude Desktop はアプリ内のGUI設定と、接続方法がアプリごとに異なる
- どのモデルを使っても、実際の消費額はそのモデル・プロバイダーの価格がそのまま適用される(OpenRouter独自の上乗せはない)
なぜ導入したか
- Claude はサブスクでそのまま使い続けたい
- コーディング以外の作業や、コスト重視の軽い作業では、他の安いモデルも試したい
- ただし「使いすぎて想定外の請求が来る」のは避けたい
料金面での注意点
OpenRouter 経由では Claude のモデルも従量課金になります。最新の価格は OpenRouter のモデル一覧 で確認してください。
コーディングエージェントは1タスクで数万〜数十万トークン消費することも珍しくなく、ヘビーユーザーほどサブスクの方が安上がりになりやすい点に注意が必要です。従量課金は「軽い作業」「他モデルを試す」用途に留めるのが無難です。
使いすぎを防ぐ設定
1. APIキーごとの利用上限
OpenRouterのキー作成画面で、月/週/日単位の利用上限を設定できます。リセットタイミングは以下のいずれか(UTC基準):
- 毎日:UTC午前0時
- 毎週:月曜日
- 毎月:1日
上限に達すると、そのキーでのリクエストはそれ以上通らなくなります。**クレジット残高とは別の「ブレーキ」**なので、この上限額自体が自動で請求されるわけではありません。
2. 自動チャージ(Auto-reload)は基本オフ
残高が減ったら自動的にカード課金される機能ですが、想定外の連続課金リスクがあるため、個人利用では手動チャージのままにしておくのが安全です。
3. データの送信先(プライバシー設定)も確認
OpenRouter 経由で他社モデルを使うと、コードやプロンプトはそのモデルの提供元に送られます。仕事のコードを扱う場合は、OpenRouter の Privacy 設定を事前に確認しておきましょう。
APIキーの安全な管理:キーチェーンを使う
.zshrc にキーを平文で書くと、Gitへの誤コミットやファイル流出時にそのまま漏れるリスクがあります。macOSのキーチェーンを使うことで、ディスク上に平文のキーを残さずに済みます。
# キーチェーンに保存(初回のみ)
# -w の後に値を書かずに実行すると入力を求められる(キーをシェル履歴に残さないため)
security add-generic-password -a "$USER" -s "openrouter" -w
# 保存されているか確認(※キーが画面に表示されるので、画面共有中などは注意)
security find-generic-password -s "openrouter" -w
ただし、実行中のプロセスの環境変数(envコマンドなど)からは平文で見えるため、「ディスク上のファイル漏洩」を防ぐものであり、実行時のメモリ上の値までは保護できない点に注意してください。
Claude Code をサブスクと使い分ける
Claude Code は「サブスクでログイン」か「環境変数で外部ゲートウェイに接続」かの、どちらか一方でしか動作しません。そこで、OpenRouter を使うときだけ環境変数を渡して起動するシェル関数を .zshrc に定義しておきます。
# --- Claude Code: OpenRouter経由で起動 ---
# ( ) のサブシェル内で export するので、環境変数は今のターミナルに残らない
claude_or() {
(
export ANTHROPIC_BASE_URL="https://openrouter.ai/api"
export ANTHROPIC_AUTH_TOKEN="$(security find-generic-password -s openrouter -w)"
export ANTHROPIC_API_KEY=""
export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1
claude "$@"
)
}
ポイントは、環境変数の設定と claude の起動を ( )(サブシェル)の中にまとめていることです。環境変数はこの起動にだけ適用され、Claude Code を終了すると元のターミナルには何も残りません。そのため「OpenRouter モードのまま戻し忘れて、サブスクのつもりで従量課金を使っていた」という事故が起きず、サブスクに戻すための関数も不要です。
また、関数として定義しているだけなので、.zshrc を source しただけでは何も発動しません。
使い方
# 他モデルを試したい・軽い作業のとき(OpenRouter経由)
claude_or
# 引数はそのまま claude に渡される
claude_or --model deepseek/deepseek-v4-pro
# Claude でガッツリ作業したいとき(サブスク)
claude
接続確認は Claude Code 内で:
/status
Auth token: ANTHROPIC_AUTH_TOKEN / Anthropic base URL: https://openrouter.ai/api と表示されていれば OpenRouter 経由で成功です。
注意:ターミナルの環境変数はDesktopアプリの通常起動には引き継がれない
上記の環境変数は、ターミナルから起動したプロセスにしか引き継がれません。Dock などからアプリを直接起動した場合には反映されません。
ただし、Claude Desktopアプリ自体にも、アプリ内のGUI設定からOpenRouter(Gateway)経由に切り替える公式な方法が別途用意されています。
おまけ:Claude Desktopアプリ自体をGateway経由にする
Claude Code とは別に、通常のチャット用 Claude Desktop アプリも、Anthropicアカウントにログインせず OpenRouter 経由で動かせます。公式ドキュメントの手順は以下の通りです。
-
サインインせずに Claude Desktop を起動し、
Help > Troubleshooting→Enable Developer Modeを有効化 -
メニューバーの
Developer > Configure Third-Party Inference…を開く -
以下を入力
項目 値 Gateway base URL https://openrouter.ai/apiGateway API key OpenRouterのAPIキー( sk-or-v1-...)Gateway auth scheme bearerCredential kind Static API key -
アプリを完全終了・再起動し、起動画面で
Continue with Gatewayを選択(Anthropicアカウント不要) -
モデル選択画面に OpenRouter 経由のモデル一覧が表示される
注意点:
- これは Claude Code の環境変数切り替えとは別の仕組みで、アプリ全体の恒久的な接続先設定を変更するものです。シェル関数のように「その場だけ一時的に切り替える」性質のものではなく、元に戻すには再度この設定画面で戻す必要があります
- モデルが一覧に出ない場合は、OpenRouterアカウントのクレジット残高を確認してください(openrouter.ai/credits)
実践編:/modelに出てこないモデルを使う(DeepSeek実例)
CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 を設定すると /model に OpenRouter 経由のモデルが表示されますが、これはOpenRouterが厳選した一部のモデルのみです。実際に試したところ、DeepSeekやQwenなどのコスト重視モデルはこの一覧に出てきませんでした。
ただし、/model に出てこなくても、起動時にモデルIDを直接指定すれば普通に使えます。
環境変数ではなく --model フラグを使う
当初は export ANTHROPIC_DEFAULT_SONNET_MODEL=... のような環境変数での固定を検討していましたが、これは一度設定するとそのターミナルセッションで残り続けてしまい、切り替え忘れの事故につながります。そのため、起動のたびに明示的に指定できる --model フラグの方が安全です。
claude_or --model deepseek/deepseek-v4-pro
実行結果
起動時に以下の警告が表示されました:
"deepseek/deepseek-v4-pro" isn't described by this version's model catalog;
update Claude Code, or map it with behavesAs on a modelPicker row
(or modelOverrides, if it is a provider id of a model this version knows).
Until then auto-compact keeps this session within 200k tokens
(the context window it assumes); if the model accepts more,
append [1m] to the model name for 1M, or set CLAUDE_CODE_MAX_CONTEXT_TOKENS
to its real window; CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT=1
restores the previous wait-for-the-API behavior.
これはエラーではなく警告です。「Claude Codeが把握しているモデル一覧にはない未知のモデルなので、コンテキストウィンドウは仮に20万トークンとして扱う」という内容で、起動自体は問題なく進みます。
画面下部のステータスバーには、実際に使用中のモデルと課金方式が表示されます:
deepseek/deepseek-v4-pro · API Usage Billing
/model を開いても「Kept model as deepseek/deepseek-v4-pro」と表示され、指定したモデルのまま起動できていることが確認できました。実際に会話してみても、DeepSeek自身が「DeepSeek V4 Pro モデルで動作しています」と応答し、正しく接続できていることが分かります。
コンテキストウィンドウの注意点
DeepSeek V4 Pro は実際には100万トークンのコンテキストウィンドウを持っていますが、Claude Codeが未知のモデルと判断すると、デフォルトでは20万トークン相当で早めに会話が圧縮(auto-compact)されてしまいます。実際の性能を活かすには、モデル名に [1m] を付けて起動します。
claude_or --model "deepseek/deepseek-v4-pro[1m]"
途中でモデルを切り替えたい場合
--model で起動したモデルを、セッションの途中で別モデルに変えたい場合は以下の通りです。
-
/modelに載っているモデル同士(Sonnet↔Opus↔Geminiなど) →/modelコマンドでセッションを終了せずその場で切り替え可能 -
/modelに載っていないモデル(DeepSeekなど)に切り替えたい・そこから戻りたい場合 → 一旦/exitで終了し、--modelを指定し直して再起動する必要がある
頻繁に行き来したい場合は、ターミナルのタブを2つ開いて、それぞれ別のモデルで起動しておく運用が手軽です。より快適に/modelのメニューからも選べるようにしたい場合は、Claude Code Routerのような非公式のサードパーティ製ツールを使う方法もありますが、信頼性や管理コストとのトレードオフになります。
モデルの使い分け
/model に載っているモデルであれば、セッションを終了せずに切り替えられます(会話の文脈も保持されます)。一覧に載っていないモデル(DeepSeek、Qwen など)は、前述のとおり --model で起動時に指定してください。
| 用途 | 向いているモデル傾向 |
|---|---|
| 簡単な修正・定型コード | 安い軽量モデル(DeepSeek、Qwenなど) |
| 複雑な設計・バグ調査 | Sonnet、Opusなど高性能モデル |
| 画像を読み取る作業 | Qwen-VL、Gemini Flash系など安価な画像対応モデル |
トラブル実例:Geminiでツール呼び出しエラーが発生
/model から Google: Gemini 3.8 Flash を選んで使っていたところ、以下のエラーが発生しました。
API Error: 400 * GenerateContentRequest.tools[0].function_declarations[3].parameters.properties[query].properties[where].items.items: missing field.
エラーメッセージを読むと、Claude Code が送ったツール定義(JSON Schema)のうち、query → where という引数の中で入れ子になった配列の items に必要な項目(型の指定など)が欠けている、として Gemini API に拒否されています。Gemini API はツール定義のスキーマのチェックが厳しいため、Claude では問題なく動くツール定義でもエラーになることがあるようです。
query や where という引数名から、組み込みツールではなく、接続している MCP サーバーのツール定義が原因の可能性が高いと考えています(未検証)。
対処法(暫定):
- 同様のエラーが出たら、素直にAnthropic系モデル(Sonnet、Opusなど)に戻す
- Gemini を使いたい場合は、原因と思われる MCP サーバーを一時的に無効にして試す
まとめ
- OpenRouter はサブスクではなく前払いクレジット制。モデル料金への上乗せはなく、OpenRouter独自の手数料は購入時の5.5%のみ
- ヘビーユーザーはサブスクの方が安く、軽い作業や他モデル比較には従量課金が向く
- 月次の利用上限設定で、想定外の高額請求を防止
- APIキーはキーチェーンで管理し、
.zshrcに平文で残さない - サブスク/OpenRouterの切り替えは、サブシェルで起動するシェル関数にしておくと戻し忘れがなく安全
- Claude Desktopアプリ自体も、GUI設定から Gateway 経由に切り替え可能(ただし恒久的な設定変更)
-
/modelに出てこないモデル(DeepSeekなど)も、--model起動時指定で問題なく使用可能 - 他社モデル(Geminiなど)は、複雑なツール呼び出しで相性問題が起きることがある