乐于分享
好东西不私藏

CrewAI 源码阅读系列 01:从项目入口到公共 API,读懂 CrewAI 的工程边界

CrewAI 源码阅读系列 01:从项目入口到公共 API,读懂 CrewAI 的工程边界

深入CrewAI源码,今天先读“项目入口层”,不碰复杂 Agent 执行逻辑。

目标是建立边界:CrewAI 源码到底由哪些包组成、运行入口在哪里、下一步应该从哪个文件进入。

第一步先吃透三个文件:

CrewAI/

├── pyproject.toml

├── lib/crewai/pyproject.toml

└── lib/crewai/src/crewai/__init__.py

这三个文件回答一个核心问题:

CrewAI 这个项目如何被组织、如何被安装、如何暴露给用户使用?

因为源码阅读的第一性原理不是“看代码”,而是要逐步确定:

  • 项目边界

  • 包边界

  • 入口边界

  • 对外 API 边界

  • 再进入核心实现

进入根目录 pyproject.toml

可以看到:

[tool.uv.workspace]

members = [

 "lib/crewai",

 "lib/crewai-tools",

 "lib/devtools",

 "lib/crewai-files",

 "lib/cli",

 "lib/crewai-core",

]

你要理解:CrewAI 根仓库不是一个简单 Python 包。而是一个 monorepo

根目录pyproject.toml文件主要负责:

  • 管理 workspace

  • 管理统一开发依赖

  • 管理 lint / mypy / pytest / bandit 等工程规范

  • 管理依赖 override 与安全约束

此外,它还配置了 ruff、mypy、pytest、bandit,这说明 CrewAI 工程上不是只追求“能跑”,而是把格式、类型、测试、安全扫描放进了项目级规范。

接下来,我们看主包。它不在根目录,而是在lib/crewai/ 。

[project]

name = "crewai"

这说明用户执行:

import crewai

导入的是这个包。lib/crewai/pyproject.toml 当前声明的项目名就是 crewai。

requires-python = ">=3.10, <3.14"

这说明 CrewAI 当前不是任意 Python 都能跑,而是限制在 Python 3.10 到 3.13 之间。

那么,用户真正接触到哪些核心对象

打开lib/crewai/src/crewai/__init__.py。你会看到它导入并暴露了一批核心对象:

from crewai.agent.core import Agent

from crewai.crew import Crew

from crewai.task import Task

from crewai.flow.flow import Flow

from crewai.llm import LLM

from crewai.process import Process

这说明普通用户写:

from crewai import Agent, Crew, Task

本质上依赖的是 crewai/__init__.py 对外暴露的公共 API。当前 __init__.py 明确导入并导出了 Agent、Crew、Task、Flow、LLM、Process 等核心对象。

今天只掌握这张图

 CrewAI

├── pyproject.toml

│   └── 定义 workspace / 工程规范 / 测试规范 / 依赖约束

├── lib/crewai/

│   ├── pyproject.toml

│   │   ├── 定义主包 crewai

│   │   ├── 定义依赖

│   │   └── 定义 CLI 映射:crewai = crewai_cli.cli:crewai

│   │

│   └── src/crewai/__init__.py

│       ├── 暴露 Agent

│       ├── 暴露 Crew

│       ├── 暴露 Task

│       ├── 暴露 Flow

│       ├── 暴露 LLM

│       └── 暴露 Process

总结

根目录不是业务入口,而是工程治理入口。

根目录pyproject.toml 主要解决:

  • 这个大项目怎么统一管理?

  • 怎么统一测试?

  • 怎么统一类型检查?

  • 怎么统一安全扫描?

  • 怎么统一依赖版本?

  • 这属于工程治理层。

lib/crewai/pyproject.toml 是包边界。

它解决:

  • 这个包叫什么?

  • 支持哪些 Python 版本?

  • 依赖哪些库?

  • 可选能力有哪些?

  • 命令行入口在哪里?

  • 如何构建?

  • 这属于包发布层。

crewai/__init__.py 是用户 API 门面。

它解决:

  • 用户 import crewai 后,能直接拿到什么?

  • 哪些类是 CrewAI 希望用户感知的核心概念?

  • 哪些内部模块被隐藏在门面之后?

  • 这属于 API 设计层。

今天的源码阅读,我们可以体会到如下工程思想

成熟框架不是一个文件写到底,而是分层治理:

  • 仓库层负责工程规范;

  • 包层负责依赖和发布;

  • 入口层负责用户 API;

  • 核心层负责业务机制。