Os seis componentes de um agente de programação

Os seis componentes de um agente de programação
6componentes no arnês de um agente de programação
3camadas: família de modelos, loop do agente e suportes de execução
4verificações antes de executar qualquer ferramenta
0dependências no Mini Coding Agent: Python puro
As 6 peças de um agente de programação (e por que o Claude Code parece mais esperto que um chat)
Também conto isso neste vídeo de 13 minutos, no meu canal Articulator PT.

Modelo, raciocínio e agente: o motor e o carrolink

O Raschka começa com uma ideia que eu compartilho: grande parte do progresso recente em sistemas com modelos de linguagem não vem de modelos melhores, mas de como os usamos. As ferramentas, a gestão do contexto e a memória pesam tanto quanto o próprio modelo. E, para falar disso, vale separar três conceitos que costumamos misturar:

  • Modelo de linguagem: o núcleo. Ele prevê o próximo token.
  • Modelo de raciocínio: continua sendo um modelo de linguagem, mas treinado ou instruído para gastar mais computação ao responder: raciocina passo a passo, se verifica ou busca entre várias respostas candidatas.
  • Agente: uma camada acima, um loop de controle em volta do modelo. Dado um objetivo, ele decide o que olhar em seguida, quais ferramentas chamar, como atualizar seu estado e quando parar.

A analogia dele é a de um carro: o modelo de linguagem é o motor; o de raciocínio, um motor mais potente, mas mais caro de usar; e o arnês do agente é o carro inteiro, o que permite tirar proveito desse motor.

O motor do modelo de linguagem, o motor mais potente do modelo de raciocínio cercado de moedas e o kart do arnês do agente.
O modelo é o motor; o arnês, o carro inteiro.

Mais dois termos. O arnês de um agente é a estrutura de software em volta dele: gerencia o contexto, as ferramentas, os prompts, o estado e o fluxo de controle. Um arnês de programação é um caso particular, pensado para a engenharia de software. O Claude Code e o Codex são arneses de programação; já o OpenClaw é um arnês de agente mais geral.

O arnês de programaçãolink

Um modelo consegue resolver tarefas de programação sozinho, mas programar é só em parte gerar texto. Também é navegar pelo repositório, buscar, encontrar funções, aplicar mudanças, rodar os testes, ler os erros e não perder de vista o que importa. O Raschka brinca: é um trabalho mental pesado, e por isso não gostamos de ser interrompidos.

Um arnês de programação tem três camadas:

Família de modelos

Entra com o motor: um modelo base ou um de raciocínio.

Loop do agente

Resolve o problema por iterações: observa, analisa, decide e age.

Suportes de execução

O encanamento: contexto do repositório, ferramentas, permissões, memória e cache.

As três camadas de um arnês de programação: família de modelos, loop do agente (observa, analisa, decide e age) e suportes de execução (repo, ferramentas, permissões, memória e cache).
As três camadas de um arnês de programação.

Quando falamos do arnês, falamos da camada que monta os prompts, oferece as ferramentas, acompanha o estado dos arquivos, aplica as edições, executa comandos, gerencia as permissões, guarda em cache o que não muda e armazena a memória. Hoje, essa camada define quase toda a experiência de uso. Um chat na web, por outro lado, se parece mais com "conversar com alguns arquivos anexados".

Aqui o Raschka se arrisca. Ele acha que as versões básicas dos melhores modelos já têm um desempenho muito parecido, então o arnês costuma ser o que faz a diferença. E especula: se colocássemos um modelo aberto de ponta, como o GLM, em um arnês parecido, ele poderia render no nível do GPT no Codex ou do Claude Opus no Claude Code. Mas treinar o modelo para o seu arnês costuma ajudar: a OpenAI manteve uma variante geral do seu modelo e outra especializada no Codex.

Para mostrar as peças, o Raschka escreveu seu próprio agente mínimo, em Python puro e sem dependências. O código dele marca com comentários os seis componentes a seguir.

Os seis cartões dos componentes: contexto vivo do repositório, formato do prompt e cache, ferramentas com validação e permissões, reduzir o contexto, memória da sessão e subagentes com limites.
Os seis componentes de um agente de programação.

1. Contexto vivo do repositóriolink

Talvez seja o mais óbvio, mas é um dos mais importantes. Quando você pede "conserte os testes", o modelo deveria saber se está em um repositório Git, em qual branch e quais documentos do projeto podem trazer instruções. Esse pedido não se entende sozinho:

  • Se o agente vê um AGENTS.md ou o README do projeto, pode aprender com qual comando os testes rodam.
  • Se conhece a raiz e a estrutura do repositório, busca no lugar certo em vez de adivinhar.
  • A branch, o status e os últimos commits dizem quais mudanças estão em andamento.

Então, antes de trabalhar, o arnês inspeciona o repositório, extrai o contexto do Git e os documentos do projeto e os condensa em um resumo do espaço de trabalho. Esse resumo se combina com o seu pedido, e assim o agente não começa do zero a cada prompt.

Diagrama: o arnês inspeciona o repositório, extrai o contexto do Git e os documentos, condensa tudo em um resumo do espaço de trabalho e um prefixo estável, e combina isso com o seu pedido antes de chegar ao modelo.
Antes de trabalhar, o arnês condensa o repositório em um resumo.

2. Formato do prompt e cachelink

Já temos os dados do repositório. Mas seria um desperdício montá-los e processá-los de novo a cada pedido. As sessões de programação são repetitivas: as regras do agente não mudam, a descrição das ferramentas também não, e o resumo do projeto quase nada. O que muda a cada turno é o seu último pedido, a conversa recente e a memória de curto prazo.

Por isso um arnês inteligente divide o prompt em duas partes:

  • Um prefixo estável, com as instruções, as ferramentas e o resumo do espaço de trabalho, que ele reaproveita do cache.
  • O estado da sessão, que ele acrescenta no final a cada turno.
O prompt em duas partes: um prefixo estável reaproveitado do cache (instruções, ferramentas e resumo do espaço de trabalho) e o estado da sessão, acrescentado no final de cada turno.
Um prefixo estável que é reaproveitado e um estado que muda a cada turno.

A diferença para o componente um: aquele reúne os fatos do repositório; este os empacota e guarda em cache para as chamadas repetidas ao modelo. Não faz sentido gastar computação reconstruindo do zero o que não mudou.

3. Ferramentas, validação e permissõeslink

É aqui que deixa de parecer um chat e começa a parecer um agente. Um modelo sozinho sugere comandos em texto, e você os executa e cola o resultado para ele. Em um arnês de programação, o próprio modelo executa o comando e recebe a saída.

Mas o arnês não deixa o modelo improvisar qualquer sintaxe. Ele dá uma lista fechada de ferramentas com nome, com entradas claras e limites claros: listar o diretório, ler, buscar, executar um comando no terminal ou escrever um arquivo. E o modelo tem que passar os argumentos em um formato que o arnês consiga verificar. Quando o modelo pede uma ação, o arnês para e se faz quatro perguntas:

É uma ferramenta conhecida?

Só as da lista fechada.

Os argumentos são válidos?

No formato que o arnês sabe verificar.

O usuário precisa aprovar?

Escrever um arquivo, por exemplo, pede permissão.

O caminho está dentro do espaço de trabalho?

O agente não sai do repositório.

Só quando passa por todas as verificações algo é executado. Depois, o resultado é cortado e volta para o loop.

O terminal do Mini Coding Agent pede aprovação para write_file; ao lado, a lista: menos liberdade, mais confiável, mais fácil de usar, nada de comandos arbitrários e não sai do repositório.
No Mini Coding Agent, escrever um arquivo espera a sua aprovação.

No Mini Coding Agent fica assim: você pede "implemente a busca binária em Python", e antes de escrever o arquivo ele pergunta se você aprova. O arnês dá ao modelo menos liberdade, mas assim ele fica mais confiável e mais fácil de usar: não executa comandos arbitrários e não sai do repositório.

4. Reduzir o contextolink

O inchaço do contexto é um problema de todos os modelos de linguagem. Eles aceitam contextos cada vez mais longos, mas continuam sendo caros e podem trazer ruído. E um agente de programação sofre ainda mais: lê os mesmos arquivos várias vezes e acumula saídas de ferramentas e logs muito longos. Se guardasse tudo do jeito que está, ficaria sem tokens rapidinho.

Um arnês mínimo usa pelo menos duas estratégias:

  • Cortar: encurta os trechos de documentos, as saídas longas, as notas de memória e as entradas do histórico, para que nenhum texto devore o orçamento do prompt só por ser longo.
  • Resumir o histórico: transforma a sessão inteira em um resumo pequeno que caiba no prompt. O truque é guardar o recente com mais detalhe, porque importa mais para o passo atual, e comprimir mais o antigo.

Além disso, as leituras repetidas de um mesmo arquivo são removidas, para que o modelo não o veja de novo e de novo.

Blocos do histórico em uma linha do tempo: os antigos, pequenos e comprimidos; os recentes, grandes e com detalhe.
O recente, com detalhe; o antigo, comprimido.

Para o Raschka, essa é uma das partes mais chatas e subestimadas do design de um agente. Mas fico com a frase dele: muito do que parece qualidade do modelo é, na verdade, qualidade do contexto.

5. Memória da sessãolink

O componente anterior respondia a quanto do passado volta para o modelo no próximo turno. Este responde a outra pergunta: o que o agente guarda como registro permanente? E ele separa isso em pelo menos duas camadas, que costumam ser salvas em disco como arquivos JSON:

Transcrição completa

Todos os seus pedidos, as saídas das ferramentas e as respostas do modelo. Dá para retomar mesmo se você fechar o agente.

Memória de trabalho

Um estado pequeno e destilado, com a tarefa atual, os arquivos importantes e as notas recentes. Ela não só cresce: é editada e compactada.

À esquerda, a transcrição completa com pedidos, saídas e respostas; à direita, a memória de trabalho com a tarefa, os arquivos e as notas, que é editada e compactada.
As duas camadas da memória da sessão.

A memória de trabalho parece a mesma coisa que o histórico compacto do componente quatro, mas cumpre outra função. O histórico compacto serve para reconstruir o prompt: dá ao modelo uma visão comprimida do que é recente. A memória de trabalho serve para não perder o fio da tarefa entre os turnos. E cada evento novo é anotado nas duas camadas.

6. Subagentes com limiteslink

Quando um agente já tem ferramentas e estado, o próximo passo é delegar. No meio de uma tarefa, ele pode precisar de uma resposta lateral: qual arquivo define um símbolo, o que diz uma configuração ou por que um teste falha. Melhor separar isso em uma subtarefa delimitada, que pode rodar em paralelo e acelerar o trabalho.

Um subagente só serve se herdar contexto suficiente para trabalhar de verdade. Mas, se não o limitarmos, teremos vários agentes repetindo trabalho, mexendo nos mesmos arquivos ou lançando mais subagentes. Como diz o Raschka: o problema difícil não é como criar um subagente, mas como amarrá-lo. Por exemplo, com acesso só de leitura e uma profundidade de recursão limitada.

Um subagente dentro de um quadro de limites, com um cadeado de só leitura e uma profundidade de recursão limitada.
O subagente herda contexto, mas dentro de limites mais rígidos.

No agente do Raschka, o subagente ainda roda sem paralelismo, mas a ideia é a mesma. O Claude Code tem subagentes há algum tempo, e o Codex os adicionou mais tarde. O Codex não os obriga a ser só de leitura: eles costumam herdar o ambiente isolado e as permissões do agente principal. Ali, o limite está em delimitar a tarefa, o contexto e a profundidade.

E o OpenClaw?link

Os seis componentes estão muito entrelaçados no código, mas olhar para eles um por um ajuda a entender como funciona um arnês de programação e por que ele torna o modelo muito mais útil que um chat de vários turnos. O Raschka fecha comparando com o OpenClaw, que tem muito em comum:

  • Arquivos de instruções no espaço de trabalho, como AGENTS.md, SOUL.md e TOOLS.md.
  • Sessões salvas com compactação do histórico.
  • Subagentes e sessões auxiliares.

Mas é outro tipo de sistema: uma plataforma local de agentes gerais que também programam, pensada para muitos agentes de vida longa espalhados por chats, canais e espaços de trabalho. Já um agente de programação é otimizado para uma pessoa que trabalha em um repositório e pede para ele inspecionar arquivos, editar código e executar ferramentas locais de forma eficiente. No OpenClaw, programar é uma tarefa importante, mas só mais uma entre várias.

O agente de programação como um círculo pequeno diante do OpenClaw, um círculo grande com muitos agentes espalhados por chats, canais e espaços de trabalho.
Muito em comum, mas outro tipo de sistema.
Em uma frase

O modelo é o motor, mas o arnês o transforma em um agente: contexto do repositório, prompt com cache, ferramentas com permissões, contexto cortado, memória de sessão e subagentes com limites.

De qual componente você mais sente falta no seu agente?

Fonteslink

Continuar lendo

Últimos posts -->

Você viu esses projetos?

Gymnasia

Gymnasia Gymnasia
Expo
React Native
TypeScript
OpenAI
Anthropic

App de fitness com dois agentes que são executados integralmente no dispositivo, sem backend, de forma que os dados do usuário nunca saem do celular. Um coach conversacional BYOK com tools locais e system prompt remoto com fallback offline, e um estimador de refeições que tira os macronutrientes de uma foto do prato, com leitura de códigos de barras contra o OpenFoodFacts.

LangGraph Deep Researcher

LangGraph Deep Researcher LangGraph Deep Researcher
Python
LangGraph
FastAPI
React
TypeScript
Docker

Sistema multiagente de pesquisa construído com LangGraph. Um supervisor decompõe sua pergunta em tópicos e lança subagentes de busca em paralelo; cada um comprime seus achados antes de repassá-los a um agente redator que escreve o relatório final em markdown com suas fontes. Streaming ao vivo por WebSockets, modelo configurável por papel e chaves de API próprias que nunca são armazenadas no servidor.

Tau

Tau Tau
Python
LangChain

Sistema multiagente de tutoria para estudantes do ensino médio, com um agente por disciplina e material de curso elaborado e validado por uma equipe de professores. Chegou a ser usado com alunos reais em um colégio privado na Espanha e em uma escola de ensino médio na Colômbia.

Ver todos os projetos -->
>_ Disponível para projetos

Tem um projeto com IA?

Vamos conversar.

maximofn@gmail.com

Especialista em Machine Learning e Inteligência Artificial. Desenvolvo soluções com IA generativa, agentes inteligentes e modelos personalizados.

Quer assistir alguma palestra?

Últimas palestras -->

Quer melhorar com essas dicas?

Últimos tips -->

Use isso localmente

Os espaços do Hugging Face nos permitem executar modelos com demos muito simples, mas e se a demo quebrar? Ou se o usuário a deletar? Por isso, criei contêineres docker com alguns espaços interessantes, para poder usá-los localmente, aconteça o que acontecer. Na verdade, se você clicar em qualquer botão de visualização de projeto, ele pode levá-lo a um espaço que não funciona.

Flow edit

Flow edit Flow edit

Edite imagens com este modelo de Flow. Baseado em SD3 ou FLUX, você pode editar qualquer imagem e gerar novas

FLUX.1-RealismLora

FLUX.1-RealismLora FLUX.1-RealismLora
Ver todos os contêineres -->
>_ Disponível para projetos

Tem um projeto com IA?

Vamos conversar.

maximofn@gmail.com

Especialista em Machine Learning e Inteligência Artificial. Desenvolvo soluções com IA generativa, agentes inteligentes e modelos personalizados.

Você quer treinar seu modelo com esses datasets?

short-jokes-dataset

HuggingFace

Dataset com piadas em inglês

Uso: Fine-tuning de modelos de geração de texto humorístico

231K linhas 2 colunas 45 MB
Ver no HuggingFace →

opus100

HuggingFace

Dataset com traduções de inglês para espanhol

Uso: Treinamento de modelos de tradução inglês-espanhol

1M linhas 2 colunas 210 MB
Ver no HuggingFace →

netflix_titles

HuggingFace

Dataset com filmes e séries da Netflix

Uso: Análise de catálogo Netflix e sistemas de recomendação

8.8K linhas 12 colunas 3.5 MB
Ver no HuggingFace →
Ver mais datasets -->