当前位置: 首页 > news >正文

OpenManus代码详解(一):app/agent

请添加图片描述

往期推荐:

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() 执行具体工具
        # 检查是否需要继续
    # 返回执行结果

相关文章:

  • seay代码审计工具的使用
  • ROS2——节点
  • Linux应用:PCB、fork
  • Linux C++ 编程死锁详解
  • JAVA-Thread类实现多线程
  • 想怎么测就怎么测?CAD“弧线智能打断”,让测量不再受限!
  • 【机器学习】迁移学习(Transfer Learning)
  • 多模态自适应融合技术:轻量级AutoFusion与GAN-Fusion详解
  • 如何设计微服务及其设计原则?
  • Redis--zset类型
  • 使用conda将python环境打包,移植到另一个linux服务器项目中
  • IO多路转接 ——— select、poll、epoll
  • C# NX二次开发:获取模型中所有的草图并获取草图中的对象
  • PostgreSQL 多数据库集簇配置及多数据库复制方法【流程+代码实例】
  • 【操作系统安全】任务2:用户与用户组
  • 手写智能指针shared_ptr
  • 【软考网工-实践篇】DHCP 动态主机配置协议
  • springboot436-基于SpringBoot的汽车票网上预订系统(源码+数据库+纯前后端分离+部署讲解等)
  • Windsurf初体验
  • CUDA编程之OpenCV与CUDA结合使用
  • 龙岗建设高端网站/搜索推广出价多少合适
  • 用手机做网站的软件/网页设计制作
  • jquery 手机网站开发/seo关键词优化软件手机
  • 网站建设专员工作职责/北京网站营销与推广
  • 外国人做僾视频网站/东莞seo优化seo关键词
  • 做网站css常用元素/网站关键词排名优化