1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenRouterとCrazyrouter:請求額を決める4つの応答項目

1
Posted at

モデル数を比べる前に、レスポンスの4つのフィールドを見る。請求書を説明できるかどうかは、そこに宿っています。

同じClaudeのリクエストをOpenRouterと別のAPIゲートウェイに送ると、どちらも200を返します。Anthropic Messagesのエンドポイントがあり、x-api-key も Authorization: Bearer も通り、クライアント側の変更は不要です。単価も同じで、どちらもベンダーの定価に従います。

つまり表面上は引き分けです。残るのはエンジニアリングの比較——トークンの上に何が乗るのか、リクエストがコードを離れた後に何が起きるのかだけになります。

実際に違うのは4点です。

  • レスポンスフィールド。 OpenRouterは各社のフィールドをクロスベンダーの命名に正規化し、もう一方はAnthropicの返却をそのまま透過させます。
  • ルーティング。 OpenRouterはオープンウェイトモデルを複数のホストに分散し、既定では価格で重み付けします。もう一方は直供で、モデルIDごとに1つの価格、provider パラメータはありません。
  • ルールの置き場所。 OpenRouterのフォールバックはリクエストかプリセットに、もう一方の許可リストと予算はAPIキーに書きます。
  • モデルカタログ。 正規化後で372対177。これは後者の弱点で、目を逸らしません。

両者の違いはインターフェースではなく、要件がどちら側に落ちるかです。OpenRouterが適する場面もあります:自前のproviderキー、待ってよいバッチ処理、欧州に留める必要のあるprompt、SAML SSOと契約SLAが要る調達です。

実測した内容

2026年10月12日、両方のAnthropic Messagesエンドポイントに最小リクエストを送り、返却JSONを保存しました。あわせて cache_control 付きの長いコンテキストと、budget_tokens を128と1024に振った比較も行っています。対象モデルは claude-haiku-5-5、claude-sonnet-5-5、claude-opus-5-5 です。

カタログ数、フィールド名、価格は各社の公開APIとドキュメントから取得しました。OpenRouter側はドキュメントベースで、有料の実測はしていません。

4点の比較

OpenRouter もう一方のゲートウェイ
モデル項目(正規化後の一意ID) 458 / 372 177 / 177
プロトコル Chat、Responses、Messages Chat、Messages(両方の認証ヘッダーが可)
オープンウェイトモデル 実際のホスト先の価格 モデルIDごとに1価格
制限とフォールバックの設定場所 リクエストまたは @preset APIキー(許可リスト + 予算)
自前providerキー 月2.5万ドルまで手数料なし、以降5% 対応する仕組みの記載なし
バッチとフレックス 約半額 バッチエンドポイントの記載なし
キャッシュミスの理由 なし(cached_tokens が0になるだけ) diagnostics.cache_miss_reason
thinkingトークンの計数 usageに正規化 output_tokens_details.thinking_tokens
ゼロデータ保持 全プランで利用可 ZDR相当の記載なし(画像は48時間保持)
リージョン内ルーティング BusinessでEUまたはUS なし

レスポンスフィールドが分岐点

ネイティブ側には、OpenAI互換の形では表現できないフィールドが4つあります。cache_creation.ephemeral_5m_input_tokens と ephemeral_1h_input_tokens はキャッシュ書き込みを5分/1時間の2段で数え、output_tokens_details.thinking_tokens は推論トークンを出力から分離し、diagnostics.cache_miss_reason は今回ヒットしなかった理由を返します(実測では previous_message_not_found)。safeguard_results も含まれます。

# 静かな失敗を、大きな失敗に変える2つのassert
diag = resp.get("diagnostics") or {}
assert resp["usage"]["output_tokens_details"]["thinking_tokens"] > 0, "thinkingが出ていない: budget_tokensを確認"
if reason := diag.get("cache_miss_reason"):
    print(f"キャッシュミス: {reason}")

1つ目のassertは見た目より重要です。budget_tokens が小さすぎてもエラーにならず、200が返り、thinking_tokens が0になります。4モデルで試したところ、128ではthinkingブロックが出ず、1024では出ました。

正規化は欠点ではありません。集約サービスとしては当然の選択で、ClaudeからGemini、DeepSeekへ移っても usage のパースを書き換えずに済みます。代償は障害時に現れます。ヒット率が落ちても cached_tokens が0になったことしか分からず、あとは推測になります。

ルールはどこに置くか

OpenRouterはリクエスト内の models リストか、@preset/<name> として参照するプリセットでフォールバックを設定します。openrouter/auto という自動ルーターもあります。いずれもクライアントがOpenRouter固有のものを送る必要があります。

もう一方はAPIキー側です。モデルの許可リストとtoken予算をキーに紐づけ、クライアントは今まで通りのモデル名を送り続けます。許可外のモデルは model not allowed(403)、予算超過は429を返します。

レート制限のスコープも違います。OpenRouterはキーを増やしても上限は上がらないと明記しており、容量は全体管理です。もう一方のトラブルシューティング文書は、429の対処として「複数のtokenにトラフィックを分散する」を挙げており、制限がtoken単位で数えられていることが分かります。

料金:単価よりキャッシュ

OpenRouterは推論に上乗せせず、費用をチャージ時に取ります。Standardはカード決済で5.5%(最低$0.80)、暗号通貨5%、Businessは8%で、手数料は返金されません。つまり定価×1.055が実効単価です。もう一方は単価にグループ割引が含まれ、実際の呼び出し量で精算されます。

100万トークン(入力/出力)あたり、チャージ条件を織り込むとこうなります。

モデル ベンダー定価 OpenRouter(手数料込み) もう一方(割引)
Claude Opus 5.5 $4 / $20 $4.22 / $21.10 グループ割引
Claude Sonnet 5.5 $2 / $10 $2.11 / $10.55 グループ割引
GPT-6.1 Sol $2 / $10 $2.11 / $10.55 グループ割引
GPT-6 Astra $10 / $50 $10.55 / $52.75 定価比35%減
Gemini 3.8 Flash $0.75 / $3.75 $0.79 / $3.96 グループ割引
GLM-5.3 $1.40 / $4.40 $1.48 / $4.64 グループ割引

割引欄は割引率のみで、単価には換算していません。グループ割引はモデルごとに異なるためです。35%は2026年10月13日の価格ページのスナップショット($6.50 / $32.50、定価$10 / $50)です。

月$1,000をAstraの定価で使う場合、OpenRouterは年$12,660、35%で外挿すると年$7,800、差は$4,860になります。

ただし本命はキャッシュです。 Anthropicの規則では、書き込み1.25倍、読み取り0.1倍、1時間TTLの書き込み2倍で、この係数は両方に適用されます。6万トークンの文脈で1日40ターンなら、ミス時は0.06M × $2 = 1ターン$0.12、1日$4.80。全ヒットなら初回書き込み$0.15に、以降39ターン×$0.012で合計$0.62。1日$4.18、月$125の差です。

同じトークンで10倍の単価差。そのすべてがヒットしたかどうかで決まり、「なぜ外したか」をレスポンスに書いているのは片方だけです。

どちらを選ぶか

要件 適する側 理由
マルチモデル比較、オープンウェイトのロングテール OpenRouter 372対177、Qwen3は37対12
ベンダーを頻繁に切り替えるコード OpenRouter 正規化フィールドでパーサ変更不要
providerを跨ぐ冗長化 OpenRouter 複数ホスト + Sticky Routing
データ所在地、ゼロ保持、ソブリンクラウド OpenRouter ZDRとリージョンルーティングの文書あり
文書通りにレート制限を実装したい OpenRouter 402 / 403 / 429の分離 + in-flight予算
モデルがClaudeの1〜2本に固定 もう一方 ネイティブフィールド透過、thinking も tool_use もそのまま
キャッシュミスの原因を追いたい もう一方 cache_miss_reason が返る
token単位の予算・許可リスト・環境分離 もう一方 仕組みが用意されている
1つのキーで画像や音声も呼ぶ もう一方 独立エンドポイント

Claude Codeの切り替えは環境変数3つです。

export ANTHROPIC_BASE_URL="https://api.crazyrouter.com"
export ANTHROPIC_AUTH_TOKEN="あなたのキー"
export ANTHROPIC_MODEL="claude-sonnet-5-5"

検証していないこと

レイテンシとエラー率は測っていません。両者を同一条件で比較する安定した方法がないためです。429の実閾値も未計測で、token単位という記述はトラブルシューティング文書からの推測です。OpenRouter側は有料実測ではなくドキュメントベースで、実際の請求は自分の明細で確認するのが確実です。35%は1日・1モデルのスナップショットであり、外挿はできません。

価格とモデル数は自分で取得するのが最も正確です。どちらのAPIもキー不要です。

curl -s https://openrouter.ai/api/v1/models | jq '.data | length'
curl -s https://crazyrouter.com/api/pricing | jq '.data | length'

参考

Crazyrouter

OpenRouter(比較元)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?