TL;DR
- Dans Claude Code, jev-gateway ne force jamais un outil. Une seule ligne,
steer: thinking || cached ? "hint" : "tool_choice", bascule en mode hint dès que la requête porte un extended thinking ou une conversation en cache, et une vraie requête Claude Code porte les deux dès le premier tour. - Le hint est un
<system-reminder>de deux phrases ajouté au dernier message utilisateur. Le modèle est libre de l'ignorer, et quand Claude Code a déjà ajouté son propre system reminder comme dernier bloc, le hint n'est pas attaché du tout. - Le benchmark du gateway lui-même (120 sessions) dit que le routage rapporte sur le debug et coûte sur le développement de feature pour les modèles Claude : Opus 5 à +61% de tokens d'entrée, +47% de requêtes et +83% de temps sur la tâche feature, Sonnet 5 à +16% d'entrée et +37% de temps.
- C'est sur Codex que Jev mord : le gateway y force l'outil, et Jev a orienté 76 à 100% des requêtes Codex contre 34 à 51% des requêtes Claude Code.
- Mesuré sur notre machine : une requête Claude Code 2.1.280 propre porte déjà 24 outils et 47,411 tokens de préfixe ; une config normale avec des serveurs MCP porte 40 outils et 57,277 tokens, et le gateway renvoie ce roster à Jev à chaque appel.
- fast-jev-compaction, l'outil Jev le plus étoilé, a des issues ouvertes qui disent que ses hooks ne s'enregistrent pas sur les builds actuels de Claude Code et que les transcripts complets partent vers une API tierce. Pas encore.
Ce que disent les mesures
Jev est un modèle de décision, pas un générateur de texte. Son éditeur facture l'entrée à $0.042 / MTok avec une sortie gratuite, annonce un temps de réponse de bout en bout de 70ms-500ms, et écrit sous son titre « 193.6x faster, 444.6x cheaper » que ces chiffres « are on the higher end of real world gains » s3. Le même article admet que les réponses de référence sont la moyenne de GPT-6 Astra et Fable 5.1, ce qui biaise la comparaison en faveur des modèles OpenAI et Anthropic s3.
jev-gateway se branche sur Claude Code via une seule variable d'environnement : bin/clients.mjs pointe ANTHROPIC_BASE_URL vers le gateway local et laisse le login Max tranquille s1. Dans src/adapters/messages.ts, le gateway demande à Jev quel outil convient à la prochaine étape, puis décide comment transmettre la réponse. Quand la requête a thinking activé ou des blocs cache_control, il fait un hint. Sinon il positionne tool_choice s1. Le hint dit en substance : un modèle de routage d'outils suggère que l'outil nommé est la prochaine étape la plus pertinente, à ignorer s'il ne correspond pas à ce que l'utilisateur a vraiment demandé. Il est ajouté au dernier message utilisateur sous forme de bloc <system-reminder> s1.
L'API Anthropic ne laisse pas d'autre choix. Avec l'extended thinking manuel activé, tool_choice: any et tool_choice: tool ne sont pas supportés et renvoient une erreur, et Claude Opus 5.5, Claude Fable 5.1 et Claude Mythos 5.1 renvoient un 400 pour l'usage d'outil forcé quel que soit le thinking s4. Une nuance que le commentaire du gateway rate : la doc dit que Claude Opus 5 supporte bien le choix d'outil forcé avec thinking activé s4. Côté cache, la hiérarchie est tools puis system puis messages ; changer tool_choice n'invalide que le cache des messages, alors que modifier une définition d'outil invalide tout le cache, ce qui explique pourquoi le gateway ajoute un bloc au lieu de réécrire une description d'outil s5.
Le benchmark que presque personne ne cite est celui de l'auteur du gateway. Six modèles, deux tâches, cinq runs par mode, 120 sessions d'agent les 2026-09-18 et 19, modèles GPT dans Codex 0.154, modèles Claude dans Claude Code 2.1, chaque agent propre, sans serveur MCP, plugin ni skill s2. Sur chess-bugfix, chaque modèle a utilisé moins de tokens avec le routage et rien n'est devenu moins correct. Sur chess-san, la tâche feature, le routage a nettement dégradé Opus 5 et Sonnet 5, et les auteurs en donnent la cause : le gateway ne fait que des hints avec les modèles Claude, donc un hint inadapté coûte un détour au lieu d'être ignoré gratuitement s2. Le routage a aussi coûté en justesse une fois : GPT-5.6 Luna a résolu chess-san cinq fois sur cinq seul et trois sur cinq avec routage s2. Les auteurs ajoutent que les tokens d'entrée sont en grande partie cachés (80 à 96%), donc une économie d'entrée vaut moins d'argent que la même économie en tokens de sortie, et que Jev lui-même a coûté entre un demi-cent et dix cents par cinq runs s2. Un des 120 runs, chess-bugfix.on.3 dans la série Luna, est marqué contaminated après que l'agent a trouvé le script de test d'un autre run dans /tmp s2.
La note de bas de page du README qui a motivé notre propre test : avec --user-tools, une config envoyait 285 outils et environ 200,000 tokens à chaque requête Claude Code, contre 6 outils et 7,000 tokens en config propre s2. Nous avons mesuré le même siège. Une requête Claude Code 2.1.280 propre porte 24 outils, 87,547 caractères de définitions d'outils et 47,411 tokens de préfixe facturés (16,221 écrits, 31,190 lus) ; la config complète porte 40 outils, 93,179 caractères de définitions et 57,277 tokens de préfixe, tous écrits. Les deux portent thinking: {type: "adaptive"} et 3 blocs cache_control, sans tool_choice, soit exactement la condition qui verrouille le mode hint dans messages.ts s1. Une simple réponse « ok » coûte $0.07 équivalent API sur le run Sonnet 5 propre et $1.15 sur le run Fable 5.1 complet, lus dans les champs total_cost_usd et usage de Claude Code lui-même, le même siège que celui du lanceur du gateway s1.
Sur fast-jev-compaction, le plugin derrière le thread « instant compaction » (score 495, 117 commentaires) s9, les issues ouvertes comptent plus que le nombre d'étoiles : #21 signale Hooks (0) à l'installation parce que session.compact et turn.complete ne sont pas des événements de hook reconnus sur Claude Code 2.1.272, #88 dit que les hooks ne peuvent pas remplacer la compaction et que les transcripts complets partent vers une API tierce, #65 documente 9 rapports « work done » fabriqués d'affilée après une compaction, #89 dit que la compaction est annulée au --resume s7. La plainte principale du thread, à 84 points, concerne les CGU et le contrôle des données de l'éditeur s9. Le cookbook de suggestion de skills est le seul gain mesuré que l'éditeur publie pour un roster d'agent : le mauvais skill chargé passe de 16.8% à 7.3%, et un skill chargé alors que rien ne convient passe de 9.8% à 4.0% s13.
Mesures
Le benchmark du gateway, pourcentages par rapport au même modèle sans routage s2.
chess-bugfix : trouver et corriger cinq bugs injectés
| Modèle | Résolu, avec / sans | Tokens de sortie | Tokens d'entrée | Requêtes LLM | Secondes | Orienté par 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 : ajouter la notation algébrique à un moteur qui fonctionne
| Modèle | Résolu, avec / sans | Tokens de sortie | Tokens d'entrée | Requêtes LLM | Secondes | Orienté par 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% |
Notre propre capture de requête, le siège qu'occupe jev-gateway s1.
| Propre | Complète | |
|---|---|---|
| Modèle choisi par Claude Code | claude-sonnet-5 | claude-fable-5-1 (réglage utilisateur, 1M) |
thinking dans la requête |
{type: "adaptive"} |
{type: "adaptive"} |
Blocs cache_control |
3 | 3 |
tool_choice |
absent (auto) | absent (auto) |
| Outils dans la requête | 24 | 40 (28 natifs + 12 MCP) |
| Définitions d'outils, caractères | 87,547 | 93,179 |
| Prompt système, caractères | 27,754 | 12,436 |
| Requête entière, caractères | 134,882 | 155,718 |
| Tokens de préfixe facturés (écriture cache + lecture) | 47,411 (16,221 écrits, 31,190 lus) | 57,277 (tous écrits) |
| Tokens de sortie | 4 | 4 |
| Coût équivalent API d'un « ok » | $0.07 | $1.15 |
Protocole : un proxy de logging de 60 lignes sur 127.0.0.1:8790 transmet chaque requête à https://api.anthropic.com octet pour octet et journalise ce qu'elle porte, exactement le siège que bin/clients.mjs donne à jev-gateway. Claude Code 2.1.280 lancé en headless, claude -p "Reply with the single word ok. Do not use any tool." --output-format json --max-turns 1, depuis un repo Expo privé de 1,021 fichiers suivis, sur un abonnement claude.ai. Propre : CLAUDE_CONFIG_DIR sur un dossier vide, --strict-mcp-config, --setting-sources project. Complète : les réglages utilisateur normaux de la machine, le .mcp.json du projet, les serveurs MCP utilisateur et les plugins installés. Une requête par configuration, premier tour seulement ; pas de clé Jev, donc les chiffres de régression sont ceux du bench du gateway rejoués, pas reproduits.
À faire lundi
- Avant d'ajouter un routeur, mesurez votre propre siège : lancez un proxy de logging, pointez
ANTHROPIC_BASE_URLdessus, exécutezclaude -p "Reply with the single word ok." --output-format json --max-turns 1, et lisezcache_creation_input_tokenspluscache_read_input_tokensdans la sortie. - Comptez les outils de cette requête. Si des serveurs MCP que vous utilisez peu gonflent le roster, retirez-les de
.mcp.jsonou limitez-les par projet ; cette coupe profite à chaque requête, routeur ou pas. - Si vous voulez quand même Jev dans Claude Code, ouvrez
src/adapters/messages.tsdans votre clone de jev-gateway et vérifiez la lignesteer: avec thinking ou cache activés, vous achetez un hint, pas une route. - Lancez le bench du gateway sur votre propre repo avec
--user-toolsplutôt que de croire les tables d'échecs ; gardez le routage seulement si une tâche de chasse au bug montre moins de requêtes sans changement résolu/non résolu. - N'installez pas fast-jev-compaction tant que les issues #21, #88 et #89 ne sont pas fermées ; vérifiez que
/hooksliste plus de zéro hook après l'installation. - Lisez les CGU de l'éditeur avant de coller une clé : chaque requête routée envoie votre roster d'outils et votre dernier message, et le plugin de compaction envoie des transcripts complets.
- Si vous utilisez aussi Codex, testez Jev là d'abord : le
tool_choiceforcé est ce qui rapporte dans le bench.
Pour aller plus loin
- La table de l'usage d'outil forcé par modèle, avec les modèles qui renvoient un 400 et les modes de thinking qui bloquent
anyettools4. - La table d'invalidation du cache :
toolspuissystempuismessages, et la lignetool_choicequi explique le design du gateway s5. - L'issue #24 de jev-gateway : le roster d'outils, invariant sur la session, est renvoyé à Jev à chaque requête, le centre de coût que le dashboard masque s14.
- La section sur l'intégrité des données du README du bench : 119 runs sur 120 gardés tels quels, un run marqué
contaminateddansruns.jsonls2. - Une lecture indépendante de Jev comme classifieur ou filtre sur des données publiques et privées, hors du cadre des agents de code s12.
- Pourquoi les évals de l'éditeur mesurent contre deux modèles plutôt que contre la vérité terrain, et ce que cela fait aux multiplicateurs du titre s11.
- Une revue tierce de jev-gateway qui détaille la séparation « Jev choisit, le LLM écrit » et son exposition sur localhost, corrigée le jour même s8.
- Le thread de lancement sur HN, où la question du prix et de la subvention est débattue en public s10.
Sources
- jev-gateway, GitHub, vinilana. Pourquoi le lire :
src/adapters/messages.tscontient la ligne qui décide entre hint et outil forcé, etbin/clients.mjsmontre que le lanceur ne règle queANTHROPIC_BASE_URL. - jev-gateway-bench, GitHub, vinilana. Pourquoi le lire : la table complète des 120 sessions et la lecture des auteurs eux-mêmes, dont le run contaminé.
- Introducing System One Models & Jev, TypeSafe AI. Pourquoi le lire : prix, latence et la note qui nuance le 444.6x, de la bouche de l'éditeur.
- Forcing tool use, Anthropic docs. Pourquoi le lire : la table par modèle des valeurs de
tool_choicequi plantent. - Prompt caching, Anthropic docs. Pourquoi le lire : la hiérarchie d'invalidation qui impose le design par hint.
- fast-jev-compaction, GitHub, tamaratran. Pourquoi le lire : ouvrez l'onglet issues avant le README.
- jev-gateway Review: Jev Picks, the LLM Writes, mrjev.com. Pourquoi le lire : un tour extérieur de l'architecture du gateway.
- Instant Claude Code compaction is my favorite use of Jev so far, r/ClaudeCode. Pourquoi le lire : le thread de praticiens, avec l'objection sur les CGU en tête.
- HN: Introducing System One Models and Jev, Hacker News. Pourquoi le lire : le débat de lancement sur le prix et la soutenabilité.
- The Evals: Measured Against Two Models, Not Against Truth, novcog. Pourquoi le lire : une critique de la méthode d'évaluation derrière les multiplicateurs de l'éditeur.
- Testing Jev on public and private data: classifier or filter, Aman Kumar. Pourquoi le lire : une mesure indépendante hors des agents de code.
- Skill suggestion cookbook, TypeSafe docs. Pourquoi le lire : les seuls chiffres publiés de sélection de roster, 16.8% à 7.3%.
- jev-gateway issue #24, GitHub. Pourquoi le lire : le coût de renvoi du roster que personne ne compte.
- Jev + Claude Code: compaction and a Sonnet 5 source check, jevmodel.ai. Pourquoi le lire : un second regard sur l'affirmation de compaction avec une vérification Sonnet 5.
FAQ
jev-gateway force-t-il jamais un outil dans Claude Code ?
Seulement quand la requête n'a ni extended thinking ni blocs cache_control. Nos requêtes de premier tour capturées avaient les deux, en config propre comme en config complète, donc en pratique le gateway fait un hint.
Pourquoi le gateway ne réécrit-il pas simplement les descriptions d'outils pour orienter plus fort ?
Modifier les définitions d'outils invalide tout le cache du prompt, tools, system et messages. Ajouter un bloc au dernier message utilisateur ne touche que le niveau messages, l'endroit le moins cher pour placer un hint.
Jev est-il donc inutile pour coder ?
Non. Le bench montre qu'il rapporte sur Codex, où l'outil est forcé et où 76 à 100% des requêtes sont orientées, et sur les tâches de debug pour tous les modèles. C'est le cadrage « Claude Code le moins cher » que les chiffres du gateway ne soutiennent pas.
Dois-je essayer fast-jev-compaction ?
Attendez que les issues d'enregistrement des hooks (#21, #88) et celle du --resume (#89) soient fermées, et décidez si des transcripts complets envoyés à une API tierce sont acceptables dans vos repos.
AIDive