AIDive

Pakiet do filmu

Jev w Claude Code: tryb hint, benchmark gatewaya i zapis żądań

13 min czytania

TL;DR

  • W Claude Code jev-gateway nigdy nie wymusza narzędzia. Jedna linia, steer: thinking || cached ? "hint" : "tool_choice", przełącza go w tryb hint, gdy tylko żądanie niesie extended thinking albo rozmowę w cache, a prawdziwe żądanie Claude Code niesie jedno i drugie już w pierwszej turze.
  • Hint to dwuzdaniowy <system-reminder> doklejany do ostatniej wiadomości użytkownika. Model może go zignorować, a gdy Claude Code dopisał już własny system reminder jako ostatni blok, hint nie jest doklejany wcale.
  • Benchmark samego gatewaya (120 sesji) mówi, że dla modeli Claude routing opłaca się przy debugowaniu, a kosztuje przy pracy nad funkcjami: Opus 5 z +61% tokenów wejściowych, +47% żądań i +83% czasu w zadaniu z funkcją, Sonnet 5 z +16% wejścia i +37% czasu.
  • Jev zyskuje na Codexie: gateway wymusza tam narzędzie, a Jev sterował 76 do 100% żądań Codexa wobec 34 do 51% żądań Claude Code.
  • Zmierzone na naszej maszynie: czyste żądanie Claude Code 2.1.280 niesie już 24 narzędzia i 47,411 tokenów prefiksu; normalna konfiguracja z serwerami MCP niesie 40 narzędzi i 57,277 tokenów, a gateway wysyła tę listę do Jev przy każdym wywołaniu.
  • fast-jev-compaction, najczęściej gwiazdkowane narzędzie Jev, ma otwarte issues mówiące, że jego hooki nie rejestrują się na obecnych buildach Claude Code, a pełne transkrypty trafiają do zewnętrznego API. Jeszcze nie.

Co pokazują pomiary

Jev to model decyzyjny, nie generator tekstu. Jego dostawca wycenia wejście na $0.042 / MTok przy darmowym wyjściu, podaje czas odpowiedzi end-to-end 70ms-500ms i pod własnym nagłówkiem "193.6x faster, 444.6x cheaper" pisze, że te liczby "are on the higher end of real world gains" s3. Ten sam wpis przyznaje, że odpowiedzi wzorcowe to średnia z GPT-6 Astra i Fable 5.1, co przechyla porównanie na korzyść modeli OpenAI i Anthropic s3.

jev-gateway podpina się do Claude Code jedną zmienną środowiskową: bin/clients.mjs ustawia ANTHROPIC_BASE_URL na lokalny gateway i nie rusza logowania Max s1. W src/adapters/messages.ts gateway pyta Jev, które narzędzie pasuje do następnego kroku, a potem decyduje, jak przekazać odpowiedź. Gdy żądanie ma włączone thinking albo bloki cache_control, wysyła hint. W przeciwnym razie ustawia tool_choice s1. Hint brzmi: model routingu narzędzi sugeruje, że wskazane narzędzie to najtrafniejszy następny krok, zignoruj to, jeśli nie pasuje do tego, o co użytkownik faktycznie prosił. Jest doklejany do ostatniej wiadomości użytkownika jako blok <system-reminder> s1.

API Anthropic nie zostawia innego wyboru. Przy ręcznie włączonym extended thinking tool_choice: any i tool_choice: tool nie są wspierane i zwracają błąd, a Claude Opus 5.5, Claude Fable 5.1 i Claude Mythos 5.1 zwracają 400 przy wymuszonym użyciu narzędzia niezależnie od thinking s4. Niuans, który umyka komentarzowi w gatewayu: dokumentacja mówi, że Claude Opus 5 wspiera wymuszony wybór narzędzia przy włączonym thinking s4. W kwestii cache hierarchia to tools, potem system, potem messages; zmiana tool_choice unieważnia tylko cache wiadomości, a edycja definicji narzędzia unieważnia cały cache, dlatego gateway dokleja blok zamiast przepisywać opis narzędzia s5.

Benchmark, którego prawie nikt nie cytuje, to ten od autora gatewaya. Sześć modeli, dwa zadania, pięć uruchomień na tryb, 120 sesji agenta w dniach 2026-09-18 i 19, modele GPT w Codex 0.154, modele Claude w Claude Code 2.1, każdy agent czysty, bez serwerów MCP, pluginów i skilli s2. W chess-bugfix każdy model zużył mniej tokenów z routingiem i nic nie stało się mniej poprawne. W chess-san, zadaniu z funkcją, routing wyraźnie pogorszył Opus 5 i Sonnet 5, a autorzy wskazują przyczynę: gateway z modelami Claude tylko podpowiada, więc nietrafiony hint kosztuje objazd zamiast zostać zignorowanym za darmo s2. Routing raz kosztował też poprawność: GPT-5.6 Luna rozwiązał chess-san pięć razy na pięć samodzielnie i trzy razy na pięć z routingiem s2. Autorzy dodają, że tokeny wejściowe są w większości z cache (80 do 96%), więc oszczędność na wejściu jest warta mniej pieniędzy niż taka sama oszczędność na wyjściu, oraz że sam Jev kosztował od pół centa do dziesięciu centów na pięć uruchomień s2. Jedno ze 120 uruchomień, chess-bugfix.on.3 w serii Luna, jest oznaczone jako contaminated, po tym jak agent znalazł w /tmp skrypt testowy innego uruchomienia s2.

Przypis w README, który zmotywował nasz własny test: z --user-tools jedna konfiguracja wysyłała 285 narzędzi i około 200,000 tokenów z każdym żądaniem Claude Code, wobec 6 narzędzi i 7,000 tokenów w wersji czystej s2. Zmierzyliśmy to samo miejsce. Czyste żądanie Claude Code 2.1.280 niesie 24 narzędzia, 87,547 znaków definicji narzędzi i 47,411 rozliczonych tokenów prefiksu (16,221 zapisanych, 31,190 odczytanych); pełna konfiguracja niesie 40 narzędzi, 93,179 znaków definicji i 57,277 tokenów prefiksu, wszystkie zapisane. Oba niosą thinking: {type: "adaptive"} i 3 bloki cache_control, bez tool_choice, czyli dokładnie warunek, który blokuje tryb hint w messages.ts s1. Jedna odpowiedź "ok" kosztuje $0.07 w ekwiwalencie API w czystym uruchomieniu na Sonnet 5 i $1.15 w pełnym uruchomieniu na Fable 5.1, odczytane z pól total_cost_usd i usage samego Claude Code, w tym samym miejscu, które zajmuje launcher gatewaya s1.

Co do fast-jev-compaction, pluginu stojącego za wątkiem o "natychmiastowej kompakcji" (wynik 495, 117 komentarzy) s9, otwarte issues liczą się bardziej niż liczba gwiazdek: #21 zgłasza Hooks (0) po instalacji, bo session.compact i turn.complete nie są rozpoznawanymi zdarzeniami hooków w Claude Code 2.1.272, #88 mówi, że hooki nie mogą zastąpić kompakcji, a pełne transkrypty trafiają do zewnętrznego API, #65 dokumentuje 9 kolejnych zmyślonych raportów "praca zrobiona" po jednej kompakcji, #89 mówi, że kompakcja jest cofana przy --resume s7. Najczęstsza skarga w wątku, z wynikiem 84, dotyczy ToS dostawcy i kontroli nad danymi s9. Cookbook o podpowiadaniu skilli to jedyny zmierzony zysk, jaki dostawca publikuje dla listy agenta: załadowanie złego skilla spada z 16.8% do 7.3%, a załadowanie skilla, gdy żaden nie pasuje, z 9.8% do 4.0% s13.

Pomiary

Benchmark gatewaya, procenty względem tego samego modelu z wyłączonym routingiem s2.

chess-bugfix: znaleźć i naprawić pięć wstrzykniętych błędów

Model Rozwiązane, on / off Tokeny wyjściowe Tokeny wejściowe Żądania LLM Sekundy Sterowane przez 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: dodać notację algebraiczną do działającego silnika

Model Rozwiązane, on / off Tokeny wyjściowe Tokeny wejściowe Żądania LLM Sekundy Sterowane przez 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%

Nasz własny zapis żądań, w miejscu zajmowanym przez jev-gateway s1.

Czyste Pełne
Model wybrany przez Claude Code claude-sonnet-5 claude-fable-5-1 (ustawienie użytkownika, 1M)
thinking w żądaniu {type: "adaptive"} {type: "adaptive"}
Bloki cache_control 3 3
tool_choice brak (auto) brak (auto)
Narzędzia w żądaniu 24 40 (28 wbudowanych + 12 MCP)
Definicje narzędzi, znaki 87,547 93,179
System prompt, znaki 27,754 12,436
Całe żądanie, znaki 134,882 155,718
Rozliczone tokeny prefiksu (zapis + odczyt cache) 47,411 (16,221 written, 31,190 read) 57,277 (all written)
Tokeny wyjściowe 4 4
Koszt jednego "ok" w ekwiwalencie API $0.07 $1.15

Protokół: 60-liniowy proxy logujące na 127.0.0.1:8790 przekazuje każde żądanie do https://api.anthropic.com bajt w bajt i zapisuje, co niesie, dokładnie w miejscu, które bin/clients.mjs daje jev-gateway. Claude Code 2.1.280 uruchomiony headless, claude -p "Reply with the single word ok. Do not use any tool." --output-format json --max-turns 1, z prywatnego repo Expo z 1,021 śledzonymi plikami, na subskrypcji claude.ai. Czyste: CLAUDE_CONFIG_DIR na pustym katalogu, --strict-mcp-config, --setting-sources project. Pełne: normalne ustawienia użytkownika na maszynie, .mcp.json projektu, serwery MCP użytkownika i zainstalowane pluginy. Jedno żądanie na konfigurację, tylko pierwsza tura; bez klucza Jev, więc liczby regresji to bench gatewaya odtworzony, a nie powtórzony.

Do zrobienia w poniedziałek

  • Zanim dodasz jakikolwiek router, zmierz własne miejsce: uruchom proxy logujące, skieruj na nie ANTHROPIC_BASE_URL, odpal claude -p "Reply with the single word ok." --output-format json --max-turns 1 i odczytaj z wyniku cache_creation_input_tokens plus cache_read_input_tokens.
  • Policz narzędzia w tym żądaniu. Jeśli rzadko używane serwery MCP windują listę, usuń je z .mcp.json albo ogranicz do projektu; to cięcie działa na każde żądanie, z routerem czy bez.
  • Jeśli nadal chcesz Jev w Claude Code, otwórz src/adapters/messages.ts w swoim klonie jev-gateway i sprawdź linię steer: z thinking albo cache kupujesz hint, nie trasę.
  • Odpal bench gatewaya na własnym repo z --user-tools zamiast wierzyć tabelom szachowym; zostaw routing tylko wtedy, gdy zadanie polowania na błędy pokaże mniej żądań bez zmiany rozwiązane/nierozwiązane.
  • Nie instaluj fast-jev-compaction, dopóki issues #21, #88 i #89 nie zostaną zamknięte; sprawdź, że /hooks po instalacji pokazuje więcej niż zero hooków.
  • Przeczytaj ToS dostawcy, zanim wkleisz klucz: każde przekierowane żądanie wysyła listę twoich narzędzi i ostatnią wiadomość, a plugin do kompakcji wysyła pełne transkrypty.
  • Jeśli używasz też Codexa, przetestuj Jev najpierw tam: wymuszony tool_choice to to, co w benchu się opłaca.

Czytaj dalej

  • Tabela wymuszonego użycia narzędzi per model, w tym które modele zwracają 400 i które tryby thinking blokują any i tool s4.
  • Tabela unieważniania cache: tools, potem system, potem messages, oraz wiersz tool_choice, który tłumaczy projekt gatewaya s5.
  • Issue #24 w jev-gateway: lista narzędzi, niezmienna w całej sesji, jest wysyłana do Jev przy każdym żądaniu, centrum kosztów, które dashboard ukrywa s14.
  • Sekcja o integralności danych w README benchu: 119 ze 120 uruchomień trzymanych osobno, jedno oznaczone contaminated w runs.jsonl s2.
  • Niezależne spojrzenie na Jev jako klasyfikator lub filtr na danych publicznych i prywatnych, poza ramą agentów do kodowania s12.
  • Dlaczego ewaluacje dostawcy mierzą względem dwóch modeli, a nie prawdy bazowej, i co to robi z nagłówkowymi mnożnikami s11.
  • Recenzja jev-gateway od osoby trzeciej, omawiająca podział "Jev wybiera, LLM pisze" i ekspozycję na localhost, naprawioną tego samego dnia s8.
  • Wątek premierowy na HN, w którym otwarcie spiera się o ceny i dopłaty s10.

Źródła

FAQ

Czy jev-gateway kiedykolwiek wymusza narzędzie w Claude Code?

Tylko gdy żądanie nie ma ani extended thinking, ani bloków cache_control. Nasze przechwycone żądania z pierwszej tury miały oba, zarówno w czystej, jak i w pełnej konfiguracji, więc w praktyce gateway podpowiada.

Dlaczego gateway nie przepisze po prostu opisów narzędzi, żeby sterować mocniej?

Modyfikacja definicji narzędzi unieważnia cały cache promptu: tools, system i messages. Doklejenie bloku do ostatniej wiadomości użytkownika dotyka tylko poziomu messages, czyli najtańszego miejsca na hint.

Czy Jev jest więc bezużyteczny do kodowania?

Nie. Bench pokazuje, że się opłaca na Codexie, gdzie narzędzie jest wymuszone, a sterowane jest od 76 do 100% żądań, oraz w zadaniach debugowania dla każdego modelu. To hasło o "najtańszym Claude Code" nie znajduje potwierdzenia w liczbach gatewaya.

Czy powinienem wypróbować fast-jev-compaction?

Poczekaj, aż problemy z rejestracją hooków (#21, #88) i problem z --resume (#89) zostaną zamknięte, i zdecyduj, czy wysyłanie pełnych transkryptów do zewnętrznego API jest dla ciebie akceptowalne w twoich repo.