乐于分享
好东西不私藏

CrewAI 源码深扒:一个“去 LangChain 化”的多智能体框架,值不值得跟?

CrewAI 源码深扒:一个“去 LangChain 化”的多智能体框架,值不值得跟?

多智能体框架这两年扎堆出现,CrewAI 是其中声量很大的一个。官方 README 里写得很诱人:“lean, lightning-fast Python framework built entirely from scratch—completely independent of LangChain”。但宣传归宣传,

代码不会骗人。这篇文章直接从 GitHub 源码入手,看 CrewAI 到底怎么实现、强在哪里、坑在哪里,以及它适合谁。

一、CrewAI 到底是什么:两种“组队”方式

打开源码,CrewAI 的公开接口非常清晰,核心就三类实体:

from crewai import Agent, Task, Crew, Flow, LLM

它提供两种编排模式,对应两个顶层抽象:

  • Crew(船员团队)
    :角色驱动的自主协作。你定义若干 Agent(角色、目标、背景故事)和 Task(任务描述、期望输出),再指定一个 process,框架自动安排它们接力完成。
  • Flow(工作流)
    :事件驱动的精确控制。用 @start@listen@router 等装饰器把 Python 方法连成状态机,适合需要分支、循环、人机确认的生产级流程。
图 1:CrewAI 的两种核心编排模式

源码里 lib/crewai/src/crewai/__init__.py 的导出列表也印证了这一定位:Agent、Crew、Flow、Task、LLM、Knowledge、Memory、LLMGuardrail 等一并暴露,说明它已经不再只是“一个多 Agent 协作库”,而是一个带记忆、知识、护栏、追踪、检查点的完整运行时。

二、源码级优势:它为什么能脱颖而出

1. 彻底摆脱 LangChain,自研运行时

这是 CrewAI 最值得说的一点。把早期版本(0.11.2)和最新版本(1.14.8a2)的源码放在一起看,差异触目惊心。旧版 crewai/agent.py 直接 import LangChain:

from langchain.agents.agent import RunnableAgentfrom langchain.agents.output_parsers import ReActSingleInputOutputParserfrom langchain.memory import ConversationSummaryMemoryfrom langchain_openai import ChatOpenAI

而新版 lib/crewai/src/crewai/agent/core.py 里已经看不到 LangChain 的影子。执行器继承自 BaseAgentExecutor,LLM 统一走 crewai.llm.LLM,再通过 litellm 做模型路由。这种“去依赖化”带来的直接好处是:版本更可控、启动更快、堆栈更浅,不会被 LangChain 的链式抽象和频繁 breaking change 拖累。

2. 角色驱动的声明式 API,上手极快

CrewAI 的 Agent 模型只需要三个必填字段:rolegoalbackstory。Task 只需要 description 和 expected_output。源码里 BaseAgent 的字段定义非常直观:

id: UUID4role: str = Field(description="Role of the agent")goal: str = Field(description="Objective of the agent")backstory: str = Field(description="Backstory of the agent")allow_delegation: bool = Field(default=False)max_iter: int = Field(default=25)

这种设计把“写代码”变成了“写岗位说明书”。配合 @CrewBase 装饰器和 YAML 配置(config/agents.yamlconfig/tasks.yaml),一个多 Agent 应用可以几分钟搭出骨架。

3. 双模式编排:既要“自由协作”,也要“精确控制”

大多数框架只擅长一种模式:要么像 AutoGen 一样让 Agent 自由对话,要么像 LangGraph 一样严格状态机。CrewAI 的源码架构把两者都覆盖了。Crew 处理 sequential/hierarchical 两种 process,Flow 则是一套独立的事件驱动 DSL(实现拆在 crewai.flow.dslflow_definitionruntime 三个模块)。

更有趣的是,新版 AgentExecutor 本身也是一个 Flow:

class AgentExecutor(Flow[AgentExecutorState], BaseAgentExecutor):    """Agent Executor for both standalone agents and crew-bound agents."""

这意味着底层执行引擎和上层编排用了同一套状态机,复用度很高。

4. 企业级特性密集:记忆、知识、护栏、检查点、追踪

看 Crew 类的字段就能感受到它的“生产化”野心:memory、checkpoint、tracing、security_config、knowledge_sources、skills、before_kickoff_callbacks、after_kickoff_callbacks……源码中甚至有 from_checkpoint 和 fork 类方法,支持从检查点恢复执行并分叉出新分支。

遥测模块 telemetry.py 直接基于 OpenTelemetry 实现,默认采集匿名 trace,可插拔。工具模块支持 MCP(Model Context Protocol)和 A2A(Agent-to-Agent)协议,说明它正在把自己定位成企业 Agent 生态的连接器,而不仅仅是一个脚本框架。

5. 多模型统一路由,内置上下文窗口管理

crewai/llm.py 里有一个巨大的 LLM_CONTEXT_WINDOW_SIZES 字典,覆盖 OpenAI、Anthropic、Gemini、Bedrock、Llama、Qwen、DeepSeek 等主流模型。LLM 抽象层通过 litellm 统一调用,开发者换模型基本只需要改一个字符串。

6. 工具抽象成熟,支持结构化和外部协议

BaseTool 用 Pydantic 做参数和返回值 schema,支持 args_schemaresult_schemacache_functionmax_usage_count。源码里还有 CrewStructuredToolMCPToolWrapperAgentTools,说明它已经跳出“写个函数当工具”的阶段,开始对接更重的工具生态。

三、源码级劣势:光环之下的真实代价

1. 复杂度爆炸,概念多得像企业中间件

仓库 shallow clone 下来有 18000+ 文件。核心包 lib/crewai/src/crewai/ 下塞进了 agent、agents、events、flow、knowledge、llms、memory、mcp、project、rag、security、skills、state、tasks、telemetry、tools、types、utilities 等近 20 个模块。想完整理解它的执行链路,需要同时掌握 Event Bus、RuntimeState、Checkpoint、MemoryScope、Knowledge、Guardrail、Skill、A2A、MCP 等概念。

结论:CrewAI 已经不是“小而美”的框架。它的定位更接近一个 Agent 应用服务器,初学者会被概念密度吓到。

2. 依赖极其沉重

看 lib/crewai/pyproject.toml 的 dependencies 列表:pydantic、openai、instructor、chromadb、lancedb、opentelemetry 全家桶、mcp、pyjwt、cel-python、portalocker、aiosqlite、aiofiles、httpx、pdfplumber、regex……还没算可选依赖 crewai-tools、crewai-files、torch 等。

这么多强依赖在真实项目里极易引发版本冲突,尤其是 ChromaDB、LanceDB 这类带原生编译依赖的包,在 Windows 或企业内网环境部署时往往是噩梦。

3. 遥测默认开启,隐私敏感场景需要手动关闭

telemetry.py 里明确写道:

def _is_telemetry_disabled(cls) -> bool:    return (        os.getenv("OTEL_SDK_DISABLED", "false").lower() == "true"        or os.getenv("CREWAI_DISABLE_TELEMETRY", "false").lower() == "true"        or os.getenv("CREWAI_DISABLE_TRACKING", "false").lower() == "true"    )

虽然官方强调“不收集 prompt、任务描述、输出内容”,但 trace 默认会上报到 CrewAI 的 OTLP endpoint。对于金融、医疗、政企等对数据出境敏感的场景,必须在环境变量里显式关闭,否则存在合规风险。

4. 版本迭代快,破坏性改动多

从 0.11.2 到 1.14.8a2 只用了不到两年,源码架构几乎重写了一遍。当前代码里随处可见 deprecated 字段:

  • allow_code_execution
    :已废弃,改用外部沙箱。
  • multimodal
    :已废弃,v2.0 移除。
  • reasoning
    :已废弃,改用 planning_config
  • function_calling_llm
    :已废弃,未来版本移除。

这提示团队在选择 CrewAI 时要有版本维护预算,不能指望一次写好就一劳永逸。

5. 开源版与企业版边界模糊

源码里大量出现 plus_api.pyauthenterpriseorganizationPlatformApp 等模块。CLI 包 crewai_cli 里有 deploy、authentication、organization、remote_template、triggers 等命令。开源框架已经明显在向 CrewAI Platform / AMP 商业生态导流。

这不是缺点,但企业评估时需要清醒:很多高级能力(集中控制平面、SSO、审计、私有化部署)不在 pip 包里,而在付费侧。

6. Python 版本锁死在 3.10–3.13

requires-python = ">=3.10, <3.14"。如果你的生产线还在 3.9 或已经上 3.14 preview,直接被拒之门外。考虑到它依赖大量二进制包,升级 Python 大版本时通常要重新踩一遍坑。

四、适用人群:谁该用,谁不该用

综合上面的源码观察,CrewAI 的“甜蜜区”和“雷区”可以这样划分:

场景 / 人群
建议
理由
想快速搭建多 Agent 原型的 Python 开发者
适合
声明式 API、YAML 配置、丰富示例,上手曲线前期很缓。
被困在 LangChain 版本地狱里的团队
适合
新版完全自研运行时,不再依赖 LangChain,迁移后可减少抽象层。
需要检查点、人机确认、审计追踪的生产项目
适合
checkpoint、human_input、guardrail、OpenTelemetry tracing 都是一等公民。
纯 AI 初学者 / 非技术背景用户
不适合
概念多、依赖重、报错信息常来自底层库,排错门槛高。
对依赖和隐私极度敏感的环境
谨慎
默认遥测、大量外部依赖、部分企业功能需联网或付费。
只需要单次 LLM 调用或简单 RAG 的场景
不适合
用 CrewAI 杀鸡用牛刀,直接写 requests / openai SDK 更轻。
预算有限、希望长期稳定的小团队
谨慎
版本迭代快、破坏性改动多,维护成本不容小觑。

五、小结

CrewAI 是目前多智能体框架里“工程化程度最高”的选手之一。从源码可以清楚看到它的演进路径:从一个依附于 LangChain 的轻量封装,成长为一个拥有自研运行时、事件总线、检查点、企业连接器的独立框架。它的优势是 快、全、生产向,劣势是 重、复杂、迭代激进

如果你要做的是“让几个 AI 角色分工完成一件复杂的事”,并且愿意为可维护性、可观测性、可恢复性付出学习成本,CrewAI 值得认真评估。但如果你只是想要一个轻量脚本、或者团队没有余力跟进版本更新,那它可能不是最优解。

最后提醒一句:任何框架选型,都不要只看 README 和 Star 数。把源码下载下来,看看它依赖什么、默认开启什么、未来打算去掉什么,往往比看十篇评测更管用。