HMDeveloper
Todos os artigos
roteamento
roteamentomodelosarquitetura

Um script na frente de todo modelo que não é Claude

Toda chamada a um modelo fora do Claude passa por um roteador e uma classe de tarefa. A classe escolhe o destino, e só uma delas pode alterar o repositório.

Em 18 de agosto, enviei uma tarefa longa de programação a um modelo externo. Ela rodava em primeiro plano, ou seja, ligada diretamente ao meu terminal. O shell encerrou o processo após 2 minutos, com saída 143. Rodei de novo em segundo plano, sem prender o terminal, e terminou: 52.226 tokens. Um segundo envio do mesmo tipo chegou a 56.564. Foram uma execução em primeiro plano que morreu, outra em segundo plano e um segundo envio. Todas eram da classe burst. Só o ambiente de execução mudou.

O roteador já existia naquela época. O episódio mostrou que ele precisa conhecer o ambiente onde cada classe roda. Quem escreve o prompt não deveria precisar saber disso. Toda chamada a um modelo fora do Claude passa pelo script route-engine.sh.

Uma entrada

A chamada é route-engine.sh <caller> <task_class>, com o prompt na entrada padrão. caller é o nome do agente que faz a chamada. A classe informa o tipo de trabalho, e o roteador escolhe o destino.

Em cada chamada, o script grava um recibo num log JSONL, um arquivo de texto com um registro por linha. Ele registra o provedor pedido e o que realmente respondeu. Às vezes são diferentes. Por isso o recibo importa.

Já escrevi sobre escolher um modelo pelo tipo de trabalho e sobre tentar outro caminho quando um recurso acaba. Este texto trata do ponto em que essas escolhas se encontram: a classe.

As classes

Hoje há sete:

Só burst pode escrever no repositório. Ele trabalha isolado na pasta de trabalho de quem fez a chamada e sem acesso à rede. As outras classes só recebem texto e devolvem texto. Nada é alterado. Essa restrição é intencional.

Burst não tem alternativa de texto

A divisão fica mais clara quando burst falha. Se o roteador mudasse para um motor que só responde com texto, a chamada devolveria uma resposta sem alterar arquivos. A automação veria uma resposta, marcaria a tarefa como concluída e deixaria o repositório intacto. É o mesmo falso sucesso que descrevi no texto sobre fallback.

Por isso, burst não tem uma alternativa de texto. Se não há um motor capaz de escrever, a chamada falha e deixa isso claro. Prefiro um erro que pare o processo a uma resposta educada que não fez nada.

O episódio dos 2 minutos também importa aqui. Uma tarefa burst demora por natureza, então o tempo limite do shell faz parte do ambiente. Em primeiro plano, o processo morre. Em segundo plano, termina.

A ALLOWLIST

O roteador tem uma lista de permissões chamada ALLOWLIST. A ADR-024, proposta em 9 de agosto, descreve 133 linhas explícitas e dois curingas: codex * e ollama *. Essa lista limita para onde cada classe pode ir. Não limita gastos.

Depois vieram duas decisões separadas da ADR-024. Em 12 de agosto, defini que o revisor de PR só pode usar uma lista curta de famílias de modelos: Claude, codex, antigravity, ollama cloud e opencode-go. A regra fica no roteador, não no prompt do revisor. Ele pode ignorar o texto do prompt, mas não o roteador. A outra decisão é a ADR-025, aceita em 14 de agosto. Ela trocou o programa de linha de comando do gateway multi-provedor por uma chamada HTTP direta.

Os motores são contados por medidor: assinatura (Claude Max, Codex, Ollama Cloud e algumas assinaturas de gateway), pool compartilhado e gratuito. A ordem é assinatura, pool e gratuito.

O que cada motor consegue fazer

Em 3 de setembro, descobri que o braço Claude de burst edita arquivos, mas não executa comandos. O braço codex executa comandos, mas não escreve dentro de .git. Os dois fazem parte de burst, mas têm capacidades diferentes.

O prompt não muda isso. A capacidade depende do motor. Pedir ao braço Claude para "rodar os testes" não adianta, pois ele não executa comandos. Quem precisa saber disso é o roteador, que escolhe o braço, não quem escreve o prompt.

Ajudo equipes a usar agentes de IA no trabalho de engenharia. Se sua equipe está começando, vamos conversar.

Ver consultoria