往期推荐:
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. 目录结构
flow/
├── __init__.py # 空文件,标记为包
├── base.py # 基础流程类定义
├── flow_factory.py # 流程工厂类
└── planning.py # 计划流程实现
2. base.py - 基础流程定义
class BaseFlow(BaseModel, ABC):
"""基础流程类"""
agents: Dict[str, BaseAgent] # 代理映射表
tools: Optional[List] = None # 可用工具列表
primary_agent_key: Optional[str] # 主要代理的键名
主要功能:
-
代理管理:
- 支持单个代理、代理列表或代理字典的初始化
- 提供代理访问和添加的方法
- 维护主要代理(primary_agent)的引用
-
状态枚举:
class PlanStepStatus(str, Enum):
NOT_STARTED = "not_started"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
BLOCKED = "blocked"
3. flow_factory.py - 流程工厂
class FlowFactory:
@staticmethod
def create_flow(flow_type: FlowType, agents, **kwargs) -> BaseFlow:
flows = {
FlowType.PLANNING: PlanningFlow,
}
# 创建并返回指定类型的流程
功能:
- 根据流程类型创建相应的流程实例
- 当前支持 PLANNING 类型
- 可扩展支持其他类型的流程
4. planning.py - 计划流程实现
class PlanningFlow(BaseFlow):
llm: LLM # 语言模型实例
planning_tool: PlanningTool # 计划工具
executor_keys: List[str] # 执行器键名列表
active_plan_id: str # 当前活动计划ID
current_step_index: Optional[int] # 当前步骤索引
核心功能:
- 计划创建和初始化
async def _create_initial_plan(self, request: str):
# 使用 LLM 创建初始计划
# 设置计划 ID 和步骤
# 存储计划到 planning_tool
- 步骤执行管理
async def execute(self, input_text: str) -> str:
# 1. 创建初始计划
# 2. 循环执行步骤
# 3. 检查完成状态
# 4. 返回执行结果
- 步骤状态追踪
async def _get_current_step_info(self):
# 获取当前步骤信息
# 更新步骤状态
# 返回步骤索引和信息
- 计划执行和监控
async def _execute_step(self, executor: BaseAgent, step_info: dict):
# 准备步骤上下文
# 使用指定代理执行步骤
# 更新步骤状态
# 返回执行结果
- 计划完成处理
async def _finalize_plan(self) -> str:
# 生成计划总结
# 使用 LLM 或代理提供最终报告
5. 关键特性:
-
灵活的代理管理:
- 支持多个代理协同工作
- 可以根据步骤类型选择合适的执行代理
-
状态管理:
- 详细的步骤状态跟踪
- 支持进度监控和报告
-
错误处理:
- 完善的异常捕获和处理
- 提供备选方案和降级处理
-
可扩展性:
- 基于工厂模式,易于添加新的流程类型
- 模块化设计,便于扩展功能
-
进度追踪:
- 详细的步骤执行状态
- 支持计划执行进度的可视化
使用示例:
# 创建计划流程
agents = {"planner": planner_agent, "executor": executor_agent}
flow = FlowFactory.create_flow(FlowType.PLANNING, agents)
# 执行任务
result = await flow.execute("完成一个复杂任务")
这个流程系统的设计非常灵活和强大,特别适合处理需要多个代理协作的复杂任务。它提供了清晰的任务分解、执行追踪和状态管理,同时保持了良好的可扩展性和错误处理能力。