AIDive

動画パック

Claude Code の Jev: hint モード、gateway 自身のベンチマーク、リクエストキャプチャ

13 分で読めます

TL;DR

  • Claude Code の中では、jev-gateway はツールを強制しません。steer: thinking || cached ? "hint" : "tool_choice" という1行で、リクエストに extended thinking かキャッシュ済みの会話が含まれた時点で hint モードに切り替わります。実際の Claude Code のリクエストは、最初のターンから両方を持っています。
  • hint は、最後の user メッセージに追加される2文の <system-reminder> です。モデルは無視してよく、Claude Code が自前の system reminder を最後のブロックとして追加済みの場合、hint はそもそも付きません。
  • gateway 自身のベンチマーク(120セッション)では、Claude モデルでルーティングはデバッグでは得をし、機能開発では損をします。feature タスクで Opus 5 は input トークン +61%、リクエスト +47%、時間 +83%、Sonnet 5 は input +16%、時間 +37% でした。
  • Jev が効くのは Codex です。gateway はそこでツールを強制し、Jev は Codex のリクエストの 76 から 100% を誘導しました。Claude Code では 34 から 51% です。
  • 私たちのマシンでの実測: クリーンな Claude Code 2.1.280 のリクエストでも 24 ツール、47,411 prefix トークン。MCP サーバーを入れた通常構成では 40 ツール、57,277 トークンで、gateway はこの一覧を毎回 Jev に再送します。
  • 最も star の多い Jev ツール fast-jev-compaction には、現行の Claude Code ビルドで hook が登録されないこと、全文の transcript がサードパーティ API に送られることを指摘する open issue があります。今はまだ見送りです。

計測が示すこと

Jev はテキスト生成モデルではなく、判断モデルです。ベンダーは input を $0.042 / MTok、output を無料とし、エンドツーエンドの応答時間を 70ms-500ms と謳い、見出し "193.6x faster, 444.6x cheaper" の下で、これらの数字は "are on the higher end of real world gains" だと書いています s3。同じ記事は、正解データが GPT-6 Astra と Fable 5.1 の回答の平均であり、比較が OpenAI と Anthropic のモデルに有利に偏ることも認めています s3。

jev-gateway が Claude Code に接続する方法は環境変数1つだけです。bin/clients.mjs が ANTHROPIC_BASE_URL をローカルの gateway に向け、Max のログインには触れません s1。src/adapters/messages.ts で、gateway は次のステップに合うツールを Jev に尋ね、その答えをどう渡すかを決めます。リクエストで thinking が有効か cache_control ブロックがある場合は hint にし、そうでなければ tool_choice を設定します s1。hint の文面は、ツールルーティングモデルが、指定のツールが最も関連する次のステップだと示唆している、ユーザーの実際の依頼に合わなければ無視してよい、というものです。これは最後の user メッセージに <system-reminder> ブロックとして追加されます s1。

Anthropic API に他の選択肢はありません。手動の extended thinking が有効だと tool_choice: any と tool_choice: tool はサポートされずエラーになり、Claude Opus 5.5、Claude Fable 5.1、Claude Mythos 5.1 は thinking に関係なく強制ツール使用で 400 を返します s4。gateway のコメントが見落としている点として、ドキュメントでは Claude Opus 5 は thinking が有効でも強制ツール選択をサポートするとされています s4。キャッシュの階層は tools、system、messages の順で、tool_choice の変更は messages のキャッシュだけを無効にしますが、ツール定義を編集すると全キャッシュが無効になります。gateway がツール説明を書き換えずブロックを追加するのはそのためです s5。

ほとんど誰も引用しないのが、gateway 作者自身のベンチマークです。6モデル、2タスク、モードごとに5回、2026-09-18 と 19 に行った 120 エージェントセッションで、GPT モデルは Codex 0.154、Claude モデルは Claude Code 2.1、すべてのエージェントは MCP サーバー、プラグイン、スキルなしのクリーンな状態です s2。chess-bugfix では、全モデルがルーティングでトークンを減らし、正答率は落ちませんでした。機能追加の chess-san では、ルーティングが Opus 5 と Sonnet 5 を明確に悪化させ、作者は原因を挙げています。gateway は Claude モデルでは hint しか出さないため、合わない hint は無料で無視されるのではなく回り道を生みます s2。ルーティングが正答率を下げたこともあります。GPT-5.6 Luna は単独では chess-san を5回中5回解きましたが、ルーティング付きでは5回中3回でした s2。作者はさらに、input トークンの多く(80 から 96%)はキャッシュ済みなので、input の削減は同じ量の output 削減より金額的な価値が低いこと、Jev 自体のコストは5回の実行あたり半セントから10セントだったことを付け加えています s2。120回のうち1回、Luna シリーズの chess-bugfix.on.3 は、エージェントが /tmp で別の実行のテストスクリプトを見つけたため contaminated と記されています s2。

私たち自身のテストの動機になった README の脚注があります。--user-tools では、ある構成が Claude Code のリクエストごとに 285 ツールと約 200,000 トークンを送り、クリーンな場合の 6 ツール、7,000 トークンと対照的でした s2。私たちも同じ位置で計測しました。クリーンな Claude Code 2.1.280 のリクエストは 24 ツール、ツール定義 87,547 文字、課金対象の prefix 47,411 トークン(書き込み 16,221、読み取り 31,190)。フル構成は 40 ツール、定義 93,179 文字、prefix 57,277 トークン(すべて書き込み)でした。どちらも thinking: {type: "adaptive"} と 3 つの cache_control ブロックを持ち、tool_choice はなく、これはまさに messages.ts で hint モードに固定される条件です s1。"ok" と返すだけの1回のコストは、クリーンな Sonnet 5 で API 換算 $0.07、フル構成の Fable 5.1 で $1.15 でした。Claude Code 自身の total_cost_usd と usage フィールドから読み取った値で、gateway のランチャーが占めるのと同じ位置です s1。

"instant compaction" スレッド(スコア 495、117 コメント)の元になったプラグイン fast-jev-compaction については s9、star 数より open issue が重要です。#21 は、Claude Code 2.1.272 で session.compact と turn.complete が認識される hook イベントではないため、インストール後に Hooks (0) と表示されると報告しています。#88 は hook では compaction を置き換えられず、全文 transcript がサードパーティ API に送られると指摘し、#65 は1回の compaction の後に9回連続で捏造された「作業完了」報告が出たことを記録し、#89 は --resume で compaction が元に戻ると述べています s7。スレッドで最も多い不満(84ポイント)は、ベンダーの ToS とデータ管理です s9。skill-suggestion の cookbook は、エージェント構成についてベンダーが公開している唯一の実測の成果です。誤ったスキルのロードは 16.8% から 7.3% に、合うものがないのにスキルをロードするケースは 9.8% から 4.0% に下がります s13。

計測値

gateway のベンチマーク。パーセンテージは、同じモデルでルーティングをオフにした場合との比較です s2。

chess-bugfix: 仕込まれた5つのバグを見つけて直す

モデル 正解、オン / オフ Output トークン Input トークン LLM リクエスト 秒 Jev の誘導
GPT-6 Astra 5/5 · 5/5 1,226 (-57%) 96k (-7%) 5 (0%) 41 (-39%) 100%
GPT-5.6 Sol 5/5 · 5/5 3,211 (-57%) 202k (-40%) 9 (-36%) 78 (-36%) 93%
GPT-5.6 Luna 1/4 · 0/5 10,519 (-12%) 506k (-10%) 19.5 (-15%) 200 (+10%) 86%
Fable 5.1 5/5 · 5/5 8,675 (-13%) 276k (-19%) 14 (-22%) 148 (+6%) 45%
Opus 5 5/5 · 5/5 16,693 (-7%) 406k (-22%) 18 (-14%) 218 (+2%) 38%
Sonnet 5 5/5 · 5/5 16,623 (-41%) 616k (-48%) 26 (-26%) 243 (-25%) 34%

chess-san: 動作するエンジンに代数記法を追加する

モデル 正解、オン / オフ Output トークン Input トークン LLM リクエスト 秒 Jev の誘導
GPT-6 Astra 5/5 · 5/5 3,663 (0%) 143k (+2%) 7 (0%) 88 (+8%) 95%
GPT-5.6 Sol 5/5 · 5/5 5,096 (-9%) 147k (-39%) 7 (-36%) 78 (-16%) 86%
GPT-5.6 Luna 3/5 · 5/5 6,809 (-14%) 315k (-51%) 14 (-42%) 121 (-14%) 76%
Fable 5.1 5/5 · 5/5 13,497 (-24%) 331k (-27%) 13 (-19%) 167 (-26%) 51%
Opus 5 5/5 · 5/5 20,152 (+22%) 676k (+61%) 25 (+47%) 390 (+83%) 44%
Sonnet 5 5/5 · 5/5 23,487 (+9%) 991k (+16%) 32 (+3%) 327 (+37%) 42%

私たち自身のリクエストキャプチャ。jev-gateway が占めるのと同じ位置です s1。

クリーン フル
Claude Code が選んだモデル claude-sonnet-5 claude-fable-5-1 (user setting, 1M)
リクエスト内の thinking {type: "adaptive"} {type: "adaptive"}
cache_control ブロック数 3 3
tool_choice なし (auto) なし (auto)
リクエスト内のツール数 24 40 (組み込み 28 + MCP 12)
ツール定義、文字数 87,547 93,179
System prompt、文字数 27,754 12,436
リクエスト全体、文字数 134,882 155,718
課金された prefix トークン (cache write + read) 47,411 (書き込み 16,221、読み取り 31,190) 57,277 (すべて書き込み)
Output トークン 4 4
"ok" 1回の API 換算コスト $0.07 $1.15

手順: 127.0.0.1:8790 で動く60行のロギングプロキシが、すべてのリクエストを https://api.anthropic.com へバイト単位でそのまま転送し、中身を記録します。これは bin/clients.mjs が jev-gateway に与えるのと同じ位置です。Claude Code 2.1.280 をヘッドレスで実行し、claude -p "Reply with the single word ok. Do not use any tool." --output-format json --max-turns 1 を、追跡ファイル 1,021 個の非公開 Expo リポジトリから、claude.ai のサブスクリプションで動かしました。クリーン: CLAUDE_CONFIG_DIR を空のディレクトリにし、--strict-mcp-config、--setting-sources project。フル: マシン通常の user settings、プロジェクトの .mcp.json、user の MCP サーバー、インストール済みプラグイン。構成ごとに1リクエスト、最初のターンのみ。Jev のキーはないため、回帰の数値は gateway のベンチの再掲であり、再現ではありません。

月曜にやること

  • ルーターを入れる前に、自分の環境を計測する。ロギングプロキシを起動し、ANTHROPIC_BASE_URL をそこに向け、claude -p "Reply with the single word ok." --output-format json --max-turns 1 を実行して、出力の cache_creation_input_tokens と cache_read_input_tokens を読む。
  • そのリクエストのツール数を数える。あまり使わない MCP サーバーが一覧を押し上げているなら、.mcp.json から外すかプロジェクト単位に絞る。この削減はルーターの有無に関係なく全リクエストに効く。
  • それでも Claude Code で Jev を使いたいなら、手元の jev-gateway クローンで src/adapters/messages.ts を開き、steer の行を確認する。thinking かキャッシュが有効なら、買っているのは route ではなく hint だ。
  • chess の表を信じる代わりに、--user-tools を付けて自分のリポジトリで gateway のベンチを回す。バグ探しのタスクで、正解/不正解が変わらずリクエストが減る場合だけルーティングを残す。
  • issue #21、#88、#89 が閉じるまで fast-jev-compaction を入れない。インストール後に /hooks が 0 より多い hook を表示することを確認する。
  • キーを貼る前にベンダーの ToS を読む。ルーティングされる全リクエストがツール一覧と最後のメッセージを送り、compaction プラグインは全文の transcript を送る。
  • Codex も使うなら、まずそこで Jev を試す。ベンチで効果が出ているのは強制された tool_choice だ。

さらに読む

  • モデルごとの強制ツール使用の表。どのモデルが 400 を返し、どの thinking モードが any と tool をブロックするかが分かる s4。
  • キャッシュ無効化の表。tools、system、messages の順と、gateway の設計を説明する tool_choice の行 s5。
  • jev-gateway の issue #24: セッション内で不変のツール一覧が毎リクエスト Jev に再送される。ダッシュボードが隠すコスト要因 s14。
  • ベンチ README の data-integrity の節: 120回中119回は互いに独立し、1回は runs.jsonl で contaminated と記されている s2。
  • コーディングエージェントの枠外で、公開・非公開データに対する分類器やフィルタとして Jev を評価した独立の記事 s12。
  • ベンダーの eval がグラウンドトゥルースではなく2つのモデルを基準に測っている理由と、それが見出しの倍率に与える影響 s11。
  • 「Jev が選び、LLM が書く」という分担と localhost の露出を検討した jev-gateway のサードパーティレビュー。同日中に修正された s8。
  • 価格と補助金の問題が公開で議論されている HN のローンチスレッド s10。

出典

FAQ

jev-gateway は Claude Code の中でツールを強制することがありますか?

リクエストに extended thinking も cache_control ブロックもない場合だけです。私たちが取得した最初のターンのリクエストは、クリーン構成でもフル構成でも両方を持っていたため、実際には gateway は hint を出します。

gateway はなぜツール説明を書き換えてもっと強く誘導しないのですか?

ツール定義を変更すると、tools、system、messages を含むプロンプトキャッシュ全体が無効になります。最後の user メッセージにブロックを追加するだけなら messages の階層にしか影響せず、hint を置く最も安い場所です。

では、Jev はコーディングに役立たないのですか?

そうではありません。ベンチでは、ツールが強制されリクエストの 76 から 100% が誘導される Codex と、全モデルのデバッグタスクで効果が出ています。gateway 自身の数字が裏付けないのは、「最も安い Claude Code」という見方です。

fast-jev-compaction を試すべきですか?

hook 登録の issue(#21、#88)と --resume の issue(#89)が閉じるまで待ち、全文の transcript がサードパーティ API に出ていくことが自分のリポジトリで許容できるかを判断してください。