概览
最近,Manus 的爆火再次引发了智能体 agent 的热潮,OpenManus 作为其开源实现之一,也受到了不少关注,GitHub Star 数目前已经突破 30,000+。撇开营销与评价不谈,本文将基于源码进行简单分析,窥探其实现大模型执行复杂任务的原理与流程。
基本信息
- 代码版本:e1a8cf0
- 主要语言:Python
- 开源协议:MIT
系统架构
OpenManus 的主要执行流程(main.py)为:
- 创建 Manus 智能体
- 等待用户输入任务描述(prompt)
- 智能体执行(
run
->step
)并选择是否使用工具(think
->act
) - 若需要使用,则工具执行并返回结果到智能体
- 智能体更新记忆
- 继续执行下一步(
step
) - 直至智能体达到最大执行次数结束
系统架构如下:
其核心组件主要有:
- 智能体(agent):负责思考、规划、执行任务
- 工具(tool):负责为智能体提供各类工具能力,例如 Google 搜索、代码执行等
- 流(flow):负责编排和协调智能体执行(可选)
- LLM:负责提供大语言模型接口
举个例子,如果把智能体比作我们自己,现在要执行做一道菜的任务,那么工具就类似锅、碗、刀、铲等,LLM 就是我们的大脑和手。如果加上流,那么就更像是一个后厨,智能体就类似厨师,工具就类似厨具,流就类似经理,负责统筹安排所有厨师的工作。
核心组件
智能体(agent)
在 OpenManus 中,智能体的实现主要分为抽象智能体和具象智能体两类,前者为后者提供基础功能,后者则继承前者并实现具体功能。
抽象智能体:
BaseAgent
:所有智能体的抽象基类。提供状态生命周期管理(AgentState
)、记忆(Memory
)与消息(Message
)管理、执行循环(run
)、死循环检测与处理机制(handle_stuck_state
)、以及配置与初始化等基础功能ReActAgent
:继承自BaseAgent
,定义思考(think
)和行动(act
)的运行机制(step
),便于子类继承并实现ToolCallAgent
:继承自ReActAgent
,基于大模型(LLM
)的工具调用机制实现具体的思考和行动逻辑。其实该智能体已经可以直接使用,但由于没有定义为具体的工具类型,因此这里仍将其归类为抽象智能体
具象智能体(均继承自 ToolCallAgent
):
Manus
:通用智能体,集成多种工具解决各类任务,如 Python 代码执行、Google 搜索、浏览器使用、文件操作等,从 main.py 或 run_flow.py 中执行的都是Manus
智能体PlanningAgent
:规划智能体,适合需要复杂规划的场景,基于大模型的工具(PlanningTool
)调用机制实现,默认情况下不会执行该智能体SWEAgent
:软件工程(Software Engineering)智能体,集成Bash
、StrReplaceEditor
等工具,默认情况下不会执行该智能体
智能体所需的提示词(Prompt)被单独定义在 prompt 目录中,可便于后期迭代与维护。
工具(tool)
在上一节中,我们提到 ToolCallAgent
是基于大模型的工具调用机制实现的。工具调用(Tool Calling),也称函数调用(Function Calling),指的是在请求大模型时可以传入一组工具,由模型自主选择是否使用以及具体使用哪些工具,并返回 JSON 结构化数据便于开发者调用工具,扩展模型能力。流程类似下图:
在 OpenManus 中,BaseTool
是所有工具的抽象基类,定义工具接口和参数规范;ToolResult
表示工具执行结果的标准格式,包含输出、错误和系统消息;ToolCollection
是负责管理多个工具的集合,提供统一的访问接口。
具体的工具目前有以下 9 种:
工具 | 描述 | 关联智能体 |
---|---|---|
Bash |
执行 Shell 命令 | SWEAgent |
BrowserUseTool |
基于 browser_use 库操作浏览器 |
Manus |
CreateChatCompletion |
创建结构化的 AI 响应内容 | ToolCallAgent |
FileSaver |
保存内容到文件 | Manus |
GoogleSearch |
Google 搜索工具 | Manus |
PlanningTool |
创建和管理计划,跟踪计划步骤 | PlanningAgent |
PythonExecute |
执行 Python 代码 | Manus |
StrReplaceEditor |
文件查看和编辑工具 | SWEAgent |
Terminate |
终止代理执行 | All |
流(flow)
根据现有代码逻辑,main.py 在执行过程中并不会使用到流组件,只有执行 run_flow.py 时才会使用到,因此也只有后者才能被称作是多智能体(Multi-Agent)架构。
run_flow.py 下的主要执行流程为:
- 等待用户输入任务描述(prompt)
- 根据智能体字典(多智能体)创建流,即构造
PlanningFlow
- 执行流,即
PlanningFlow
的execute
方法 - 基于大模型的工具调用机制创建初始规划
- 开始执行规划
- 获取当前步骤合适的智能体并执行(
run
,后续同主要流程) - 标记当前步骤完成
- 重复执行步骤 6 和 7,直至规划步骤为空
在 OpenManus 中,流的实现也分为抽象基类和具体实现:
BaseFlow
:所有流的抽象基类,定义流接口和参数规范。一个流可以包括多个智能体,具体的执行方法由子类继承实现PlanningFlow
:继承自BaseFlow
,负责实现规划流的具体执行逻辑,包括初始规划的创建、规划步骤的执行等
规划流的创建基于 FlowFactory
工厂类,使得外部需要创建规划流时,只需传入流类型与智能体字典(agents
)即可,具体实现由工厂类内部完成,而无需关心规划流的智能体配置。
总结
总的来说,OpenManus 基于现有大模型的工具调用机制,结合 Python 生态中的各类工具,实现了一套简洁有效的智能体方案。项目架构清晰,模块职责明确,为大模型执行复杂任务提供了参考,也为我们实现类似诉求提供了思路。