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_URLpara ele, rodeclaude -p "Reply with the single word ok." --output-format json --max-turns 1e leiacache_creation_input_tokensmaiscache_read_input_tokensna saída. - Conte as ferramentas nessa requisição. Se servidores MCP que você raramente usa aumentam a lista, remova-os do
.mcp.jsonou 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.tsno seu clone do jev-gateway e confira a linhasteer: 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-toolsem 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
/hookslista 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_choiceforç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
anyetools4. - A tabela de invalidação de cache:
tools, depoissystem, depoismessages, e a linha detool_choiceque 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
contaminatedemruns.jsonls2. - 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
- jev-gateway, GitHub, vinilana. Por que ler:
src/adapters/messages.tscontém a linha que decide entre hint e ferramenta forçada, ebin/clients.mjsmostra que o launcher só defineANTHROPIC_BASE_URL. - jev-gateway-bench, GitHub, vinilana. Por que ler: a tabela completa das 120 sessões e a leitura dos próprios autores, incluindo a execução contaminada.
- Introducing System One Models & Jev, TypeSafe AI. Por que ler: preço, latência e a nota de rodapé que qualifica a afirmação de 444.6x, vinda do fornecedor.
- Forcing tool use, Anthropic docs. Por que ler: a tabela por modelo de quais valores de
tool_choicegeram erro. - Prompt caching, Anthropic docs. Por que ler: a hierarquia de invalidação que impõe o design por hint.
- fast-jev-compaction, GitHub, tamaratran. Por que ler: abra a aba de issues antes do README.
- jev-gateway Review: Jev Picks, the LLM Writes, mrjev.com. Por que ler: um passo a passo externo da arquitetura do gateway.
- Instant Claude Code compaction is my favorite use of Jev so far, r/ClaudeCode. Por que ler: a thread de quem usa na prática, com a objeção aos termos de uso no topo.
- HN: Introducing System One Models and Jev, Hacker News. Por que ler: o debate de lançamento sobre preço e sustentabilidade.
- The Evals: Measured Against Two Models, Not Against Truth, novcog. Por que ler: uma crítica do método de avaliação por trás dos multiplicadores do fornecedor.
- Testing Jev on public and private data: classifier or filter, Aman Kumar. Por que ler: uma medição independente fora dos agentes de código.
- Skill suggestion cookbook, TypeSafe docs. Por que ler: os únicos números publicados de seleção de lista, 16.8% para 7.3%.
- jev-gateway issue #24, GitHub. Por que ler: o custo de reenvio da lista que ninguém conta.
- Jev + Claude Code: compaction and a Sonnet 5 source check, jevmodel.ai. Por que ler: um segundo olhar sobre a afirmação da compactação com uma checagem do Sonnet 5.
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.
AIDive