【Agent】OpenManus-Agent-BaseAgent详细分析

server/2025/3/17 12:47:03/
aidu_pl">

概述

BaseAgent 是一个抽象基类,用于管理Agent状态和执行流程。它提供了状态转换、内存管理和基于步骤的执行循环的基础功能。子类必须实现 step 方法来定义具体行为。

Class 参数

参数名称类型默认值描述
namestr必填agent 的唯一名称
descriptionOptional[str]Noneagent 的可选描述
system_promptOptional[str]None系统级指令提示
next_step_promptOptional[str]None确定下一步行动的提示
llmLLMLLM()LLM 实例
memoryMemoryMemory()Agent 的内存存储,见 xxx 详细设计
stateAgentStateAgentState.IDLE当前Agent状态
max_stepsint10允许 agent 轮次最大步骤数
current_stepint0执行中的当前步骤
duplicate_thresholdint2用来判断agent是否卡住的轮次次数,如果这次 message 的 role 和 content 跟 Memory message 的 role 和 content 一致,就会认为是重复,重复次数到 threshold,就会认为是卡住。

Optional[str] 是 Python 类型注解的一种写法,表示一个值可以是 str 类型(字符串),也可以是 None。它是 typing 模块中 Optional 类型的用法。

Fieldpydantic 库中的一个函数,用于为模型的字段提供额外的元数据和配置。name 字段是必填的(... 表示必填),并且有一个描述信息。

description、system_prompt、next_step_prompt 主要是由实现类来定义

类配置 (Config)

配置项描述
arbitrary_types_allowedTrue允许任意类型的字段,用于支持灵活的子类扩展。
extra“allow”允许子类中添加额外的字段,提供更大的灵活性。

Code trace

agent_34">initialize_agent

@model_validator(mode="after")
def initialize_agent(self) -> "BaseAgent":

功能:初始化Agent,如果未提供默认设置则使用默认设置。主要是针对 LLM 和 memory。

state_context

@asynccontextmanager
async def state_context(self, new_state: AgentState):

功能:安全管理Agent状态转换的上下文管理器。

设计理念

  • 使用上下文管理器模式确保状态的安全转换
  • 在异常情况下自动将状态设置为 ERROR
  • 在上下文退出时恢复先前状态,确保状态一致性
  • 提供了一种优雅的方式来临时更改Agent状态

update_memory

def update_memory(self, role: ROLE_TYPE, content: str, **kwargs) -> None:

功能:向Agent的内存中添加消息。

调用地址:baseAgent 里面的 run 方法,user request 的时候用的

设计理念

  • 使用工厂模式创建不同类型的消息
  • 支持所有标准角色(用户、系统、助手、工具)
  • 通过 kwargs 提供灵活性,特别是对于工具消息
  • 验证角色以防止无效消息

run

async def run(self, request: Optional[str] = None) -> str:if self.state != AgentState.IDLE:raise RuntimeError(f"Cannot run agent from state: {self.state}")if request:self.update_memory("user", request)results: List[str] = [] #agent 执行的结果 str 数组async with self.state_context(AgentState.RUNNING):while (# 检查是否超过最大步骤数self.current_step < self.max_steps and self.state != AgentState.FINISHED):self.current_step += 1logger.info(f"Executing step {self.current_step}/{self.max_steps}")step_result = await self.step()# 检查是否卡住if self.is_stuck():self.handle_stuck_state()results.append(f"Step {self.current_step}: {step_result}")if self.current_step >= self.max_steps:self.current_step = 0self.state = AgentState.IDLEresults.append(f"Terminated: Reached max steps ({self.max_steps})")return "\n".join(results) if results else "No steps executed"

功能:异步执行Agent的主循环。

设计理念

  • 使用状态上下文管理器确保状态一致性
  • 实现有限步骤循环以防止无限执行
  • 在每一步检查是否陷入循环
  • 收集并返回所有步骤的结果
  • 支持可选的初始用户请求

step

@abstractmethod
async def step(self) -> str:

功能:执行Agent工作流中的单个步骤。

实现的 subClass: ReActAgent

设计理念

  • 使用抽象方法强制子类实现特定行为
  • 允许不同类型的Agent定义自己的步骤逻辑
  • 返回字符串结果以便于日志记录和结果收集

handle_stuck_state

def handle_stuck_state(self):stuck_prompt = "\Observed duplicate responses. Consider new strategies and avoid repeating ineffective paths already attempted."

功能:通过添加提示来改变策略,处理卡住的状态。

is_stuck

def is_stuck(self) -> bool:

功能:通过检测重复内容来检查Agent是否陷入循环。当前 message 的 role 和 message 和上一条 Memory 中 message 的 role 和 message

属性方法

@property
def messages(self) -> List[Message]:@messages.setter
def messages(self, value: List[Message]):

功能:提供对Agent内存中消息的访问和修改。

设计理念

  • 使用属性装饰器提供对内部状态的受控访问
  • 允许直接设置消息列表,同时保持封装
  • 简化对消息历史的访问

总结

BaseAgent 提供了构建 Agent 的基础,包括状态管理、内存存储、执行控制和错误处理。它的设计允许创建各种类型的Agent,从简单的对话Agent到复杂的工具使用Agent。通过继承这个基类并实现 step 方法,可以创建具有特定行为的自定义Agent。

文章来源:https://blog.csdn.net/weixin_40242845/article/details/146303861
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/server/175701.html

相关文章

机器人技能列表

一、机器人制作基础入门 &#xff08;一&#xff09;机器人概述 1.机器人的定义与分类 2.机器人的发展历程与现状 3.机器人在各领域的应用案例 &#xff08;二&#xff09;必备工具与材料 4.常用电子工具介绍&#xff08;万用表、电烙铁等&#xff09; 5.机械加工工具&…

解决下载npm 缓存出现的问题

因为这几天一直在写项目&#xff0c;然后刚开始进行部署的时候遇到了一些问题&#xff0c;比如node版本问题&#xff0c;和npm缓存问题...还有element plus资源更新使用等问题&#xff0c;现在和大家分享一下我是如何解决的&#xff0c;希望对大家以后写项目的时候会有写帮助 当…

STM32F407——RTC实时时钟

1、RTC 简介 实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。 RTC 提供一个日历时钟、两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。 RTC 还包含用于管理低功耗模式的自动唤醒单元。 两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12…

【AHE数据集】 NCAR Anthropogenic Heat Flux (AHF) 数据集

数据概述 数据集由 美国国家大气研究中心(NCAR, National Center for Atmospheric Research) 的 气候与全球动力学实验室(CGD, Climate & Global Dynamics Laboratory) 提供。NCAR 由 美国国家科学基金会(NSF, National Science Foundation) 资助,并由 大学大气研究…

SQL与NoSQL的区别

以下是SQL与NoSQL数据库的详细对比&#xff0c;涵盖核心特性、适用场景及技术选型建议&#xff1a; 一、核心区别对比 特性SQL&#xff08;关系型数据库&#xff09;NoSQL&#xff08;非关系型数据库&#xff09;数据模型基于表格&#xff0c;严格预定义模式&#xff08;Schem…

K8S学习之基础二十九:K8S中的secret

K8S中的secret ​ configMap是用来存放明文数据的&#xff0c;如环境变量、配置文件等&#xff0c;对于蜜柑数据&#xff0c;如密码、私钥等数据&#xff0c;就要用到secret类型。 ​ secret可选参数&#xff1a; ​ 1、generic&#xff1a;通用类型&#xff0c;通常用于存储…

STM32 —— MCU、MPU、ARM、FPGA、DSP

在嵌入式系统中&#xff0c;MCU、MPU、ARM、FPGA和DSP是核心组件&#xff0c;各自在架构、功能和应用场景上有显著差异。以下从专业角度详细解析这些概念&#xff1a; 一、 MCU&#xff08;Microcontroller Unit&#xff0c;微控制器单元&#xff09; 核心定义 集成系统芯片&a…

Ubuntu 22.04 无法进入图形界面的解决方法

Ubuntu 22.04 无法进入图形界面&#xff0c;只能进入 tty&#xff0c;可能是由于图形界面相关的配置或驱动程序出现了问题。以下是一些常见的解决方法&#xff1a; 1. 检查图形界面服务状态 首先&#xff0c;检查图形界面服务&#xff08;通常是 gdm 或 lightdm&#xff09;的…