专注、坚持

浅析 OpenManus 智能体框架

2025.03.11 by kingcos

概览

最近,Manus 的爆火再次引发了智能体 agent 的热潮,OpenManus 作为其开源实现之一,也受到了不少关注,GitHub Star 数目前已经突破 30,000+。撇开营销与评价不谈,本文将基于源码进行简单分析,窥探其实现大模型执行复杂任务的原理与流程。

基本信息

  • 代码版本:e1a8cf0
  • 主要语言:Python
  • 开源协议:MIT

系统架构

OpenManus 的主要执行流程(main.py)为:

  1. 创建 Manus 智能体
  2. 等待用户输入任务描述(prompt)
  3. 智能体执行(run -> step)并选择是否使用工具(think -> act
  4. 若需要使用,则工具执行并返回结果到智能体
  5. 智能体更新记忆
  6. 继续执行下一步(step
  7. 直至智能体达到最大执行次数结束

系统架构如下:

OpenManus 系统架构

其核心组件主要有:

  • 智能体(agent):负责思考、规划、执行任务
  • 工具(tool):负责为智能体提供各类工具能力,例如 Google 搜索、代码执行等
  • 流(flow):负责编排和协调智能体执行(可选)
  • LLM:负责提供大语言模型接口

举个例子,如果把智能体比作我们自己,现在要执行做一道菜的任务,那么工具就类似锅、碗、刀、铲等,LLM 就是我们的大脑和手。如果加上流,那么就更像是一个后厨,智能体就类似厨师,工具就类似厨具,流就类似经理,负责统筹安排所有厨师的工作。

核心组件

智能体(agent)

在 OpenManus 中,智能体的实现主要分为抽象智能体具象智能体两类,前者为后者提供基础功能,后者则继承前者并实现具体功能。

抽象智能体:

  1. BaseAgent:所有智能体的抽象基类。提供状态生命周期管理(AgentState)、记忆(Memory)与消息(Message)管理、执行循环(run)、死循环检测与处理机制(handle_stuck_state)、以及配置与初始化等基础功能
  2. ReActAgent:继承自 BaseAgent,定义思考(think)和行动(act)的运行机制(step),便于子类继承并实现
  3. ToolCallAgent:继承自 ReActAgent,基于大模型(LLM)的工具调用机制实现具体的思考和行动逻辑。其实该智能体已经可以直接使用,但由于没有定义为具体的工具类型,因此这里仍将其归类为抽象智能体

具象智能体(均继承自 ToolCallAgent):

  1. Manus:通用智能体,集成多种工具解决各类任务,如 Python 代码执行、Google 搜索、浏览器使用、文件操作等,从 main.py 或 run_flow.py 中执行的都是 Manus 智能体
  2. PlanningAgent:规划智能体,适合需要复杂规划的场景,基于大模型的工具(PlanningTool)调用机制实现,默认情况下不会执行该智能体
  3. SWEAgent:软件工程(Software Engineering)智能体,集成 BashStrReplaceEditor 等工具,默认情况下不会执行该智能体

智能体所需的提示词(Prompt)被单独定义在 prompt 目录中,可便于后期迭代与维护。

工具(tool)

在上一节中,我们提到 ToolCallAgent 是基于大模型的工具调用机制实现的。工具调用(Tool Calling),也称函数调用(Function Calling),指的是在请求大模型时可以传入一组工具,由模型自主选择是否使用以及具体使用哪些工具,并返回 JSON 结构化数据便于开发者调用工具,扩展模型能力。流程类似下图:

Function Calling - OpenAI

在 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 下的主要执行流程为:

  1. 等待用户输入任务描述(prompt)
  2. 根据智能体字典(多智能体)创建流,即构造 PlanningFlow
  3. 执行流,即 PlanningFlowexecute 方法
  4. 基于大模型的工具调用机制创建初始规划
  5. 开始执行规划
  6. 获取当前步骤合适的智能体并执行(run,后续同主要流程)
  7. 标记当前步骤完成
  8. 重复执行步骤 6 和 7,直至规划步骤为空

在 OpenManus 中,流的实现也分为抽象基类和具体实现:

  1. BaseFlow:所有流的抽象基类,定义流接口和参数规范。一个流可以包括多个智能体,具体的执行方法由子类继承实现
  2. PlanningFlow:继承自 BaseFlow,负责实现规划流的具体执行逻辑,包括初始规划的创建、规划步骤的执行等

规划流的创建基于 FlowFactory 工厂类,使得外部需要创建规划流时,只需传入流类型与智能体字典(agents)即可,具体实现由工厂类内部完成,而无需关心规划流的智能体配置。

总结

总的来说,OpenManus 基于现有大模型的工具调用机制,结合 Python 生态中的各类工具,实现了一套简洁有效的智能体方案。项目架构清晰,模块职责明确,为大模型执行复杂任务提供了参考,也为我们实现类似诉求提供了思路。

参考