一、今日主要工作
- 围绕智能体管理平台的“Agent 装配工厂”方向,完成从单 Agent Plan-and-Execute 引擎到多 Agent 可配置装配模式的核心改造。
- 完成 Agent 级模型隔离、MCP Server 绑定、工具权限隔离、装配聚合 API、知识库预留 SPI、Agent 直连 Tool 等关键能力开发。
- 对后端 Agent 执行链路、MCP Gateway 适配链路、工具权限策略和前端管理页面进行联调与问题修复。
- 完成数字员工 / Agent 管理从前端 localStorage 模式向后端 API 驱动模式的改造,并新增工具广场页面。
- 整理《Agent 装配工厂实现方案与攻坚记录》,记录今日核心改造方案、攻坚过程、测试结果和后续规划。
二、核心完成内容
1. 模块开发与功能实现
今天主要围绕 Agent 装配工厂能力进行开发。改造前,系统虽然已有 AgentProfileEntity 和基础 CRUD,但运行时仍偏向单 Agent 模式,核心执行链路实际只能围绕默认 Agent 运行,无法真正支持不同 Agent 的模型、工具、MCP Server 和权限隔离。
本次改造后,Agent 的运行配置从固定代码逻辑逐步调整为数据库驱动的装配模式。一个 Agent 可以由以下能力组合而成:
- AgentProfile 主配置;
- 模型卡绑定;
- Local Skill 绑定;
- MCP Server 绑定;
- MCP Tool 直接绑定;
- Agent 级工具权限策略;
- 知识库绑定预留。
这使得新增 Agent 不再依赖新增 Java 代码,而是可以通过管理端或 API 写入配置完成装配,为后续“Agent 工厂”提供了基础结构。
2. Agent 级模型隔离改造
今天首先解决了不同 Agent 无法使用不同模型的问题。改造前,PlanGenerator、LlmStepExecutor、ResultSynthesizer、LlmSkillSelector、SkillArgumentExtractor 等核心 LLM 调用类都在构造函数中创建单例 ChatClient,导致所有 Agent 共用默认模型配置。
本次新增 AgentChatClientFactory,作为 Agent 模型选择的统一入口。其核心逻辑是:
- 如果 AgentProfile 绑定了
modelCardId,则读取模型卡中的 baseUrl、apiKey 和 model 信息,创建独立 ChatClient; - 如果没有绑定模型卡但存在
modelCode,则复用全局 baseUrl / apiKey,只覆盖模型名; - 如果两者都不存在,则回退到默认 ChatClient。
在该过程中,也清理了原有 AgentChatStreamService.resolveModelCard() 中的硬编码 API Key 风险,使模型配置从代码硬编码切换为模型卡驱动。
3. LLM 调用链路级联改造
为了让不同 Agent 的模型配置能够真正传递到执行链路中,今天对多个核心类进行了级联改造。改造涉及:
SkillInvoker接口增加agentId参数;ResultSynthesizer.synthesize()增加profile参数;LlmSkillSelector.select()增加profile参数;SkillArgumentExtractor.extract()增加profile参数;PlanAndExecuteServiceImpl负责向后传递 AgentProfile;SkillMatcher、SkillStepExecutor等组件同步透传 profile 和 agentId。
这部分改动涉及多个文件的调用链联动,修改过程中按“从外到内逐层改、每改一层立即编译验证”的方式推进,避免一次性大改造成定位困难。
同时修复了 ResultSynthesizer 中一个关键问题:原先 buildPrompt(run) 只读取用户输入,没有拼接 Step 执行结果,导致最终流式回复可能无法使用 Tool 的真实返回结果。本次改造后,执行完成后从 AgentRun 中读取 finalResult 再拼装 prompt,保证最终回复能够基于真实执行结果生成。
4. Agent 级 MCP Server 绑定
今天完成了 Agent 与 MCP Server 的绑定隔离。改造前,mcp_server_config 是全局配置,所有 Agent 默认能看到全部 MCP Server,无法做到“某个 Agent 只能访问特定 MCP Server”。
本次新增 agent_mcp_bind 表,沿用已有 agent_skill_bind 的多对多关联模式,实现 Agent 与 MCP Server 的绑定关系。随后在 McpClientGatewayAdapter.callTool() 中增加 Agent-Server 准入校验:
- 如果当前调用携带 agentId,则校验该 Agent 是否绑定目标 MCP Server;
- 如果未绑定,则拒绝调用并提示需要先在 Agent 配置中绑定服务。
同时,为了保证默认 Agent 的兼容性,在启动初始化逻辑中为 Agent ID=1 自动补齐默认 mcp-skill-server 绑定记录,避免历史 E2E 测试因新增准入校验而失败。
5. Agent 级工具权限隔离
今天还完成了 MCP 工具权限策略的 Agent 维度隔离。改造前,mcp_tool_policy 表没有 Agent 维度,一旦某个工具被设置为 DENY,会影响所有 Agent,无法实现不同 Agent 对同一工具的差异化权限控制。
本次在 mcp_tool_policy 表中新增可空的 agent_id 字段:
agent_id IS NULL表示全局策略,保持向后兼容;agent_id IS NOT NULL表示该策略只对指定 Agent 生效。
策略优先级设计为:
Agent 私有 + 精确工具名 > Agent 私有 + 通配符 > 全局 + 精确工具名 > 全局 + 通配符 > 默认规则同优先级内遵循:
DENY > APPROVAL > ALLOW为了验证策略隔离效果,还在 McpToolController 中补充了最小化测试 API,用于查询、创建和删除策略。验证结果包括:
- Agent 4 私有 DENY
math_add后,Agent 4 被拒绝; - Agent 1 不受 Agent 4 私有策略影响;
- 全局 DENY 对所有 Agent 生效;
- 删除策略后调用恢复。
这说明工具权限隔离已经具备 Agent 粒度的治理能力。
6. 装配聚合 API 与知识库预留
为了支撑前端 Agent 配置页,今天新增了装配聚合端点:
GET /api/ai/v1/agents/{id}/assembly改造前,前端进入 Agent 配置页需要分别请求 profile、skills、mcpServers、tools、policies 等多个接口,容易出现局部失败导致页面状态不一致的问题。新增聚合接口后,可以一次性返回:
- Agent 基本信息;
- 模型卡信息;
- 已绑定 Skills;
- 已绑定 MCP Servers;
- MCP Tools;
- 工具权限策略;
- 知识库绑定信息。
同时,本次只对知识库能力做接口预留,新增 KnowledgeBaseProvider SPI 和 NoOpKnowledgeBaseProvider 默认实现。后续接入 RAG 时,可以通过实现该 SPI 完成知识库注入,不需要大幅改动当前执行链路。
7. Agent 直连 Tool 链路改造
今天进一步优化了 MCP Tool 的调用路径。原有 MCP Tool 调用需要绕过一层 skill_definition:
Agent → agent_skill_bind → skill_definition → invokeConfig → MCP Tool在大量 MCP 类型 Skill 中,skill_definition.invokeConfig 实际只是记录 serverCode 和 toolName,容易变成纯转发表。
本次新增 agent_tool_bind 表,让 Agent 可以直接绑定 MCP Tool:
Agent → agent_tool_bind → MCP Tool同时在 SkillStepExecutor 中实现双路径执行:
- 如果 SkillMatcher 命中 Local Skill 或原有 Skill,则走原有 Skill 调用路径;
- 如果 SkillMatcher 未命中,则查询
agent_tool_bind,直接通过McpClientGatewayAdapter.callTool()调用 MCP Tool。
为了兼容历史数据,还在启动时自动将已有 MCP Skill 绑定迁移为 Tool 绑定。这样既保留 Local Skill 的扩展能力,又减少 MCP Tool 调用中不必要的中间层。
8. 前端 Agent 工厂相关改造
今天也同步完成了部分前端管理端改造。
首先,将 DigitalEmployeesView.vue 从纯 localStorage 模式改为后端 API 驱动。数字员工与后端 AgentProfile 的字段关系进行了统一映射:
DigitalEmployee.name对应agentCode;DigitalEmployee.title对应agentName;DigitalEmployee.roleDefinition对应systemPrompt;DigitalEmployee.modelCardIds[0]对应modelCardId;DigitalEmployee.reasoningMode对应reasoningMode,默认使用plan_execute。
其次,新增工具广场页面 /tools,左侧展示 MCP Server 目录,右侧展示 Tool 开关勾选,并支持 Agent 下拉切换。用户切换 Agent 后可以刷新对应工具勾选状态,切换 Server 后可以加载对应 Tool 列表。
最后,对模型对话页面做了精简,移除模型选择器,保留 Agent 下拉和当前模型提示。模型选择权交由 Agent 配置决定,避免用户在对话页同时选择 Agent 和模型造成配置冲突。
9. 问题攻坚与修复
今天开发过程中解决了多个联调问题:
-
Spring AI M7 版本 OpenAiApi 构造函数不匹配
编译发现构造函数参数数量不一致,最终参考已有备份配置,确认需要同时传入RestClient.Builder和WebClient.Builder。 -
调用链级联改造导致编译失败
通过从入口到内部组件逐层修改和验证,逐步完成 profile / agentId 透传。 -
默认 Agent 兼容问题
Agent-MCP 绑定校验上线后,默认 Agent 因缺少绑定会被拒绝。通过启动时自动插入默认绑定解决。 -
前后端响应字段不一致
后端不同接口返回存在message和msg差异,前端unwrap()方法增加兼容处理。 -
agent_profile 缺少 description 字段
前端表单存在“说明”字段,后端实体缺列。本次补充description字段并同步表结构。 -
Agent 选择器 ID 映射不一致
前端 Agent 下拉和后端查询字段不一致,最终统一使用agentCode作为选择 key,与后端findByAgentCode()对齐。 -
Tool 直连路径参数提取缺少 inputSchema
Tool 直连时没有 SkillDefinition,可用 dummySkill 占位。当前通过 SkillArgumentExtractor 的兜底 prompt 实现参数提取,后续可进一步从mcp_tool_definition.input_schema_json注入真实 Schema。
10. 测试验证与结果
今天完成了多维度回归测试和联调验证,测试覆盖:
- 工具注册与发现;
- 单 Skill 执行路径;
- 多 Skill 执行路径;
- 依赖链执行;
- 闲聊回归;
- 多 Agent 多模型卡隔离;
- 硬编码密钥消除;
- 无效模型卡报错;
- MCP Server 绑定 / 解绑准入;
- 默认 Agent 自动绑定;
- 工具权限策略;
- 装配聚合端点;
- 空 Agent 场景;
- 知识库桩。
根据今日攻坚记录,累计完成 22 项测试,结果均通过,覆盖后端执行链路、权限隔离、配置聚合和前端联调等关键场景。
三、今日工作产出
- 完成 Agent 工厂核心装配能力改造,使 Agent 支持模型、Skill、MCP Server、Tool、权限策略和知识库预留的组合配置。
- 新增
AgentChatClientFactory,支持按 Agent 动态创建 ChatClient,实现不同 Agent 的模型隔离。 - 清理
AgentChatStreamService中硬编码模型密钥风险,使模型配置转向模型卡驱动。 - 新增
agent_mcp_bind,实现 Agent 与 MCP Server 的绑定关系和准入校验。 - 扩展
mcp_tool_policy.agent_id,实现 Agent 级工具权限隔离。 - 新增装配聚合接口
/api/ai/v1/agents/{id}/assembly,支撑前端一次性加载 Agent 装配信息。 - 新增知识库绑定预留实体、Mapper 和
KnowledgeBaseProviderSPI,为后续 RAG 接入预留扩展点。 - 新增
agent_tool_bind,实现 Agent 直连 MCP Tool,减少 MCP 类型 Skill 对skill_definition中间层的依赖。 - 完成数字员工管理页从 localStorage 到后端 API 驱动的改造。
- 新增工具广场页面
/tools,支持按 Agent 和 MCP Server 查看 / 勾选工具。 - 完成 22 项测试验证,覆盖工具注册、执行路径、模型隔离、MCP Server 绑定、工具策略、装配聚合和知识库桩。
- 沉淀《Agent 装配工厂实现方案与攻坚记录》,记录今日改造背景、技术方案、难点处理、测试结果和后续方向。
四、遇到的问题与解决情况
1. 单 Agent 引擎无法支撑 Agent 工厂化装配
- 问题:系统虽然已有 AgentProfile 和 CRUD,但运行时仍然围绕默认 Agent 运行,不同 Agent 无法真正隔离模型、工具和 MCP Server。
- 处理:以数据库驱动为原则,新增 Agent-MCP、Agent-Tool、Agent-KB 等绑定关系,并扩展工具权限策略的 Agent 维度。
- 结果:Agent 从单一执行实例逐步演进为可配置、可装配、可隔离的运行单元。
2. LLM 调用类共用单例 ChatClient
- 问题:多个核心 LLM 调用类共用构造函数中创建的单例 ChatClient,导致 AgentProfile 中的模型配置无法生效。
- 处理:新增 AgentChatClientFactory,并对 PlanGenerator、LlmStepExecutor、ResultSynthesizer、LlmSkillSelector、SkillArgumentExtractor 等调用链进行级联改造。
- 结果:不同 Agent 可以根据模型卡或 modelCode 创建不同 ChatClient,模型隔离能力得到验证。
3. 工具权限缺少 Agent 维度
- 问题:原有 mcp_tool_policy 是全局策略,对某工具设置 DENY 会影响所有 Agent。
- 处理:为 mcp_tool_policy 增加可空 agent_id,并设计 Agent 私有策略优先于全局策略的匹配规则。
- 结果:实现了 Agent 级工具权限隔离,验证了私有 DENY 不影响其他 Agent,全局 DENY 仍可全局生效。
4. 前端配置页请求分散且状态不一致
- 问题:Agent 配置页需要多次请求 profile、skills、mcpServers、tools、policies 等数据,局部失败容易导致页面状态不一致。
- 处理:新增 assembly 聚合接口,一次性返回 Agent 装配详情。
- 结果:前端配置加载链路更清晰,也方便后续扩展知识库、工具策略和更多装配项。
5. Agent 直连 Tool 时参数提取缺少真实 Schema
- 问题:Tool 直连路径不再经过 SkillDefinition,导致 SkillArgumentExtractor 无法直接拿到 inputSchema。
- 处理:当前使用 dummySkill 占位并依赖参数提取兜底 prompt;后续计划从 mcp_tool_definition 中读取真实 inputSchema 进一步增强准确性。
- 结果:当前联调场景可用,后续仍有优化空间。
五、明日计划
- 继续完善 Agent 工厂配置链路,重点检查前端工具广场、Agent 管理页与后端 assembly API 的数据一致性。
- 优化 Agent 直连 Tool 的参数提取能力,考虑从
mcp_tool_definition.input_schema_json注入真实 Schema。 - 补充工具权限管理前端能力,使 Agent 级 DENY / ALLOW 策略可以可视化配置。
- 继续验证多 Agent、多模型、多 MCP Server、多 Tool 组合场景,检查隔离边界是否稳定。
- 评估 PlanGenerator 流式输出方案,优化计划生成阶段的用户等待体验。
- 继续推进知识库 RAG 真实接入方案,基于当前 KnowledgeBaseProvider SPI 衔接后续向量库和文档摄入。
- 梳理 Human-in-the-loop 高风险步骤确认节点设计,为后续安全执行能力做准备。
六、总结
今天主要围绕 Agent 装配工厂能力展开开发和攻坚,完成了从单 Agent Plan-and-Execute 引擎向多 Agent 可配置装配平台的关键改造。通过模型隔离、MCP Server 绑定、Agent 级工具权限、装配聚合接口、知识库 SPI、Agent 直连 Tool 和前端管理页改造,平台已经具备更完整的 Agent 工厂化基础能力。今日还完成了 22 项联调与回归测试,验证了模型隔离、工具发现、执行路径、权限隔离和装配聚合等核心链路,为后续工具治理、知识库接入、Human-in-the-loop 和企业级 Agent 装配平台继续演进打下了基础。