AIDive

Pack de vídeo

Jev en Claude Code: el modo hint, el benchmark del gateway y una captura de petición

13 min de lectura

TL;DR

  • Dentro de Claude Code, jev-gateway nunca fuerza una herramienta. Una sola línea, steer: thinking || cached ? "hint" : "tool_choice", lo pasa a modo hint en cuanto la petición lleva extended thinking o una conversación en caché, y una petición real de Claude Code lleva ambas desde el primer turno.
  • El hint es un <system-reminder> de dos frases añadido al último mensaje del usuario. El modelo es libre de ignorarlo, y cuando Claude Code ya ha añadido su propio system reminder como último bloque, el hint no se adjunta en absoluto.
  • El benchmark del propio gateway (120 sesiones) dice que el enrutado compensa en depuración y cuesta en desarrollo de features con modelos Claude: Opus 5 con +61% de tokens de entrada, +47% de peticiones y +83% de tiempo en la tarea de feature, Sonnet 5 con +16% de entrada y +37% de tiempo.
  • Donde Jev muerde es en Codex: el gateway fuerza la herramienta allí, y Jev orientó del 76 al 100% de las peticiones de Codex frente al 34 al 51% de las de Claude Code.
  • Medido en nuestra máquina: una petición limpia de Claude Code 2.1.280 ya lleva 24 herramientas y 47,411 tokens de prefijo; una configuración normal con servidores MCP lleva 40 herramientas y 57,277 tokens, y el gateway reenvía ese listado a Jev en cada llamada.
  • fast-jev-compaction, la herramienta de Jev con más estrellas, tiene issues abiertas que dicen que sus hooks no se registran en las builds actuales de Claude Code y que las transcripciones completas salen hacia una API de terceros. Todavía no.

Qué dicen las mediciones

Jev es un modelo de decisión, no un generador de texto. Su proveedor cobra la entrada a $0.042 / MTok con salida gratis, cita un tiempo de respuesta de extremo a extremo de 70ms-500ms, y escribe bajo su titular «193.6x faster, 444.6x cheaper» que esas cifras «are on the higher end of real world gains» s3. El mismo artículo admite que las respuestas de referencia son el promedio de GPT-6 Astra y Fable 5.1, lo que sesga la comparación a favor de los modelos de OpenAI y Anthropic s3.

jev-gateway se conecta a Claude Code con una sola variable de entorno: bin/clients.mjs apunta ANTHROPIC_BASE_URL al gateway local y deja en paz el login de Max s1. En src/adapters/messages.ts el gateway pregunta a Jev qué herramienta encaja con el siguiente paso y luego decide cómo pasar la respuesta. Cuando la petición tiene thinking activado o bloques cache_control, hace un hint. Si no, fija tool_choice s1. El hint dice, en esencia: un modelo de enrutado de herramientas sugiere que la herramienta nombrada es el siguiente paso más relevante, ignóralo si no encaja con lo que el usuario pidió de verdad. Se añade al último mensaje del usuario como bloque <system-reminder> s1.

La API de Anthropic no deja otra opción. Con extended thinking manual activado, tool_choice: any y tool_choice: tool no están soportados y devuelven un error, y Claude Opus 5.5, Claude Fable 5.1 y Claude Mythos 5.1 devuelven un 400 para el uso forzado de herramientas con independencia del thinking s4. Un matiz que el comentario del gateway pasa por alto: la doc dice que Claude Opus 5 sí soporta la elección forzada de herramienta con thinking activado s4. Sobre la caché, la jerarquía es tools, luego system, luego messages; cambiar tool_choice solo invalida la caché de mensajes, mientras que editar la definición de una herramienta invalida toda la caché, por eso el gateway añade un bloque en lugar de reescribir la descripción de una herramienta s5.

El benchmark que casi nadie cita es el del propio autor del gateway. Seis modelos, dos tareas, cinco ejecuciones por modo, 120 sesiones de agente entre el 2026-09-18 y el 19, modelos GPT en Codex 0.154, modelos Claude en Claude Code 2.1, cada agente limpio, sin servidores MCP, plugins ni skills s2. En chess-bugfix todos los modelos usaron menos tokens con enrutado y nada salió menos correcto. En chess-san, la tarea de feature, el enrutado empeoró claramente a Opus 5 y Sonnet 5, y los autores señalan la causa: el gateway solo hace hints con modelos Claude, así que un hint que no encaja cuesta un rodeo en lugar de ignorarse gratis s2. El enrutado también costó corrección una vez: GPT-5.6 Luna resolvió chess-san cinco de cinco veces sola y tres de cinco con enrutado s2. Los autores añaden que los tokens de entrada están en su mayoría cacheados (80 a 96%), así que un ahorro de entrada vale menos dinero que el mismo ahorro en tokens de salida, y que el propio Jev costó entre medio céntimo y diez céntimos por cinco ejecuciones s2. Una de las 120 ejecuciones, chess-bugfix.on.3 en la serie de Luna, está marcada contaminated después de que el agente encontrara el script de test de otra ejecución en /tmp s2.

La nota al pie del README que motivó nuestra propia prueba: con --user-tools, una configuración enviaba 285 herramientas y unos 200,000 tokens con cada petición de Claude Code, frente a 6 herramientas y 7,000 tokens en limpio s2. Medimos el mismo asiento. Una petición limpia de Claude Code 2.1.280 lleva 24 herramientas, 87,547 caracteres de definiciones de herramientas y 47,411 tokens de prefijo facturados (16,221 escritos, 31,190 leídos); la configuración completa lleva 40 herramientas, 93,179 caracteres de definiciones y 57,277 tokens de prefijo, todos escritos. Ambas llevan thinking: {type: "adaptive"} y 3 bloques cache_control, sin tool_choice, que es exactamente la condición que fija el modo hint en messages.ts s1. Una simple respuesta «ok» cuesta $0.07 equivalente en API en la ejecución limpia con Sonnet 5 y $1.15 en la ejecución completa con Fable 5.1, leído de los campos total_cost_usd y usage del propio Claude Code, el mismo asiento que ocupa el lanzador del gateway s1.

Sobre fast-jev-compaction, el plugin detrás del hilo de «instant compaction» (puntuación 495, 117 comentarios) s9, las issues abiertas importan más que las estrellas: #21 informa Hooks (0) tras instalar porque session.compact y turn.complete no son eventos de hook reconocidos en Claude Code 2.1.272, #88 dice que los hooks no pueden reemplazar la compactación y que las transcripciones completas se envían a una API de terceros, #65 documenta 9 informes seguidos de «work done» inventados tras una compactación, #89 dice que la compactación se deshace con --resume s7. La queja principal del hilo, con 84 puntos, son los ToS y los controles de datos del proveedor s9. El cookbook de sugerencia de skills es la única ganancia medida que el proveedor publica para un listado de agente: la carga del skill equivocado baja de 16.8% a 7.3%, y un skill cargado cuando nada encaja baja de 9.8% a 4.0% s13.

Mediciones

El benchmark del gateway, porcentajes frente al mismo modelo con el enrutado apagado s2.

chess-bugfix: encontrar y corregir cinco bugs inyectados

Modelo Resuelto, con / sin Tokens de salida Tokens de entrada Peticiones al LLM Segundos Orientado por 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: añadir notación algebraica a un motor que funciona

Modelo Resuelto, con / sin Tokens de salida Tokens de entrada Peticiones al LLM Segundos Orientado por 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%

Nuestra propia captura de petición, el asiento que ocupa jev-gateway s1.

Limpia Completa
Modelo elegido por Claude Code claude-sonnet-5 claude-fable-5-1 (ajuste de usuario, 1M)
thinking en la petición {type: "adaptive"} {type: "adaptive"}
Bloques cache_control 3 3
tool_choice ausente (auto) ausente (auto)
Herramientas en la petición 24 40 (28 nativas + 12 MCP)
Definiciones de herramientas, caracteres 87,547 93,179
Prompt de sistema, caracteres 27,754 12,436
Petición completa, caracteres 134,882 155,718
Tokens de prefijo facturados (escritura de caché + lectura) 47,411 (16,221 escritos, 31,190 leídos) 57,277 (todos escritos)
Tokens de salida 4 4
Coste equivalente en API de un «ok» $0.07 $1.15

Protocolo: un proxy de logging de 60 líneas en 127.0.0.1:8790 reenvía cada petición a https://api.anthropic.com byte a byte y registra lo que lleva, exactamente el asiento que bin/clients.mjs le da a jev-gateway. Claude Code 2.1.280 ejecutado en headless, claude -p "Reply with the single word ok. Do not use any tool." --output-format json --max-turns 1, desde un repo Expo privado de 1,021 archivos rastreados, con una suscripción de claude.ai. Limpia: CLAUDE_CONFIG_DIR apuntando a un directorio vacío, --strict-mcp-config, --setting-sources project. Completa: los ajustes de usuario normales de la máquina, el .mcp.json del proyecto, los servidores MCP de usuario y los plugins instalados. Una petición por configuración, solo el primer turno; sin clave de Jev, así que las cifras de regresión son el bench del gateway repetido, no reproducido.

Haz esto el lunes

  • Antes de añadir cualquier router, mide tu propio asiento: arranca un proxy de logging, apunta ANTHROPIC_BASE_URL a él, ejecuta claude -p "Reply with the single word ok." --output-format json --max-turns 1 y lee cache_creation_input_tokens más cache_read_input_tokens en la salida.
  • Cuenta las herramientas de esa petición. Si servidores MCP que rara vez usas inflan el listado, quítalos de .mcp.json o acótalos por proyecto; ese recorte llega a cada petición, haya router o no.
  • Si aun así quieres Jev en Claude Code, abre src/adapters/messages.ts en tu clon de jev-gateway y confirma la línea steer: con thinking o caché activados, compras un hint, no una ruta.
  • Ejecuta el bench del gateway en tu propio repo con --user-tools en vez de fiarte de las tablas de ajedrez; mantén el enrutado solo si una tarea de caza de bugs muestra menos peticiones sin cambio en resuelto/no resuelto.
  • No instales fast-jev-compaction hasta que las issues #21, #88 y #89 estén cerradas; comprueba que /hooks lista más de cero hooks tras la instalación.
  • Lee los ToS del proveedor antes de pegar una clave: cada petición enrutada envía tu listado de herramientas y tu último mensaje, y el plugin de compactación envía transcripciones completas.
  • Si también usas Codex, prueba Jev allí primero: el tool_choice forzado es lo que compensa en el bench.

Para ir más lejos

  • La tabla de uso forzado de herramientas por modelo, incluidos los modelos que devuelven un 400 y los modos de thinking que bloquean any y tool s4.
  • La tabla de invalidación de caché: tools, luego system, luego messages, y la fila de tool_choice que explica el diseño del gateway s5.
  • La issue #24 de jev-gateway: el listado de herramientas, invariable durante la sesión, se reenvía a Jev en cada petición, el centro de coste que el dashboard esconde s14.
  • La sección de integridad de datos del README del bench: 119 de 120 ejecuciones conservadas tal cual, una marcada contaminated en runs.jsonl s2.
  • Una lectura independiente de Jev como clasificador o filtro sobre datos públicos y privados, fuera del marco de los agentes de código s12.
  • Por qué las evals del proveedor miden contra dos modelos y no contra la verdad de referencia, y qué le hace eso a los multiplicadores del titular s11.
  • Una reseña de terceros de jev-gateway que recorre la división «Jev elige, el LLM escribe» y su exposición en localhost, corregida el mismo día s8.
  • El hilo de lanzamiento en HN, donde la cuestión del precio y la subvención se discute abiertamente s10.

Fuentes

FAQ

¿jev-gateway llega a forzar una herramienta dentro de Claude Code?

Solo cuando la petición no tiene ni extended thinking ni bloques cache_control. Nuestras peticiones de primer turno capturadas tenían ambos, tanto en configuración limpia como completa, así que en la práctica el gateway hace hints.

¿Por qué el gateway no reescribe simplemente las descripciones de las herramientas para orientar con más fuerza?

Modificar las definiciones de herramientas invalida toda la caché del prompt, tools, system y messages. Añadir un bloque al último mensaje del usuario solo toca el nivel de messages, el lugar más barato para poner un hint.

¿Entonces Jev no sirve para programar?

Sí sirve. El bench muestra que compensa en Codex, donde la herramienta se fuerza y del 76 al 100% de las peticiones se orientan, y en tareas de depuración para todos los modelos. Lo que las cifras del propio gateway no respaldan es el enfoque de «el Claude Code más barato».

¿Debería probar fast-jev-compaction?

Espera a que se cierren las issues de registro de hooks (#21, #88) y la de --resume (#89), y decide si te parece aceptable que transcripciones completas salgan hacia una API de terceros en tus repos.