OpenManus 项目结构
OpenManus/
├── app/ # 主应用程序目录
│ ├── agent/ # 智能代理模块
│ │ ├── __init__.py
│ │ ├── base.py # 基础代理类
│ │ ├── planning.py # 规划代理
│ │ ├── react.py # ReAct代理
│ │ ├── swe.py # 软件工程代理
│ │ ├── toolcall.py # 工具调用代理
│ │ └── manus.py # Manus主代理
│ ├── tool/ # 工具模块
│ │ ├── __init__.py
│ │ ├── base.py # 基础工具类
│ │ ├── bash.py # 命令行工具
│ │ ├── create_chat_completion.py
│ │ ├── planning.py # 规划工具
│ │ ├── python_execute.py
│ │ ├── str_replace_editor.py
│ │ ├── terminate.py
│ │ ├── tool_collection.py
│ │ ├── browser_use_tool.py
│ │ ├── file_saver.py
│ │ └── web_search.py
│ ├── flow/ # 流程控制模块
│ │ ├── __init__.py
│ │ ├── base.py
│ │ └── planning.py
│ ├── prompt/ # 提示词模块
│ ├── schema/ # 数据模型模块
│ ├── config.py # 配置文件
│ ├── exceptions.py # 异常定义
│ └── logger.py # 日志工具
├── assets/ # 资源文件目录
├── config/ # 配置文件目录
├── examples/ # 示例代码目录
├── main.py # 主入口文件
├── run_flow.py # 流程运行入口
├── setup.py # 安装配置
├── requirements.txt # 依赖项
├── README.md # 英文说明文档
├── README_ja.md # 日文说明文档
├── README_ko.md # 韩文说明文档
├── README_zh.md # 中文说明文档
├── LICENSE # 许可证
└── .gitignore # Git忽略文件
主要模块说明:
- agent/ - 智能代理模块,包含各种类型的代理实现
- tool/ - 工具模块,提供各种功能工具
- flow/ - 流程控制模块,管理执行流程
- prompt/ - 提示词模块,存储各种提示模板
- schema/ - 数据模型定义
- config/ - 配置文件目录 项目采用模块化设计,各个组件之间通过清晰的接口进行交互。主要功能通过 agent(代理)调用 tool(工具)来实现,并通过 flow(流程)来组织和管理整个执行过程。
运行模式
时序分析
工具使用
根据代码库分析,OpenManus 提供了以下工具(定义在 app/tool 目录下):
- 基础工具
BaseTool:所有工具的基类,提供基础工具接口
- 核心功能工具
PythonExecute:执行 Python 代码Bash:执行命令行指令StrReplaceEditor:文本替换编辑工具
- 网络和浏览器工具
WebSearch:网络搜索功能BrowserUseTool:浏览器操作工具
- 文件操作工具
FileSaver:文件保存工具
- 规划和控制工具
PlanningTool:任务规划工具CreateChatCompletion:创建对话完成Terminate:终止执行工具
- 工具管理
-
ToolCollection:工具集合管理类,负责:- 工具的注册和管理
- 工具的执行调度
- 工具参数的处理
- 工具执行结果的处理 这些工具被不同的 Agent 使用:
-
Manus Agent:使用全套工具
-
Planning Agent:主要使用规划相关工具
-
SWE Agent:主要使用开发相关工具 每个工具都实现了标准的接口,包括:
-
execute() 方法:执行工具的核心功能
-
to_param() 方法:提供工具参数信息
-
错误处理机制:通过 ToolResult 和 ToolFailure 处理执行结果
| 阶段 | 发起方 | 动作 | 接收方 | 说明 |
|---|---|---|---|---|
| 输入阶段 | User | 输入提示词 | Main | 用户输入初始提示 |
| Main | 创建 Manus Agent | Manus | 初始化代理 | |
| 初始化阶段 | Manus | 初始化 LLM 客户端 | LLM | 设置语言模型 |
| Manus | 初始化内存存储 | Memory | 创建内存系统 | |
| Manus | 加载可用工具集 | Tools | 准备工具集 | |
| 执行循环 | Manus | 思考(think) | LLM | 分析当前状态 |
| LLM | 返回决策 | Manus | 提供行动建议 | |
| 条件分支 1 | Manus | 执行工具(act) | Tools | 需要执行工具时 |
| Tools | 返回结果 | Manus | 工具执行完成 | |
| Manus | 存储结果 | Memory | 保存工具执行结果 | |
| 条件分支 2 | Manus | 存储思考结果 | Memory | 无需执行工具时 |
| 完成阶段 | Manus | 返回最终结果 | Main | 任务完成时 |
| Main | 输出执行结果 | User | 返回给用户 |
prompt使用
根据代码库,我来分析各个 prompt 的使用场景:
- Manus Prompt 中的 prompt:
- 用于 代理
SYSTEM_PROMPT:定义 Manus 作为全能 AI 助手的角色和能力NEXT_STEP_PROMPT:指导如何使用各种工具(PythonExecute、FileSaver、BrowserUseTool 等)
- Planning Prompt 中的 prompt:
- 用于
PLANNING_SYSTEM_PROMPT:定义规划代理的任务和工作流程NEXT_STEP_PROMPT:指导如何评估和执行下一步计划
- SWE (Software Engineering) Prompt 中的 prompt:
- 用于
SYSTEM_PROMPT:定义软件工程代理的工作环境和命令行接口规则NEXT_STEP_TEMPLATE:提供命令行环境的状态信息模板
- Tool Call Prompt 中的 prompt:
- 用于
SYSTEM_PROMPT:定义工具调用代理的基本角色NEXT_STEP_PROMPT:提供终止交互的指导
这些 prompt 形成了一个层级结构:
- ToolCallAgent 是基础类
- ReActAgent 继承自 BaseAgent
- 其他具体代理(Manus、Planning、SWE)继承并扩展这些基础类
- 每个代理使用特定的 prompt 来定义其行为和能力