🏢 O conceito de Crew: equipe com missão
CrewAI modela sistemas multi-agente como equipes de trabalho. Uma Crew tem uma missão coletiva, e cada membro tem um papel, objetivo e contexto específicos. Diferente do LangGraph que pensa em grafos, CrewAI pensa em estruturas organizacionais.
🏗️ Arquitetura do CrewAI
🧠 A diferença de mentalidade
Com CrewAI você não pensa em fluxo de dados — você pensa em quem faz o quê. Quais são os papéis? Quais são as responsabilidades? Como as informações fluem entre os membros da equipe? É gestão de equipe, não programação de grafo.
- •LangGraph: "Qual é o próximo nó após este?"
- •CrewAI: "Quem tem as competências para fazer isto?"
🎭 Definindo agentes com papéis
Cada Agent é definido por três atributos que constroem sua persona: role (título e função), goal (o que quer alcançar) e backstory (contexto e especialidade). Juntos, eles formam o system prompt do agente.
👤 Três agentes completos
from crewai import Agent
from crewai_tools import SerperDevTool, WebsiteSearchTool
search_tool = SerperDevTool()
# Agente 1: Pesquisador de Mercado
pesquisador = Agent(
role="Senior Market Research Analyst",
goal="Coletar dados precisos e atualizados sobre tendências de mercado no setor solicitado",
backstory="""Você é um analista sênior com 10 anos de experiência em pesquisa
de mercado. Especialista em identificar padrões emergentes, analisar dados
qualitativos e quantitativos, e sintetizar informações complexas em insights
acionáveis. Sua metodologia é rigorosa e suas fontes são sempre verificadas.""",
tools=[search_tool],
llm="gpt-4o",
verbose=True,
allow_delegation=False # não pode delegar sub-tarefas
)
# Agente 2: Analista Estratégico
analista = Agent(
role="Strategic Business Analyst",
goal="Transformar dados brutos em análises estratégicas com recomendações claras",
backstory="""Especialista em análise SWOT, Porter's Five Forces e frameworks
estratégicos. Você transforma dados e pesquisas em narrativas coerentes que
executivos conseguem usar para tomar decisões. Seu diferencial é conectar
pontos que outros não veem.""",
llm="gpt-4o",
verbose=True
)
# Agente 3: Redator Executivo
redator = Agent(
role="Executive Content Writer",
goal="Criar relatórios executivos claros, concisos e persuasivos a partir de análises",
backstory="""Redator especializado em comunicação executiva. Você sabe como
apresentar dados complexos de forma que C-level entenda em 5 minutos.
Usa estrutura clara: executive summary, principais achados, recomendações
e próximos passos.""",
llm="gpt-4o-mini", # redação usa modelo menor
verbose=True
)
💡 A backstory faz toda a diferença
Uma backstory genérica gera respostas genéricas. Uma backstory específica com anos de experiência, metodologias favoritas e diferenciais claros faz o LLM "entrar no papel" de verdade. Invista tempo escrevendo backstories ricas — é o seu equivalente de engenharia de prompt para personas de agente.
📋 Tasks e flows: estruturando o trabalho
Uma Task é uma unidade de trabalho com três elementos obrigatórios: description (o que deve ser feito), expected_output (qual o formato e conteúdo esperado) e agent (quem executa). O expected_output claro é o segredo de outputs consistentes.
📝 Tasks completas com contexto
from crewai import Task
from pydantic import BaseModel
from typing import List
# Schema do output final
class RelatorioMercado(BaseModel):
setor: str
principais_tendencias: List[str]
oportunidades: List[str]
ameacas: List[str]
recomendacoes: List[str]
score_atratividade: float
# Task 1: Pesquisa
task_pesquisa = Task(
description="""Pesquise o mercado de {setor} focando em:
1. Tamanho de mercado atual e projeções 2025-2027
2. Top 5 players e suas estratégias
3. Tendências tecnológicas emergentes
4. Barreiras de entrada
5. Comportamento do consumidor""",
expected_output="""Relatório de pesquisa com dados quantitativos
de pelo menos 5 fontes verificadas. Include: tamanho de mercado (USD),
CAGR, principais players com market share, e 3 tendências com evidências.""",
agent=pesquisador,
output_file="pesquisa_raw.md" # salva em arquivo
)
# Task 2: Análise (usa output da pesquisa como contexto)
task_analise = Task(
description="""Com base na pesquisa de mercado fornecida, realize:
1. Análise SWOT completa do setor
2. Mapeamento de oportunidades não óbvias
3. Avaliação de riscos com probabilidade e impacto
4. Score de atratividade do mercado (0-10)""",
expected_output="""Análise estratégica estruturada com SWOT,
mapa de oportunidades rankeadas por potencial, matriz de risco
e score de atratividade com justificativa.""",
agent=analista,
context=[task_pesquisa] # recebe output da task anterior
)
# Task 3: Redação (output em Pydantic)
task_relatorio = Task(
description="""Crie um relatório executivo baseado na pesquisa e análise.
O relatório deve ser legível em 5 minutos por um CEO.""",
expected_output="Relatório executivo em formato JSON estruturado.",
agent=redator,
context=[task_pesquisa, task_analise],
output_pydantic=RelatorioMercado # output tipado!
)
🏛️ Hierarquia de agentes: o manager pattern
No Process.hierarchical, um Manager Agent LLM-powered coordena os demais — decide quem executa cada task, pode redirecionar trabalho e revisar outputs antes de continuar. É como ter um gerente de projeto automático.
Process.sequential (padrão)
Tasks executam em ordem fixa. Output de uma vira input da próxima automaticamente.
- ✓Simples e previsível
- ✓Fácil de debugar
- ✓Menos custo de tokens
- ✗Sem adaptação dinâmica
Process.hierarchical
Manager LLM decide quem faz o quê. Pode redirecionar, revisar e coordenar dinamicamente.
- ✓Adaptação a situações inesperadas
- ✓Melhor qualidade de output
- ✗Mais tokens, mais custo
- ✗Menos determinístico
👔 Manager agent em código
from crewai import Crew, Process
# Manager agent (usa modelo forte para coordenação)
manager = Agent(
role="Research Project Manager",
goal="Garantir que a pesquisa de mercado seja completa, precisa e entregue no prazo",
backstory="Gerente de projetos com experiência em coordenar times de análise.",
llm="gpt-4o",
allow_delegation=True # DEVE ter delegation ativo
)
# Crew com hierarquia
crew_hierarquica = Crew(
agents=[pesquisador, analista, redator],
tasks=[task_pesquisa, task_analise, task_relatorio],
process=Process.hierarchical,
manager_agent=manager,
verbose=True,
memory=True # memória compartilhada entre agentes
)
resultado = crew_hierarquica.kickoff(
inputs={"setor": "IA Generativa B2B"}
)
# Acessa output tipado
relatorio: RelatorioMercado = resultado.pydantic
print(f"Score de atratividade: {relatorio.score_atratividade}")
print(f"Recomendações: {relatorio.recomendacoes}")
⚡ Processo sequencial vs. paralelo
Tasks que não dependem umas das outras desperdiçam tempo se forem sequenciais. Com async_execution=True, elas rodam em paralelo — podendo reduzir latência de minutos para segundos.
⚡ Paralelismo em tasks independentes
# Cenário: pesquisa de 3 mercados simultaneamente
task_mercado_br = Task(
description="Analise o mercado de IA no Brasil",
expected_output="Relatório mercado Brasil",
agent=pesquisador,
async_execution=True # roda em paralelo!
)
task_mercado_us = Task(
description="Analise o mercado de IA nos EUA",
expected_output="Relatório mercado EUA",
agent=pesquisador,
async_execution=True # também paralelo!
)
task_mercado_eu = Task(
description="Analise o mercado de IA na Europa",
expected_output="Relatório mercado Europa",
agent=pesquisador,
async_execution=True # também paralelo!
)
# Esta task espera todos os anteriores terminarem
task_comparativo = Task(
description="Compare os três mercados e identifique o mais atrativo",
expected_output="Comparativo global com ranking",
agent=analista,
context=[task_mercado_br, task_mercado_us, task_mercado_eu],
# sem async_execution — espera o contexto
)
# Crew executa: 3 pesquisas em paralelo, depois o comparativo
crew = Crew(
agents=[pesquisador, analista],
tasks=[task_mercado_br, task_mercado_us, task_mercado_eu, task_comparativo],
process=Process.sequential
)
💡 Regra de ouro do paralelismo
Use async_execution=True em qualquer task que não precise do output de outra task. Se A, B e C são independentes, mas D precisa de todos os três — A, B, C são async; D é síncrona com context=[A, B, C]. Isso pode reduzir latência de 3x.
📈 Projeto: time de análise de mercado
O projeto completo: três agentes (pesquisador, analista, redator), três tasks em sequência, compartilhamento de contexto automático e output final tipado em Pydantic. Este é o padrão CrewAI para uso empresarial.
🚀 Crew completa em produção
# Crew completa de análise de mercado
from crewai import Crew, Process
from datetime import datetime
crew_analise = Crew(
agents=[pesquisador, analista, redator],
tasks=[task_pesquisa, task_analise, task_relatorio],
process=Process.sequential,
verbose=True,
memory=True, # memória entre tasks
max_rpm=10, # rate limiting de API
output_log_file=f"log_{datetime.now():%Y%m%d_%H%M}.txt"
)
# Executa com inputs dinâmicos
resultado = crew_analise.kickoff(inputs={
"setor": "SaaS de Recursos Humanos",
"regiao": "América Latina",
"foco": "PMEs com 50-500 funcionários"
})
# Output estruturado e tipado
relatorio = resultado.pydantic
print(f"Setor analisado: {relatorio.setor}")
print(f"Score de atratividade: {relatorio.score_atratividade}/10")
print("\nPrincipais tendências:")
for i, tendencia in enumerate(relatorio.principais_tendencias, 1):
print(f" {i}. {tendencia}")
print("\nRecomendações estratégicas:")
for rec in relatorio.recomendacoes:
print(f" → {rec}")
# Custos e métricas da execução
print(f"\nTokens usados: {resultado.token_usage}")
print(f"Tempo total: {resultado.tasks_output[-1].raw[:100]}...")
CrewAI brilha quando...
- ✓Equipes de agentes com papéis claros
- ✓Prototipagem rápida de workflows
- ✓Output final estruturado (Pydantic)
- ✓Lógica de delegação automática
Limitações do CrewAI
- ✗Controle de fluxo menos preciso que LangGraph
- ✗Loops complexos são mais difíceis de implementar
- ✗Observabilidade requer configuração adicional
- ✗Menos controle sobre o estado interno
🎯 Resumo do Módulo
Próximo Módulo:
3.3 — 💬 AutoGen / AG2: filosofia conversacional, code execution e quando preferir sobre CrewAI