一、本章介绍
从 AgentWorkflowNode 出发,流程将进入 LoopAgent、ParallelAgent 或 SequentialAgent 等不同类型的节点。这几类节点在流转机制上具有相似性,因此可以采用统一的处理思路进行设计与实现。
接下来,我们将围绕这些节点的共性逻辑进行梳理与处理,以便形成一致的流转规则。
二、流程设计
如图,智能体装配中,LoopAgentNode、ParallelAgentNode、SequentialAgentNode 部分;

LoopAgentNode:用于处理循环类任务。例如,一个用户请求可能需要经历分析、执行与结果校验等多个阶段,并在必要时反复迭代;又如针对一段 Git 提交代码,可以先进行 diff 分析获取变更,再结合检索进行代码匹配与召回,制定评审或执行计划,并持续循环优化处理。这类场景都适合通过循环机制来实现。
ParallelAgentNode:用于并发执行多个任务。在一些复杂场景中,可以将数据获取、分析与决策等环节拆分为多条链路并行处理,从而在整体上提升执行效率,尤其适用于对时效性要求较高的任务。
SequentialAgentNode:用于顺序编排多个子智能体,将不同步骤按既定顺序依次执行。它通常作为流程组织的基础结构,可以与循环(Loop)或并行(Parallel)机制组合使用,从而构建更加复杂且灵活的智能体执行流程。
三、功能实现
1. 工程结构
本节完善 LoopAgentNode、ParallelAgentNode、SequentialAgentNode,几个加载智能体的操作。
2. 核心模块
2.1 Loop 循环
@Service
public class LoopAgentNode extends AbstractArmorySupport {
@Override
protected AiAgentRegisterVO doApply(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
log.info("Ai Agent 装配操作 - LoopAgentNode");
List<AiAgentConfigTableVO.Module.AgentWorkflow> agentWorkflows = dynamicContext.getAgentWorkflows();
AiAgentConfigTableVO.Module.AgentWorkflow agentWorkflow = agentWorkflows.remove(0);
List<BaseAgent> subAgents = dynamicContext.queryAgentList(agentWorkflow.getSubAgents());
LoopAgent loopAgent =
LoopAgent.builder()
.name(agentWorkflow.getName())
.description(agentWorkflow.getDescription())
.subAgents(subAgents)
.maxIterations(agentWorkflow.getMaxIterations())
.build();
dynamicContext.getAgentGroup().put(agentWorkflow.getName(), loopAgent);
return router(requestParameter, dynamicContext);
}
// ... 省略 get,前面章节已经体现过
}通过上下文信息获取已装配的节点实例,并提取当前节点所依赖的子节点,将其组装进 LoopAgent 中,随后再写回到上下文对象,供后续流程继续使用。
需要特别注意的是,
agentWorkflow.getName()所对应的每个智能体标识必须保持唯一性,以确保在装配与获取过程中能够被准确定位,避免出现冲突或覆盖问题。
2.2 Parallel 并行
@Slf4j
@Service
public class ParallelAgentNode extends AbstractArmorySupport {
@Override
protected AiAgentRegisterVO doApply(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
log.info("Ai Agent 装配操作 - ParallelAgentNode");
List<AiAgentConfigTableVO.Module.AgentWorkflow> agentWorkflows = dynamicContext.getAgentWorkflows();
AiAgentConfigTableVO.Module.AgentWorkflow agentWorkflow = agentWorkflows.remove(0);
List<BaseAgent> subAgents = dynamicContext.queryAgentList(agentWorkflow.getSubAgents());
ParallelAgent parallelAgent =
ParallelAgent.builder()
.name(agentWorkflow.getName())
.subAgents(subAgents)
.description(agentWorkflow.getDescription())
.build();
dynamicContext.getAgentGroup().put(agentWorkflow.getName(), parallelAgent);
return router(requestParameter, dynamicContext);
}
// ... 省略 get,前面章节已经体现过
}- 同上,装配 ParallelAgent,完成后填充到上下文中。
2.3 Sequentail 串行
@Service
public class SequentialAgentNode extends AbstractArmorySupport {
@Resource
private RunnerNode runnerNode;
@Override
protected AiAgentRegisterVO doApply(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
log.info("Ai Agent 装配操作 - SequentialAgentNode");
List<AiAgentConfigTableVO.Module.AgentWorkflow> agentWorkflows = dynamicContext.getAgentWorkflows();
AiAgentConfigTableVO.Module.AgentWorkflow agentWorkflow = agentWorkflows.remove(0);
List<BaseAgent> subAgents = dynamicContext.queryAgentList(agentWorkflow.getSubAgents());
SequentialAgent sequentialAgent =
SequentialAgent.builder()
.name(agentWorkflow.getName())
.description(agentWorkflow.getDescription())
.subAgents(subAgents)
.build();
dynamicContext.getAgentGroup().put(agentWorkflow.getName(), sequentialAgent);
// 设置上下文(Agent 工作流包装体)
dynamicContext.setSequentialAgent(sequentialAgent);
// 注册到 Spring 容器
registerBean(agentWorkflow.getName(), SequentialAgent.class, sequentialAgent);
return router(requestParameter, dynamicContext);
}
}- 本部分主要完成 SequentialAgent 节点的装配。在当前阶段的设计中,SequentialAgent 被作为流程的最终收敛节点,用于承接前序执行结果并进行顺序化处理。后续阶段将在此基础上继续扩展相关能力,以支持更加灵活的流程组合与执行方式。