增加调度器策略执行Agent链路
2025年10月17日...大约 5 分钟
一、介绍
从 UI 页面 增加 AI Agent 分类选择。由于存在多种 Agent 类型,引入策略调度器:
- 根据所选 Agent 类型,匹配并切换对应的执行策略;
- 统一入口、解耦调用,确保不同 Agent 的按需路由与扩展更便捷。
二、功能流程
如图,Ai Agent 策略调度器执行过程;

场景选择后,根据场景映射到对应的 AI Agent 类型,从而选择相应的 执行策略。
将 AutoAgent 与 FlowAgent 注册到统一的 策略调度器,按类型路由执行。
在数据库表
ai_agent中新增字段strategy,通过用户传入的 agent_id 读取并绑定对应策略。前端优化,该部分由 AI 开发工具实现。
三、编码实现
1. 工程结构

- 在 AiAgentController 执行用户请求时,之前的实现方式是通过注入相应的
autoAgent执行策略。现在,我们需要引入一个调度器服务接口,借助该调度器来选择执行autoAgent或flowAgent。 - 由于需要判断使用的是哪种类型的 Agent,因此需要在数据库表(
ai_agent)中增加相应字段。表结构更新后,对应的代码也需要进行相应的调整以支持这一变更。
2. 修改说明
数据访问: 新增 aiAgentDao.queryByAgentId(aiAgentId),用于读取数据库中该 Agent 的执行策略配置。
策略调度:
- 定义调度器接口
IAgentDispatchService,负责按策略分发与执行。 - 通过依赖注入
private Map<String, IExecuteStrategy> executeStrategyMap注册各策略,实现按键(strategy)路由到对应的IExecuteStrategy实现。
执行与完成标识: 修改 Step4ExecuteStepsNode 与 FlowAgentExecuteStrategy,增加完成标识;当达到最终结果时,通过 SSE 将结果推送给前端。
**控制层改造: **调整 AiAgentController:由原先直接调用策略,改为通过 调度器统一执行,提升解耦与可扩展性。
**前端说明: **前端页面优化由 AI 工具完成,后端仅需提供稳定的 SSE 输出与接口契约;(面试通常不深问前端实现细节)。
3. 库表数据

- 库表 ai_agent 增加 strategy 策略字段。
4. 策略调度器
/**
* Agent 策略调度器接口
*
* @author 仙人球⁶ᴳ |
* @date 2025/10/14 15:17
* @github https://github.com/lixuanfengs
*/
public interface IAgentDispatchService {
void dispatch(ExecuteCommandEntity requestParameter, ResponseBodyEmitter emitter) throws Exception;
}
*/
@Slf4j
@Service
public class AgentDispatchDispatchService implements IAgentDispatchService {
@Resource
private Map<String, IExecuteStrategy> executeStrategyMap;
@Resource
private IAgentRepository repository;
@Resource
private ThreadPoolExecutor threadPoolExecutor;
@Override
public void dispatch(ExecuteCommandEntity requestParameter, ResponseBodyEmitter emitter) throws Exception {
AiAgentVO aiAgentVO = repository.queryAiAgentByAgentId(requestParameter.getAiAgentId());
String strategy = aiAgentVO.getStrategy();
IExecuteStrategy executeStrategy = executeStrategyMap.get(strategy);
if (null == executeStrategy) {
throw new BizException("不存在的执行策略类型 strategy:" + strategy);
}
// 3. 异步执行AutoAgent
threadPoolExecutor.execute(() -> {
try {
executeStrategy.execute(requestParameter, emitter);
} catch (Exception e) {
log.error("AutoAgent执行异常:{}", e.getMessage(), e);
try {
emitter.send("执行异常:" + e.getMessage());
} catch (Exception ex) {
log.error("发送异常信息失败:{}", ex.getMessage(), ex);
}
} finally {
try {
emitter.complete();
} catch (Exception e) {
log.error("完成流式输出失败:{}", e.getMessage(), e);
}
}
});
}
}这一部分实现较为简单:通过策略调度器动态执行相应策略。具体策略的对应关系,可根据数据库表数据进行查询获取。
5. 接口层处理
@Slf4j
@RestController
@RequestMapping("/api/v1/agent")
@CrossOrigin(origins = "*", allowedHeaders = "*", methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.OPTIONS})
public class AiAgentController implements IAiAgentService {
@Resource(name = "autoAgentExecuteStrategy")
private IExecuteStrategy autoAgentExecuteStrategy;
@Resource
private ThreadPoolExecutor threadPoolExecutor;
@Resource
private IAgentDispatchService agentDispatchService;
@RequestMapping(value = "auto_agent", method = RequestMethod.POST)
public ResponseBodyEmitter autoAgent(@RequestBody AutoAgentRequestDTO request, HttpServletResponse response) {
log.info("AutoAgent流式执行请求开始,请求信息:{}", JSON.toJSONString(request));
try {
// 设置SSE响应头
response.setContentType("text/event-stream");
response.setCharacterEncoding("UTF-8");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Connection", "keep-alive");
// 1. 创建流式输出对象
ResponseBodyEmitter emitter = new ResponseBodyEmitter(Long.MAX_VALUE);
// 2. 构建执行命令实体
ExecuteCommandEntity executeCommandEntity = ExecuteCommandEntity.builder()
.aiAgentId(request.getAiAgentId())
.message(request.getMessage())
.sessionId(request.getSessionId())
.maxStep(request.getMaxStep())
.build();
// 3. 调度处理
agentDispatchService.dispatch(executeCommandEntity, emitter);
return emitter;
} catch (Exception e) {
log.error("AutoAgent请求处理异常:{}", e.getMessage(), e);
ResponseBodyEmitter errorEmitter = new ResponseBodyEmitter();
try {
errorEmitter.send("请求处理异常:" + e.getMessage());
errorEmitter.complete();
} catch (Exception ex) {
log.error("发送错误信息失败:{}", ex.getMessage(), ex);
}
return errorEmitter;
}
}
}原本,接口层需根据注入的策略进行调度,但策略类型多样化导致难以有效区分。为此,可引入调度器统一处理相关逻辑。
6. 完成结果通知
/**
* 发送总结结果到流式输出
*/
private void sendSummaryResult(DefaultFlowAgentExecuteStrategyFactory.DynamicContext dynamicContext, String sessionId) {
// 构建执行总结内容
StringBuilder summaryContent = new StringBuilder();
summaryContent.append("## 执行步骤完成总结\n\n");
// 获取执行历史
StringBuilder executionHistory = dynamicContext.getExecutionHistory();
if (executionHistory != null && executionHistory.length() > 0) {
summaryContent.append("### 已完成的工作\n");
summaryContent.append(executionHistory.toString());
summaryContent.append("\n\n");
}
summaryContent.append("### 执行状态\n");
summaryContent.append("✅ 所有规划步骤已成功执行完成\n\n");
summaryContent.append("### 执行效果评估\n");
summaryContent.append("📊 任务执行流程顺利完成,各步骤按计划执行");
AutoAgentExecuteResultEntity result = AutoAgentExecuteResultEntity.createSummaryResult(
summaryContent.toString(), sessionId);
sendSseResult(dynamicContext, result);
log.info("📊 已发送总结结果到【最终执行结果】区域");
}
/**
* 发送完成标识到流式输出
*/
private void sendCompleteResult(DefaultFlowAgentExecuteStrategyFactory.DynamicContext dynamicContext, String sessionId) {
AutoAgentExecuteResultEntity result = AutoAgentExecuteResultEntity.createCompleteResult(sessionId);
sendSseResult(dynamicContext, result);
log.info("✅ 已发送完成标识");
}在 Step4ExecuteStepsNode 和 FlowAgentExecuteStrategy 两个模块中,需集成完成结果通知机制,以确保任务执行后及时反馈状态。
四、测试验证
- 在测试前,将最新的库表数据导入到数据库中。随后,启动服务并访问UI界面进行验证。
- 在yml配置文件中,注意加载2101、2102、2103模块,以支持本节场景测试。同时,可加载先前学习的其他模块,进行综合验证。

- 进入页面后,选择第一个CSDN发帖+通知。之后提问案例里有对应的内容,可以选择进行提问。
赞助