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, odpalclaude -p "Reply with the single word ok." --output-format json --max-turns 1i odczytaj z wynikucache_creation_input_tokenspluscache_read_input_tokens. - Policz narzędzia w tym żądaniu. Jeśli rzadko używane serwery MCP windują listę, usuń je z
.mcp.jsonalbo 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.tsw 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-toolszamiast 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
/hookspo 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_choiceto 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ą
anyitools4. - Tabela unieważniania cache:
tools, potemsystem, potemmessages, oraz wiersztool_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
contaminatedwruns.jsonls2. - 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
- jev-gateway, GitHub, vinilana. Dlaczego warto:
src/adapters/messages.tszawiera linię, która rozstrzyga między hintem a wymuszonym narzędziem, abin/clients.mjspokazuje, że launcher ustawia tylkoANTHROPIC_BASE_URL. - jev-gateway-bench, GitHub, vinilana. Dlaczego warto: pełna tabela 120 sesji i własna interpretacja autorów, z jednym zanieczyszczonym uruchomieniem.
- Introducing System One Models & Jev, TypeSafe AI. Dlaczego warto: ceny, opóźnienia i przypis, który ogranicza twierdzenie o 444.6x, od samego dostawcy.
- Forcing tool use, Anthropic docs. Dlaczego warto: tabela per model, które wartości
tool_choicekończą się błędem. - Prompt caching, Anthropic docs. Dlaczego warto: hierarchia unieważniania, która wymusza projekt hinta.
- fast-jev-compaction, GitHub, tamaratran. Dlaczego warto: otwórz zakładkę issues przed README.
- jev-gateway Review: Jev Picks, the LLM Writes, mrjev.com. Dlaczego warto: zewnętrzne omówienie architektury gatewaya.
- Instant Claude Code compaction is my favorite use of Jev so far, r/ClaudeCode. Dlaczego warto: wątek praktyków, z zastrzeżeniem o ToS na górze.
- HN: Introducing System One Models and Jev, Hacker News. Dlaczego warto: premierowa debata o cenach i trwałości modelu biznesowego.
- The Evals: Measured Against Two Models, Not Against Truth, novcog. Dlaczego warto: krytyka metody ewaluacji stojącej za mnożnikami dostawcy.
- Testing Jev on public and private data: classifier or filter, Aman Kumar. Dlaczego warto: niezależny pomiar poza agentami do kodowania.
- Skill suggestion cookbook, TypeSafe docs. Dlaczego warto: jedyne opublikowane liczby o wyborze z listy, od 16.8% do 7.3%.
- jev-gateway issue #24, GitHub. Dlaczego warto: koszt ponownego wysyłania listy, którego nikt nie liczy.
- Jev + Claude Code: compaction and a Sonnet 5 source check, jevmodel.ai. Dlaczego warto: drugie spojrzenie na twierdzenie o kompakcji ze sprawdzeniem na Sonnet 5.
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.
AIDive