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