crewai-multi-agent

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

CrewAI - Multi-Agent Orchestration Framework

CrewAI - 多Agent编排框架

Build teams of autonomous AI agents that collaborate to solve complex tasks.
构建能够协作解决复杂任务的自主AI Agent团队。

When to use CrewAI

何时使用CrewAI

Use CrewAI when:
  • Building multi-agent systems with specialized roles
  • Need autonomous collaboration between agents
  • Want role-based task delegation (researcher, writer, analyst)
  • Require sequential or hierarchical process execution
  • Building production workflows with memory and observability
  • Need simpler setup than LangChain/LangGraph
Key features:
  • Standalone: No LangChain dependencies, lean footprint
  • Role-based: Agents have roles, goals, and backstories
  • Dual paradigm: Crews (autonomous) + Flows (event-driven)
  • 50+ tools: Web scraping, search, databases, AI services
  • Memory: Short-term, long-term, and entity memory
  • Production-ready: Tracing, enterprise features
Use alternatives instead:
  • LangChain: General-purpose LLM apps, RAG pipelines
  • LangGraph: Complex stateful workflows with cycles
  • AutoGen: Microsoft ecosystem, multi-agent conversations
  • LlamaIndex: Document Q&A, knowledge retrieval
使用CrewAI的场景:
  • 构建具备特定角色的多Agent系统
  • 需要Agent之间的自主协作
  • 希望基于角色分配任务(研究员、撰稿人、分析师)
  • 需要按顺序或分层执行流程
  • 构建带记忆和可观测性的生产级工作流
  • 相比LangChain/LangGraph需要更简单的设置
核心特性:
  • 独立无依赖:无需LangChain,轻量小巧
  • 基于角色:Agent拥有角色、目标和背景故事
  • 双范式:Crews(自主式)+ Flows(事件驱动式)
  • 50+工具:网页爬取、搜索、数据库、AI服务等
  • 记忆功能:短期、长期和实体记忆
  • 生产就绪:追踪功能、企业级特性
可选择竞品的场景:
  • LangChain:通用LLM应用、RAG流水线
  • LangGraph:复杂有状态工作流
  • AutoGen:微软生态、多Agent对话
  • LlamaIndex:文档问答、知识检索

Quick start

快速开始

Installation

安装

bash
undefined
bash
undefined

Core framework

Core framework

pip install crewai
pip install crewai

With 50+ built-in tools

With 50+ built-in tools

pip install 'crewai[tools]'
undefined
pip install 'crewai[tools]'
undefined

Create project with CLI

使用CLI创建项目

bash
undefined
bash
undefined

Create new crew project

Create new crew project

crewai create crew my_project cd my_project
crewai create crew my_project cd my_project

Install dependencies

Install dependencies

crewai install
crewai install

Run the crew

Run the crew

crewai run
undefined
crewai run
undefined

Simple crew (code-only)

简单Crew示例(纯代码)

python
from crewai import Agent, Task, Crew, Process
python
from crewai import Agent, Task, Crew, Process

1. Define agents

1. Define agents

researcher = Agent( role="Senior Research Analyst", goal="Discover cutting-edge developments in AI", backstory="You are an expert analyst with a keen eye for emerging trends.", verbose=True )
writer = Agent( role="Technical Writer", goal="Create clear, engaging content about technical topics", backstory="You excel at explaining complex concepts to general audiences.", verbose=True )
researcher = Agent( role="Senior Research Analyst", goal="Discover cutting-edge developments in AI", backstory="You are an expert analyst with a keen eye for emerging trends.", verbose=True )
writer = Agent( role="Technical Writer", goal="Create clear, engaging content about technical topics", backstory="You excel at explaining complex concepts to general audiences.", verbose=True )

2. Define tasks

2. Define tasks

research_task = Task( description="Research the latest developments in {topic}. Find 5 key trends.", expected_output="A detailed report with 5 bullet points on key trends.", agent=researcher )
write_task = Task( description="Write a blog post based on the research findings.", expected_output="A 500-word blog post in markdown format.", agent=writer, context=[research_task] # Uses research output )
research_task = Task( description="Research the latest developments in {topic}. Find 5 key trends.", expected_output="A detailed report with 5 bullet points on key trends.", agent=researcher )
write_task = Task( description="Write a blog post based on the research findings.", expected_output="A 500-word blog post in markdown format.", agent=writer, context=[research_task] # Uses research output )

3. Create and run crew

3. Create and run crew

crew = Crew( agents=[researcher, writer], tasks=[research_task, write_task], process=Process.sequential, # Tasks run in order verbose=True )
crew = Crew( agents=[researcher, writer], tasks=[research_task, write_task], process=Process.sequential, # Tasks run in order verbose=True )

4. Execute

4. Execute

result = crew.kickoff(inputs={"topic": "AI Agents"}) print(result.raw)
undefined
result = crew.kickoff(inputs={"topic": "AI Agents"}) print(result.raw)
undefined

Core concepts

核心概念

Agents - Autonomous workers

Agents - 自主工作单元

python
from crewai import Agent

agent = Agent(
    role="Data Scientist",                    # Job title/role
    goal="Analyze data to find insights",     # What they aim to achieve
    backstory="PhD in statistics...",         # Background context
    llm="gpt-4o",                             # LLM to use
    tools=[],                                 # Tools available
    memory=True,                              # Enable memory
    verbose=True,                             # Show reasoning
    allow_delegation=True,                    # Can delegate to others
    max_iter=15,                              # Max reasoning iterations
    max_rpm=10                                # Rate limit
)
python
from crewai import Agent

agent = Agent(
    role="Data Scientist",                    # Job title/role
    goal="Analyze data to find insights",     # What they aim to achieve
    backstory="PhD in statistics...",         # Background context
    llm="gpt-4o",                             # LLM to use
    tools=[],                                 # Tools available
    memory=True,                              # Enable memory
    verbose=True,                             # Show reasoning
    allow_delegation=True,                    # Can delegate to others
    max_iter=15,                              # Max reasoning iterations
    max_rpm=10                                # Rate limit
)

Tasks - Units of work

Tasks - 工作单元

python
from crewai import Task

task = Task(
    description="Analyze the sales data for Q4 2024. {context}",
    expected_output="A summary report with key metrics and trends.",
    agent=analyst,                            # Assigned agent
    context=[previous_task],                  # Input from other tasks
    output_file="report.md",                  # Save to file
    async_execution=False,                    # Run synchronously
    human_input=False                         # No human approval needed
)
python
from crewai import Task

task = Task(
    description="Analyze the sales data for Q4 2024. {context}",
    expected_output="A summary report with key metrics and trends.",
    agent=analyst,                            # Assigned agent
    context=[previous_task],                  # Input from other tasks
    output_file="report.md",                  # Save to file
    async_execution=False,                    # Run synchronously
    human_input=False                         # No human approval needed
)

Crews - Teams of agents

Crews - Agent团队

python
from crewai import Crew, Process

crew = Crew(
    agents=[researcher, writer, editor],      # Team members
    tasks=[research, write, edit],            # Tasks to complete
    process=Process.sequential,               # Or Process.hierarchical
    verbose=True,
    memory=True,                              # Enable crew memory
    cache=True,                               # Cache tool results
    max_rpm=10,                               # Rate limit
    share_crew=False                          # Opt-in telemetry
)
python
from crewai import Crew, Process

crew = Crew(
    agents=[researcher, writer, editor],      # Team members
    tasks=[research, write, edit],            # Tasks to complete
    process=Process.sequential,               # Or Process.hierarchical
    verbose=True,
    memory=True,                              # Enable crew memory
    cache=True,                               # Cache tool results
    max_rpm=10,                               # Rate limit
    share_crew=False                          # Opt-in telemetry
)

Execute with inputs

Execute with inputs

result = crew.kickoff(inputs={"topic": "AI trends"})
result = crew.kickoff(inputs={"topic": "AI trends"})

Access results

Access results

print(result.raw) # Final output print(result.tasks_output) # All task outputs print(result.token_usage) # Token consumption
undefined
print(result.raw) # Final output print(result.tasks_output) # All task outputs print(result.token_usage) # Token consumption
undefined

Process types

流程类型

Sequential (default)

顺序执行(默认)

Tasks execute in order, each agent completing their task before the next:
python
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_task],
    process=Process.sequential  # Task 1 → Task 2 → Task 3
)
任务按顺序执行,每个Agent完成任务后下一个才开始:
python
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_task],
    process=Process.sequential  # Task 1 → Task 2 → Task 3
)

Hierarchical

分层执行

Auto-creates a manager agent that delegates and coordinates:
python
crew = Crew(
    agents=[researcher, writer, analyst],
    tasks=[research_task, write_task, analyze_task],
    process=Process.hierarchical,  # Manager delegates tasks
    manager_llm="gpt-4o"           # LLM for manager
)
自动创建一个Manager Agent来分配和协调任务:
python
crew = Crew(
    agents=[researcher, writer, analyst],
    tasks=[research_task, write_task, analyze_task],
    process=Process.hierarchical,  # Manager delegates tasks
    manager_llm="gpt-4o"           # LLM for manager
)

Using tools

使用工具

Built-in tools (50+)

内置工具(50+种)

bash
pip install 'crewai[tools]'
python
from crewai_tools import (
    SerperDevTool,           # Web search
    ScrapeWebsiteTool,       # Web scraping
    FileReadTool,            # Read files
    PDFSearchTool,           # Search PDFs
    WebsiteSearchTool,       # Search websites
    CodeDocsSearchTool,      # Search code docs
    YoutubeVideoSearchTool,  # Search YouTube
)
bash
pip install 'crewai[tools]'
python
from crewai_tools import (
    SerperDevTool,           # Web search
    ScrapeWebsiteTool,       # Web scraping
    FileReadTool,            # Read files
    PDFSearchTool,           # Search PDFs
    WebsiteSearchTool,       # Search websites
    CodeDocsSearchTool,      # Search code docs
    YoutubeVideoSearchTool,  # Search YouTube
)

Assign tools to agent

Assign tools to agent

researcher = Agent( role="Researcher", goal="Find accurate information", backstory="Expert at finding data online.", tools=[SerperDevTool(), ScrapeWebsiteTool()] )
undefined
researcher = Agent( role="Researcher", goal="Find accurate information", backstory="Expert at finding data online.", tools=[SerperDevTool(), ScrapeWebsiteTool()] )
undefined

Custom tools

自定义工具

python
from crewai.tools import BaseTool
from pydantic import Field

class CalculatorTool(BaseTool):
    name: str = "Calculator"
    description: str = "Performs mathematical calculations. Input: expression"

    def _run(self, expression: str) -> str:
        try:
            result = eval(expression)
            return f"Result: {result}"
        except Exception as e:
            return f"Error: {str(e)}"
python
from crewai.tools import BaseTool
from pydantic import Field

class CalculatorTool(BaseTool):
    name: str = "Calculator"
    description: str = "Performs mathematical calculations. Input: expression"

    def _run(self, expression: str) -> str:
        try:
            result = eval(expression)
            return f"Result: {result}"
        except Exception as e:
            return f"Error: {str(e)}"

Use custom tool

Use custom tool

agent = Agent( role="Analyst", goal="Perform calculations", tools=[CalculatorTool()] )
undefined
agent = Agent( role="Analyst", goal="Perform calculations", tools=[CalculatorTool()] )
undefined

YAML configuration (recommended)

YAML配置(推荐)

Project structure

项目结构

my_project/
├── src/my_project/
│   ├── config/
│   │   ├── agents.yaml    # Agent definitions
│   │   └── tasks.yaml     # Task definitions
│   ├── crew.py            # Crew assembly
│   └── main.py            # Entry point
└── pyproject.toml
my_project/
├── src/my_project/
│   ├── config/
│   │   ├── agents.yaml    # Agent definitions
│   │   └── tasks.yaml     # Task definitions
│   ├── crew.py            # Crew assembly
│   └── main.py            # Entry point
└── pyproject.toml

agents.yaml

agents.yaml

yaml
researcher:
  role: "{topic} Senior Data Researcher"
  goal: "Uncover cutting-edge developments in {topic}"
  backstory: >
    You're a seasoned researcher with a knack for uncovering
    the latest developments in {topic}. Known for your ability
    to find relevant information and present it clearly.

reporting_analyst:
  role: "Reporting Analyst"
  goal: "Create detailed reports based on research data"
  backstory: >
    You're a meticulous analyst who transforms raw data into
    actionable insights through well-structured reports.
yaml
researcher:
  role: "{topic} Senior Data Researcher"
  goal: "Uncover cutting-edge developments in {topic}"
  backstory: >
    You're a seasoned researcher with a knack for uncovering
    the latest developments in {topic}. Known for your ability
    to find relevant information and present it clearly.

reporting_analyst:
  role: "Reporting Analyst"
  goal: "Create detailed reports based on research data"
  backstory: >
    You're a meticulous analyst who transforms raw data into
    actionable insights through well-structured reports.

tasks.yaml

tasks.yaml

yaml
research_task:
  description: >
    Conduct thorough research about {topic}.
    Find the most relevant information for {year}.
  expected_output: >
    A list with 10 bullet points of the most relevant
    information about {topic}.
  agent: researcher

reporting_task:
  description: >
    Review the research and create a comprehensive report.
    Focus on key findings and recommendations.
  expected_output: >
    A detailed report in markdown format with executive
    summary, findings, and recommendations.
  agent: reporting_analyst
  output_file: report.md
yaml
research_task:
  description: >
    Conduct thorough research about {topic}.
    Find the most relevant information for {year}.
  expected_output: >
    A list with 10 bullet points of the most relevant
    information about {topic}.
  agent: researcher

reporting_task:
  description: >
    Review the research and create a comprehensive report.
    Focus on key findings and recommendations.
  expected_output: >
    A detailed report in markdown format with executive
    summary, findings, and recommendations.
  agent: reporting_analyst
  output_file: report.md

crew.py

crew.py

python
from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task
from crewai_tools import SerperDevTool

@CrewBase
class MyProjectCrew:
    """My Project crew"""

    @agent
    def researcher(self) -> Agent:
        return Agent(
            config=self.agents_config['researcher'],
            tools=[SerperDevTool()],
            verbose=True
        )

    @agent
    def reporting_analyst(self) -> Agent:
        return Agent(
            config=self.agents_config['reporting_analyst'],
            verbose=True
        )

    @task
    def research_task(self) -> Task:
        return Task(config=self.tasks_config['research_task'])

    @task
    def reporting_task(self) -> Task:
        return Task(
            config=self.tasks_config['reporting_task'],
            output_file='report.md'
        )

    @crew
    def crew(self) -> Crew:
        return Crew(
            agents=self.agents,
            tasks=self.tasks,
            process=Process.sequential,
            verbose=True
        )
python
from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task
from crewai_tools import SerperDevTool

@CrewBase
class MyProjectCrew:
    """My Project crew"""

    @agent
    def researcher(self) -> Agent:
        return Agent(
            config=self.agents_config['researcher'],
            tools=[SerperDevTool()],
            verbose=True
        )

    @agent
    def reporting_analyst(self) -> Agent:
        return Agent(
            config=self.agents_config['reporting_analyst'],
            verbose=True
        )

    @task
    def research_task(self) -> Task:
        return Task(config=self.tasks_config['research_task'])

    @task
    def reporting_task(self) -> Task:
        return Task(
            config=self.tasks_config['reporting_task'],
            output_file='report.md'
        )

    @crew
    def crew(self) -> Crew:
        return Crew(
            agents=self.agents,
            tasks=self.tasks,
            process=Process.sequential,
            verbose=True
        )

main.py

main.py

python
from my_project.crew import MyProjectCrew

def run():
    inputs = {
        'topic': 'AI Agents',
        'year': 2025
    }
    MyProjectCrew().crew().kickoff(inputs=inputs)

if __name__ == "__main__":
    run()
python
from my_project.crew import MyProjectCrew

def run():
    inputs = {
        'topic': 'AI Agents',
        'year': 2025
    }
    MyProjectCrew().crew().kickoff(inputs=inputs)

if __name__ == "__main__":
    run()

Flows - Event-driven orchestration

Flows - 事件驱动编排

For complex workflows with conditional logic, use Flows:
python
from crewai.flow.flow import Flow, listen, start, router
from pydantic import BaseModel

class MyState(BaseModel):
    confidence: float = 0.0

class MyFlow(Flow[MyState]):
    @start()
    def gather_data(self):
        return {"data": "collected"}

    @listen(gather_data)
    def analyze(self, data):
        self.state.confidence = 0.85
        return analysis_crew.kickoff(inputs=data)

    @router(analyze)
    def decide(self):
        return "high" if self.state.confidence > 0.8 else "low"

    @listen("high")
    def generate_report(self):
        return report_crew.kickoff()
对于带条件逻辑的复杂工作流,使用Flows:
python
from crewai.flow.flow import Flow, listen, start, router
from pydantic import BaseModel

class MyState(BaseModel):
    confidence: float = 0.0

class MyFlow(Flow[MyState]):
    @start()
    def gather_data(self):
        return {"data": "collected"}

    @listen(gather_data)
    def analyze(self, data):
        self.state.confidence = 0.85
        return analysis_crew.kickoff(inputs=data)

    @router(analyze)
    def decide(self):
        return "high" if self.state.confidence > 0.8 else "low"

    @listen("high")
    def generate_report(self):
        return report_crew.kickoff()

Run flow

Run flow

flow = MyFlow() result = flow.kickoff()

See [Flows Guide](references/flows.md) for complete documentation.
flow = MyFlow() result = flow.kickoff()

查看[Flows指南](references/flows.md)获取完整文档。

Memory system

记忆系统

python
undefined
python
undefined

Enable all memory types

Enable all memory types

crew = Crew( agents=[researcher], tasks=[research_task], memory=True, # Enable memory embedder={ # Custom embeddings "provider": "openai", "config": {"model": "text-embedding-3-small"} } )

**Memory types:** Short-term (ChromaDB), Long-term (SQLite), Entity (ChromaDB)
crew = Crew( agents=[researcher], tasks=[research_task], memory=True, # Enable memory embedder={ # Custom embeddings "provider": "openai", "config": {"model": "text-embedding-3-small"} } )

**记忆类型:** 短期记忆(ChromaDB)、长期记忆(SQLite)、实体记忆(ChromaDB)

LLM providers

LLM提供商

python
from crewai import LLM

llm = LLM(model="gpt-4o")                              # OpenAI (default)
llm = LLM(model="claude-sonnet-4-5-20250929")                       # Anthropic
llm = LLM(model="ollama/llama3.1", base_url="http://localhost:11434")  # Local
llm = LLM(model="azure/gpt-4o", base_url="https://...")              # Azure

agent = Agent(role="Analyst", goal="Analyze data", llm=llm)
python
from crewai import LLM

llm = LLM(model="gpt-4o")                              # OpenAI (default)
llm = LLM(model="claude-sonnet-4-5-20250929")                       # Anthropic
llm = LLM(model="ollama/llama3.1", base_url="http://localhost:11434")  # Local
llm = LLM(model="azure/gpt-4o", base_url="https://...")              # Azure

agent = Agent(role="Analyst", goal="Analyze data", llm=llm)

CrewAI vs alternatives

CrewAI vs 竞品

FeatureCrewAILangChainLangGraph
Best forMulti-agent teamsGeneral LLM appsStateful workflows
Learning curveLowMediumHigher
Agent paradigmRole-basedTool-basedGraph-based
MemoryBuilt-inPlugin-basedCustom
特性CrewAILangChainLangGraph
最佳适用场景多Agent团队通用LLM应用有状态工作流
学习曲线中等较高
Agent范式基于角色基于工具基于图
记忆功能内置插件式自定义

Best practices

最佳实践

  1. Clear roles - Each agent should have a distinct specialty
  2. YAML config - Better organization for larger projects
  3. Enable memory - Improves context across tasks
  4. Set max_iter - Prevent infinite loops (default 15)
  5. Limit tools - 3-5 tools per agent max
  6. Rate limiting - Set max_rpm to avoid API limits
  1. 清晰的角色定义 - 每个Agent应具备明确的专业领域
  2. 使用YAML配置 - 大型项目的组织性更佳
  3. 启用记忆功能 - 提升任务间的上下文连贯性
  4. 设置max_iter - 避免无限循环(默认值15)
  5. 限制工具数量 - 每个Agent最多3-5种工具
  6. 速率限制 - 设置max_rpm避免API调用超限

Common issues

常见问题

Agent stuck in loop:
python
agent = Agent(
    role="...",
    max_iter=10,           # Limit iterations
    max_rpm=5              # Rate limit
)
Task not using context:
python
task2 = Task(
    description="...",
    context=[task1],       # Explicitly pass context
    agent=writer
)
Memory errors:
python
undefined
Agent陷入循环:
python
agent = Agent(
    role="...",
    max_iter=10,           # 限制迭代次数
    max_rpm=5              # 速率限制
)
任务未使用上下文:
python
task2 = Task(
    description="...",
    context=[task1],       # 显式传递上下文
    agent=writer
)
记忆相关错误:
python
undefined

Use environment variable for storage

使用环境变量指定存储目录

import os os.environ["CREWAI_STORAGE_DIR"] = "./my_storage"
undefined
import os os.environ["CREWAI_STORAGE_DIR"] = "./my_storage"
undefined

References

参考资料

  • Flows Guide - Event-driven workflows, state management
  • Tools Guide - Built-in tools, custom tools, MCP
  • Troubleshooting - Common issues, debugging
  • Flows指南 - 事件驱动工作流、状态管理
  • 工具指南 - 内置工具、自定义工具、MCP
  • 故障排查 - 常见问题、调试方法

Resources

资源