LangGraph vs CrewAI vs AutoGen: Guia Completo de Multi-Agentes AI em 2026
Em 2025 a gente criava um agente AI e ficava feliz. Em 2026, a parada mudou: agora é orquestrar vários agentes trabalhando juntos.
Aquele agente que tenta fazer tudo sozinho geralmente explode. A nova onda é dividir responsabilidades entre agentes especialistas que colaboram tipo um time. Mas tem um problema: existem 3 frameworks principais—LangGraph, CrewAI e AutoGen—cada um com uma filosofia bem diferente. Escolher errado pode te custar semanas de refatoração.
Nesse artigo vou explicar as diferenças e quando usar cada um. Com código real, claro.
Por que um agente só não dá conta?
Antes de falar dos frameworks, bora entender por que sistemas multi-agente viraram essenciais.
Os limites do agente faz-tudo
Imagina criar um bot de atendimento ao cliente. Esse agente precisa:
- Identificar o que o usuário quer
- Buscar informação relevante no banco
- Consultar dados da conta do cliente
- Gerar uma resposta apropriada
- Escalar pra um humano se necessário
Se um agente só faz tudo isso:
# O antipadrão do "Agente Deus" class CustomerServiceAgent: def handle_request(self, message: str) -> str: intent = self.classify_intent(message) context = self.search_knowledge_base(intent) account_info = self.get_account_info() response = self.generate_response(context, account_info) if self.should_escalate(response): return self.escalate_to_human() return response
Qual o problema?
- Tokens estouram rápido: enfia tudo no prompt e tchau context window
- LLM fica confuso: pulando de classificar pra gerar resposta
- Fica lento: coisas que podiam rodar em paralelo vão em série
- Debug impossível: quando algo quebra, tem que vasculhar um prompt de 2000 linhas
A solução multi-agente
Dividindo por papéis fica assim:
┌─────────────────────────────────────────────────────────────┐
│ ORQUESTRADOR │
│ (Direciona as requests pro agente certo) │
└─────────────────┬──────────────────────────────┬───────────┘
│ │
┌─────────────▼─────────────┐ ┌─────────────▼─────────────┐
│ CLASSIFICADOR │ │ BUSCADOR │
│ (Detecta intenção) │ │ (Especialista em RAG) │
└─────────────┬─────────────┘ └─────────────┬─────────────┘
│ │
┌─────────────▼─────────────┐ ┌─────────────▼─────────────┐
│ CONTA │ │ REDATOR │
│ (Consulta CRM) │ │ (Gera respostas) │
└───────────────────────────┘ └───────────────────────────┘
Benefícios:
- Cada agente tem um prompt curto e focado
- Agentes independentes podem rodar em paralelo
- Se um cair, o sistema não colapsa inteiro
- Dá pra testar cada agente separado
Agora vamos ver como cada framework implementa isso.
LangGraph: Controle total com grafos
LangGraph vem do time do LangChain. O conceito central: modelar seu sistema de agentes como um grafo. Nós são funções, arestas são o fluxo. Tudo explícito e visível.
A ideia central
- Nós = funções (agentes, tools, lógica pura)
- Arestas = o que vem depois
- Estado = os dados que passam entre nós
Melhor ver no código:
from typing import Annotated, TypedDict from langgraph.graph import StateGraph, START, END from langgraph.graph.message import add_messages from langchain_openai import ChatOpenAI class AgentState(TypedDict): messages: Annotated[list, add_messages] current_intent: str knowledge_context: str account_info: dict should_escalate: bool def classify_intent(state: AgentState) -> AgentState: """Agente classificador""" llm = ChatOpenAI(model="gpt-4o") response = llm.invoke([ {"role": "system", "content": "Classifica a intenção em: billing, technical, general, complaint"}, {"role": "user", "content": state["messages"][-1].content} ]) return {"current_intent": response.content.strip().lower()} def retrieve_knowledge(state: AgentState) -> AgentState: """Agente de busca""" intent = state["current_intent"] knowledge_map = { "billing": "Política de faturamento: reembolsos em 30 dias...", "technical": "Troubleshooting: primeiro reinicia...", "general": "Sobre nós: somos uma plataforma SaaS...", "complaint": "Gestão de reclamações: levamos a sério..." } return {"knowledge_context": knowledge_map.get(intent, "")} def lookup_account(state: AgentState) -> AgentState: """Agente de conta""" return { "account_info": { "tier": "premium", "tenure_months": 24, "open_tickets": 2 } } def generate_response(state: AgentState) -> AgentState: """Agente de resposta""" llm = ChatOpenAI(model="gpt-4o") prompt = f"""Gera uma resposta útil baseada em: Intenção: {state['current_intent']} Contexto: {state['knowledge_context']} Conta: {state['account_info']} Mensagem: {state['messages'][-1].content}""" response = llm.invoke([{"role": "user", "content": prompt}]) return {"messages": [response]} def check_escalation(state: AgentState) -> AgentState: should_escalate = ( state["current_intent"] == "complaint" and state["account_info"].get("tier") == "premium" ) return {"should_escalate": should_escalate} def route_after_check(state: AgentState) -> str: return "escalate" if state["should_escalate"] else "respond" def escalate_to_human(state: AgentState) -> AgentState: return { "messages": [ {"role": "assistant", "content": "Vou te conectar com um especialista."} ] } def build_graph(): workflow = StateGraph(AgentState) workflow.add_node("classify", classify_intent) workflow.add_node("retrieve", retrieve_knowledge) workflow.add_node("lookup", lookup_account) workflow.add_node("check_escalation", check_escalation) workflow.add_node("respond", generate_response) workflow.add_node("escalate", escalate_to_human) workflow.add_edge(START, "classify") workflow.add_edge("classify", "retrieve") workflow.add_edge("retrieve", "lookup") workflow.add_edge("lookup", "check_escalation") workflow.add_conditional_edges( "check_escalation", route_after_check, {"respond": "respond", "escalate": "escalate"} ) workflow.add_edge("respond", END) workflow.add_edge("escalate", END) return workflow.compile() graph = build_graph() result = graph.invoke({ "messages": [{"role": "user", "content": "Minha fatura tá errada!"}], "current_intent": "", "knowledge_context": "", "account_info": {}, "should_escalate": False })
O melhor do LangGraph
1. Visualização do fluxo
from IPython.display import Image, display display(Image(graph.get_graph().draw_mermaid_png()))
2. Pausar e continuar
from langgraph.checkpoint.memory import MemorySaver memory = MemorySaver() graph = build_graph().compile(checkpointer=memory) config = {"configurable": {"thread_id": "user-123"}} result = graph.invoke({"messages": [...]}, config)
3. Aprovação humana fácil
from langgraph.types import interrupt def human_approval_node(state: AgentState) -> AgentState: if state["requires_approval"]: approval = interrupt("Reembolso > R$500, esperando aprovação do gerente") return {"approved": approval} return state
Quando usar LangGraph?
✅ Sim:
- Precisa de controle fino do fluxo
- Auditoria e compliance são importantes
- Tem lógica de branching complexa
- Já usa LangChain
❌ Não:
- Quer prototipar rápido
- O fluxo é simples
CrewAI: Times com papéis
CrewAI tem outra abordagem. Nada de grafos. Aqui você define papéis e tarefas como se montasse um time real.
A ideia central
- Agent = membro do time (papel, objetivo, personalidade)
- Task = o que tem que fazer
- Crew = o time completo
from crewai import Agent, Task, Crew, Process from crewai_tools import SerperDevTool classifier_agent = Agent( role="Analista de Intenção", goal="Identificar o que o cliente quer e classificar", backstory="""Expert em entender clientes. Anos de experiência detectando se é problema de faturamento, técnico ou reclamação.""", verbose=True, allow_delegation=False ) researcher_agent = Agent( role="Pesquisador", goal="Achar as informações necessárias pra resolver o caso", backstory="""Conhece todas as políticas da empresa. Sempre acha a info certa.""", tools=[SerperDevTool()], verbose=True ) response_agent = Agent( role="Especialista em Respostas", goal="Criar respostas que deixem o cliente satisfeito", backstory="""Mestre da comunicação. Transforma clientes bravos em fãs.""", verbose=True ) classification_task = Task( description="""Analisa a mensagem: Mensagem: {customer_message} Classifica como billing, technical, general ou complaint. Indica urgência: low, medium, high.""", expected_output="Classificação e urgência", agent=classifier_agent ) research_task = Task( description="""Baseado em: {classification} Busca políticas e soluções relevantes.""", expected_output="Info de políticas e solução proposta", agent=researcher_agent, context=[classification_task] ) response_task = Task( description="""Com a pesquisa, escreve uma resposta: Mensagem original: {customer_message} Classificação: {classification} Pesquisa: {research}""", expected_output="Resposta pra mandar pro cliente", agent=response_agent, context=[classification_task, research_task] ) crew = Crew( agents=[classifier_agent, researcher_agent, response_agent], tasks=[classification_task, research_task, response_task], process=Process.sequential, verbose=True ) result = crew.kickoff(inputs={"customer_message": "Minha fatura tá errada!"})
O melhor do CrewAI
1. Modo hierárquico com gerente
crew = Crew( agents=[...], tasks=[...], process=Process.hierarchical, manager_llm=ChatOpenAI(model="gpt-4o"), )
2. Memória integrada
crew = Crew( agents=[...], tasks=[...], memory=True, )
Quando usar CrewAI?
✅ Sim:
- Quer prototipar rápido
- Pensa em termos de papéis
- Não-devs precisam entender o sistema
❌ Não:
- Precisa de controle granular
- Resultados 100% determinísticos
AutoGen: Agentes que conversam
AutoGen da Microsoft é diferentão. Os agentes conversam pra resolver problemas. Tipo um grupo do Slack discutindo.
A ideia central
from autogen import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager import os config_list = [{"model": "gpt-4o", "api_key": os.environ["OPENAI_API_KEY"]}] llm_config = {"config_list": config_list} classifier = AssistantAgent( name="Classifier", system_message="""Você é o classificador. Analisa mensagens e indica intenção e urgência.""", llm_config=llm_config ) researcher = AssistantAgent( name="Researcher", system_message="""Você é o pesquisador. Busca info relevante quando passam uma intenção.""", llm_config=llm_config ) responder = AssistantAgent( name="Responder", system_message="""Você escreve as respostas. Escreve respostas legais. Termina com 'TERMINATE'.""", llm_config=llm_config ) human_proxy = UserProxyAgent( name="Customer", human_input_mode="NEVER", max_consecutive_auto_reply=0, code_execution_config=False ) group_chat = GroupChat( agents=[human_proxy, classifier, researcher, responder], messages=[], max_round=10, speaker_selection_method="round_robin" ) manager = GroupChatManager(groupchat=group_chat, llm_config=llm_config) human_proxy.initiate_chat(manager, message="Minha fatura tá errada!")
O melhor do AutoGen
1. Executa código
coder = AssistantAgent( name="Coder", system_message="Você é expert em Python. Resolve com código.", llm_config=llm_config ) executor = UserProxyAgent( name="Executor", code_execution_config={"work_dir": "workspace", "use_docker": True} ) executor.initiate_chat(coder, message="Cria uma função de juros compostos")
Quando usar AutoGen?
✅ Sim:
- Precisa executar código
- O problema precisa de iteração
- Quer que debatam soluções
❌ Não:
- Fluxos previsíveis
- Preocupado com custo de tokens
Comparativo rápido
| Aspecto | LangGraph | CrewAI | AutoGen |
|---|---|---|---|
| Em uma frase | Grafos | Times | Chats |
| Curva | Média-alta | Baixa | Média |
| Tokens | Eficiente | Normal | Alto |
| Debug | Visual | Logs | Difícil |
| Produção | Pronto | Crescendo | Pesquisa |
Recomendações
| Caso de uso | Framework |
|---|---|
| Atendimento ao cliente | LangGraph |
| Criação de conteúdo | CrewAI |
| Geração de código | AutoGen |
| MVP rápido | CrewAI |
Erros comuns
1. Agentes demais
Começa com 2-3. Adiciona mais só quando precisar.
2. Loops infinitos
Sempre coloca limites:
graph.invoke(state, config={"recursion_limit": 25}) group_chat = GroupChat(max_round=10, ...)
3. Contexto explodindo
Resume o contexto entre agentes:
def summarize(state): llm = ChatOpenAI(model="gpt-4o-mini") return llm.invoke([{"role": "user", "content": f"Resume em 100 palavras: {state}"}])
Conclusão
LangGraph → Controle e produção
CrewAI → Rapidez e clareza
AutoGen → Código e debate
Os princípios são os mesmos:
- Começa simples (2-3 agentes)
- Papéis claros
- Tratamento de erros
- Monitoramento
Os frameworks estão maduros. Hora de construir.