Executando verificação de segurança...
5

NTK (Neural Token Killer): daemon em Rust que comprime até 90 % da saída de comandos antes de chegar no Claude Code. [PT-BR]

TL;DR

Criei o NTK (Neural Token Killer), um proxy local em Rust que fica entre o Claude Code (e outros editores com hook) e o LLM. Ele intercepta a saída de Bash / cargo test / docker logs / tsc e comprime antes de virar contexto. Números medidos: até 92 % em logs repetitivos do Docker, 56–83 % em stack traces de várias linguagens, < 20 ms de overhead nas camadas regex + tokenizer. Pode ser utilizado juntamente com o RTK já que e RTK é PreToolUse e NTK é PostToolUse.

O projeto é open-source (MIT) e está no começo. Preciso de gente para testar, adicionar fixtures de linguagens que ainda não cobrimos, traduzir a documentação, portar o hook para outros editores e fazer benchmarks em GPUs que eu não tenho.


O problema

Se você usa Claude Code, Cursor, OpenCode ou qualquer outro editor com agente LLM, já percebeu: cada vez que o modelo roda um comando Bash, toda a saída é empurrada de volta para o contexto na próxima turn. Um cargo test com 200 testes passando, um docker logs de 10 mil linhas, um tsc com warnings repetidos — tudo isso consome milhares de tokens que, do ponto de vista do modelo, são ruído.

Consequências:

  1. Cap de contexto atingido mais rápido — a janela acaba no meio de uma sessão produtiva.
  2. Latência maior — o modelo processa mais tokens de entrada.
  3. Custo maior — se você está na API paga.
  4. Perda de foco do modelo — output verboso dilui a informação relevante (erros, diffs, warnings).

A alternativa que já existia (RTK, filtros por regex no shell) funciona para casos simples mas é síncrona e cega à semântica: filtra o que o autor da regra sabia que era ruído, não o que o modelo consideraria ruído.

A ideia do NTK

Pipeline em 4 camadas, assíncrona, via PostToolUse hook:

Saída do Bash
  → Hook PostToolUse
    → POST /compress no daemon local
      → L1 Fast Filter    (regex, < 1 ms) — ANSI, dedup por template, stack-trace filter
      → L2 Tokenizer       (cl100k_base, < 5 ms) — path shortening, BPE, normalização
      → L3 Local Inference (Phi-3 Mini, só quando pós-L1+L2 > 300 tokens)
      → L4 Context Injection — prefixa a intenção do usuário no prompt da L3
  → Contexto do modelo

L1 e L2 são sempre ligadas. L3 só dispara quando pós-L1+L2 ainda está acima de 300 tokens — evita overhead de 300-800 ms para outputs pequenos tipo git status. L4 lê o transcript da sessão do Claude Code para descobrir a pergunta atual do usuário e prefixa no prompt de compressão.

Números reais

Todos vindos de bench/microbench.csv rodado contra 15 fixtures determinísticos em bench/fixtures/. Nada de estimativa.

FixtureCenárioEconomia L1+L2
docker_logs_repetitiveLogs com timestamps repetidos92 %
node_express_traceStack trace Node.js com node_modules/express83 %
cargo_test_failurescargo test com 1 falha em 5068 %
python_django_traceStack trace Django + gunicorn/asgiref62 %
stack_trace_javaSpring/Tomcat/CGLIB60 %
go_panic_traceGo panic + goroutine dumps56 %
php_symfony_traceSymfony/HttpKernel + /vendor33 %

L3 empurra esses números mais para cima em outputs desestruturados, mas o tempo CPU do Phi-3 Mini é longo (~60 s) sem GPU, então na prática só vale ligar com aceleração CUDA/Metal.

Por que Rust

  • Latência determinística — cada chamada de Bash é interceptada; overhead precisa ser previsível.
  • Binário único, zero runtime — se seu shell abre, NTK roda.
  • Multiplataforma sem #ifdef — Windows, macOS, Linux compilam a mesma base.
  • Enum de backend de inferência — trocar Ollama por Candle ou llama.cpp é um match.

O que precisa de ajuda (é aqui que você entra)

Comecei sozinho. A lista do que não tenho como fazer bem é maior do que a que consigo:

  1. Fixtures de linguagens novas — pares .txt + .meta.json. Ainda abertos: Elixir/Phoenix, Scala/Akka, Swift/iOS, Flutter/Dart, Clojure, Erlang/OTP. Qualquer log real serve.
  2. Portar o hook para outros editores — Claude Code e OpenCode já funcionam. Cursor, Aider, Zed, Continue, Windsurf têm esquemas JSON parecidos. É um script shell autocontido.
  3. Benchmarks em hardware que não tenho — números de AMD (Vulkan), Apple Silicon (Metal) e Intel AMX no README são parcialmente estimados.
  4. Traduçõesdocs/ tem pt-BR e en-US. ES/FR/DE/JA é só copiar e traduzir.
  5. Quebrar invariantes — 8 property-based tests em cargo test --test compression_invariants. Achar uma entrada que viole qualquer um é ouro.

Trade-offs honestos

  • Não substitui LLM remoto. A L3 usa Phi-3 Mini (3.8B). É bom para sumarizar output estruturado, não escreve código no seu lugar.
  • Privacidade. Nada sai da sua máquina. Telemetria é opt-out e não envia arquivos/paths/conteúdo.
  • NTK+RTK combinado ainda não medido. Hoje o painel "combined" no site mostra N/A porque eu não tenho o número real.

Perguntas abertas (é aqui que eu quero opinião)

  1. Você usa agente de LLM que roda comandos locais? Qual comando mais entope seu contexto?
  2. Se isso existisse antes e você soubesse, teria instalado? O que faria você não instalar?
  3. Alguma linguagem / framework que queria ver suportado primeiro?

Crítica dura (incluindo "isso é ruim porque X") vale mais do que upvote silencioso.

Obrigado pela leitura. Ponto de partida mais curto pra contribuir: https://github.com/VALRAW-ALL/ntk/blob/master/CONTRIBUTING.md

Carregando publicação patrocinada...
1

Meus 2 cents,

Parabens pela iniciativa !

Eh um campo bastante negligenciado - a limpeza de contexto antes de enviar para um LLM trabalhar (isso custa caro).

Sobre suas perguntas:

  1. Você usa agente de LLM que roda comandos locais? Qual comando mais entope seu contexto?
  • docker logs com certeza, tail de saidas diversas e ls de um modo geral.
  1. Se isso existisse antes e você soubesse, teria instalado? O que faria você não instalar?
  • No meu caso o maior impeditivo eh testar e ver na pratica como ele impacta nos conteudos atuais: isso toma um bocado de tempo, pois se tenho um pipeline funcional, preciso ter certeza que adcionar uma ferramenta no meio nao vai impactar negativamente no que ja esta funcionando.
  1. Alguma linguagem / framework que queria ver suportado primeiro?
  • Como nao testei, nao tenho nada especifico para indicar - mas me lembrei das sugestoes de troca de JSON por outro formato mais leve (p.ex. TOON)

Um ponto que pensei eh se ele seria util em RAG, ou mesmo como um otimizador de prompt ou algo do genero (so viajando um pouco aqui).

Na lista de testes (que esta um pouco longa...)

Obrigado por compartilhar !

Post devidamente favoritado via extensão TABNEWS FAVORITOS

Saude e Sucesso !

1

Valeu pelo feedback!
Sobre docker logs, tail e ls: docker logs tá coberto (92%). tail e ls me interessam por um motivo específico, eles caem numa zona onde L1+L2 ainda compensa mas L3 seria overhead puro, output pequeno demais. Vou adicionar como fixtures na próxima leva pra garantir que o fast-path tá otimizado pra esses casos.

Sobre o medo de quebrar pipeline funcional, essa é a objeção #1 que eu precisava ouvir. Tem algumas coisas já na cabeça pra atacar isso

modo observe-only (NTK_OBSERVE_ONLY=1), roda, mede economia, mas devolve o output original. Dá pra avaliar impacto com risco zero.
kill switch via env var, desliga sem desinstalar, sem reiniciar shell.
passthrough garantido abaixo de N tokens (hoje N=300), output pequeno não é tocado.

Vou implementar o observe-only no próximo release e documentar como uma feature "teste" para o usuário validar se gerou impacto suficiente e se foi positivo ou negativo. Acho que isso resolve a maior parte que você mencionou.

valeu pelo tempo, feedback dessa qualidade é o que faz o projeto não ser brinquedo de um dev só :D

1

Meus 2 cents extendidos,

Fico contente em ajudar.

Esqueci de comentar - repositorio devidamente starreado e forkeado !

Uma coisa que passou pela minha cabeca foi a questao de plugins - dei uma olhada e vi que voce ja tem os "compressores" em .rs e via ollama. fico imaginando se tem alguma forma de criar um "hook" razoavelmente simples para que ele execute uma funcao externa: que pode tanto ser um cache (p.ex. verificar se o sha1 da entrada ja existe, entao retorna direto o cache da entrada), uma funcao especifica ou mesmo um MCP (a funcao na verdade poderia fazer isso) e colocar um timeout ajustavel (-1 deslia) para evitar que ficasse pendurado para sempre.

Saude e Sucesso !

1
2

Opa, essa duvida é frequente quando apresento o sistema para alguém. Tem pelo menos duas razões:

A primeira é a latência determinística no hot path. NTK roda em todo PostToolUse do Claude Code. Se o hook adiciona 200ms de jitter, o dev sente. Rust me dá latência previsível sem pausa de GC para gerenciamento de memória em que linguagens como python, c# ou java possuem, também não me daria problema relacionados a malloc fragmentado em running longos via daemon no C++. L1+L2 rodam em < 5ms p99 num notebook de "antigo", em Python isso seria 30-80ms só do overhead de regex+tokenização, a ideia é reduzir ao máximo essa latencia.

O segundo motivo é o binário único. curl ou sh instala um executável de 15MB e pronto, sem pip install, sem venv, sem "qual Python tá no PATH", isso já me deu muita dor de cabeça kkkk. Pra uma ferramenta que precisa estar rodando o tempo todo em máquinas de devs heterogêneas , Win/Mac/Linux, com e sem GPU, isso remove uma categoria inteira de excesso de suporte para cada prataforma.

O python seria ótimo pra protótipo mas o projeto já era uma ideia pré-avaliada e não era algo "incerto", logo usei Rust como linguagem mais segura e performática. C++ daria a mesma performance com 3× mais bugs de memória, gerenciar memória usando C++ exige muita atenção, testes rigososos, para um projeto de médio porte como este e que só tem eu e o Claudinho Code como desenvolvedor, é difícil manter tudo na linha.

1

Então não foi algo aleatório! Confesso que estou surpreendido. Normalmente eu vejo algumas pessoaso optando por Rust meramente por ter ganho uma popularidade a mais.

Você sem dúvidas agiu como um dev certeiro e atacou o problema com a melhorar ferramenta que tinha. Parabéns! Aprendi bastante coisa com teu comentário também. Estou profundamente agradecido.