往期推荐:
1. OpenManus架构解析
2. OpenManus代码详解(一):app/agent
3. OpenManus代码详解(二):app/flow
4. OpenManus代码详解(三):app/tool
5. OpenManus代码详解(四):app/schema.py
6. OpenManus代码详解(五):app/tool/planning.py
7. OpenManus代码详解(六):代码调用流程
官方地址:https://github.com/mannaandpoem/OpenManus
agent 文件夹中的各个实现及其调用流程:
1. 核心智能体类型
继承关系图
BaseAgent (base.py)
└── ReActAgent (react.py)
└── ToolCallAgent (toolcall.py)
├── PlanningAgent (planning.py)
├── SWEAgent (swe.py)
└── Manus (manus.py)
1.1. BaseAgent (base.py)
- 基础抽象类,定义了智能体的基本接口和功能
- 核心属性:
○ name: 智能体名称
○ description: 智能体描述
○ system_prompt: 系统级提示词
○ next_step_prompt: 下一步动作提示词
○ llm: 语言模型实例
○ memory: 记忆存储
○ state: 当前状态 - 主要方法:
○ think(): 思考下一步行动
○ act(): 执行行动
○ run(): 运行智能体
○ step(): 执行单个步骤
1.2. ReActAgent (react.py)
- 实现 ReAct(Reasoning and Acting)模式
- 特点:
○ 思考-行动循环
○ 基于观察的决策
○ 动态调整策略
1.3. ToolCallAgent (toolcall.py)
- 继承自 BaseAgent,专注于工具调用功能
- 核心功能:
○ 工具管理:available_tools
○ 工具选择策略:tool_choices
○ 工具调用追踪:tool_calls - 主要方法:
○parse_tool_calls()
: 解析工具调用
○execute_tool_calls()
: 执行工具调用
○format_tool_result()
: 格式化工具结果
1.4. PlanningAgent (planning.py)
- 继承自 ToolCallAgent,增加了规划能力
- 核心特性:
○ 计划管理:active_plan_id
○ 步骤追踪:step_execution_tracker
○ 当前步骤:current_step_index - 主要方法:
○create_initial_plan()
: 创建初始计划
○update_plan_status()
: 更新计划状态
○get_plan()
: 获取当前计划
○_get_current_step_index()
: 获取当前步骤索引
1.5. SWEAgent (swe.py)
- 软件工程师智能体
- 专注于:
○ 代码开发
○ 代码审查
○ 问题调试
1.6. Manus (manus.py)
- 继承自 ToolCallAgent,通用目的智能体
- 集成工具:
○ PythonExecute: Python 代码执行
○ GoogleSearch: 网络搜索
○ BrowserUseTool: 浏览器操作
○ FileSaver: 文件操作
○ Terminate: 终止操作
2. 调用流程
2.1. 初始化阶段
# 例如创建一个 Manus 代理实例
agent = Manus()
调用顺序:
- Manus 构造函数
- ToolCallAgent 构造函数
- ReActAgent 构造函数
- BaseAgent 构造函数
- BaseAgent.initialize_agent() 验证器运行
2.2. 运行阶段
result = await agent.run("用户的请求")
调用流程:
BaseAgent.run()
│
├── 检查初始状态(IDLE)
├── 更新内存(如果有请求)
│
└── 进入主循环
│
└── 循环执行 step() 直到达到 max_steps 或状态变为 FINISHED
│
└── step() 调用(在 ReActAgent 中实现)
│
├── think() (由具体代理实现)
│ │
│ └── ToolCallAgent.think()
│ │
│ └── 使用 LLM 决定下一步行动
│
└── act() (由具体代理实现)
│
└── ToolCallAgent.act()
│
└── 执行选定的工具
2.3. 详细执行流程
a. BaseAgent 层:
async def run(self, request: Optional[str] = None) -> str:
# 1. 状态检查
# 2. 处理初始请求
# 3. 进入执行循环
# 4. 检查是否卡住
# 5. 收集结果
b. ReActAgent 层:
async def step(self) -> str:
# 1. 思考(think)
# 2. 执行(act)
# 3. 返回结果
c. ToolCallAgent 层:
async def think(self) -> bool:
# 1. 准备提示词
# 2. 调用 LLM 获取响应
# 3. 处理工具调用
# 4. 更新内存
async def act(self) -> str:
# 1. 执行工具调用
# 2. 处理结果
# 3. 更新内存
d. 具体代理实现:
- PlanningAgent: 添加计划管理功能
- SWEAgent: 添加软件工程特定工具
- Manus: 添加通用工具集合
2.4. 关键组件交互
-
内存管理:
self.memory.add_message(Message.user_message(content)) self.memory.add_message(Message.assistant_message(content))
-
工具调用:
result = await self.available_tools.execute(name=tool_name, tool_input=args)
-
状态管理:
async with self.state_context(AgentState.RUNNING): # 执行操作
2.5. 错误处理和安全机制
- 状态转换保护
- 步数限制
- 循环检测
- 工具执行错误处理
2.6. 示例完整调用链
以执行一个简单任务为例:
# 1. 创建代理
agent = Manus()
# 2. 执行任务
result = await agent.run("执行一个任务")
# BaseAgent.run() 开始执行
# ReActAgent.step() 处理每个步骤
# ToolCallAgent.think() 决定使用什么工具
# LLM.ask_tool() 获取决策
# ToolCallAgent.act() 执行工具
# ToolCollection.execute() 执行具体工具
# 检查是否需要继续
# 返回执行结果