Alternar tema

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

Easton editorial illustration: agent rollout and rollback rail

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árioNível recomendadoMotivo
Perguntas simples e processamento de textoChamada direta ao modeloÉ suficiente; não complique sem necessidade
Consulta a banco de dados ou chamada de APIAgente único com ferramentasSolução clássica e estável
Tarefa decomponível com etapas incertasAgente único com ferramentas (padrão ReAct)O agente planeja as próprias etapas
Colaboração entre vários papéis especializadosOrquestração multiagenteUse 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?”

  1. Thought: primeiro preciso consultar a previsão do tempo para amanhã em Pequim
  2. Action: chamar a ferramenta get_weather com o parâmetro city: "Pequim"
  3. Observation: amanhã estará parcialmente nublado em Pequim, com temperatura entre 18 e 25 °C e 10% de probabilidade de chuva
  4. Thought: a temperatura está agradável e a chance de chuva é baixa, então o tempo é adequado para atividades ao ar livre
  5. 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:

VantagensDesvantagens
Alta flexibilidade para tarefas dinâmicasPode entrar em loop infinito
Raciocínio transparente, o que facilita a depuraçãoCusto maior por execução
Não exige etapas definidas antecipadamenteCapacidade 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:

VantagensDesvantagens
Execução estável, com etapas controláveisDepois de criado, o plano é pouco flexível
Adequado para tarefas previsíveisNão se adapta bem a ambientes dinâmicos
Fácil de monitorar e interromperA 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

ModeloCasos indicadosComplexidadePrincipal risco
SequentialTarefas em pipelineBaixaDependências entre etapas causam bloqueios
ConcurrentAnálise paralela sob várias perspectivasMédiaResultados conflitantes exigem arbitragem
Group ChatDecisões após várias rodadas de discussãoAltaFalta de convergência e discussões infinitas
HandoffDivisão dinâmica do trabalhoMédiaTransferências cíclicas e deadlock
MagenticTipos variados de tarefaAltaLó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

FrameworkFoco principalPontos fortesCasos indicados
LangChainFramework genérico para agentesMuitas integrações com ferramentas e implementação madura de ReActProtótipos rápidos, aplicações em produção e cenários com muitas ferramentas
AutoGenColaboração multiagenteColaboração baseada em diálogo e interação humano-agenteSistemas multiagente complexos e cenários com intervenção humana
CrewAIColaboração baseada em papéisAPI simples e conceitos intuitivosSimulação de equipes e tarefas com papéis bem definidos
Claude Agent SDKIntegração nativa com ClaudeCompreensão de código, operações em arquivos e integração profunda com ClaudeEcossistema 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 permissionMode para 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:

  1. Qual é o seu modelo principal?

    • Claude → priorize o Claude Agent SDK
    • OpenAI → o ecossistema LangChain é mais maduro
    • Vários modelos → LangChain ou AutoGen
  2. Qual é a complexidade da tarefa?

    • Agente único com ferramentas → LangChain é suficiente
    • Colaboração multiagente → AutoGen ou CrewAI
    • Tarefas de código → Claude Agent SDK
  3. 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
  4. 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ê arquivos
  • Write: cria arquivos
  • Edit: edita arquivos existentes
  • Bash: executa comandos da linha de comando
  • Glob: busca padrões de arquivos
  • Grep: 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

  1. Limite as iterações: evite que o agente entre em loop infinito
  2. Defina um tempo limite: tarefas demoradas precisam de uma proteção
  3. Separe os níveis de permissão: use o modo interactive em operações sensíveis
  4. Crie um mecanismo de backup: faça backup antes de alterar arquivos importantes
  5. 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. 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. 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. 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. 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?
Escolha de acordo com as características da tarefa: ReAct funciona bem quando as etapas são incertas e exigem decisões dinâmicas, como no atendimento ao cliente; Plan-and-Execute é indicado quando as etapas são previsíveis e a saída precisa ser estável, como na geração de relatórios; Multi-Agent atende tarefas complexas que exigem a colaboração entre várias especialidades, como um pipeline de desenvolvimento de software.
Por que a Azure recomenda limitar os agentes de um Group Chat a no máximo três?
Um número excessivo de agentes em um Group Chat causa dois problemas: primeiro, a discussão tem dificuldade para convergir e os agentes podem entrar em debates intermináveis; segundo, o custo de depuração cresce exponencialmente, pois a sincronização de estado e a troca de mensagens ficam muito mais complexas. Três agentes, como um moderador e duas partes com posições opostas, costumam ser suficientes para a maioria das decisões que exigem discussão.
Como escolher entre LangChain e AutoGen/CrewAI?
LangChain é suficiente para a maioria dos casos: tem ampla integração com ferramentas, implementação madura de ReAct e bom suporte da comunidade. Considere AutoGen ou CrewAI apenas quando a colaboração multiagente for realmente necessária. AutoGen oferece Human-in-the-loop e se encaixa em cenários com intervenção humana; CrewAI tem uma API mais simples e ajuda a montar protótipos rapidamente.
Em quais cenários o Claude Agent SDK é mais indicado?
O Claude Agent SDK é uma ferramenta oficial da Anthropic e se destaca em três situações: quando Claude é o modelo principal, graças à integração profunda; em tarefas de código, por trazer recursos de leitura, gravação e edição de arquivos; e quando é necessário controlar permissões com precisão, pois permissionMode permite gerenciar diferentes níveis de acesso.
Como evitar que um agente entre em loop infinito?
Há três proteções essenciais: definir maxIterations, de preferência entre 10 e 20, para interromper o agente ao ultrapassar o limite; definir timeout, de preferência em 5 minutos, para encerrar a execução após o prazo; e registrar no systemPrompt condições claras de término, explicando quando o agente deve desistir. Meu primeiro agente ReAct ficou rodando a noite inteira porque eu não havia configurado essas proteções.

17 min de leitura · Publicado em: 21 mar 2026 · Atualizado em: 4 set 2026

Comentários

Entre com GitHub para comentar

Easton BlogEaston Blog