AIDive

Pack de vídeo

Jev no Claude Code: modo hint, o benchmark do próprio gateway e uma captura de requisição

13 min de leitura

TL;DR

  • Dentro do Claude Code, o jev-gateway nunca força uma ferramenta. Uma linha, steer: thinking || cached ? "hint" : "tool_choice", muda para o modo hint assim que a requisição traz extended thinking ou uma conversa em cache, e uma requisição real do Claude Code traz os dois já no primeiro turno.
  • O hint é um <system-reminder> de duas frases anexado à última mensagem do usuário. O modelo pode ignorá-lo, e quando o Claude Code já anexou seu próprio system reminder como último bloco, o hint nem chega a ser anexado.
  • O benchmark do próprio gateway (120 sessões) mostra que, para modelos Claude, o roteamento compensa em debugging e custa em desenvolvimento de feature: Opus 5 com +61% de tokens de entrada, +47% de requisições e +83% de tempo na tarefa de feature, Sonnet 5 com +16% de entrada e +37% de tempo.
  • É no Codex que o Jev rende: o gateway força a ferramenta ali, e o Jev conduziu de 76 a 100% das requisições do Codex contra 34 a 51% das do Claude Code.
  • Medido na nossa máquina: uma requisição limpa do Claude Code 2.1.280 já carrega 24 ferramentas e 47,411 tokens de prefixo; uma configuração normal com servidores MCP carrega 40 ferramentas e 57,277 tokens, e o gateway reenvia essa lista ao Jev a cada chamada.
  • fast-jev-compaction, a ferramenta do Jev com mais estrelas, tem issues abertas dizendo que seus hooks não são registrados nos builds atuais do Claude Code e que transcrições completas saem para uma API de terceiros. Ainda não.

O que as medições dizem

O Jev é um modelo de decisão, não um gerador de texto. O fornecedor cobra $0.042 / MTok de entrada com saída gratuita, anuncia um tempo de resposta de ponta a ponta de 70ms-500ms, e escreve sob o título "193.6x faster, 444.6x cheaper" que esses números "are on the higher end of real world gains" s3. O mesmo post admite que as respostas de referência são a média de GPT-6 Astra e Fable 5.1, o que enviesa a comparação a favor dos modelos da OpenAI e da Anthropic s3.

O jev-gateway se conecta ao Claude Code por uma única variável de ambiente: bin/clients.mjs aponta ANTHROPIC_BASE_URL para o gateway local e deixa o login Max intacto s1. Em src/adapters/messages.ts, o gateway pergunta ao Jev qual ferramenta serve para o próximo passo e depois decide como repassar a resposta. Quando a requisição tem thinking ativado ou blocos cache_control, ele usa hint. Caso contrário, define tool_choice s1. O hint diz, em essência: um modelo de roteamento de ferramentas sugere que a ferramenta indicada é o próximo passo mais relevante, ignore isso se não combinar com o que o usuário realmente pediu. Ele é anexado à última mensagem do usuário como um bloco <system-reminder> s1.

A API da Anthropic não deixa outra escolha. Com extended thinking manual ativado, tool_choice: any e tool_choice: tool não são suportados e retornam erro, e Claude Opus 5.5, Claude Fable 5.1 e Claude Mythos 5.1 retornam 400 para uso forçado de ferramenta, com ou sem thinking s4. Um detalhe que o comentário do próprio gateway deixa passar: a documentação diz que o Claude Opus 5 suporta escolha forçada de ferramenta com thinking ativado s4. Sobre cache, a hierarquia é tools, depois system, depois messages; mudar tool_choice invalida só o cache de mensagens, enquanto editar a definição de uma ferramenta invalida o cache inteiro, e é por isso que o gateway anexa um bloco em vez de reescrever a descrição de uma ferramenta s5.

O benchmark que quase ninguém cita é o do próprio autor do gateway. Seis modelos, duas tarefas, cinco execuções por modo, 120 sessões de agente em 2026-09-18 e 19, modelos GPT no Codex 0.154, modelos Claude no Claude Code 2.1, todos os agentes limpos, sem servidores MCP, plugins ou skills s2. Em chess-bugfix, todos os modelos usaram menos tokens com roteamento e nenhum ficou menos correto. Em chess-san, a tarefa de feature, o roteamento deixou Opus 5 e Sonnet 5 claramente piores, e os autores apontam a causa: o gateway só usa hint com modelos Claude, então um hint que não se encaixa custa um desvio em vez de ser ignorado de graça s2. O roteamento também custou corretude uma vez: o GPT-5.6 Luna resolveu chess-san cinco vezes em cinco sozinho e três em cinco com roteamento s2. Os autores acrescentam que os tokens de entrada são em sua maioria cacheados (80 a 96%), então economizar entrada vale menos dinheiro do que economizar a mesma quantidade em saída, e que o próprio Jev custou entre meio centavo e dez centavos por cinco execuções s2. Uma das 120 execuções, chess-bugfix.on.3 na série do Luna, está marcada como contaminated depois que o agente encontrou em /tmp o script de teste de outra execução s2.

A nota de rodapé do README que motivou o nosso próprio teste: com --user-tools, uma configuração enviou 285 ferramentas e cerca de 200,000 tokens a cada requisição do Claude Code, contra 6 ferramentas e 7,000 tokens no modo limpo s2. Medimos esse mesmo ponto. Uma requisição limpa do Claude Code 2.1.280 carrega 24 ferramentas, 87,547 caracteres de definições de ferramentas e 47,411 tokens de prefixo faturados (16,221 escritos, 31,190 lidos); a configuração completa carrega 40 ferramentas, 93,179 caracteres de definições e 57,277 tokens de prefixo, todos escritos. Ambas trazem thinking: {type: "adaptive"} e 3 blocos cache_control, sem tool_choice, que é exatamente a condição que trava o modo hint em messages.ts s1. Uma única resposta "ok" custa $0.07 em equivalente de API na execução limpa com Sonnet 5 e $1.15 na execução completa com Fable 5.1, lidos dos campos total_cost_usd e de uso do próprio Claude Code, o mesmo ponto que o launcher do gateway ocupa s1.

Sobre o fast-jev-compaction, o plugin por trás da thread de "compactação instantânea" (score 495, 117 comentários) s9, as issues abertas pesam mais do que o número de estrelas: a #21 relata Hooks (0) após a instalação porque session.compact e turn.complete não são eventos de hook reconhecidos no Claude Code 2.1.272, a #88 diz que hooks não podem substituir a compactação e que transcrições completas são enviadas a uma API de terceiros, a #65 documenta 9 relatórios seguidos de "trabalho concluído" inventados após uma compactação, a #89 diz que a compactação é desfeita no --resume s7. A principal reclamação da thread, com 84 pontos, são os termos de uso do fornecedor e os controles de dados s9. O cookbook de sugestão de skills é o único ganho medido que o fornecedor publica para uma lista de agentes: skill errada carregada cai de 16.8% para 7.3%, e skill carregada quando nada serve cai de 9.8% para 4.0% s13.

Medições

O benchmark do gateway, porcentagens em relação ao mesmo modelo com roteamento desligado s2.

chess-bugfix: encontrar e corrigir cinco bugs injetados

Modelo Resolvido, on / off Tokens de saída Tokens de entrada Requisições LLM Segundos Conduzido pelo 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: adicionar notação algébrica a um engine que funciona

Modelo Resolvido, on / off Tokens de saída Tokens de entrada Requisições LLM Segundos Conduzido pelo 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%

Nossa própria captura de requisição, o ponto que o jev-gateway ocupa s1.

Limpa Completa
Modelo escolhido pelo Claude Code claude-sonnet-5 claude-fable-5-1 (configuração do usuário, 1M)
thinking na requisição {type: "adaptive"} {type: "adaptive"}
Blocos cache_control 3 3
tool_choice ausente (auto) ausente (auto)
Ferramentas na requisição 24 40 (28 nativas + 12 MCP)
Definições de ferramentas, caracteres 87,547 93,179
System prompt, caracteres 27,754 12,436
Requisição inteira, caracteres 134,882 155,718
Tokens de prefixo faturados (escrita + leitura de cache) 47,411 (16,221 escritos, 31,190 lidos) 57,277 (todos escritos)
Tokens de saída 4 4
Custo em equivalente de API de um "ok" $0.07 $1.15

Protocolo: um proxy de log de 60 linhas em 127.0.0.1:8790 encaminha cada requisição para https://api.anthropic.com byte a byte e registra o que ela carrega, exatamente o ponto que bin/clients.mjs dá ao jev-gateway. Claude Code 2.1.280 rodou em modo headless, claude -p "Reply with the single word ok. Do not use any tool." --output-format json --max-turns 1, a partir de um repositório Expo privado com 1,021 arquivos versionados, em uma assinatura claude.ai. Limpa: CLAUDE_CONFIG_DIR apontando para um diretório vazio, --strict-mcp-config, --setting-sources project. Completa: as configurações de usuário normais da máquina, o .mcp.json do projeto, servidores MCP do usuário e plugins instalados. Uma requisição por configuração, só o primeiro turno; sem chave do Jev, então os números de regressão são os do bench do gateway repetidos, não reproduzidos.

Para fazer na segunda

  • Antes de adicionar qualquer roteador, meça o seu próprio ponto: suba um proxy de log, aponte ANTHROPIC_BASE_URL para ele, rode claude -p "Reply with the single word ok." --output-format json --max-turns 1 e leia cache_creation_input_tokens mais cache_read_input_tokens na saída.
  • Conte as ferramentas nessa requisição. Se servidores MCP que você raramente usa aumentam a lista, remova-os do .mcp.json ou restrinja por projeto; esse corte vale para toda requisição, com ou sem roteador.
  • Se ainda quiser o Jev no Claude Code, abra src/adapters/messages.ts no seu clone do jev-gateway e confira a linha steer: com thinking ou cache ativos, você está comprando um hint, não uma rota.
  • Rode o bench do gateway no seu próprio repositório com --user-tools em vez de confiar nas tabelas de xadrez; mantenha o roteamento só se uma tarefa de caça a bugs mostrar menos requisições sem mudança em resolvido/não resolvido.
  • Não instale o fast-jev-compaction até as issues #21, #88 e #89 serem fechadas; confirme que /hooks lista mais de zero hooks após a instalação.
  • Leia os termos de uso do fornecedor antes de colar uma chave: cada requisição roteada envia sua lista de ferramentas e sua última mensagem, e o plugin de compactação envia transcrições completas.
  • Se você também usa o Codex, teste o Jev primeiro lá: o tool_choice forçado é o que o bench mostra compensando.

Para ir além

  • A tabela de uso forçado de ferramenta por modelo, incluindo quais modelos retornam 400 e quais modos de thinking bloqueiam any e tool s4.
  • A tabela de invalidação de cache: tools, depois system, depois messages, e a linha de tool_choice que explica o design do gateway s5.
  • A issue #24 do jev-gateway: a lista de ferramentas, invariável na sessão, é reenviada ao Jev a cada requisição, o centro de custo que o dashboard esconde s14.
  • A seção de integridade de dados do README do bench: 119 das 120 execuções mantidas em si, uma execução marcada como contaminated em runs.jsonl s2.
  • Uma leitura independente do Jev como classificador ou filtro em dados públicos e privados, fora do enquadramento de agentes de código s12.
  • Por que as avaliações do fornecedor medem contra dois modelos e não contra a verdade, e o que isso faz com os multiplicadores de destaque s11.
  • Uma análise de terceiros do jev-gateway que percorre a divisão "o Jev escolhe, o LLM escreve" e sua exposição em localhost, corrigida no mesmo dia s8.
  • A thread de lançamento no HN, onde a questão de preço e subsídio é debatida abertamente s10.

Fontes

FAQ

O jev-gateway chega a forçar uma ferramenta dentro do Claude Code?

Só quando a requisição não tem extended thinking nem blocos cache_control. Nossas requisições de primeiro turno capturadas tinham os dois, na configuração limpa e na completa, então na prática o gateway usa hint.

Por que o gateway não reescreve as descrições das ferramentas para conduzir com mais força?

Modificar definições de ferramentas invalida o cache de prompt inteiro, tools, system e messages. Anexar um bloco à última mensagem do usuário só toca o nível de mensagens, que é o lugar mais barato para colocar um hint.

Então o Jev é inútil para programar?

Não. O bench mostra que ele compensa no Codex, onde a ferramenta é forçada e de 76 a 100% das requisições são conduzidas, e em tarefas de debugging para todos os modelos. O que os números do próprio gateway não sustentam é o enquadramento de "Claude Code mais barato".

Devo testar o fast-jev-compaction?

Espere até as issues de registro de hooks (#21, #88) e a issue do --resume (#89) serem fechadas, e decida se transcrições completas saindo para uma API de terceiros são aceitáveis nos seus repositórios.