手把手带你理解OpenManus

从 OpenManus 看 Agent 智能体实现及概念辨析 这可能是对Agent智能体解释的最明白的一篇文章 阅读详情
AI摘要

本文深入剖析OpenManus的实现,介绍其app目录下各结构,重点分析了agent目录中多个模块及对应Agent类。梳理了多个Agent类(如BaseAgent、ReActAgent等)的继承关系和方法调用逻辑,总结出各Agent类特点及调用逻辑实现方式,鼓励读者实践。

我之前演示过几个OpenManus的demo,其实也就是demo,包括manus,现在也就是demo阶段,复杂的plan和flow,现在的代码支撑和LLM的能力都有待改善,但是我们这期不是吐槽文章,是来把OpenManus给打开看看它的实现是怎么样的,其实Manus也都差不多,甚至OWL也都差不多,我们看一个就够了

Image

其他的几个目录也没啥特别需要看的,就看app

Image

app里面有这么几个结构

1- agent 没啥好解释的

2- flow 就是来做multiagent的planning和管理任务框架的

3- prompt 

Image

都是这种形式,来定义系统提示词和agent的role

4- tool

Image

纯纯干活的了

Image

Image

主要看最重要的目录agent

大概总体分这么几个agent

先看base:base.py 模块定义了抽象基类 BaseAgent,用于管理代理的状态、内存、执行循环(包括运行、步骤执行、卡住处理)和消息,并提供初始化和配置功能,为构建具有特定行为的代理提供基础框架。

在看planning:planning.py模块定义了PlanningAgent类,该代理通过PlanningTool和Terminate等工具创建、管理和执行任务计划。它具有初始化、计划创建(create_initial_plan)、思考(think)、行动(act)、计划状态更新(update_plan_status)、步骤跟踪(step_execution_tracker)等功能,并能根据工具执行结果动态调整计划,处理初始请求(run)并检索当前计划状态(get_plan)。

然后是 react.py:react.py模块定义了继承自BaseAgent的抽象类ReActAgent,它通过think(思考,决定下一步行动) 和act(执行行动) 两个抽象方法(需子类实现)以及step方法(整合think和act)来处理和执行任务,并提供基础的任务处理框架。

swe和tool就是 指从code和tool了

manus.py:manus.py模块定义了Manus类,一个继承自ToolCallAgent(实际上你前面提到了继承自 PlanningAgent, 请确认是哪个) 的通用智能代理。Manus具有预定义的名称、描述、系统提示、步骤限制(max_observe,max_steps),并利用包含PythonExecute、WebSearch、BrowserUseTool、FileSaver和Terminate等工具的available_tools集合来执行各种任务,并通过_handle_special_tool方法处理(如清理)BrowserUseTool的结果。

好的,我们来梳理一下这些代码的调用逻辑。这里涉及到多个Agent类(BaseAgent,ReActAgent,ToolCallAgent,PlanningAgent,SWEAgent,Manus),以及它们之间的继承关系和方法调用。我用文字描述,并结合伪代码(因为好解释

Image

)来表示调用流程。

1. 总体继承关系:

      BaseAgent (抽象基类)
  └─ ReActAgent (抽象基类)
      └─ ToolCallAgent
          ├─ PlanningAgent
          ├─ SWEAgent
          └─ Manus    

2.BaseAgent(核心基类):

  • 核心方法:

    • __init__: 初始化Agent的基本属性(name, description, llm, memory, state, max_steps等)。

    • initialize_agent: 使用model_validator在对象创建后进行进一步初始化(设置默认的LLM和Memory)。

    • state_context: 一个异步上下文管理器,用于安全地更改Agent的状态(IDLE, RUNNING, ERROR等)。

    • update_memory: 将消息添加到Agent的内存中。

    • run: Agent的主执行循环。它会循环调用step()方法,直到达到max_steps或状态变为FINISHED。

    • step:抽象方法,必须由子类实现。执行Agent的单个步骤。

    • is_stuck: 检查智能体是否卡住。

    • handle_stuck_state: 处理卡住的状态。

    • messages: 属性,用于获取和设置消息。

  • 调用流程 (以run方法为例):

      async run(request):  if state != IDLE:    raise RuntimeError
  if request:    update_memory(USER, request)
  async with state_context(RUNNING):    while current_step < max_steps and state != FINISHED:      current_step += 1      step_result = await step()  # 调用子类的 step() 方法      if is_stuck():         handle_stuck_state()
      results.append(step_result)
    if current_step >= max_steps:      state = IDLE      results.append("Terminated: Reached max steps")
  return "\n".join(results)

3.ReActAgent(ReAct模式的基类):

  • 继承自:BaseAgent

  • 核心方法:

    • think:抽象方法,由子类实现。思考下一步行动。

    • act:抽象方法,由子类实现。执行行动。

    • step: 实现了BaseAgent的step方法。依次调用think()和act()。

  • 调用流程 (以step方法为例):

4.ToolCallAgent(支持工具调用的Agent):

async step():  should_act = await think()  # 调用子类的 think()  if should_act:    return await act()  # 调用子类的 act()  else:    return "Thinking complete - no action needed"

  • 继承自:ReActAgent

  • 核心方法:

    • __init__: 初始化工具相关的属性 (available_tools, tool_choices, special_tool_names, tool_calls等)。

    • think: 根据当前状态和可用工具,决定是否调用工具。使用LLM进行决策。

    • act: 执行工具调用,并处理工具的输出。

    • execute_tool: 执行具体的工具调用。

    • _handle_special_tool: 处理特殊工具。

  • 调用流程 (以think和act为例):

    async think():  # ... (准备消息和工具信息) ...  response = await llm.ask_tool(...) # 让LLM决定是否调用工具,以及调用哪个工具  if response.tool_calls:     self.tool_calls = response.tool_calls     return True # 需要执行工具  else:     return False
    async act():   if self.tool_calls:      tool_call = self.tool_calls.pop(0) # 取出第一个工具调用      result = await execute_tool(tool_call)      await _handle_special_tool(tool_call.function.name,result) # 如果是特殊工具,则处理。      update_memory(TOOL, result, tool_call_id=tool_call.id)      return result   else:       return "No tool to execute"

5.PlanningAgent(规划型Agent):

  • 继承自:ToolCallAgent

  • 核心方法:

    • initialize_plan_and_verify_tools: 初始化计划ID并验证是否有PlanningTool。

    • think: 获取当前计划状态,并让LLM决定下一步行动(包括是否调用工具)。

    • act: 执行工具调用,并更新计划状态。

    • get_plan: 获取当前计划。

    • create_initial_plan: 根据用户请求创建初始计划。

    • update_plan_status: 根据工具执行结果更新计划步骤的状态。

    • _get_current_step_index: 获取当前计划中第一个未完成步骤的索引。

  • 调用流程 (更详细,以run->think->act为例):

async run(request):  if request:     await create_initial_plan(request)  return await super().run()  # 调用 ToolCallAgent.run() -> ReActAgent.run() -> BaseAgent.run()

async create_initial_plan(request):  # 1. 构造消息,让 LLM 创建计划  messages = [...]  response = await llm.ask_tool(..., tool_choice=ToolChoice.AUTO)
  # 2. 处理 LLM 的响应,提取工具调用(应该是 planning 工具的调用)  for tool_call in response.tool_calls:    if tool_call.function.name == "planning":      result = await execute_tool(tool_call) # 执行 planning 工具      # 3. 将工具执行结果(计划)存入内存      update_memory(TOOL, result, tool_call_id=tool_call.id)

async think():    prompt = f"CURRENT PLAN STATUS:\n{await self.get_plan()}\n\n{self.next_step_prompt}"    self.messages.append(Message.user_message(prompt))    self.current_step_index = await self._get_current_step_index()    result = await super().think() # 调用 ToolCallAgent 的 think()
    if result and self.tool_calls:       # 记录工具和步骤的关联       latest_tool_call = self.tool_calls[0]       if latest_tool_call 不是 planning tool 且 不是 special tool:           self.step_execution_tracker[latest_tool_call.id] = {               "step_index": self.current_step_index,               "tool_name": latest_tool_call.function.name,                "status": "pending"           }    return result
async act():   result = await super().act() # 调用 ToolCallAgent 的 act()   if self.tool_calls:       latest_tool_call = self.tool_calls[0]       if latest_tool_call.id in self.step_execution_tracker:          self.step_execution_tracker[latest_tool_call.id]["status"] = "completed"          self.step_execution_tracker[latest_tool_call.id]["result"] = result
          if latest_tool_call 不是 planning tool 且 不是 special tool:              await self.update_plan_status(latest_tool_call.id)   return result

async update_plan_status(tool_call_id):  # 1. 检查 tool_call_id 是否在 tracker 中,以及状态是否为 completed  # 2. 调用 planning 工具的 mark_step 命令,将对应步骤标记为 completed
async _get_current_step_index():   # 1. 获取当前计划 (文本)   # 2. 解析计划文本,找到第一个 [ ] 或 [→] 的步骤   # 3. 调用 planning 工具的 mark_step 命令,将当前步骤设置为 in_progress   # 4. 返回步骤索引

6.SWEAgent(软件工程师Agent):

  • 继承自:ToolCallAgent

  • 核心方法:

    • think: 更新工作目录,并使用格式化的next_step_prompt。然后调用父类的think。

  • 调用流程 (以think为例):

async think():  self.working_dir = await self.bash.execute("pwd")  # 获取当前工作目录  self.next_step_prompt = self.next_step_prompt.format(current_dir=self.working_dir) # 更新提示  return await super().think()  # 调用 ToolCallAgent 的 think()

7.Manus(通用Agent):

  • 继承自:ToolCallAgent

  • 特点:拥有更广泛的工具集 (PythonExecute, WebSearch, BrowserUseTool, FileSaver, Terminate)。

  • _handle_special_tool: 重写此方法,处理BrowserUseTool的清理工作。

那么好,我们总结一下:

  • BaseAgent提供了Agent的基本框架和执行循环。

  • ReActAgent引入了 "思考-行动" 模式。

  • ToolCallAgent增加了工具调用的能力。

  • PlanningAgent、SWEAgent和Manus是ToolCallAgent的具体实现,分别针对不同的任务类型。

  • 调用逻辑主要通过继承和重写think、act和step方法来实现。

  • PlanningAgent具有更复杂的内部状态管理,用于跟踪计划的执行。

画出来就是下图这样

Image

总体调用的抽象感觉就是下图这样

Image

好了今天这节课就解释到这,大家可以结合我的解释自己去run一下代码,甚至自己按着这个逻辑来新写一套multi-agents的框架也不是特别难的事

那么就到这里,再见吧!

Image

OpenManus云端部署及经典案例应用 玩家通过方向键控制蛇的移动,程序能即时检测蛇与食物的碰撞并更新蛇的长度,同时判断蛇是否撞墙或撞到自己,当发生碰撞时游戏结束。此外,它还提供了极大的发挥空间,能基于此轻松地拓展游戏规则、加入新的功能模块,像是调整蛇的移动速度、设计多种障碍物或食物类型,又或是融入计时器来提升游戏的挑战性等,从而进一步加深对Pygame编程的领悟与运用能力。本次活动将以领团学习的形式进行,为此我们将除招募对此活动感兴趣的参与者外,也招募学习领团人,只要你热爱技术,想要成长,无论是个人社区创建者,还是万粉博主,都可以点击。 阅读详情

相关推荐

AI Agent与OpenManus

AI Agent(人工智能智能体)是一种能够在特定环境中自主感知、推理、决策并执行任务的智能系统。与传统的生成式AI(如ChatGPT)相比,AI Agent不仅能生成文本或回答问题,还能像人类一样完成实际操作,例如自动化处理文件、爬取网页数据、规划旅行或分析股票数据。核心特性自主性:无需持续人工干预,独立完成任务。感知与交互:通过API、文件输入、网页交互等方式感知环境。推理与规划:理解复杂指令,拆解任务并制定执行计划。行动能力:调用外部工具(如Python脚本、浏览器)执行任务。学习与适应。

Rhett_Butler0922的博客 1344

OpenManus介绍及本地部署体验

OpenManus,由 MetaGPT 团队精心打造的开源项目,于2025年3月发布。它致力于模仿并改进 Manus 这一封闭式商业 AI Agent 的核心功能,为用户提供无需邀请码、可本地化部署的智能体解决方案。换句话说,OpenManus 就像一位全能的数字助手,能够在你的本地设备上运行,随时听候差遣,完成各种复杂任务。它的出现,打破了技术领域的高墙,让每一位开发者都有机会站在同一起跑线上,快速实现诸如代码生成、数据分析、网络信息检索等复杂任务的自动化处理。

寸先生的AI道路 3万+

OpenManus:开源版Manus的快速安装及使用「喂饭教程」

OpenManus是由 MetaGPT 社区成员开发的Manus开源版本。与 Manus 相比,OpenManus 的主要优势在于其本地化部署能力,用户可以在个人电脑上运行 AI 代理,并观察其执行任务的过程。

blues_C的博客 1万+

OpenManus 开源智能体(AI Agent)框架介绍

OpenManus 以开源精神打破了封闭式 AI Agent 的局限性,通过模块化工具链和 LLM 协作机制,为开发者提供了高效、透明的任务自动化解决方案。尽管当前版本功能尚处初级阶段,但其灵活的架构和社区驱动的开发模式,使其有望成为通用型智能体领域的标杆项目。1. 定义与背景OpenManus 是由 MetaGPT 团队开发的开源通用型 AI 智能体框架,旨在复刻并优化 Manus(一款封闭式商业 AI Agent)的核心功能,提供无需邀请码、本地化部署的智能体解决方案。

学亮编程手记 7338

libfacedetection 框架阅读及扩展经验

libfacedetection 框架源码解析与扩展心得1. libfacedetection 框架简介2. 源码解析2.1 facedetectcnn.h2.2 facedetectcnn.cpp2.3 facedetectcnn-model.cpp3. 其他层的扩展--depthwise convolution 前段时间因为工作需要,对libfacedetection框架做了些扩展,在阅读源...

weixin_42616332的博客 1500

告别Vivado自带编辑器!手把手教你用Sublime Text 4 + Icarus Verilog搭建FPGA开发环境(Windows 10/11)

本文详细介绍如何在Windows 10/11系统下,使用Sublime Text 4和Icarus Verilog搭建高效的FPGA开发环境,替代Vivado自带编辑器。通过配置语法检查、代码高亮和智能补全等功能,提升Verilog开发效率,实现专业级工作流。

weixin_30684743的博客 427

产品经理一文读懂互联网广告与DSP

这两天的朋友圈算是被Manus彻底攻陷了,这个号称“数字实习生”的AI工具,能三分钟生成股票分析报告、自动筛简历,连PPT排版都包办。马上一个叫OpenManus的开源项目突然杀出来,开发者是MetaGPT团队的五个程序员,据说只用了三小时就搞出了“平替版”。不用抢邀请码、不用交钱,代码直接甩在GitHub上,三四天的时间已经快16K的star了,看看这增速:官方地址:https://github.com/mannaandpoem/OpenManus。

zyjwjck的博客 5013

keil自动分配SDRAM空间设置使用

1.修改.sct文件。

qizhi321123的博客 1404

OpenManus 保姆级入门指南

OpenManus 保姆级入门指南

永远保持随时离开的技术能力! 6975

利用Python爬虫获取淘宝商品评论:实战案例分析

在数字化时代,数据的价值日益凸显,尤其是对于电商平台而言,商品评论作为用户反馈的重要载体,蕴含着丰富的信息。本文将详细介绍如何利用Python爬虫技术获取淘宝商品评论,包括代码示例和关键步骤解析。

2401_87849335的博客 2833

深度解析NXP AMCLIB状态观测器:PMSM无感FOC控制实战指南

状态观测器是现代电机控制中的核心算法,它基于电机数学模型,通过测量定子电压和电流,实时估算出转子的位置和速度,从而替代了传统的物理传感器。其原理遵循“预测-校正”的闭环结构,通过比较模型预测值与实际采样值的误差,不断修正内部状态估计。这项技术的核心价值在于实现了无传感器控制,显著降低了系统成本、提升了可靠性与紧凑性,广泛应用于伺服驱动、变频器、电动汽车和家电等领域。本文聚焦于NXP AMCLIB库中的角度跟踪观测器和反电动势观测器,深入剖析其设计思路、固定点运算实现以及参数整定方法,为工程师在永磁同步电机无

cumi7754的博客 2829

OpenManus实战:从入门到放弃

OpenManus实战操作,一步步带你跑通OpenManus

沙门空海 2344

飞凌OK3588-C Linux R4系统下MIPI YUV摄像头CSI尺寸错误排查与极性适配方案

本文详细介绍了在飞凌OK3588-C平台的Linux R4系统下调试MIPI YUV摄像头时遇到的'csi size err'错误排查与极性适配方案。通过分析信号极性、驱动参数调整及FPGA协同调试,提供了从硬件检测到系统级调试的完整解决方案,帮助开发者快速解决类似问题。

bean的博客 258

OpenManus 本地化部署

OpenManus的部署与使用

1714

Veeam Backup Replication Console 13 备份 PVE

本文介绍了如何通过Veeam Backup & Replication控制台配置与Proxmox VE(PVE)服务器的连接,包括主机地址、用户名密码和SSH信任设置。随后详细说明了部署备份Worker虚拟机的步骤,涵盖网络配置和VM创建。接着指导用户创建PVE虚拟机备份任务,包括命名、选择备份对象、存储位置、备份类型设置,以及配置备份计划任务。最后描述了备份测试执行过程,从启动备份到完成状态通知的完整流程。整个操作涉及服务器连接、Worker部署、备份配置和任务执行四个主要环节。

极致,细节 1601

2024年CSP-X复赛真题题解(T1:购物)

2024年CSP-X复赛真题题解(T1:购物)

王老师青少年编程 1179

OpenManus深度解析(1) - 执行流程概述

OpenManus原理深入解析,彻底明白智能体底层是如何工作的。

1562

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Openmanus复现教程:打造自己的Agent助手

摘要: OpenManus是一款开源AI开发辅助工具,可替代Manus实现代码生成与任务自动化。本文提供详细复现教程:1) 通过Anaconda创建Python 3.12虚拟环境;2) 克隆GitHub源码并安装依赖;3) 配置config.toml文件;4) 输入自然语言需求(如"生成DDPG训练代码")获得完整代码框架;5) 在workspace中安装依赖并成功运行生成代码。实测显示,生成的DDPG算法能有效训练Gym环境模型,实现"需求→代码→执行"全流程闭环,

Moresweet 猫甜 1151

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

对比Manus、OpenManus与OWL技术架构

Manus是一个真正自主的AI代理,能够解决各种复杂且不断变化的任务。其名称来源于拉丁语中"手"的意思,象征着它能够将思想转化为行动的能力。与传统的AI助手不同,Manus不仅能提供建议或回答,还能直接交付完整的任务结果。作为一个"通用型AI代理",Manus能够自主执行任务,从简单的查询到复杂的项目,无需用户持续干预。用户只需输入简单的提示,无需AI知识或经验,即可获得高质量的输出。这种"一步解决任何问题"的设计理念使Manus区别于传统的AI工作流程,更易于普通用户使用。

2401_84204207的博客 1606

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

OpenManus 火了!一文带你搞懂 AI Agent 新秀 OpenManus到底是什么?

文章摘要: OpenManus是一款开源AIAgent框架,被誉为"会干活的AI",不同于传统问答式AI(如ChatGPT),它能自主规划、调用工具并执行多步骤任务(如调研、代码开发、数据分析)。其核心架构包含Planner(任务拆解)、Reasoner(推理)、Tools(工具库)等组件,通过ReAct模式循环(思考→行动→观察)实现复杂任务自动化。优势在于开源可扩展、支持多模型,但存在Token消耗大、执行速度慢等局限。与商业产品Manus不同,OpenManus更侧重开发者生态,为

2503_94545876的博客 917

OpenManus终极入门指南:一文读懂,上手你的AI智能体

你是否曾幻想过拥有一个能听懂你“人话”,并能自动操作电脑完成任务的智能助手?OpenManus就是这样一个为你量身打造的开源AI智能体(Agent)框架。它如同一位任劳任怨的“数字员工”,能帮你处理从数据搜集、代码编写到自动化测试等一系列复杂任务。本文将以最浅显易懂的方式,带你走进OpenManus的世界,让你轻松上手,成为AI时代的主人。

牛奶夹心巧克力 1713

【学习笔记】如何在openmanus中添加自定义tool

openmanus支持多种工具,比如本地文件的读写、命令行操作、浏览器操作、搜索功能、执行python代码等等。而我们很可能不会满足于仅仅浏览一下网页,写几个python程序之类的,还有更重要的事情要做,比如手搓原子弹、火星探索、保卫宇宙…为了更愉快地玩耍,不得不面对这个问题:如何添加自定义tool?首先看下openmanus tools的特点。这些tool全部都在app/tool/这个路径下。几乎每一个tool类都是这种结构tool名称tool介绍tool参数。

orientharp的博客 1923

OpenManus代码详解(六): 代码调用流程

当代理执行完成(或达到最大步数),控制权返回到 main.py 的循环,等待下一个用户输入。

南城同学的博客 1574

OpenManus代码解读

可以看到,OpenManus的代码抽象得很好,实现也很简单。虽然有不少类实现了,却并没有使用,这应该是因为OpenManus的代码还在编写中,还没有最终定稿,但这并不影响我们阅读和理解它的代码。Agent确实会是AI的下一个风口和热点,接下来几年会有大量Agent的出现,对于程序员来讲,通过阅读OpenManus的源代码,可以让我们更好地理解AI Agent的实现原理,帮助我们更好地跟进AI Agent的技术趋势。关注我,下篇文章解读transformers库中的Agent代码实现。

giraffe73的博客 959

取代Manus的开源OpenManus实测体验

本文从最近火爆的通用AI agent出发,介绍了开源的OpenManus的实测情况和分享。

heiyeluren的blog(黑夜路人的开源世界) 1341

3步彻底解决OpenManus对接自建LLM时的API 400错误

作为技术文章写手,我将为您详细解析OpenManus项目对接自建大语言模型服务时常见的API 400错误。当您尝试将开源AI智能体框架OpenManus与本地部署的LLM服务集成时,可能会遇到"auto tool choice requires --enable-auto-tool-choice and --tool-call-parser to be set"这样的错误提示。本文将深入剖析问题根

gitblog_00187的博客 674
上一篇: 你理解的控制LLM幻觉的方法可能是错的
下一篇: 除了rag和train有没有其他方式给模型注入知识?
周博洋K
博客等级 码龄9年 2005粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值