What is CrewAI?

CrewAI is a cutting-edge framework for orchestrating role-playing, autonomous AI agents. It enables the creation of collaborative multi-agent systems where specialized agents work together as a cohesive team to accomplish complex tasks.

Role-Based Design

Each agent has a specific role, backstory, and goals that define their behavior and expertise

Collaborative Execution

Agents work together, delegate tasks, and share information to achieve common objectives

Tool Integration

Agents can use various tools like web search, file operations, and custom functions

Process Flexibility

Sequential, hierarchical, or custom process flows for different use cases

Installation & Setup

Quick Start

# Install CrewAI
pip install crewai
pip install 'crewai[tools]'

# Set up environment variables
export OPENAI_API_KEY="your-api-key-here"
# Optional: For other LLM providers
export ANTHROPIC_API_KEY="your-claude-key"
export GROQ_API_KEY="your-groq-key"

# Install additional tools
pip install langchain-community
pip install duckduckgo-search
pip install wikipedia-api
                    

Core Concepts

1. Agents

Agents are the building blocks of CrewAI. Each agent is an autonomous unit with specific attributes:

from crewai import Agent

researcher = Agent(
    role='Senior Research Analyst',
    goal='Uncover cutting-edge developments in AI and data science',
    backstory="""You work at a leading tech think tank.
    Your expertise lies in identifying emerging trends.
    You have a knack for dissecting complex data and presenting
    actionable insights.""",
    verbose=True,
    allow_delegation=False,
    tools=[search_tool, scrape_tool]
)

writer = Agent(
    role='Content Strategist',
    goal='Craft compelling content on tech advancements',
    backstory="""You are a renowned Content Strategist,
    known for your insightful and engaging articles.
    You transform complex concepts into compelling narratives.""",
    verbose=True,
    allow_delegation=True,
    tools=[writing_tool]
)
                

2. Tasks

Tasks define what needs to be accomplished. They can be assigned to specific agents:

from crewai import Task

research_task = Task(
    description="""Conduct a comprehensive analysis of the latest 
    AI advancements in 2024. Identify key trends, breakthrough 
    technologies, and potential industry impacts.""",
    expected_output="Full analysis report in bullet points",
    agent=researcher
)

writing_task = Task(
    description="""Using the insights provided, develop an engaging 
    blog post that highlights the most significant AI advancements.
    Make it accessible yet informative.""",
    expected_output="A 750-word blog post",
    agent=writer,
    context=[research_task]  # This task depends on research_task
)
                

3. Crew

A Crew represents a collaborative group of agents working together:

from crewai import Crew, Process

crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task],
    process=Process.sequential,  # Tasks executed sequentially
    verbose=2,
    memory=True  # Enable memory for better context retention
)

# Execute the crew
result = crew.kickoff()
print(result)
                

Advanced CrewAI Patterns

🏢
Hierarchical Process
Manager-based delegation system
from crewai import Crew, Process
from langchain_openai import ChatOpenAI

# Create a manager LLM (can be different from agent LLMs)
manager_llm = ChatOpenAI(model="gpt-4", temperature=0.7)

# Create crew with hierarchical process
crew = Crew(
    agents=[researcher, analyst, writer, reviewer],
    tasks=[research_task, analysis_task, writing_task, review_task],
    manager_llm=manager_llm,
    process=Process.hierarchical,
    verbose=True
)

# The manager will automatically delegate tasks to appropriate agents
result = crew.kickoff()
                    
🔄
Custom Process Flow
Define your own execution logic
from crewai import Process

class CustomProcess(Process):
    def execute(self, agents, tasks):
        # Custom logic for task execution
        results = []
        
        # Parallel execution for research tasks
        research_tasks = [t for t in tasks if "research" in t.description.lower()]
        for task in research_tasks:
            result = task.execute()
            results.append(result)
        
        # Sequential execution for dependent tasks
        remaining_tasks = [t for t in tasks if t not in research_tasks]
        for task in remaining_tasks:
            task.context = results  # Pass previous results as context
            result = task.execute()
            results.append(result)
        
        return results

crew = Crew(
    agents=agents,
    tasks=tasks,
    process=CustomProcess(),
    verbose=True
)
                    

Tool Integration

Built-in Tools

from crewai_tools import (
    SerperDevTool,
    WebsiteSearchTool,
    FileReadTool,
    DirectoryReadTool,
    CodeDocsSearchTool,
    YoutubeVideoSearchTool
)

# Web search tool
search_tool = SerperDevTool()

# Website content tool
website_tool = WebsiteSearchTool(
    website="https://example.com",
)

# File operations
file_tool = FileReadTool(file_path="./data/report.pdf")

# Code documentation search
docs_tool = CodeDocsSearchTool(
    docs_url="https://docs.crewai.com/",
)

# Assign tools to agents
agent = Agent(
    role="Research Specialist",
    goal="Gather comprehensive information",
    tools=[search_tool, website_tool, file_tool],
    verbose=True
)
                

Custom Tools

from crewai_tools import BaseTool

class CustomDatabaseTool(BaseTool):
    name: str = "Database Query Tool"
    description: str = "Query internal database for customer information"
    
    def _run(self, query: str) -> str:
        # Your custom database logic here
        import sqlite3
        conn = sqlite3.connect('customers.db')
        cursor = conn.cursor()
        cursor.execute(query)
        results = cursor.fetchall()
        conn.close()
        return str(results)

# Create and use custom tool
db_tool = CustomDatabaseTool()

analyst = Agent(
    role="Data Analyst",
    goal="Analyze customer data",
    tools=[db_tool],
    verbose=True
)
                

Real-World Project: Content Creation Pipeline

Automated Blog Writing Crew

A complete multi-agent system for researching, writing, and optimizing blog content.

from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, WebsiteSearchTool
from langchain_openai import ChatOpenAI

# Initialize LLM
llm = ChatOpenAI(model="gpt-4", temperature=0.7)

# Tools
search_tool = SerperDevTool()
web_tool = WebsiteSearchTool()

# 1. Topic Researcher
topic_researcher = Agent(
    role='Topic Research Specialist',
    goal='Find trending topics and gather comprehensive information',
    backstory='Expert in identifying viral content opportunities',
    tools=[search_tool, web_tool],
    llm=llm,
    verbose=True
)

# 2. SEO Analyst
seo_analyst = Agent(
    role='SEO Optimization Expert',
    goal='Optimize content for search engines',
    backstory='Specialist in keyword research and SEO best practices',
    tools=[search_tool],
    llm=llm,
    verbose=True
)

# 3. Content Writer
content_writer = Agent(
    role='Senior Content Writer',
    goal='Create engaging and informative blog posts',
    backstory='Award-winning writer with expertise in tech content',
    llm=llm,
    verbose=True
)

# 4. Editor
editor = Agent(
    role='Content Editor',
    goal='Polish and perfect the final content',
    backstory='Meticulous editor ensuring quality and consistency',
    llm=llm,
    verbose=True
)

# Tasks
research_task = Task(
    description="""Research the topic: 'Future of AI Agents in 2025'
    Find the latest trends, statistics, and expert opinions.
    Identify 3-5 key points to cover.""",
    expected_output="Research summary with key points and sources",
    agent=topic_researcher
)

seo_task = Task(
    description="""Analyze SEO requirements for the blog post.
    Identify primary and secondary keywords.
    Suggest meta description and title tags.""",
    expected_output="SEO optimization report",
    agent=seo_analyst
)

writing_task = Task(
    description="""Write a 1000-word blog post on 'Future of AI Agents in 2025'.
    Include the research findings and SEO keywords naturally.
    Make it engaging and informative.""",
    expected_output="Complete blog post draft",
    agent=content_writer,
    context=[research_task, seo_task]
)

editing_task = Task(
    description="""Review and edit the blog post.
    Check for grammar, flow, and factual accuracy.
    Ensure SEO guidelines are followed.""",
    expected_output="Final polished blog post",
    agent=editor,
    context=[writing_task]
)

# Create and run the crew
blog_crew = Crew(
    agents=[topic_researcher, seo_analyst, content_writer, editor],
    tasks=[research_task, seo_task, writing_task, editing_task],
    process=Process.sequential,
    memory=True,
    cache=True,
    max_rpm=10,
    verbose=True
)

# Execute
result = blog_crew.kickoff()
print("Final Blog Post:")
print(result)
                    

Memory & Context Management

from crewai.memory import ShortTermMemory, LongTermMemory, EntityMemory

# Configure crew with advanced memory
crew = Crew(
    agents=[...],
    tasks=[...],
    memory=True,  # Enable memory
    memory_config={
        "short_term": ShortTermMemory(),
        "long_term": LongTermMemory(
            storage_path="./crew_memory"
        ),
        "entity": EntityMemory(
            storage_path="./entity_memory"
        )
    },
    embedder={
        "provider": "openai",
        "config": {
            "model": "text-embedding-3-small"
        }
    }
)

# Memory persists across crew executions
result1 = crew.kickoff(inputs={"topic": "AI Safety"})
result2 = crew.kickoff(inputs={"topic": "AI Ethics"})  # Can reference previous context
                

Performance Optimization

Best Practices for Production:
  • Use caching to avoid redundant LLM calls
  • Implement rate limiting with max_rpm parameter
  • Use cheaper models for simple tasks (gpt-3.5-turbo)
  • Enable async execution for parallel tasks
  • Monitor token usage and costs
# Optimized crew configuration
crew = Crew(
    agents=agents,
    tasks=tasks,
    process=Process.sequential,
    memory=True,
    cache=True,  # Cache results
    max_rpm=10,  # Rate limiting
    max_iter=5,  # Max iterations for tasks
    step_callback=lambda step: print(f"Step: {step}"),  # Progress tracking
    task_callback=lambda task: print(f"Task completed: {task}"),
    share_crew=True,  # Share crew execution telemetry
    output_log_file="crew_output.log"  # Log outputs
)

# Async execution for better performance
import asyncio

async def run_crew_async():
    result = await crew.kickoff_async()
    return result

# Run multiple crews in parallel
async def run_multiple_crews():
    crews = [crew1, crew2, crew3]
    results = await asyncio.gather(*[c.kickoff_async() for c in crews])
    return results
                

CrewAI vs Other Frameworks

Feature CrewAI AutoGen LangChain Agents
Multi-Agent Focus ✅ Core feature ✅ Core feature ⚠️ Limited
Role-Based Design ✅ Excellent ✅ Good ⚠️ Basic
Learning Curve Moderate Steep Moderate
Tool Integration ✅ Extensive ✅ Good ✅ Excellent
Memory Management ✅ Built-in ⚠️ Basic ✅ Flexible
Production Ready ✅ Yes ✅ Yes ✅ Yes

Common Patterns & Use Cases

Common Pitfalls to Avoid:
  • Over-engineering simple tasks with too many agents
  • Not setting clear boundaries and goals for agents
  • Ignoring token costs with verbose outputs
  • Creating circular dependencies between tasks
  • Not implementing proper error handling