🗣️ Filosofia conversacional: fluxo que emerge
AutoGen (agora AG2) parte de uma premissa diferente: ao invés de definir um grafo de estado ou uma equipe estruturada, o fluxo emerge da conversa. Agentes trocam mensagens, e o progresso acontece naturalmente — como uma equipe de pessoas resolvendo um problema juntas.
🧭 Três paradigmas comparados
Grafo explícito de estados. Você projeta cada transição. Controle máximo, mais código.
Equipe com papéis e tasks definidas. Colaboração estruturada com contexto compartilhado.
Conversa entre agentes. Fluxo emergente. Execução de código real. Reflexão mútua.
💡 Quando a conversa vence o grafo
- •Pesquisa exploratória: o agente não sabe quantas iterações precisará — a conversa determina
- •Code gen iterativo: gera código → executa → vê erro → corrige → repete até funcionar
- •Debates e revisão: múltiplas perspectivas que emergem naturalmente da troca de mensagens
🤝 AssistantAgent e UserProxyAgent
O par fundamental do AutoGen: AssistantAgent usa um LLM para raciocinar e gerar código, enquanto UserProxyAgent pode executar esse código localmente e simular o papel do usuário. Juntos, formam um loop de geração-execução-feedback totalmente automático.
⚙️ O par básico em ação
import autogen
# Configuração do LLM
config_list = [{"model": "gpt-4o", "api_key": "sk-..."}]
llm_config = {"config_list": config_list, "cache_seed": 42}
# AssistantAgent: usa LLM, gera respostas e código
assistente = autogen.AssistantAgent(
name="Cientista_de_Dados",
llm_config=llm_config,
system_message="""Você é um cientista de dados experiente.
Quando solicitado, escreva código Python comentado e executável.
Sempre encerre com 'TERMINATE' quando a tarefa estiver completa."""
)
# UserProxyAgent: executa código, simula usuário
executor = autogen.UserProxyAgent(
name="Executor",
human_input_mode="NEVER", # sem intervenção humana
max_consecutive_auto_reply=10,
is_termination_msg=lambda x: "TERMINATE" in x.get("content", ""),
code_execution_config={
"work_dir": "workspace", # diretório de execução
"use_docker": False, # True para sandbox Docker
"timeout": 120, # timeout em segundos
"last_n_messages": 3 # contexto de mensagens
}
)
# Inicia a conversa — o loop acontece automaticamente
executor.initiate_chat(
assistente,
message="Analise o arquivo sales_data.csv e gere um gráfico das vendas por mês. "
"Inclua média móvel de 3 meses."
)
# O que acontece automaticamente:
# 1. Executor envia a mensagem
# 2. Assistente gera código Python
# 3. Executor executa o código
# 4. Se erro: retorna stderr ao Assistente
# 5. Assistente corrige e tenta de novo
# 6. Quando bem-sucedido: Assistente encerra com TERMINATE
💡 human_input_mode tem 3 opções
- •
"NEVER"— totalmente autônomo, sem interrupção humana - •
"TERMINATE"— humano pode intervir quando o agente quiser terminar - •
"ALWAYS"— humano aprova cada mensagem antes de enviar
👥 GroupChat: múltiplos agentes, uma conversa
Quando você precisa de mais de dois agentes colaborando, GroupChat é o mecanismo nativo do AutoGen. Um GroupChatManager decide quem fala a seguir com base em regras ou via outro LLM.
🏛️ GroupChat com 4 agentes
# 4 agentes especializados
pesquisador = autogen.AssistantAgent(
name="Pesquisador",
llm_config=llm_config,
system_message="Você pesquisa informações e coleta dados relevantes."
)
analista = autogen.AssistantAgent(
name="Analista",
llm_config=llm_config,
system_message="Você analisa dados e identifica padrões e insights."
)
critico = autogen.AssistantAgent(
name="Critico",
llm_config=llm_config,
system_message="""Você critica construtivamente as análises dos outros.
Aponte falhas de lógica, dados faltantes e conclusões precipitadas."""
)
executor = autogen.UserProxyAgent(
name="Executor",
human_input_mode="NEVER",
code_execution_config={"work_dir": "ws", "use_docker": False}
)
# Cria o GroupChat
group_chat = autogen.GroupChat(
agents=[pesquisador, analista, critico, executor],
messages=[],
max_round=20, # máximo de turnos
speaker_selection_method="auto", # LLM decide quem fala
allow_repeat_speaker=False # evita monólogo
)
# Manager coordena a conversa
manager = autogen.GroupChatManager(
groupchat=group_chat,
llm_config=llm_config # usa LLM para escolher speaker
)
# Inicia o debate
executor.initiate_chat(
manager,
message="Pesquise e analise o impacto do GPT-4o em startups B2B SaaS. "
"O Crítico deve questionar cada conclusão."
)
📊 Métodos de seleção de speaker
- •
"auto"— LLM decide quem deve falar com base no contexto da conversa - •
"round_robin"— cada agente fala em ordem rotativa (determinístico) - •
"random"— agente aleatório a cada turno - •
função customizada— você define a lógica de quem fala quando
🪞 Reflexão entre agentes: o crítico automático
O padrão de reflexão usa dois agentes: um gerador e um crítico. O gerador produz uma resposta, o crítico avalia com uma rubrica clara, e o ciclo continua até que o crítico aprove ou o limite seja atingido.
🔄 Padrão escritor-crítico
# Agente escritor
escritor = autogen.AssistantAgent(
name="Escritor",
llm_config=llm_config,
system_message="""Você escreve análises técnicas claras e precisas.
Quando receber crítica, melhore o texto e marque com [REVISADO vX]."""
)
# Agente crítico com rubrica clara
critico = autogen.AssistantAgent(
name="Critico",
llm_config=llm_config,
system_message="""Avalie textos com esta rubrica (1-5 cada):
1. Precisão técnica: dados e fatos corretos?
2. Clareza: texto acessível ao público-alvo?
3. Completude: todos os aspectos importantes cobertos?
4. Estrutura: organização lógica e fluente?
Se TODOS >= 4: responda com "APROVADO: [motivo]"
Senão: liste melhorias específicas por critério."""
)
# Loop de reflexão controlado
proxy = autogen.UserProxyAgent(
name="Proxy",
human_input_mode="NEVER",
max_consecutive_auto_reply=8, # máximo 4 ciclos escritor+crítico
is_termination_msg=lambda x: "APROVADO" in x.get("content", ""),
code_execution_config=False
)
# Inicia com o tópico para o escritor
proxy.initiate_chat(
autogen.GroupChatManager(
groupchat=autogen.GroupChat(
agents=[escritor, critico, proxy],
messages=[],
speaker_selection_method="round_robin"
),
llm_config=llm_config
),
message="Escreva uma análise de 300 palavras sobre LangGraph para CTOs de startup."
)
💡 Rubrica clara = feedback acionável
O crítico precisa de uma rubrica específica para dar feedback acionável. "Está bom" ou "melhore" são inúteis. "Clareza (3/5): o parágrafo 2 usa jargão sem definição para o público-alvo indicado" é o que o escritor precisa para melhorar.
💻 Execução de código em sandbox
A execução de código é o superpoder do AutoGen. O AssistantAgent gera Python, o UserProxyAgent executa em ambiente controlado, o stdout/stderr vira feedback automático, e o agente corrige até funcionar — sem nenhuma intervenção humana.
Execução local (desenvolvimento)
code_execution_config={
"work_dir": "workspace",
"use_docker": False,
"timeout": 60
}
- • Sem overhead de Docker
- • Acesso a recursos locais
- • Risco: código malicioso pode executar
- • Ideal para desenvolvimento e testes
Docker sandbox (produção)
code_execution_config={
"work_dir": "workspace",
"use_docker": "python:3.11-slim",
"timeout": 120
}
- • Isolamento completo do sistema
- • Código não acessa recursos externos
- • Overhead de inicialização do container
- • Obrigatório em produção com código gerado
⚠️ Segurança na execução de código
Nunca execute código gerado por LLM em produção sem sandbox. O LLM pode — intencionalmente ou não — gerar código que acessa arquivos sensíveis, faz chamadas de rede não autorizadas ou consome recursos excessivos.
- ✗Sem sandbox em produção
- ✗Docker com acesso à rede sem allowlist
- ✗Sem timeout configurado
- ✓Docker com network isolado para produção
🎯 Quando preferir AutoGen sobre os outros
AutoGen não é a resposta certa para tudo. Mas há casos onde ele supera LangGraph e CrewAI: quando o fluxo precisa emergir naturalmente, quando execução de código real é central, ou quando debates entre múltiplas perspectivas são o núcleo do problema.
Geração e depuração de código iterativa
O agente precisa escrever Python, executar, ver o erro, corrigir e repetir até funcionar. AutoGen foi construído exatamente para isso.
Pesquisa exploratória sem etapas fixas
Quando você não sabe quantas iterações serão necessárias, nem qual será a próxima pergunta — a conversa define o caminho.
Análise com perspectivas múltiplas
Debates, revisões críticas, análises de risco onde diferentes "vozes" precisam se contradizer e chegar a um consenso emergente.
📊 Tabela de decisão rápida
| Cenário | AutoGen | LangGraph | CrewAI |
|---|---|---|---|
| Code gen + execução iterativa | ★★★ | ★★ | ★ |
| Workflow com branches complexos | ★ | ★★★ | ★★ |
| Time de agentes especialistas | ★★ | ★★ | ★★★ |
| Pesquisa / debate multi-perspectiva | ★★★ | ★ | ★★ |
🎯 Resumo do Módulo
Próximo Módulo:
3.4 — 🤖 OpenAI Agents SDK: handoffs, guardrails e o padrão Swarm