AIDive

影片資料包

Claude Code 中的 Jev:提示模式、閘道自己的基準測試與請求擷取

閱讀約 13 分鐘

重點摘要

  • 在 Claude Code 裡,jev-gateway 從不強制指定工具。一行程式碼 steer: thinking || cached ? "hint" : "tool_choice",只要請求帶有延伸思考(extended thinking)或已快取的對話,就會切換成提示模式(hint mode),而真正的 Claude Code 請求在第一輪就兩者兼具。
  • 提示是附加在最後一則使用者訊息後的兩句 <system-reminder>。模型可以自由忽略它;如果 Claude Code 已經把自己的 system reminder 放在最後一個區塊,這則提示根本不會被附上。
  • 閘道自己的基準測試(120 個工作階段)顯示,對 Claude 模型而言,路由在除錯上划算,在功能開發上反而吃虧:Opus 5 在功能任務上輸入 token +61%、請求數 +47%、耗時 +83%,Sonnet 5 則是輸入 +16%、耗時 +37%。
  • Jev 真正有效的地方是 Codex:閘道在那裡會強制指定工具,Jev 引導了 76 到 100% 的 Codex 請求,Claude Code 請求則只有 34 到 51%。
  • 我們在自己機器上的實測:乾淨的 Claude Code 2.1.280 請求本身就帶有 24 個工具與 47,411 個前綴 token;掛了 MCP 伺服器的一般設定帶有 40 個工具與 57,277 個 token,而閘道每次呼叫都會把這份工具清單重新送給 Jev。
  • fast-jev-compaction 是星數最多的 Jev 工具,但它有未解決的 issue,指出其 hooks 在目前的 Claude Code 版本上無法註冊,且完整對話記錄會送往第三方 API。暫時不要用。

測量結果說明

Jev 是決策模型,不是文字生成模型。供應商的定價是輸入 $0.042 / MTok、輸出免費,宣稱端到端回應時間為 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:bin/clients.mjs 把 ANTHROPIC_BASE_URL 指向本機閘道,並保留你的 Max 登入不動 s1。在 src/adapters/messages.ts 裡,閘道先問 Jev 下一步適合哪個工具,再決定如何傳遞答案。當請求啟用 thinking 或帶有 cache_control 區塊時,它就給提示;否則設定 tool_choice s1。提示的內容是:一個工具路由模型認為所指名的工具是最相關的下一步,如果它不符合使用者實際要求的內容就忽略。它以 <system-reminder> 區塊的形式附加在最後一則使用者訊息後 s1。

Anthropic API 沒有給其他選擇。啟用手動延伸思考時,tool_choice: any 和 tool_choice: tool 不受支援並會回傳錯誤,而 Claude Opus 5.5、Claude Fable 5.1 和 Claude Mythos 5.1 不論有沒有思考,只要強制使用工具都會回傳 400 s4。閘道自己的註解漏掉了一個細節:文件說 Claude Opus 5 在開啟思考時確實支援強制工具選擇 s4。在快取方面,層級順序是 tools、system、messages;更動 tool_choice 只會讓 messages 快取失效,而修改工具定義則會讓整個快取失效,這就是閘道選擇附加一個區塊,而不是改寫工具描述的原因 s5。

幾乎沒人引用的基準測試,其實是閘道作者自己做的。六個模型、兩個任務、每種模式跑五次,共 120 個 agent 工作階段,時間在 2026-09-18 和 19 日,GPT 模型在 Codex 0.154,Claude 模型在 Claude Code 2.1,每個 agent 都是乾淨環境,沒有 MCP 伺服器、外掛或技能 s2。在 chess-bugfix 上,每個模型啟用路由後都用了更少 token,且沒有任何結果變差。在功能任務 chess-san 上,路由讓 Opus 5 和 Sonnet 5 明顯變差,作者也點出原因:閘道對 Claude 模型只給提示,所以不合適的提示會造成一次繞路,而不是被免費忽略 s2。路由也曾讓正確率下降一次:GPT-5.6 Luna 單獨跑時 chess-san 五次全過,開啟路由後只過三次 s2。作者補充,輸入 token 大多已快取(80 到 96%),所以節省輸入的價值低於節省同樣數量的輸出 token,而且每五次執行 Jev 本身的花費介於半美分到十美分之間 s2。120 次執行中有一次,Luna 系列的 chess-bugfix.on.3,在 agent 於 /tmp 找到另一次執行的測試腳本後,被標記為 contaminated s2。

促使我們自己做測試的是 README 的一則註腳:使用 --user-tools 時,某個設定每個 Claude Code 請求都送出 285 個工具和約 200,000 個 token,乾淨環境則是 6 個工具和 7,000 個 token s2。我們量了同一個位置。乾淨的 Claude Code 2.1.280 請求帶有 24 個工具、87,547 個字元的工具定義,以及 47,411 個計費前綴 token(寫入 16,221、讀取 31,190);完整設定帶有 40 個工具、93,179 個字元的定義與 57,277 個前綴 token,全部都是寫入。兩者都帶有 thinking: {type: "adaptive"} 和 3 個 cache_control 區塊,沒有 tool_choice,這正是讓 messages.ts 鎖定在提示模式的條件 s1。一句「ok」的回覆,在乾淨的 Sonnet 5 上以 API 等值計算花費 $0.07,在完整的 Fable 5.1 上則是 $1.15,數字取自 Claude Code 自己的 total_cost_usd 和 usage 欄位,也就是閘道啟動器所處的同一個位置 s1。

關於 fast-jev-compaction,也就是「instant compaction」討論串(分數 495、117 則留言)背後的外掛 s9,比起星數,未解決的 issue 更值得看:#21 回報安裝後顯示 Hooks (0),因為在 Claude Code 2.1.272 上 session.compact 和 turn.complete 不是可識別的 hook 事件;#88 指出 hooks 無法取代壓縮,且完整對話記錄會送往第三方 API;#65 記錄了一次壓縮後連續 9 份捏造的「work done」報告;#89 指出 --resume 時壓縮會被還原 s7。討論串中 84 分的最高票抱怨,針對的是供應商的服務條款與資料控制 s9。技能建議 cookbook 是供應商針對 agent 工具清單公布的唯一一項實測成果:載入錯誤技能的比例從 16.8% 降到 7.3%,在沒有合適技能時仍載入技能的比例從 9.8% 降到 4.0% s13。

測量數據

閘道的基準測試,百分比是相對於同一模型關閉路由時的結果 s2。

chess-bugfix:找出並修正五個被植入的 bug

模型 解題數,開 / 關 輸出 token 輸入 token 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:為一個可運作的引擎加上代數記譜法

模型 解題數,開 / 關 輸出 token 輸入 token 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 (使用者設定, 1M)
請求中的 thinking {type: "adaptive"} {type: "adaptive"}
cache_control 區塊數 3 3
tool_choice 無 (auto) 無 (auto)
請求中的工具數 24 40 (28 個內建 + 12 個 MCP)
工具定義字元數 87,547 93,179
系統提示字元數 27,754 12,436
整個請求字元數 134,882 155,718
計費的前綴 token (快取寫入 + 讀取) 47,411 (16,221 寫入, 31,190 讀取) 57,277 (全部寫入)
輸出 token 4 4
一句「ok」的 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,在一個私有的 Expo 儲存庫(1,021 個受追蹤檔案)中,使用 claude.ai 訂閱。乾淨環境:CLAUDE_CONFIG_DIR 指向空目錄、--strict-mcp-config、--setting-sources project。完整環境:這台機器的一般使用者設定、專案 .mcp.json、使用者 MCP 伺服器與已安裝的外掛。每種設定只跑一個請求,只看第一輪;我們沒有 Jev 金鑰,所以迴歸數據是重播閘道的基準,而非自行重現。

週一就做

  • 在加任何路由器之前,先量你自己的位置:啟動一個記錄代理,把 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 clone 裡的 src/adapters/messages.ts,確認 steer 那一行:開著思考或快取時,你買到的是提示,不是路由。
  • 用 --user-tools 在你自己的儲存庫上跑閘道的基準測試,不要輕信西洋棋的表格;只有當找 bug 的任務顯示請求變少、且解題結果沒變時,才保留路由。
  • 在 issue #21、#88 和 #89 關閉之前,不要安裝 fast-jev-compaction;安裝後確認 /hooks 列出的 hooks 多於零個。
  • 貼上金鑰之前先讀供應商的服務條款:每個被路由的請求都會送出你的工具清單與最後一則訊息,而壓縮外掛則會送出完整對話記錄。
  • 如果你也用 Codex,先在那裡測試 Jev:基準顯示有回報的正是強制 tool_choice。

延伸閱讀

  • 各模型的強制工具使用表,包含哪些模型會回傳 400,以及哪些思考模式會擋住 any 和 tool s4。
  • 快取失效表:先 tools、再 system、再 messages,以及解釋閘道設計的 tool_choice 那一列 s5。
  • jev-gateway 的 issue #24:整個工作階段不變的工具清單在每個請求都被重新送給 Jev,是儀表板沒顯示的成本中心 s14。
  • 基準 README 的資料完整性章節:120 次執行中有 119 次保持獨立,一次在 runs.jsonl 中被標記為 contaminated s2。
  • 在程式碼 agent 框架之外,把 Jev 當作分類器或過濾器,用於公開與私有資料的獨立評測 s12。
  • 為什麼供應商的評測是對照兩個模型而非真實標準答案,以及這對標題倍率有什麼影響 s11。
  • 第三方對 jev-gateway 的評論,逐步解析「Jev 選擇,LLM 撰寫」的分工,以及當天就修好的 localhost 暴露問題 s8。
  • HN 發表討論串,定價與補貼問題在其中公開辯論 s10。

來源

FAQ

jev-gateway 在 Claude Code 裡會強制指定工具嗎?

只有當請求既沒有延伸思考、也沒有 cache_control 區塊時才會。我們擷取的第一輪請求,無論乾淨或完整設定,兩者都有,所以實際上閘道只會給提示。

為什麼閘道不乾脆改寫工具描述來更強力地引導?

修改工具定義會讓整個提示快取失效,包括 tools、system 和 messages。把區塊附加在最後一則使用者訊息後,只會動到 messages 這一層,是放提示成本最低的位置。

那 Jev 對寫程式就沒用嗎?

不是。基準顯示它在 Codex 上有回報,那裡工具是被強制的,76 到 100% 的請求被引導;對所有模型的除錯任務也有回報。閘道自己的數字不支持的,是「最便宜的 Claude Code」這種說法。

我該試試 fast-jev-compaction 嗎?

等 hook 註冊相關的 issue(#21、#88)與 --resume 的 issue(#89)關閉後再說,並先決定完整對話記錄送往第三方 API 在你的儲存庫中是否可以接受。