- O processo de construir agentes continua complexo, e há problemas em que as abstrações de SDK frequentemente se quebram na etapa real de uso de ferramentas
- O gerenciamento de cache varia de plataforma para plataforma; o controle manual é mais previsível e eficiente, e a abordagem de pontos de cache explícitos do SDK da Anthropic é a preferida
- O loop de reforço (reinforcement loop) desempenha um papel central no rastreamento do estado das tarefas e na recuperação de falhas, e as falhas precisam ser isoladas separadamente para evitar o colapso do loop
- O gerenciamento de estado compartilhado exige uma hierarquia semelhante a um sistema de arquivos, usada como estrutura-base para troca de dados entre ferramentas de execução de código e de inferência
- A ferramenta de saída e a escolha do modelo continuam sendo difíceis, com modelos como Haiku, Sonnet e Gemini permanecendo como principais opções, o que mantém a complexidade do projeto de agentes
Escolha do SDK de agentes
- Ao construir agentes, é preciso escolher entre usar diretamente SDKs básicos como os da OpenAI e Anthropic, ou usar camadas de abstração de alto nível como Vercel AI SDK ou Pydantic
- O autor menciona que no passado usou apenas a abstração de provider do Vercel AI SDK, mas que hoje não repetiria essa escolha
- Como as diferenças entre modelos são grandes, é preciso construir diretamente a própria camada de abstração de agentes, e a abstração dos SDKs existentes não é adequada
- Existem diferenças sutis em controle de cache, requisitos de reforço e prompts de ferramentas
- O Vercel SDK apresenta problemas no processamento de ferramentas no lado do provider
- Há casos em que a ferramenta de busca na web da Anthropic corrompe o histórico de mensagens
- Ao usar diretamente o SDK da Anthropic, o gerenciamento de cache e as mensagens de erro ficam mais claros
- Em conclusão, neste momento a abordagem de usar diretamente os SDKs sem camada de abstração é considerada mais vantajosa
Lições sobre gerenciamento de cache
- A abordagem de cache difere entre plataformas, e a Anthropic cobra pelo cache e exige gerenciamento explícito
- O controle manual é preferido por tornar mais previsíveis o custo e o aproveitamento do cache
- O cache explícito permite executar ramificações da conversa ou editar o contexto
- É possível definir vários pontos de cache, como após o prompt de sistema e no começo da conversa
- Para manter o cache, o prompt de sistema e a seleção de ferramentas devem permanecer estáticos, enquanto informações dinâmicas, como horário, devem ser passadas em mensagens posteriores
- O loop de reforço é usado ativamente junto com o cache para melhorar a previsibilidade de custos e o controle
Reforço dentro do loop do agente
- Ao executar ferramentas, além de retornar apenas o resultado, é possível reinjetar no loop informações como objetivo, estado da tarefa e causa da falha
- Ferramentas de auto-reforço (self-reinforcement), como a todo write do Claude Code, ajudam no andamento do loop
- Em mudanças de ambiente ou momentos de recuperação de falhas, a estabilidade do loop é garantida ao injetar informações de mudança de estado
- Ex.: ao tentar novamente com base em dados corrompidos, insere-se uma mensagem para voltar à etapa anterior
Isolar falhas (Isolate Failures)
- Tarefas com expectativa de falhas repetidas são executadas separadamente em um subagente (subagent), e apenas os resultados bem-sucedidos são reportados ao loop superior
- Resumos das tentativas fracassadas podem ser usados como material de aprendizado para a próxima tarefa
- No SDK da Anthropic, é possível remover o registro de falhas com o recurso de edição de contexto (context editing)
- Em vez de manter todas as informações de falha, preservam-se apenas as partes necessárias
- Porém, a edição de contexto pode invalidar o cache e aumentar os custos
Subagentes e sistema de arquivos compartilhado
- A maioria dos agentes é baseada em execução e geração de código, por isso precisa de um repositório de dados comum
- Para isso, usa-se um sistema de arquivos virtual (VFS)
- Ferramentas diversas, como geração de imagem, compressão e inferência, precisam compartilhar o mesmo caminho de arquivo
- As ferramentas
ExecuteCode e RunInference precisam poder acessar o mesmo sistema de arquivos
- Essa estrutura é essencial para eliminar gargalos na troca de dados e processar tarefas contínuas dentro do loop
Ferramenta de saída (Output Tool)
- O agente opera não como uma sessão de chat, mas como um loop interno privado de mensagens, e a comunicação com o exterior é feita por meio de uma ferramenta de saída
- A ferramenta de saída é responsável por comunicações externas, como envio de e-mail
- É difícil controlar o tom e o estilo da ferramenta de saída, e ao usar um LLM auxiliar (Gemini 2.5 Flash) surgem queda de qualidade e latência
- Como a ferramenta subordinada não recebe contexto suficiente, ela gera resultados imprecisos
- Se a ferramenta de saída não for chamada ao final do loop, injeta-se uma mensagem de reforço para induzir sua chamada
Escolha de modelos
- Haiku e Sonnet têm bom desempenho em chamadas de ferramentas e são usados como modelos principais do loop
- Gemini 2.5 é adequado para resumir documentos grandes, processar PDFs e extrair informações de imagens
- O modelo Sonnet tem a desvantagem de frequentemente ser barrado por filtros de segurança
- Modelos da linha GPT não tiveram grande desempenho no loop principal
- Não dá para avaliar o custo total apenas pelo preço de tokens
- Um modelo melhor em chamadas de ferramentas pode executar a mesma tarefa com menos tokens
Testes e avaliação (Evals)
- A automação de testes e avaliação de agentes é apontada como o problema mais difícil
- Ao contrário de prompts, não é possível fazer uma avaliação simples a partir de um sistema externo
- É necessário ter observabilidade (observability) ou instrumentação (instrumentation) com base em dados reais de execução
- O autor menciona que até agora não encontrou um método de avaliação satisfatório
Atualização sobre agentes de programação
- Não houve grandes mudanças relacionadas a agentes de programação
- Recentemente, ele vem testando o agente Amp e avalia muito bem a estrutura de interação entre o subagente Oracle e o loop principal
- Amp e Claude Code passam a impressão de terem sido projetados por desenvolvedores que realmente usam suas próprias ferramentas
1 comentários
Opinião no Hacker News
Há cerca de 2 anos fundei uma empresa nessa área. Hoje ela está indo bem
O que aprendi nesses 2 anos é que muitas técnicas são otimizações temporárias para compensar as limitações atuais dos LLMs. Como a tecnologia evolui rápido, o problema de hoje pode desaparecer amanhã
Antigamente, quando a AWS não tinha criptografia de disco, a equipe gastou 3 meses implementando isso por conta própria, mas logo depois a AWS lançou criptografia padrão com um clique. No fim, foi tempo desperdiçado
Então a lição foi que, às vezes, não fazer nada é a melhor opção
A era de aprender padrões como uma linguagem comum, como antigamente, acabou, e agora a meia-vida dos padrões de IA é de cerca de uma semana. Se você perguntar a 10 especialistas o que é um “agent”, vai receber 10 respostas diferentes
Nos últimos 2 anos usei vários SDKs de agent, e ao tentar montar algo por conta própria descobri que é muito mais complexo do que parece
O Claude Code SDK (hoje Agent SDK) é excelente, mas ainda não está totalmente desacoplado do Claude Code. Por exemplo, as skills precisam ser colocadas diretamente no sistema de arquivos
O SDK da OpenAI permite rastreamento e avaliação automáticos no dashboard graças ao forte acoplamento com a plataforma, mas é difícil integrar modelos de terceiros
O Google Agent Kit ainda não tem SDK para Typescript, e o Mastra é incômodo porque exige subir um servidor
Agora estou testando o SDK da SmythOS, que dá bastante liberdade na escolha do provedor de modelo e na definição da arquitetura
Fiquei curioso se a estrutura que vocês usam hoje é Agent → SubAgents → SubSubAgents ou algo no estilo Planner-Executor
O volume de código aumenta, mas o modelo mental é simples, então fica muito mais fácil de entender. Rodo um loop no estilo ReAct, repetindo reasoning e chamadas de ferramentas
No fim, dá para implementar handoff de agent e workflows manualmente, sem SDK
Quero compartilhar alguns princípios de design de agent que aprendemos
Para referência, nossa empresa Definite é uma plataforma de dados operada por engenheiros de dados de IA, como se fosse um Heroku
Trabalho com agents há alguns anos, e a melhor decisão que tomei foi construir meu próprio framework
Várias camadas de abstração open source ficam impossíveis de manter conforme os SDKs mudam, e no fim desmoronam
Criei o OpusAgents, baseado em PydanticAI; é um framework open source simples e expansível, mais simples que um servidor MCP
Hoje estamos repetindo o mesmo padrão de abstração excessiva e complexidade do começo do LangChain/RAG
No fim, dá para pensar em agent como uma estrutura simples de REPL (Read, Eval, Print, Loop).
Uma versão leve que implementei com esse conceito foi muito mais estável do que SDKs pesados
A parte mais difícil em agent é teste e avaliação (evals).
Há entradas demais para avaliar com sistemas externos, e é preciso observar os dados durante a execução
Ainda não tenho certeza de qual abordagem funciona melhor
Mesmo o básico no desenvolvimento de agent ainda sofre com falta de diretrizes claras
Por exemplo, no tratamento dos tipos de entrada e saída de ferramentas de função, ao passar IDs numéricos podem ocorrer erros de serialização ou perda de precisão
No fim, resolvi convertendo para string
Se olhar a documentação da OpenAI (link) e a issue do Google ADK (link),
dizem que “o resultado deve ser uma string”, mas os exemplos reais retornam dicts ou números. Esse tipo de inconsistência gera confusão
Estou usando o produto de uma certa empresa de agentic coding (prefiro não dizer o nome)
Estou satisfeito porque eles cuidam de tudo — releases de modelo, avaliações, gerenciamento de subagentes, cobrança — e eu posso simplesmente focar no meu trabalho
Nos últimos dois meses implementei vários agents para tarefas diferentes. No começo usei o Claude Code, mas por causa da dependência de vendor e dos limites de uso acabei criando meu próprio runtime
Hoje ele só suporta OpenAI, mas foi desenhado para permitir adicionar Claude ou Gemini depois
Está em open source, então fica como referência → agent-composer
Minha dica é simples: não use SDK; faça você mesmo um loop
whilee lide com JSON diretamenteVocê precisa controlar tamanho de contexto e erros por conta própria para criar um agent realmente flexível