CrewAI: Framework de Orquestación Multi-Agente para Python
La guía definitiva de CrewAI -- el framework de orquestación multi-agente basado en roles para Python. Desde conceptos centrales (Agent, Task, Crew, Process) hasta integración de herramientas, sistemas de memoria, Flows API, backends de LLM, patrones avanzados, comparación de frameworks y despliegue en producción con CrewAI+.
Por Jose Nobile | Publicado 2026-04-23 | 14 min de lectura
1. ¿Qué es CrewAI?
CrewAI es un framework de código abierto en Python para orquestar agentes autónomos de IA que colaboran como un equipo. Creado por João Moura y lanzado a finales de 2023, modela sistemas multi-agente como equipos de especialistas con roles definidos -- cada agente tiene un rol, una meta y un trasfondo que moldea su comportamiento. Los agentes trabajan juntos en tareas organizadas en procesos secuenciales o jerárquicos, produciendo salidas estructuradas que fluyen a través del pipeline.
La filosofía de diseño central es colaboración basada en roles sobre programación rígida. En lugar de escribir flujo de control explícito para cada decisión, defines agentes con roles y metas en lenguaje natural, les asignas tareas con salidas esperadas y dejas que el framework orqueste su colaboración. Esto hace que CrewAI sea particularmente efectivo para automatización de trabajo intelectual: investigación, creación de contenido, análisis, planificación y cualquier flujo de trabajo donde múltiples especialistas contribuyen a un resultado compartido.
A junio 2026, CrewAI cruzó el hito 1.0 (v1.0.0 lanzada en octubre 2025; la versión actual es 1.14) y tiene más de 53,000 estrellas en GitHub, siendo uno de los frameworks multi-agente más adoptados en el ecosistema Python. El framework soporta cualquier proveedor de LLM (OpenAI, Anthropic Claude, Google Gemini, Ollama, Groq, Azure OpenAI y más), incluye un sistema de memoria integrado, se integra con servidores MCP y herramientas LangChain, y ofrece CrewAI+ -- una plataforma gestionada para despliegue en producción con monitoreo, testing y características empresariales.
Cuándo Usar Multi-Agente
Usa CrewAI cuando tu flujo de trabajo requiere múltiples perspectivas o especializaciones distintas -- investigación + escritura, análisis + revisión, planificación + ejecución. Multi-agente brilla cuando las tareas se benefician de la división del trabajo, cuando diferentes pasos necesitan diferentes configuraciones de LLM, o cuando quieres que los agentes critiquen y refinen el trabajo del otro.
Cuándo un Solo Agente es Suficiente
Si tu flujo de trabajo es un ciclo único de pregunta-respuesta o una cadena lineal de llamadas a herramientas, un solo agente (vía el OpenAI Agents SDK o Claude Agent SDK) es más simple y rápido. CrewAI agrega valor cuando la complejidad de coordinación entre especialistas justifica la sobrecarga de orquestación.
El Punto Fuerte de CrewAI
CrewAI sobresale en flujos de trabajo multi-paso estructurados donde cada paso tiene un dueño claro: pipelines de contenido (investigar, redactar, editar, publicar), análisis de datos (recopilar, procesar, analizar, reportar), operaciones de cliente (triaje, resolver, seguimiento) y planificación de proyectos (alcance, estimar, programar, asignar).
2. Conceptos Centrales
Agent
Una unidad autónoma con un rol, meta y trasfondo. Cada agente envuelve un LLM y puede usar herramientas, delegar tareas a otros agentes y mantener memoria. Los agentes son los trabajadores de tu crew -- piensa en ellos como miembros especializados del equipo con experiencia y responsabilidades distintas.
Task
Una unidad de trabajo asignada a un agente. Cada tarea tiene una descripción, formato de salida esperado y opcionalmente un contexto (lista de otras tareas cuyas salidas alimentan esta). Las tareas son los bloques de construcción de tu flujo de trabajo -- definen qué hay que hacer y cómo debe verse el resultado.
Crew
El orquestador que une agentes y tareas. Un Crew define qué agentes participan, qué tareas ejecutan, qué tipo de proceso gobierna el orden de ejecución y configuración compartida como memoria, verbosidad y ajustes de LLM. Llamar a crew.kickoff() inicia la orquestación.
Process
La estrategia de ejecución del crew. Sequential ejecuta tareas una por una en orden. Hierarchical usa un agente manager para delegar tareas dinámicamente. Estos son los dos tipos de proceso que ofrece CrewAI. El tipo de proceso determina cómo fluye la colaboración.
Tool
Una capacidad que los agentes pueden usar para interactuar con el mundo exterior -- buscar en la web, leer archivos, consultar bases de datos, llamar APIs, ejecutar código. CrewAI soporta herramientas integradas, herramientas de función personalizadas, herramientas LangChain y herramientas de servidores MCP. Las herramientas conectan el razonamiento del LLM con acciones del mundo real.
from crewai import Agent, Task, Crew, Process
# Define agents
researcher = Agent(
role="Senior Research Analyst",
goal="Find and synthesize the latest information on {topic}",
backstory="You are an expert research analyst with 15 years of "
"experience. You excel at finding patterns in data and "
"presenting clear, actionable insights.",
verbose=True
)
writer = Agent(
role="Technical Writer",
goal="Write a compelling technical article based on research findings",
backstory="You are a skilled technical writer who transforms complex "
"research into clear, engaging content for developers."
)
# Define tasks
research_task = Task(
description="Research the latest developments in {topic}. "
"Focus on key trends, major players, and technical details.",
expected_output="A comprehensive research brief with key findings, "
"statistics, and sources.",
agent=researcher
)
writing_task = Task(
description="Write a technical article based on the research findings.",
expected_output="A polished 1500-word technical article with clear "
"sections, code examples, and actionable takeaways.",
agent=writer,
context=[research_task] # receives output from research_task
)
# Create and run the crew
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, writing_task],
process=Process.sequential,
verbose=True
)
result = crew.kickoff(inputs={"topic": "multi-agent AI systems"})
3. Diseño de Agentes
El diseño de agentes es la parte más importante de construir crews efectivos. Cada agente se define por tres campos en lenguaje natural que moldean su comportamiento: role (qué es el agente), goal (qué está tratando de lograr) y backstory (contexto que da personalidad y experiencia al agente). Estos campos se inyectan en el prompt del sistema, así que elaborarlos bien es crítico para el rendimiento del agente.
Más allá de los campos de identidad centrales, los agentes aceptan configuración para asignación de LLM (parámetro llm), acceso a herramientas (lista tools), comportamiento de delegación (allow_delegation), límites máximos de iteración (max_iter), tiempo máximo de ejecución (max_execution_time) y configuración de memoria. Puedes asignar diferentes LLMs a diferentes agentes -- usa un modelo potente para tareas de razonamiento complejo y un modelo rápido y económico para extracción de datos simple.
Definición de Rol
El rol es un título de trabajo que establece el dominio de experiencia del agente. Sé específico: "Analista Senior de Datos especializado en mercados financieros" es mejor que "Analista". El rol aparece en el prompt del sistema e influye en cómo el LLM aborda los problemas. Buenos roles crean límites claros entre agentes.
Establecimiento de Metas
La meta le dice al agente qué está tratando de lograr. Las metas deben estar orientadas a resultados, no a procesos: "Producir análisis financiero preciso con recomendaciones accionables" en lugar de "Analizar datos". Las metas soportan interpolación {variable}, adaptándose dinámicamente a cada ejecución del crew.
Elaboración de Trasfondo
El trasfondo proporciona contexto y personalidad. Ancla al agente en una identidad profesional realista, lo que mejora la calidad de salida. Incluye experiencia relevante, estilo de trabajo y conocimiento del dominio. Trasfondos de 2-4 oraciones funcionan bien -- suficiente para establecer experiencia sin saturar la ventana de contexto.
Asignación de LLM
Cada agente puede usar un LLM diferente vía el parámetro llm. Pasa una cadena de modelo como "openai/gpt-5.5", "anthropic/claude-sonnet-4-6" u "ollama/llama3.2". Esto te permite optimizar costo y calidad: modelos caros para agentes de razonamiento pesado, modelos rápidos para agentes de extracción o formateo de datos.
Control de Delegación
Cuando allow_delegation=True (por defecto), un agente puede pedir a otros agentes del crew que ayuden con sub-tareas. Esto habilita colaboración emergente donde un escritor pide más datos a un investigador. Establece allow_delegation=False para mantener agentes estrictamente independientes, reduciendo uso de tokens y tiempo de ejecución.
Límites de Ejecución
Usa max_iter (por defecto 20) para limitar el número de iteraciones de razonamiento por tarea, previniendo bucles infinitos. Usa max_execution_time (en segundos) para establecer un límite de tiempo duro. Usa max_rpm para limitar llamadas API por minuto. Estos guardrails previenen costos descontrolados y aseguran ejecución predecible.
from crewai import Agent, LLM
# Agent with specific LLM and configuration
analyst = Agent(
role="Senior Financial Analyst",
goal="Produce accurate financial analysis with actionable "
"investment recommendations for {company}",
backstory="You are a CFA charterholder with 20 years of experience "
"in equity research. You specialize in technology sector "
"analysis and are known for your rigorous, data-driven "
"approach to valuation.",
llm=LLM(model="anthropic/claude-sonnet-4-6", temperature=0.1),
tools=[financial_data_tool, sec_filing_tool],
allow_delegation=False,
max_iter=15,
max_execution_time=300, # 5 minutes
verbose=True
)
# YAML-based agent definition (config/agents.yaml)
# researcher:
# role: "Senior Research Analyst"
# goal: "Find comprehensive information on {topic}"
# backstory: "Expert researcher with deep domain knowledge."
# llm: openai/gpt-5.5
# max_iter: 10
4. Definición de Tareas
Las tareas son las unidades de trabajo en CrewAI. Cada tarea tiene una description (qué hacer), un expected_output (cómo debe verse el resultado) y un agent (quién lo hace). La descripción y expected_output soportan interpolación {variable}, así que puedes parametrizar tareas en tiempo de ejecución vía crew.kickoff(inputs={...}).
El parámetro context crea dependencias de datos entre tareas. Cuando una tarea lista otras tareas en su contexto, recibe sus salidas como entrada adicional. Así es como la información fluye a través de un crew: la salida del investigador alimenta al escritor, la salida del escritor alimenta al editor. El contexto crea un DAG (grafo acíclico dirigido) de dependencias de tareas que CrewAI resuelve automáticamente.
Mejores Prácticas de Descripción
Escribe descripciones claras y específicas que le digan al agente exactamente qué hacer. Incluye restricciones, límites de alcance y criterios de calidad. Malo: "Investigar IA". Bueno: "Investigar los top 5 frameworks de orquestación multi-agente lanzados en 2025-2026, comparando su arquitectura, adopción y preparación para producción."
Salida Esperada
El campo expected_output es crítico -- le dice al agente exactamente qué formato y contenido producir. Sé preciso: "Un objeto JSON con claves: frameworks (array de objetos con nombre, arquitectura, estrellas, pros, contras)" es mejor que "Un resumen". Usa output_json u output_pydantic para validación estructurada.
Encadenamiento de Contexto
El contexto crea flujo de datos entre tareas. Una tarea con context=[task_a, task_b] recibe las salidas de ambas tareas como entrada adicional. Esto crea un pipeline donde cada etapa construye sobre resultados previos. El contexto funciona tanto en procesos secuenciales como jerárquicos.
Ejecución Asíncrona
Establece async_execution=True para ejecutar una tarea concurrentemente con la siguiente en la secuencia. Útil cuando las tareas son independientes y pueden correr en paralelo -- por ejemplo, investigar dos temas diferentes simultáneamente. El crew espera a que todas las tareas async completen antes de pasar a tareas dependientes.
Salida Estructurada
Usa output_json=MyModel u output_pydantic=MyModel para forzar validación de salida estructurada con modelos Pydantic. La salida del agente se parsea y valida contra el esquema. Si la validación falla, el agente reintenta con feedback sobre qué salió mal. Esto asegura salidas confiables y legibles por máquina.
Callbacks de Tareas
Adjunta una función callback a cualquier tarea para ejecutar lógica personalizada cuando la tarea completa. Los callbacks reciben la salida de la tarea y pueden disparar efectos secundarios: guardar en base de datos, enviar notificaciones, actualizar dashboards o alimentar resultados a sistemas externos.
from crewai import Task
from pydantic import BaseModel
from typing import List
# Structured output model
class ResearchReport(BaseModel):
topic: str
key_findings: List[str]
recommendations: List[str]
confidence_score: float
# Task with structured output and context
research_task = Task(
description="Research {topic} and produce a structured analysis. "
"Focus on: current state, key trends, major players, "
"and technical challenges. Use available search tools.",
expected_output="A structured research report with key findings, "
"actionable recommendations, and confidence score.",
agent=researcher,
output_pydantic=ResearchReport
)
# Async tasks that run in parallel
market_task = Task(
description="Analyze market trends for {topic}.",
expected_output="Market analysis with growth projections.",
agent=market_analyst,
async_execution=True
)
tech_task = Task(
description="Analyze technical landscape for {topic}.",
expected_output="Technical analysis with architecture comparisons.",
agent=tech_analyst,
async_execution=True
)
# Task with callback
def save_report(output):
with open("report.md", "w") as f:
f.write(output.raw)
print(f"Report saved: {len(output.raw)} characters")
final_task = Task(
description="Synthesize all research into a final report.",
expected_output="A comprehensive report combining all analyses.",
agent=writer,
context=[market_task, tech_task],
callback=save_report
)
5. Tipos de Proceso
El tipo de proceso determina cómo CrewAI orquesta la ejecución de tareas. CrewAI ofrece exactamente dos tipos de proceso -- secuencial y jerárquico. Elegir el correcto depende de las necesidades de coordinación de tu flujo de trabajo: pipelines predecibles usan secuencial, mientras que la delegación compleja y dinámica usa jerárquico.
Proceso Secuencial
Las tareas se ejecutan una tras otra en el orden listado. La salida de cada tarea está disponible como contexto para tareas subsiguientes. Este es el proceso por defecto y el más simple de razonar. Mejor para flujos de trabajo lineales: investigar, luego escribir, luego editar. Orden de ejecución predecible, costos predecibles, fácil de depurar.
Proceso Jerárquico
Un agente manager (creado automáticamente o personalizado) recibe todas las tareas y las delega al agente más apropiado basándose en sus roles y metas. El manager puede reasignar tareas, solicitar revisiones y coordinar el flujo de trabajo dinámicamente. Requiere un manager_llm o manager_agent. Mejor para flujos de trabajo complejos donde la asignación de tareas depende de resultados intermedios.
from crewai import Crew, Process
# Sequential: tasks run in listed order
sequential_crew = Crew(
agents=[researcher, writer, editor],
tasks=[research_task, writing_task, editing_task],
process=Process.sequential,
verbose=True
)
# Hierarchical: manager delegates to agents
hierarchical_crew = Crew(
agents=[researcher, writer, editor],
tasks=[research_task, writing_task, editing_task],
process=Process.hierarchical,
manager_llm="openai/gpt-5.5", # LLM for the auto-created manager
verbose=True
)
# Hierarchical with custom manager
manager = Agent(
role="Project Manager",
goal="Coordinate the team to produce the highest quality output",
backstory="Experienced PM who excels at delegating tasks to the "
"right specialists and ensuring quality standards.",
allow_delegation=True
)
custom_manager_crew = Crew(
agents=[researcher, writer, editor],
tasks=[research_task, writing_task, editing_task],
process=Process.hierarchical,
manager_agent=manager,
verbose=True
)
6. Integración de Herramientas
Herramientas Integradas
CrewAI viene con crewai-tools, un paquete de herramientas listas para usar: SerperDevTool (búsqueda web), ScrapeWebsiteTool (web scraping), FileReadTool, DirectoryReadTool, PDFSearchTool, CSVSearchTool, CodeInterpreterTool, YoutubeVideoSearchTool y más. Instala con pip install crewai-tools.
Herramientas Personalizadas
Construye herramientas personalizadas subclaseando BaseTool o usando el decorador @tool. El enfoque del decorador es más simple -- anota una función con @tool, agrega type hints y un docstring, y CrewAI auto-genera el esquema. Las herramientas personalizadas pueden acceder a APIs, bases de datos, sistemas de archivos o cualquier biblioteca Python.
Herramientas LangChain
Cualquier herramienta de LangChain funciona directamente con agentes CrewAI. El framework envuelve herramientas LangChain de forma transparente, dándote acceso a todo el ecosistema de herramientas LangChain -- 700+ integraciones cubriendo bases de datos, APIs, servicios cloud y capacidades especializadas de IA.
Herramientas de Servidor MCP
CrewAI se integra con servidores Model Context Protocol (MCP), dando a los agentes acceso al ecosistema creciente de herramientas MCP. Conecta cualquier servidor MCP (sistemas de archivos, GitHub, bases de datos, Slack, servidores personalizados) y sus herramientas quedan disponibles para tus agentes automáticamente.
Herramientas RAG
Las herramientas RAG integradas permiten a los agentes buscar a través de documentos, PDFs, CSVs y sitios web semánticamente. El PDFSearchTool, CSVSearchTool y DirectorySearchTool usan embeddings para búsqueda semántica sobre archivos locales. Para bases de conocimiento personalizadas, usa el RagTool con tu propio almacén vectorial.
Ejecución de Código
El CodeInterpreterTool da a los agentes la capacidad de escribir y ejecutar código Python en un entorno aislado. Los agentes pueden realizar cálculos, generar visualizaciones, procesar datos y ejecutar experimentos -- conectando el razonamiento con la computación.
from crewai.tools import tool, BaseTool
from crewai_tools import SerperDevTool, ScrapeWebsiteTool
# Built-in tools
search = SerperDevTool()
scraper = ScrapeWebsiteTool()
# Custom tool with decorator
@tool("Database Query")
def query_database(sql: str) -> str:
"""Execute a SQL query against the analytics database and return results.
Use standard SQL syntax. Tables: users, orders, products, events."""
import sqlite3
conn = sqlite3.connect("analytics.db")
result = conn.execute(sql).fetchall()
conn.close()
return str(result)
# Custom tool with class
class GitHubTool(BaseTool):
name: str = "GitHub PR Reviewer"
description: str = "Fetch and analyze pull request details from GitHub"
def _run(self, repo: str, pr_number: int) -> str:
import requests
resp = requests.get(
f"https://api.github.com/repos/{repo}/pulls/{pr_number}",
headers={"Authorization": f"token {self.api_key}"}
)
pr = resp.json()
return f"PR #{pr_number}: {pr['title']} ({pr['state']}, " \
f"+{pr['additions']}/-{pr['deletions']})"
# Assign tools to agents
researcher = Agent(
role="Research Analyst",
goal="Find accurate, up-to-date information",
backstory="Expert researcher with strong analytical skills.",
tools=[search, scraper, query_database]
)
7. Sistema de Memoria
CrewAI incluye un sistema de memoria multicapa que da a los agentes la capacidad de aprender y retener información a través de tareas y ejecuciones del crew. La memoria está deshabilitada por defecto y se habilita con memory=True en el Crew. Cuando está habilitada, los agentes pueden recordar interacciones previas, construir conocimiento de entidades y mejorar su rendimiento con el tiempo.
Memoria a Corto Plazo
Almacena información dentro de la ejecución actual del crew. La memoria a corto plazo se comparte entre agentes del crew, permitiéndoles referenciar las salidas recientes del otro y mantener coherencia a lo largo del flujo de trabajo. Implementada usando RAG con embeddings para recuperación eficiente. Poblada automáticamente desde salidas de tareas.
Memoria a Largo Plazo
Persiste a través de ejecuciones del crew usando una base de datos SQLite local. La memoria a largo plazo almacena resultados de tareas, estrategias exitosas y patrones aprendidos. Con el tiempo, los agentes desarrollan conocimiento institucional -- recuerdan qué funcionó antes y aplican esas lecciones a nuevas tareas. Esto crea un efecto volante donde el rendimiento del crew mejora con el uso.
Memoria de Entidades
Rastrea conocimiento sobre entidades específicas (personas, organizaciones, proyectos, conceptos) a través de interacciones. Cuando un agente encuentra información sobre una entidad, se almacena y puede recordarse en interacciones futuras. Esto permite a los agentes construir un grafo de conocimiento del dominio en el que trabajan.
Backends de Almacenamiento Personalizados
Sobreescribe el almacenamiento por defecto con backends personalizados implementando la interfaz de proveedor de memoria. Usa almacenes vectoriales externos (Pinecone, Weaviate, Qdrant, ChromaDB), bases de datos cloud o sistemas de gestión de conocimiento empresarial como respaldo para cualquier capa de memoria.
from crewai import Crew
# Enable memory with default storage
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, writing_task],
memory=True, # enables all memory layers
verbose=True
)
# Custom memory configuration
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, writing_task],
memory=True,
embedder={
"provider": "openai",
"config": {
"model": "text-embedding-3-small"
}
},
long_term_memory=LongTermMemory(
storage=LTMSQLiteStorage(db_path="./crew_memory.db")
),
short_term_memory=ShortTermMemory(
storage=RAGStorage(
embedder_config={
"provider": "openai",
"config": {"model": "text-embedding-3-small"}
}
)
),
entity_memory=EntityMemory(
storage=RAGStorage(
embedder_config={
"provider": "openai",
"config": {"model": "text-embedding-3-small"}
}
)
)
)
8. API de Flows
La API de Flows es la abstracción de nivel superior de CrewAI para construir flujos de trabajo con estado y dirigidos por eventos que coordinan múltiples crews y operaciones externas. Mientras los Crews manejan colaboración multi-agente en un conjunto de tareas, los Flows manejan la orquestación de múltiples crews, lógica condicional, gestión de estado e integración con sistemas externos en pipelines complejos.
Los Flows usan una sintaxis basada en decoradores: @start() marca el punto de entrada, @listen() conecta métodos que reaccionan a eventos (salidas de otros métodos) y @router() implementa ramificación condicional basada en estado o resultados. El Flow mantiene estado tipado a través de todos los pasos, facilitando construir flujos de trabajo complejos, multi-etapa con flujo de datos claro.
Decorador @start()
Marca un método como punto de entrada del flow. Cuando se llama a flow.kickoff(), todos los métodos @start() se ejecutan. Puedes tener múltiples métodos start para ejecutar pasos de inicialización en paralelo. Los métodos start configuran estado que los listeners downstream consumen.
Decorador @listen()
Conecta un método a un evento upstream. Cuando el método upstream completa, el listener se ejecuta con el valor de retorno del upstream como entrada. Múltiples listeners pueden reaccionar al mismo evento, habilitando patrones fan-out. Los listeners también pueden escuchar a otros listeners, creando pipelines multi-etapa.
Decorador @router()
Implementa ramificación condicional. Un método router inspecciona el estado actual o la salida upstream y devuelve un nombre de ruta. Los listeners downstream anotados con la ruta coincidente se disparan. Esto habilita lógica if/else, bucles de reintento y adaptación dinámica del flujo de trabajo basada en resultados intermedios.
Gestión de Estado
Los Flows mantienen estado tipado vía un modelo Pydantic. El estado es accesible a todos los métodos vía self.state y persiste a través de toda la ejecución del flow. Las actualizaciones de estado son atómicas y rastreadas, facilitando depurar y auditar el comportamiento del flow. El estado se puede serializar para persistencia y reanudación.
from crewai.flow.flow import Flow, listen, start, router
from pydantic import BaseModel
class ContentPipelineState(BaseModel):
topic: str = ""
research: str = ""
draft: str = ""
quality_score: float = 0.0
final_content: str = ""
class ContentPipeline(Flow[ContentPipelineState]):
@start()
def gather_topic(self):
self.state.topic = "Multi-Agent AI Orchestration"
return self.state.topic
@listen(gather_topic)
def research_phase(self, topic):
# Run a research crew
research_crew = Crew(
agents=[researcher],
tasks=[research_task],
verbose=True
)
result = research_crew.kickoff(inputs={"topic": topic})
self.state.research = result.raw
return result.raw
@listen(research_phase)
def writing_phase(self, research):
# Run a writing crew
writing_crew = Crew(
agents=[writer, editor],
tasks=[writing_task, editing_task],
process=Process.sequential
)
result = writing_crew.kickoff(
inputs={"research": research}
)
self.state.draft = result.raw
return result.raw
@router(writing_phase)
def quality_check(self, draft):
# Evaluate quality and decide next step
score = evaluate_quality(draft)
self.state.quality_score = score
if score >= 0.8:
return "publish"
return "revise"
@listen("publish")
def publish(self):
self.state.final_content = self.state.draft
return f"Published: {len(self.state.final_content)} chars"
@listen("revise")
def revise(self):
# Re-run writing with feedback
return self.writing_phase(self.state.research)
# Run the flow
flow = ContentPipeline()
result = flow.kickoff()
9. Backends de LLM
OpenAI
El backend por defecto. Soporta GPT-5.5, GPT-5.4 y las variantes GPT-5.4 mini y nano. Establece OPENAI_API_KEY y usa cadenas de modelo como "openai/gpt-5.5". Soporta llamado de funciones, salidas estructuradas y streaming. Mejor soporte general del ecosistema e integración más probada en batalla.
Anthropic Claude
Soporte completo para Claude Fable 5, Opus, Sonnet y Haiku vía "anthropic/claude-sonnet-4-6". Establece ANTHROPIC_API_KEY. Claude sobresale en análisis de contexto largo, generación de código y razonamiento matizado. Ideal para agentes que necesitan procesar documentos largos o producir contenido escrito de alta calidad.
Ollama (Modelos Locales)
Ejecuta agentes localmente con modelos de código abierto vía Ollama. Usa "ollama/llama3.2", "ollama/mistral" u "ollama/deepseek-r1". Establece OPENAI_API_BASE=http://localhost:11434. Mejor para desarrollo, cargas de trabajo sensibles a privacidad y operación sin conexión. Sin costos de API pero requiere recursos GPU locales.
Azure OpenAI
Despliegue empresarial vía Azure OpenAI Service. Usa "azure/tu-nombre-de-despliegue" con AZURE_API_KEY, AZURE_API_BASE y AZURE_API_VERSION. Proporciona seguridad empresarial, cumplimiento y requisitos de residencia de datos. Los mismos modelos que OpenAI con la capa de gobernanza de Azure.
Groq
Inferencia ultra-rápida para agentes que necesitan baja latencia. Usa "groq/llama-3.3-70b-versatile" con GROQ_API_KEY. El hardware LPU personalizado de Groq entrega tiempos de respuesta sub-segundo, ideal para agentes de triaje, tareas de clasificación y pipelines en tiempo real donde la velocidad importa más que la capacidad máxima del modelo.
Estrategia de LLM Mixta
El patrón más efectivo: asigna diferentes LLMs a diferentes agentes según sus necesidades. Usa GPT-5.5, Claude Fable 5 o Claude Opus 5 para agentes de razonamiento complejo, Llama en Groq para agentes de triaje rápido y GPT-5.4 mini para tareas de formateo o extracción. Esto optimiza tanto costo como calidad a través del crew.
from crewai import Agent, LLM
# OpenAI agent
planner = Agent(
role="Strategic Planner",
goal="Create comprehensive project plans",
backstory="Expert strategist.",
llm=LLM(model="openai/gpt-5.5", temperature=0.2)
)
# Claude agent for long-context analysis
analyst = Agent(
role="Document Analyst",
goal="Analyze lengthy technical documents",
backstory="Expert at processing dense technical content.",
llm=LLM(model="anthropic/claude-sonnet-4-6", temperature=0.1)
)
# Groq agent for fast classification
triager = Agent(
role="Request Triager",
goal="Quickly classify and route incoming requests",
backstory="Fast, accurate classification specialist.",
llm=LLM(model="groq/llama-3.3-70b-versatile", temperature=0.0)
)
# Local Ollama agent for privacy-sensitive tasks
local_agent = Agent(
role="PII Processor",
goal="Process documents containing sensitive personal data",
backstory="Privacy-first document processor.",
llm=LLM(
model="ollama/llama3.2",
base_url="http://localhost:11434"
)
)
10. Patrones Avanzados
Humano en el Bucle
Establece human_input=True en una tarea para pausar la ejecución y solicitar feedback humano antes de finalizar la salida. El humano puede aprobar, rechazar o proporcionar correcciones. Esencial para flujos de trabajo de alto impacto donde las salidas del agente necesitan validación humana antes de proceder a tareas downstream.
Callbacks de Paso
Registra step_callback en el Crew para recibir notificaciones después de cada paso de razonamiento del agente. Los callbacks reciben la salida del paso y pueden registrar, filtrar o transformar resultados intermedios. Usa esto para monitoreo en tiempo real, seguimiento de progreso, contabilidad de costos y lógica de aborto personalizada.
Guardrails de Salida
Combina output_pydantic con lógica de validación personalizada para forzar estándares de calidad en las salidas de los agentes. Si la salida falla la validación, CrewAI reintenta automáticamente con feedback. Capa de validación Pydantic, validadores personalizados y callbacks de post-procesamiento para control de calidad en profundidad.
Tareas Condicionales
Usa la clase dedicada ConditionalTask con una función condition para hacer condicional la ejecución de una tarea. La función recibe el TaskOutput de la tarea anterior y devuelve un booleano -- si devuelve false, la tarea se omite. Esto habilita flujos de trabajo dinámicos donde ciertos pasos solo se ejecutan cuando se cumplen criterios específicos.
Orquestación de Pipeline
Usa Pipeline para encadenar múltiples crews en flujos de trabajo multi-etapa. Cada etapa es un crew que procesa entradas y produce salidas para la siguiente etapa. Los pipelines soportan etapas paralelas (múltiples crews corriendo concurrentemente) y lógica de enrutamiento entre etapas. Esto escala CrewAI de un solo crew a orquestación de grado empresarial.
Entrenamiento y Testing
Usa crew.train(n_iterations=5) para ejecutar el crew múltiples veces con feedback humano, construyendo datos de entrenamiento que mejoran el rendimiento del agente. Usa crew.test(n_iterations=3) para hacer benchmark de las salidas del crew contra criterios de calidad. El ciclo de entrenamiento crea un ciclo de feedback que ajusta el comportamiento del agente con el tiempo.
from crewai import Task, Crew
# Human-in-the-loop task
review_task = Task(
description="Review the generated report for accuracy.",
expected_output="A validated, human-approved report.",
agent=editor,
human_input=True # pauses for human feedback
)
# Conditional task -- skipped when the condition returns False
from crewai.tasks.conditional_task import ConditionalTask
from crewai.tasks.task_output import TaskOutput
def enough_data(output: TaskOutput) -> bool:
# inspect the previous task's output; skip deep analysis if it's thin
return len(output.raw) > 100
advanced_analysis = ConditionalTask(
description="Perform deep statistical analysis on the data.",
expected_output="Statistical analysis with confidence intervals.",
agent=statistician,
condition=enough_data
)
# Step callback for monitoring
def monitor_step(step_output):
print(f"Agent: {step_output.agent}")
print(f"Action: {step_output.action}")
print(f"Output: {step_output.result[:200]}...")
crew = Crew(
agents=[researcher, analyst, writer],
tasks=[research_task, analysis_task, writing_task],
step_callback=monitor_step,
verbose=True
)
# Training loop with human feedback
crew.train(
n_iterations=5,
filename="training_data.pkl",
inputs={"topic": "AI agents"}
)
# Test and benchmark
crew.test(
n_iterations=3,
openai_model_name="gpt-5.5",
inputs={"topic": "AI agents"}
)
11. Comparación de Frameworks
El panorama de frameworks multi-agente en 2026 incluye varios jugadores principales. Cada framework hace diferentes compromisos entre nivel de abstracción, flexibilidad y preparación para producción. La elección correcta depende de la complejidad de tu flujo de trabajo, experiencia del equipo y requisitos de despliegue.
| Dimensión | CrewAI | AutoGen | LangGraph | Claude Agent SDK | OpenAI Agents SDK |
|---|---|---|---|---|---|
| Enfoque | Role-based crews | Conversational agents | Graph-based state machines | Tool-first agents | Handoff-based pipelines |
| Nivel de Abstracción | High (role/goal/backstory) | Medium (chat patterns) | Low (nodes/edges/state) | Medium (tools/prompts) | Medium (agents/handoffs) |
| Lenguaje | Python | Python, .NET | Python, TypeScript | Python, TypeScript | Python |
| Dependencia de Modelo | None (any LLM) | None (any LLM) | None (any LLM) | Claude-optimized | OpenAI-optimized |
| Memoria | Built-in (3 layers) | Conversation history | Checkpointing | Session-based | Sessions + compaction |
| Gestión de Estado | Flows API | Chat history | TypedDict/Pydantic | RunContext | RunContextWrapper |
| Observabilidad | CrewAI+, callbacks | AutoGen Studio | LangSmith | Tracing API | OpenAI Traces |
| Mejor Para | Structured team workflows | Multi-turn conversations | Complex stateful agents | Computer-use, coding | Rapid multi-agent dev |
CrewAI sobresale cuando necesitas colaboración de equipo estructurada con roles claros -- tiene el nivel de abstracción más alto, haciendo que sea el más rápido para prototipar flujos de trabajo multi-agente. AutoGen (Microsoft) es más fuerte para patrones conversacionales multi-turno donde los agentes debaten y refinan salidas. LangGraph ofrece el mayor control con máquinas de estado basadas en grafos explícitos, ideal para flujos de trabajo complejos que necesitan checkpointing y depuración con viaje en el tiempo. Claude Agent SDK tiene el acceso más profundo al sistema con herramientas integradas de archivos y shell. OpenAI Agents SDK proporciona el camino más simple a multi-agente con abstracciones mínimas y ejecución en sandbox.
12. Despliegue en Producción
Llevar CrewAI de prototipo a producción requiere abordar confiabilidad, monitoreo, manejo de errores, control de costos y escalamiento. CrewAI+ (la plataforma gestionada) maneja muchas de estas preocupaciones, pero despliegues auto-hospedados necesitan infraestructura explícita alrededor del framework.
Plataforma CrewAI+
La plataforma de despliegue gestionada para CrewAI. Despliega crews como endpoints API con monitoreo integrado, logging, visualización de traces y analítica de rendimiento de crews. CrewAI+ maneja escalamiento, recuperación de errores y proporciona un dashboard para seguimiento de ejecución en tiempo real. El tier empresarial incluye SSO, logs de auditoría y enrutamiento personalizado de LLM.
Monitoreo y Logging
Usa step_callback y task_callback para capturar telemetría de ejecución. Registra pasos de razonamiento de agentes, invocaciones de herramientas, uso de tokens y datos de tiempo. Exporta a plataformas de observabilidad (Datadog, Grafana, dashboards personalizados) para alertas de producción sobre fallos de ejecución, picos de costo y degradación de calidad.
Manejo de Errores
Establece max_iter y max_execution_time en agentes para prevenir bucles infinitos. Usa output_pydantic para validación de esquema con reintentos automáticos. Envuelve crew.kickoff() en bloques try/except con backoff exponencial para errores transitorios de API. Registra ejecuciones fallidas con contexto completo para depuración.
Optimización de Costos
Usa estrategias de LLM mixtas: modelos caros para agentes de razonamiento pesado, modelos económicos para extracción y formateo. Establece max_rpm para limitar llamadas API. Deshabilita allow_delegation en agentes que no lo necesitan (reduce uso de tokens por sobrecarga de delegación). Monitora uso de tokens por agente por tarea para identificar objetivos de optimización.
Patrones de Escalamiento
Para alto throughput, ejecuta crews en procesos workers con colas de tareas (Celery, Redis Queue o Temporal). Cada ejecución de crew es stateless (a menos que use memoria), así que el escalamiento horizontal es directo. Usa la API de Flows para orquestar múltiples crews a través de workers distribuidos para pipelines empresariales complejos.
Estrategias de Testing
Usa crew.test() para benchmarking automatizado de calidad. Escribe tests unitarios para herramientas individuales y callbacks personalizados. Haz tests de integración de ejecuciones completas de crew con LLMs mock para validar lógica de pipeline sin costos de API. Usa el ciclo de entrenamiento para recopilar salidas validadas por humanos como fixtures de tests de regresión.
# Production deployment with error handling and monitoring
import logging
from crewai import Crew
from tenacity import retry, stop_after_attempt, wait_exponential
logger = logging.getLogger("crewai_production")
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=4, max=60)
)
def run_crew_with_retries(crew, inputs):
try:
result = crew.kickoff(inputs=inputs)
logger.info(
f"Crew completed: {result.token_usage}"
)
return result
except Exception as e:
logger.error(f"Crew execution failed: {e}")
raise
# Deploy as API endpoint (FastAPI example)
from fastapi import FastAPI, BackgroundTasks
app = FastAPI()
@app.post("/api/analyze")
async def analyze(topic: str, background_tasks: BackgroundTasks):
crew = Crew(
agents=[researcher, analyst, writer],
tasks=[research_task, analysis_task, report_task],
process=Process.sequential,
memory=True,
max_rpm=30 # rate limit across all agents
)
background_tasks.add_task(
run_crew_with_retries, crew, {"topic": topic}
)
return {"status": "processing", "topic": topic}
# CLI deployment with CrewAI+
# crewai deploy -- deploys to CrewAI+ platform
# crewai monitor -- real-time crew monitoring
# crewai logs -- view execution logs
Primeros Pasos
CrewAI requiere Python 3.10 a 3.13 (3.14 aún no está soportado). Instala con pip y crea tu primer crew en minutos.
# Install CrewAI and tools pip install crewai crewai-tools # Create a new project with the CLI crewai create crew my_project cd my_project # Configure agents in config/agents.yaml # Configure tasks in config/tasks.yaml # Run the crew crewai run
# Minimal crew -- your first multi-agent workflow
from crewai import Agent, Task, Crew
researcher = Agent(
role="Researcher",
goal="Find accurate information on {topic}",
backstory="Expert research analyst."
)
writer = Agent(
role="Writer",
goal="Write clear, engaging content based on research",
backstory="Skilled technical writer."
)
research = Task(
description="Research {topic} thoroughly.",
expected_output="Comprehensive research brief.",
agent=researcher
)
article = Task(
description="Write an article based on the research.",
expected_output="A polished 1000-word article.",
agent=writer,
context=[research]
)
crew = Crew(agents=[researcher, writer], tasks=[research, article])
result = crew.kickoff(inputs={"topic": "CrewAI multi-agent orchestration"})
print(result)
Para uso en producción, configura tus claves de API de LLM como variables de entorno, habilita memoria para aprendizaje entre ejecuciones y usa la API de Flows para orquestación multi-crew compleja. La documentación oficial en docs.crewai.com cubre todos los conceptos, integraciones y patrones avanzados en profundidad.