往期推荐:
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
这个文件定义了项目中使用的核心数据模型。
1. AgentState 枚举类
class AgentState(str, Enum):
"""代理执行状态枚举"""
IDLE = "IDLE" # 空闲状态
RUNNING = "RUNNING" # 运行状态
FINISHED = "FINISHED" # 完成状态
ERROR = "ERROR" # 错误状态
- 继承自 str 和 Enum,定义了代理可能的状态
- 用于跟踪和管理代理的执行状态
2. Function 和 ToolCall 类
class Function(BaseModel):
name: str # 函数名称
arguments: str # 函数参数(JSON字符串)
class ToolCall(BaseModel):
"""表示消息中的工具/函数调用"""
id: str # 调用ID
type: str = "function" # 调用类型
function: Function # 函数信息
- 定义了工具调用的数据结构
- 用于处理 LLM 的函数调用请求
3. Message 类
class Message(BaseModel):
"""表示对话中的消息"""
# 基本属性
role: Literal["system", "user", "assistant", "tool"] # 消息角色
content: Optional[str] = None # 消息内容
tool_calls: Optional[List[ToolCall]] = None # 工具调用列表
name: Optional[str] = None # 工具名称
tool_call_id: Optional[str] = None # 工具调用ID
# 运算符重载
def __add__(self, other) -> List["Message"]:
"""支持 Message + list 或 Message + Message"""
def __radd__(self, other) -> List["Message"]:
"""支持 list + Message"""
# 转换方法
def to_dict(self) -> dict:
"""转换为字典格式"""
# 工厂方法
@classmethod
def user_message(cls, content: str) -> "Message":
"""创建用户消息"""
@classmethod
def system_message(cls, content: str) -> "Message":
"""创建系统消息"""
@classmethod
def assistant_message(cls, content: Optional[str] = None) -> "Message":
"""创建助手消息"""
@classmethod
def tool_message(cls, content: str, name, tool_call_id: str) -> "Message":
"""创建工具消息"""
@classmethod
def from_tool_calls(cls, tool_calls: List[Any], content: Union[str, List[str]] = ""):
"""从原始工具调用创建消息"""
特点:
- 支持四种消息角色:系统、用户、助手、工具
- 提供便捷的消息创建方法
- 支持消息列表的加法运算
- 可以转换为字典格式
4. Memory 类
class Memory(BaseModel):
"""内存管理类"""
messages: List[Message] = Field(default_factory=list) # 消息列表
max_messages: int = Field(default=100) # 最大消息数量
def add_message(self, message: Message) -> None:
"""添加单条消息"""
self.messages.append(message)
# 超出限制时裁剪
if len(self.messages) > self.max_messages:
self.messages = self.messages[-self.max_messages:]
def add_messages(self, messages: List[Message]) -> None:
"""添加多条消息"""
self.messages.extend(messages)
def clear(self) -> None:
"""清空所有消息"""
self.messages.clear()
def get_recent_messages(self, n: int) -> List[Message]:
"""获取最近的n条消息"""
return self.messages[-n:]
def to_dict_list(self) -> List[dict]:
"""转换为字典列表"""
return [msg.to_dict() for msg in self.messages]
功能:
- 管理对话历史
- 限制最大消息数量
- 提供消息添加、清空、获取等操作
- 支持批量消息操作
- 可以转换为字典列表格式
主要用途:
-
数据验证:
- 使用 Pydantic 的 BaseModel 进行数据验证
- 确保数据类型和格式的正确性
-
状态管理:
- 通过 AgentState 管理代理状态
- 提供清晰的状态转换机制
-
消息处理:
- 统一的消息格式
- 支持不同类型的消息创建
- 便捷的消息操作方法
-
内存管理:
- 管理对话历史
- 控制内存使用
- 提供消息检索功能
-
工具调用:
- 定义工具调用的数据结构
- 支持复杂的工具交互
schema.py
提供了核心的数据结构和类型定义,确保了数据的一致性和类型安全。通过 Pydantic 的类型系统,它还提供了自动的数据验证功能。