MÓDULO 3.2

👥 CrewAI na Prática

Monte times de agentes especializados com papéis, goals e backstories. Tasks estruturadas e flows que permitem que agentes colaborem como uma equipe real — com resultado final estruturado em Pydantic.

6
Tópicos
45
Minutos
Inter.
Nível
Projeto
Tipo
1

🏢 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

🎭
Agent
Membro com role, goal e backstory
📋
Task
Assignment com description e expected_output
🔧
Tool
Capacidades: web, código, API
🚀
Crew
Orquestra agentes + tasks + processo

🧠 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?"
2

🎭 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.

3

📋 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!
)
4

🏛️ 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}")
5

⚡ 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.

6

📈 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

Crew como equipe — agents com role/goal/backstory, tasks com description/expected_output
context= compartilha resultados — output de uma task vira input da próxima automaticamente
Process.hierarchical — manager LLM coordena agentes dinamicamente
async_execution=True — tasks independentes rodam em paralelo, reduzindo latência
output_pydantic= — output final tipado e validado automaticamente

Próximo Módulo:

3.3 — 💬 AutoGen / AG2: filosofia conversacional, code execution e quando preferir sobre CrewAI