一、本章介绍
基于领域驱动设计思想,结合单一职责原则、规则树(组合模式)、工厂模式、上下文对象和泛型等设计方法,构建智能体装配服务的核心结构,为后续流程编排与扩展提供基础支撑。
二、流程设计
如图,智能体装配结构设计;

在架构设计上,首先构建基于规则树(组合模式)的节点编排框架,作为流程执行的核心结构,承载如
RootNode、AiApiNode、ChatModelNode等节点的有序流转。在此基础上,定义符合单一职责原则的装配服务接口
IArmoryService,并结合工厂模式实现节点装配与调用的统一管理。同时设计上下文对象(Context),用于贯穿整个执行链路,在节点之间传递与沉淀运行数据。
三、功能实现
1. 工程结构
首先,在 domain 模块的 agent 领域层中,新增 IArmoryService 和 IChatService 两个单一职责接口。随后,在 service 包下分别创建对应的子包,并在各自包中实现对应服务,以此实现领域服务的职责拆分。
其次,armory 装配模块下的 node 节点,用于将流程实现中的大量逻辑代码拆分到不同节点中处理。各节点通过设计模式进行有序流转,从而替代传统 if...else 的流程判断。
在节点流转过程中,需要在不同节点之间传递和保存上下文数据。该部分通过 DefaultArmoryFactory 工厂中定义的上下文对象进行承载,并以泛型方式传递到各个节点中使用;各节点通过继承 AbstractArmorySupport 获取统一的流程支撑能力。
然后,在整体功能实现中,ArmoryCommandEntity 作为 IArmoryService 领域服务方法的命令实体入参,其中包含 AiAgentRegisterVO 值对象,用于驱动整个装配流程的流转。
最后,由 IArmoryService 的实现类 ArmoryService 调用 DefaultArmoryFactory 工厂中的节点服务,完成整个智能体装配流程的执行。
2. 核心模块
2.1 类关系结构
装配层负责调度服务,并通过工厂机制进行统一管理。工厂内部维护一个 RootNode 作为起始节点,所有节点均基于抽象类进行扩展实现。
当前流程由 RootNode 与 AiApiNode 组成,节点之间按照既定顺序依次流转执行。后续可根据业务需要持续扩展新的节点类型,以增强整体处理能力。
2.2 单一职责
装配接口
public interface IArmoryService {
void acceptArmoryAgents(List<AiAgentConfigTableVO> tables) throws Exception;
}对话接口
public interface IChatService {
}2.3 流转节点
抽象类
public abstract class AbstractArmorySupport extends AbstractMultiThreadStrategyRouter<ArmoryCommandEntity, DefaultArmoryFactory.DynamicContext, AiAgentRegisterVO> {
protected final Logger log = LoggerFactory.getLogger(AbstractArmorySupport.class);
@Override
protected void multiThread(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws ExecutionException, InterruptedException, TimeoutException {
}
}以 AbstractArmorySupport 作为核心支撑类,继承规则树路由体系,并通过泛型约束相关数据类型。
其中主要涉及三类对象:ArmoryCommandEntity(命令载体)、DefaultArmoryFactory.DynamicContext(执行上下文)以及 AiAgentRegisterVO(返回结果对象)。
RootNode-根节点
@Slf4j
@Service
public class RootNode extends AbstractArmorySupport {
@Resource
private AiApiNode aiApiNode;
@Override
protected AiAgentRegisterVO doApply(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
// 路由到下一个节点
return router(requestParameter, dynamicContext);
}
@Override
public StrategyHandler<ArmoryCommandEntity, DefaultArmoryFactory.DynamicContext, AiAgentRegisterVO> get(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
// 配置了下一个节点
return aiApiNode;
}
}AiApiNode-接口节点
@Slf4j
@Service
public class AiApiNode extends AbstractArmorySupport {
@Override
protected AiAgentRegisterVO doApply(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
// 编写 AiApi 构建
// 路由到下一个节点,如果不需要路由了,可以 return 返回结果
return router(requestParameter, dynamicContext);
}
@Override
public StrategyHandler<ArmoryCommandEntity, DefaultArmoryFactory.DynamicContext, AiAgentRegisterVO> get(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
// 如果不需要下一个节点了,可以配置 defaultStrategyHandler
return defaultStrategyHandler;
}
}当前仅引入 RootNode 与 AiApiNode 两个示例节点,用于展示整体设计思路及流程衔接方式,具体的业务实现将在后续逐步补充完善。
其中,doApply 方法用于处理实际业务逻辑,执行完成后通常通过 return router(requestParameter, dynamicContext) 进入后续节点;若无需继续流转,也可直接返回结果。
get 方法则用于获取下一个执行节点,可在此处编写流程分支判断,从而将条件控制(如 if...else)与具体业务逻辑解耦,使代码结构更加清晰。
2.4 工厂设计
@Service
public class DefaultArmoryFactory {
@Resource
private RootNode rootNode;
public StrategyHandler<ArmoryCommandEntity, DynamicContext, AiAgentRegisterVO> armoryStrategyHandler() {
return rootNode;
}
/**
* 定义一个上下文对象,用于各个节点串联的时候,写入数据和使用数据
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class DynamicContext {
private Map<String, Object> dataObjects = new HashMap<>();
public <T> void setValue(String key, T value) {
dataObjects.put(key, value);
}
public <T> T getValue(String key) {
return (T) dataObjects.get(key);
}
}
}- 由工厂定义上下文对象,填充数据,以及提供返回 RootNode 根节点的方法,用于外部调用使用。
2.5 服务调用
@Slf4j
@Service
public class ArmoryService implements IArmoryService {
@Resource
private DefaultArmoryFactory defaultArmoryFactory;
@Override
public void acceptArmoryAgents(List<AiAgentConfigTableVO> tables) throws Exception {
for (AiAgentConfigTableVO table : tables) {
StrategyHandler<ArmoryCommandEntity, DefaultArmoryFactory.DynamicContext, AiAgentRegisterVO> handler = defaultArmoryFactory.armoryStrategyHandler();
handler.apply(
ArmoryCommandEntity.builder()
.aiAgentConfigTableVO(table)
.build(),
new DefaultArmoryFactory.DynamicContext());
}
}
}- 在 ArmoryService 实现受理装配服务,调用 DefaultArmoryFactory 工厂具体的服务来完成处理。