Arquitetura de agentes de IA: guia prático de design e implementação

Depois de vinte minutos em execução, um agente ReAct ficou preso em um loop infinito, chamando repetidamente a mesma ferramenta. O motivo era a ausência de maxIterations, que força a interrupção ao atingir o limite e evita loops sem fim. Essa é uma das armadilhas mais comuns no desenvolvimento de agentes: agentes ReAct entram em loop, sistemas multiagente não convergem e Plan-and-Execute é pouco flexível para tarefas dinâmicas.
A arquitetura de agentes tem três níveis: chamada direta ao modelo para tarefas de uma etapa, agente único com ferramentas como padrão para a maioria dos casos e orquestração multiagente, que deve ser adotada com cautela. Os três padrões principais servem a contextos distintos: ReAct para decisões dinâmicas, Plan-and-Execute para fluxos estáveis e Multi-Agent para divisão especializada do trabalho. A documentação oficial da Azure recomenda limitar os agentes de um Group Chat a no máximo três, pois acima disso a discussão tende a não convergir.
A seguir, compartilho o que aprendi em dois anos lidando com essas armadilhas: os princípios e a implementação em código dos três padrões de arquitetura, cinco modelos de orquestração multiagente, como escolher entre LangChain, AutoGen, CrewAI e Claude Agent SDK e, por fim, como criar um agente funcional com o Claude Agent SDK.
1. Os três níveis da arquitetura de agentes
Antes de tudo, vale lembrar um princípio que muitos iniciantes ignoram: se uma solução simples resolve o problema, não adote uma arquitetura complexa.
A documentação oficial da Azure divide a arquitetura de agentes em três níveis. Essa classificação é especialmente útil na prática.
1.1 Chamada direta ao modelo (Direct Model Call)
É o nível mais simples. Você envia uma tarefa ao modelo e recebe a resposta diretamente.
// Forma mais básica de chamada
const response = await anthropic.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 1024,
messages: [{ role: 'user', content: 'Resuma este texto...' }]
});
É indicada para tarefas de uma etapa, cenários com alta previsibilidade e casos que não exigem ferramentas externas, como resumo de texto, tradução e preenchimento de código.
As vantagens são simplicidade, baixo custo e controle. A desvantagem é não conseguir lidar com tarefas complexas que exigem raciocínio em várias etapas nem chamar ferramentas externas.
1.2 Agente único com ferramentas (Single Agent with Tools)
Esta é a escolha padrão para a maioria dos cenários empresariais. O agente pode chamar ferramentas e executar tarefas em várias etapas.
// Exemplo de agente único com LangChain
import { ChatAnthropic } from '@langchain/anthropic';
import { AgentExecutor, createToolCallingAgent } from 'langchain/agents';
import { tool } from '@langchain/core/tools';
import { z } from 'zod';
// Define uma ferramenta de consulta meteorológica
const weatherTool = tool(
async ({ city }) => {
// Simula uma chamada à API de meteorologia
return `Hoje o tempo está ensolarado em ${city}, com temperatura de 22 °C`;
},
{
name: 'get_weather',
description: 'Obtém informações meteorológicas da cidade especificada',
schema: z.object({
city: z.string().describe('Nome da cidade'),
}),
}
);
const model = new ChatAnthropic({
model: 'claude-sonnet-4-20250514',
temperature: 0,
});
const agent = await createToolCallingAgent({
llm: model,
tools: [weatherTool],
prompt: 'Você é um assistente prestativo.',
});
const executor = AgentExecutor.fromAgentAndTools({
agent,
tools: [weatherTool],
});
// Executa
const result = await executor.invoke({
input: 'Como está o tempo hoje em Pequim?',
});
É indicado para tarefas que exigem chamadas de ferramentas, podem ser decompostas e têm etapas relativamente fixas, como análise de dados, execução de código e orquestração de APIs.
1.3 Orquestração multiagente (Multi-Agent Orchestration)
É o nível mais complexo. Vários agentes especializados assumem responsabilidades diferentes e colaboram para concluir a tarefa.
Sendo direto: os casos que realmente exigem esse nível são menos numerosos do que parecem. Adotar vários agentes aumenta o custo de coordenação, a complexidade do gerenciamento de estado e a dificuldade de depuração, todos de forma exponencial.
É indicado para tarefas complexas entre diferentes domínios, que precisam de especialização ou que um único agente não consegue executar. Alguns exemplos são pipelines de desenvolvimento de software — análise de requisitos → design → implementação → testes — e sistemas complexos de apoio à decisão.
1.4 Como escolher? Uma tabela de decisão
| Seu cenário | Nível recomendado | Motivo |
|---|---|---|
| Perguntas simples e processamento de texto | Chamada direta ao modelo | É suficiente; não complique sem necessidade |
| Consulta a banco de dados ou chamada de API | Agente único com ferramentas | Solução clássica e estável |
| Tarefa decomponível com etapas incertas | Agente único com ferramentas (padrão ReAct) | O agente planeja as próprias etapas |
| Colaboração entre vários papéis especializados | Orquestração multiagente | Use com cautela e confirme antes se é realmente necessária |
Em uma frase: comece pelo simples e acrescente apenas o que for necessário.
2. Os três principais padrões de arquitetura
Depois de escolher o nível, o próximo passo é definir o padrão. Os três padrões não são mutuamente exclusivos; em muitos casos, eles são combinados.
2.1 Padrão ReAct (raciocínio e ação)
ReAct é a abreviação de Reasoning + Acting. A ideia principal é permitir que o modelo “pense enquanto age”.
Como funciona:
Entrada do usuário → Thought (pensamento) → Action (ação) → Observation (observação) → repete ou encerra
Imagine que o usuário pergunte: “O tempo amanhã em Pequim estará bom para atividades ao ar livre?”
- Thought: primeiro preciso consultar a previsão do tempo para amanhã em Pequim
- Action: chamar a ferramenta
get_weathercom o parâmetrocity: "Pequim" - Observation: amanhã estará parcialmente nublado em Pequim, com temperatura entre 18 e 25 °C e 10% de probabilidade de chuva
- Thought: a temperatura está agradável e a chance de chuva é baixa, então o tempo é adequado para atividades ao ar livre
- Final Answer: amanhã o tempo em Pequim estará bom para atividades ao ar livre; leve uma jaqueta leve
Implementação em código (LangChain):
import { ChatAnthropic } from '@langchain/anthropic';
import { AgentExecutor, createReactAgent } from 'langchain/agents';
import { pull } from 'langchain/hub';
// Template de prompt ReAct
const prompt = await pull('hwchase17/react');
const agent = await createReactAgent({
llm: model,
tools: [weatherTool, searchTool], // Sua lista de ferramentas
prompt,
});
// Define o número máximo de iterações para evitar loops infinitos
const executor = AgentExecutor.fromAgentAndTools({
agent,
tools: [weatherTool, searchTool],
maxIterations: 10, // Importante: evita loops infinitos
verbose: true, // Exibe o processo de raciocínio, essencial para depuração
});
Vantagens e desvantagens:
| Vantagens | Desvantagens |
|---|---|
| Alta flexibilidade para tarefas dinâmicas | Pode entrar em loop infinito |
| Raciocínio transparente, o que facilita a depuração | Custo maior por execução |
| Não exige etapas definidas antecipadamente | Capacidade limitada de planejar tarefas complexas com muitas etapas |
Alerta prático: sempre defina maxIterations. Caso contrário, diante de uma tarefa impossível de concluir, o agente continuará rodando. Meu primeiro agente ReAct passou a noite inteira nessa situação.
2.2 Padrão Plan-and-Execute (planejar e executar)
O problema do ReAct é trabalhar “um passo de cada vez”. Em tarefas complexas, isso pode fazer o agente perder o rumo. A proposta do Plan-and-Execute é definir primeiro o plano e depois executá-lo etapa por etapa.
Como funciona:
Entrada do usuário → Planner gera o plano → Executor executa cada etapa → retorna o resultado
Implementação em código (LangGraph):
import { ChatAnthropic } from '@langchain/anthropic';
import { StateGraph, END } from '@langchain/langgraph';
// Define a estrutura do estado
interface AgentState {
input: string;
plan: string[];
pastSteps: string[];
response: string;
}
// Nó de planejamento: gera o plano de execução
async function planNode(state: AgentState): Promise<AgentState> {
const plannerPrompt = `Dado o objetivo do usuário: ${state.input}
Gere um plano de execução detalhado, com uma string por etapa, e retorne-o no formato de array JSON.`;
const response = await model.invoke(plannerPrompt);
const plan = JSON.parse(response.content as string);
return { ...state, plan };
}
// Nó de execução: executa uma etapa do plano
async function executeNode(state: AgentState): Promise<AgentState> {
const currentStep = state.plan[0];
const result = await executor.invoke({ input: currentStep });
return {
...state,
plan: state.plan.slice(1), // Remove a etapa concluída
pastSteps: [...state.pastSteps, `${currentStep}: ${result.output}`],
};
}
// Constrói o grafo
const workflow = new StateGraph<AgentState>({
channels: {
input: { value: null },
plan: { value: null },
pastSteps: { value: null, default: () => [] },
response: { value: null },
},
});
workflow.addNode('planner', planNode);
workflow.addNode('executor', executeNode);
// Define a aresta: executa depois de concluir o planejamento
workflow.addEdge('planner', 'executor');
// Aresta condicional: verifica se ainda há etapas
workflow.addConditionalEdges('executor', (state) => {
return state.plan.length > 0 ? 'executor' : END;
});
Vantagens e desvantagens:
| Vantagens | Desvantagens |
|---|---|
| Execução estável, com etapas controláveis | Depois de criado, o plano é pouco flexível |
| Adequado para tarefas previsíveis | Não se adapta bem a ambientes dinâmicos |
| Fácil de monitorar e interromper | A qualidade do planejamento depende da capacidade do Planner |
Minha experiência: Plan-and-Execute funciona especialmente bem em tarefas com etapas previsíveis, como processamento de dados em lote e geração de relatórios. Para tarefas que exigem ajustes frequentes de estratégia, ReAct costuma ser mais adequado.
2.3 Padrão Multi-Agent (colaboração entre vários agentes)
Quando a tarefa é complexa demais para um único agente, vários agentes podem colaborar.
Ideia principal: cada agente se concentra em um domínio e atua como parte de uma equipe.
Implementação em código (no estilo do Claude Agent SDK):
import { ClaudeAgent } from '@anthropic-ai/claude-agent-sdk';
// Cria agentes especializados
const researchAgent = new ClaudeAgent({
name: 'researcher',
model: 'claude-sonnet-4-20250514',
systemPrompt: 'Você é especialista em pesquisa e deve coletar e organizar informações.',
tools: ['WebSearch', 'WebFetch'],
});
const writerAgent = new ClaudeAgent({
name: 'writer',
model: 'claude-sonnet-4-20250514',
systemPrompt: 'Você é especialista em conteúdo e deve redigir e revisar artigos.',
tools: ['Read', 'Write', 'Edit'],
});
const reviewerAgent = new ClaudeAgent({
name: 'reviewer',
model: 'claude-sonnet-4-20250514',
systemPrompt: 'Você é especialista em qualidade e deve verificar a precisão e a legibilidade do conteúdo.',
tools: ['Read'],
});
// Fluxo de colaboração
async function collaborativeWriting(topic: string) {
// Etapa 1: pesquisa
const research = await researchAgent.run(`Pesquise o tema: ${topic}`);
// Etapa 2: redação
const draft = await writerAgent.run(
`Redija um artigo com base na pesquisa a seguir:\n${research}`
);
// Etapa 3: revisão
const review = await reviewerAgent.run(
`Revise o artigo a seguir e apresente sugestões de melhoria:\n${draft}`
);
// Etapa 4: ajustes
const final = await writerAgent.run(
`Ajuste o artigo de acordo com a revisão:\nTexto original: ${draft}\nComentários: ${review}`
);
return final;
}
Quando usar vários agentes:
- A tarefa exige várias especialidades, como programação, design e redação
- A janela de contexto de um único agente não é suficiente
- É necessária uma divisão especializada de responsabilidades
Alerta: a dificuldade de depurar um sistema multiagente cresce exponencialmente. Sincronização de estado, troca de mensagens e tratamento de erros já ficam mais complexos com apenas dois agentes. Se um único agente resolve o problema, não adote vários sem necessidade.
3. Cinco modelos de orquestração multiagente
Se o seu cenário realmente exige vários agentes, é preciso escolher o modelo de orquestração. Os cinco modelos resumidos pela documentação oficial da Azure cobrem a maior parte dos casos.
3.1 Sequential (orquestração sequencial)
É o modelo mais intuitivo: a saída do agente A se torna a entrada do agente B, como em um pipeline.
[Agente A] → [Agente B] → [Agente C] → Resultado final
Casos indicados: pipelines de geração de documentos — pesquisa → rascunho → revisão → publicação — e fluxos de geração de código.
Exemplo de código:
// Exemplo de orquestração sequencial
async function sequentialPipeline(input: string) {
const step1 = await researchAgent.run(input);
const step2 = await writerAgent.run(step1.output);
const step3 = await editorAgent.run(step2.output);
return step3.output;
}
Atenção: o formato de saída de cada etapa deve ser definido antecipadamente. Caso contrário, o agente seguinte pode receber dados que não consegue interpretar.
3.2 Concurrent (orquestração concorrente)
Vários agentes processam a mesma entrada ao mesmo tempo e os resultados são consolidados no fim.
→ [Agente A] →
[Entrada] → → [Agente B] → → [Agregador] → Resultado final
→ [Agente C] →
Casos indicados: análises sob várias perspectivas; avaliação de ações com análises técnica, fundamentalista e de notícias em paralelo; e revisão de código com verificações simultâneas de segurança, desempenho e estilo.
Exemplo de código:
// Exemplo de orquestração concorrente
async function concurrentAnalysis(code: string) {
const [security, performance, style] = await Promise.all([
securityAgent.run(`Revisão de segurança:\n${code}`),
performanceAgent.run(`Análise de desempenho:\n${code}`),
styleAgent.run(`Verificação de estilo de código:\n${code}`),
]);
// Consolida os resultados
return {
security: security.output,
performance: performance.output,
style: style.output,
};
}
Atenção: a execução paralela exige uma boa lógica de consolidação. Como agentes diferentes podem oferecer recomendações conflitantes, é preciso criar um mecanismo de arbitragem.
3.3 Group Chat (orquestração em grupo)
Vários agentes discutem em uma “sala” até chegar a um consenso ou atingir o tempo limite.
[Agente A] ⇄ [Agente B] ⇄ [Agente C]
↑ ↓
[Moderador/coordenador]
Casos indicados: brainstorming, validação de qualidade e decisões que exigem várias rodadas de discussão.
Recomendação oficial da Azure: limite o Group Chat a no máximo três agentes. Acima disso, a conversa tende a virar uma discussão sem fim.
Exemplo de código:
// Exemplo ilustrativo de orquestração em grupo, em pseudocódigo
interface ChatMessage {
sender: string;
content: string;
}
async function groupChatDiscussion(
topic: string,
agents: ClaudeAgent[],
maxRounds: number = 5
) {
const history: ChatMessage[] = [];
for (let round = 0; round < maxRounds; round++) {
for (const agent of agents) {
const response = await agent.run(
`Tema da discussão: ${topic}\nHistórico atual da conversa: ${JSON.stringify(history)}\nApresente seu ponto de vista.`
);
history.push({ sender: agent.name, content: response.output });
// Verifica se houve consenso
if (checkConsensus(history)) {
return summarizeConsensus(history);
}
}
}
return 'A discussão atingiu o tempo limite sem chegar a um consenso';
}
Experiência prática: sempre defina maxRounds; caso contrário, dois agentes inflexíveis podem discutir indefinidamente. Também vale incluir um Moderator para conduzir a conversa a uma conclusão.
3.4 Handoff (orquestração por transferência)
Depois de concluir uma tarefa, um agente transfere o trabalho para o agente seguinte.
[Agente A] detecta que precisa da especialidade de B → transfere para [Agente B] → processamento continua
Casos indicados: bots de atendimento — pré-venda → suporte técnico → pós-venda — e diagnóstico de falhas — diagnóstico → correção → validação.
Exemplo de código:
// Exemplo de orquestração por transferência
const supportAgent = new ClaudeAgent({
name: 'support',
systemPrompt: `Você atua no atendimento. Para perguntas técnicas, responda "HANDOFF:tech".
Para questões de pós-venda, responda "HANDOFF:after_sales".`,
});
const techAgent = new ClaudeAgent({
name: 'tech',
systemPrompt: 'Você é especialista em suporte técnico.',
});
async function handleWithHandoff(userInput: string) {
let currentAgent = supportAgent;
let response = await currentAgent.run(userInput);
// Detecta o sinal de transferência
while (response.output.includes('HANDOFF:')) {
const targetAgent = response.output.match(/HANDOFF:(\w+)/)?.[1];
if (targetAgent === 'tech') currentAgent = techAgent;
else if (targetAgent === 'after_sales') currentAgent = afterSalesAgent;
response = await currentAgent.run(userInput);
}
return response.output;
}
Atenção: a lógica de transferência precisa ser clara para evitar ciclos, como A transferir para B e B transferir de volta para A.
3.5 Magentic (orquestração magnética)
É o modelo mais flexível: de acordo com a natureza da tarefa, o sistema “atrai” dinamicamente o agente mais adequado para executá-la.
[Fila de tarefas] → [Agendador inteligente] → seleciona [Agente A/B/C] conforme a tarefa
Casos indicados: sistemas com tipos variados de tarefa e cenários que exigem agendamento dinâmico de recursos.
Ideia de implementação:
// Exemplo de orquestração magnética
interface Task {
type: string;
priority: number;
content: string;
}
async function magenticScheduling(task: Task) {
// Seleciona o agente mais adequado conforme o tipo de tarefa
const agentScores = await Promise.all(
agents.map(async (agent) => {
const score = await evaluateAgentFit(agent, task);
return { agent, score };
})
);
// Seleciona o agente com a maior pontuação
const bestAgent = agentScores.sort((a, b) => b.score - a.score)[0].agent;
return bestAgent.run(task.content);
}
Atenção: é preciso criar uma boa lógica de avaliação de compatibilidade. Caso contrário, o agendamento se torna uma distribuição aleatória.
3.6 Tabela rápida para escolher o modelo
| Modelo | Casos indicados | Complexidade | Principal risco |
|---|---|---|---|
| Sequential | Tarefas em pipeline | Baixa | Dependências entre etapas causam bloqueios |
| Concurrent | Análise paralela sob várias perspectivas | Média | Resultados conflitantes exigem arbitragem |
| Group Chat | Decisões após várias rodadas de discussão | Alta | Falta de convergência e discussões infinitas |
| Handoff | Divisão dinâmica do trabalho | Média | Transferências cíclicas e deadlock |
| Magentic | Tipos variados de tarefa | Alta | Lógica de agendamento complexa |
4. Comparação e escolha dos principais frameworks
Depois dos padrões de arquitetura, resta escolher o framework. É fácil se perder entre LangChain, AutoGen, CrewAI e Claude Agent SDK, cada um com uma proposta diferente.
Minha conclusão é simples: não existe o melhor framework, mas o framework mais adequado para cada cenário.
4.1 Comparação de posicionamento
| Framework | Foco principal | Pontos fortes | Casos indicados |
|---|---|---|---|
| LangChain | Framework genérico para agentes | Muitas integrações com ferramentas e implementação madura de ReAct | Protótipos rápidos, aplicações em produção e cenários com muitas ferramentas |
| AutoGen | Colaboração multiagente | Colaboração baseada em diálogo e interação humano-agente | Sistemas multiagente complexos e cenários com intervenção humana |
| CrewAI | Colaboração baseada em papéis | API simples e conceitos intuitivos | Simulação de equipes e tarefas com papéis bem definidos |
| Claude Agent SDK | Integração nativa com Claude | Compreensão de código, operações em arquivos e integração profunda com Claude | Ecossistema Claude, agentes de código e tarefas de automação |
4.2 Características de cada framework
LangChain: é a opção mais antiga e tem o ecossistema mais maduro.
- Suporte completo para TypeScript e Python
- Muitas ferramentas e integrações prontas
- Implementações disponíveis de ReAct e Plan-and-Execute
- Desvantagem: a API muda com frequência e a documentação nem sempre acompanha
AutoGen: desenvolvido pela Microsoft, é uma opção forte para colaboração multiagente.
- O conceito central é o “diálogo”, com agentes colaborando por meio da troca de mensagens
- Oferece Human-in-the-loop
- Indicado para cenários que exigem várias rodadas de discussão e tomada de decisão
- Desvantagem: curva de aprendizado acentuada e depuração trabalhosa em sistemas multiagente
CrewAI: uma opção mais nova com foco em simplicidade.
- Modelagem por “papéis”, “tarefas” e “equipes”, fácil de entender
- API organizada e rápida de aprender
- Indicado para montar protótipos multiagente com rapidez
- Desvantagem: ecossistema e integrações menos amplos que os do LangChain
Claude Agent SDK: ferramenta oficial da Anthropic lançada em 2026.
- Integração profunda com os modelos Claude
- Recursos nativos para ler e gravar arquivos, editar código e executar comandos
- Suporte a
permissionModepara controlar permissões de operação - É a primeira opção quando Claude é o seu modelo principal
4.3 Guia de decisão
Faça estas perguntas:
-
Qual é o seu modelo principal?
- Claude → priorize o Claude Agent SDK
- OpenAI → o ecossistema LangChain é mais maduro
- Vários modelos → LangChain ou AutoGen
-
Qual é a complexidade da tarefa?
- Agente único com ferramentas → LangChain é suficiente
- Colaboração multiagente → AutoGen ou CrewAI
- Tarefas de código → Claude Agent SDK
-
Qual é a stack técnica da equipe?
- Principalmente Python → todos os frameworks oferecem suporte
- Principalmente TypeScript → LangChain e Claude Agent SDK têm suporte melhor
-
Você precisa de interação entre pessoas e agentes?
- Sim → o Human-in-the-loop do AutoGen é bem projetado
- Não → qualquer um dos demais frameworks serve
4.4 Minha recomendação
Na prática, LangChain é suficiente para a maioria dos cenários. As integrações com ferramentas e a implementação de ReAct são maduras, e o suporte da comunidade é bom.
Se você tem certeza de que precisa de vários agentes e a tarefa é complexa o bastante para exigir a colaboração entre diferentes especialidades, vale experimentar AutoGen. Mas lembre-se: depurar vários agentes custa caro. Não adote essa arquitetura apenas por parecer mais avançada.
Para quem usa Claude intensamente, Claude Agent SDK é hoje a melhor escolha: é uma ferramenta oficial e se integra de forma mais direta aos modelos Claude.
5. Prática: criar um agente com o Claude Agent SDK
Depois da teoria, vamos criar um agente funcional de refatoração de código com o Claude Agent SDK.
5.1 Preparar o ambiente
# Instala as dependências
npm install @anthropic-ai/claude-agent-sdk
# Define a API Key
export ANTHROPIC_API_KEY=your_api_key_here
5.2 Exemplo básico de agente
import { ClaudeAgent } from '@anthropic-ai/claude-agent-sdk';
// Cria um agente de refatoração de código
const refactorAgent = new ClaudeAgent({
model: 'claude-sonnet-4-20250514',
tools: ['Read', 'Write', 'Edit', 'Bash'],
permissionMode: 'acceptEdits', // Aceita operações de edição automaticamente
workingDirectory: './src', // Diretório de trabalho
});
// Executa a tarefa
async function refactorCode(task: string) {
const result = await refactorAgent.run(task);
console.log('Resultado da refatoração:', result);
return result;
}
// Exemplo de uso
refactorCode('Refatore o arquivo auth.ts, substituindo callbacks por async/await');
5.3 Configurações importantes
permissionMode (modo de permissão):
'acceptEdits': aceita operações de edição de arquivos automaticamente'interactive': exige confirmação humana para cada operação'planOnly': gera apenas o plano, sem executar
tools (ferramentas disponíveis):
Read: lê arquivosWrite: cria arquivosEdit: edita arquivos existentesBash: executa comandos da linha de comandoGlob: busca padrões de arquivosGrep: pesquisa conteúdo
5.4 Exemplo mais complexo: agente com restrições
const cautiousAgent = new ClaudeAgent({
model: 'claude-sonnet-4-20250514',
tools: ['Read', 'Write', 'Edit', 'Bash'],
permissionMode: 'interactive', // Modo cauteloso: exige confirmação humana
maxIterations: 20, // Limita o número máximo de iterações
timeout: 300000, // Tempo limite de 5 minutos
// Prompt de sistema: define os limites de comportamento do agente
systemPrompt: `Você é especialista em refatoração de código.
Regras:
1. Não exclua nenhum arquivo de teste
2. Não altere package.json
3. Faça backup do arquivo original antes de cada alteração
4. Execute os testes após as alterações para garantir que tudo continua funcionando`,
});
async function safeRefactor(filePath: string) {
try {
const result = await cautiousAgent.run(
`Refatore ${filePath} para melhorar a estrutura e a legibilidade do código.`
);
return result;
} catch (error) {
console.error('Falha na refatoração:', error);
// Lógica de reversão...
}
}
5.5 Boas práticas
- Limite as iterações: evite que o agente entre em loop infinito
- Defina um tempo limite: tarefas demoradas precisam de uma proteção
- Separe os níveis de permissão: use o modo
interactiveem operações sensíveis - Crie um mecanismo de backup: faça backup antes de alterar arquivos importantes
- Valide com testes: execute os testes após as alterações para garantir o funcionamento
5.6 Técnicas de depuração
// Ativa logs detalhados
const debugAgent = new ClaudeAgent({
model: 'claude-sonnet-4-20250514',
tools: ['Read', 'Write', 'Edit'],
verbose: true, // Exibe os detalhes da execução
});
// Monitora eventos
debugAgent.on('toolCall', (tool, args) => {
console.log(`Ferramenta chamada: ${tool}; parâmetros: ${JSON.stringify(args)}`);
});
debugAgent.on('thinking', (thought) => {
console.log(`Raciocínio do agente: ${thought}`);
});
Para concluir
O princípio central para escolher uma arquitetura de agentes cabe em uma frase: comece pelo simples e acrescente apenas o que for necessário.
Primeiro, avalie a complexidade da tarefa:
- Tarefa de uma etapa? Chame o modelo diretamente
- Precisa de ferramentas? Use um agente único com ferramentas
- Precisa mesmo de vários papéis especializados? Só então considere vários agentes
Depois, escolha o padrão:
- A tarefa muda dinamicamente? ReAct
- As etapas são previsíveis? Plan-and-Execute
- É necessária uma divisão especializada? Multi-Agent
Por fim, escolha o framework:
- Usa Claude? Claude Agent SDK
- Precisa de vários modelos e ferramentas? LangChain
- Precisa de colaboração multiagente? AutoGen ou CrewAI
O passo mais importante é testar na prática. Escolha um projeto pequeno, coloque um agente para rodar e observe as dificuldades reais. Algumas armadilhas ensinam mais do que qualquer lista teórica.
Se ainda tiver dúvidas, deixe um comentário ou consulte meus dois artigos anteriores: “Introdução ao desenvolvimento de MCP Server” e “Agentes e chamadas de ferramentas”. Os três textos fazem parte da mesma sequência.
Criar um agente com o Claude Agent SDK
Etapas completas, da preparação do ambiente à execução do primeiro agente
⏱️ Estimated time: 30 min
- 1
Step 1: Instalar as dependências e configurar o ambiente
Execute os comandos abaixo:
```bash
npm install @anthropic-ai/claude-agent-sdk
export ANTHROPIC_API_KEY=your_api_key_here
```
Observação: obtenha a API Key no site oficial da Anthropic e armazene-a em uma variável de ambiente. - 2
Step 2: Criar a instância básica do agente
Ao criar o agente, configure três parâmetros principais:
```typescript
const agent = new ClaudeAgent({
model: 'claude-sonnet-4-20250514',
tools: ['Read', 'Write', 'Edit', 'Bash'],
permissionMode: 'acceptEdits'
});
```
• model: seleciona a versão do modelo Claude
• tools: define as ferramentas disponíveis para o agente
• permissionMode: define o modo de controle de permissões - 3
Step 3: Executar a tarefa e obter o resultado
Chame o método run para executar a tarefa:
```typescript
const result = await agent.run('Refatore o arquivo auth.ts');
```
É recomendável adicionar tratamento de erros e registros de log. - 4
Step 4: Configurar proteções de segurança
Em produção, configure estas proteções:
• maxIterations: limita o número máximo de iterações (recomendação: 20)
• timeout: define o tempo limite (recomendação: 5 minutos)
• systemPrompt: estabelece os limites de comportamento
• permissionMode: usa o modo 'interactive' em operações sensíveis
FAQ
Como escolher entre ReAct, Plan-and-Execute e Multi-Agent?
Por que a Azure recomenda limitar os agentes de um Group Chat a no máximo três?
Como escolher entre LangChain e AutoGen/CrewAI?
Em quais cenários o Claude Agent SDK é mais indicado?
Como evitar que um agente entre em loop infinito?
17 min de leitura · Publicado em: 21 mar 2026 · Atualizado em: 4 set 2026
Guia de engenharia de AI Agents
Se você chegou pela busca, o caminho mais rápido é ir para o post anterior ou próximo desta série.
Anterior
Guia de Agent Sandbox: como executar código de IA com segurança
Entenda como montar um sandbox para AI Agents, compare Docker, gVisor e Firecracker e veja um guia completo de implantação, do desenvolvimento local a clusters Kubernetes.
Parte 1 de 13
Próximo
Gerenciamento de memória em agentes de IA: memória de longo prazo e governança do conhecimento
Uma análise aprofundada dos sistemas de memória para agentes de IA: três tipos de memória, uma arquitetura cognitiva em quatro camadas e a comparação de seis frameworks. De Mem0 a Letta, de bancos vetoriais a grafos de conhecimento, veja como resolver a amnésia dos agentes e a deterioração do contexto.
Parte 3 de 13



Comentários
Entre com GitHub para comentar