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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值