3629 字
18 分钟
2026-05-27|Agent 装配工厂能力开发

一、今日主要工作#

  • 围绕智能体管理平台的“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;
  • SkillMatcherSkillStepExecutor 等组件同步透传 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 实际只是记录 serverCodetoolName,容易变成纯转发表。

本次新增 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. 问题攻坚与修复#

今天开发过程中解决了多个联调问题:

  1. Spring AI M7 版本 OpenAiApi 构造函数不匹配
    编译发现构造函数参数数量不一致,最终参考已有备份配置,确认需要同时传入 RestClient.BuilderWebClient.Builder

  2. 调用链级联改造导致编译失败
    通过从入口到内部组件逐层修改和验证,逐步完成 profile / agentId 透传。

  3. 默认 Agent 兼容问题
    Agent-MCP 绑定校验上线后,默认 Agent 因缺少绑定会被拒绝。通过启动时自动插入默认绑定解决。

  4. 前后端响应字段不一致
    后端不同接口返回存在 messagemsg 差异,前端 unwrap() 方法增加兼容处理。

  5. agent_profile 缺少 description 字段
    前端表单存在“说明”字段,后端实体缺列。本次补充 description 字段并同步表结构。

  6. Agent 选择器 ID 映射不一致
    前端 Agent 下拉和后端查询字段不一致,最终统一使用 agentCode 作为选择 key,与后端 findByAgentCode() 对齐。

  7. 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 和 KnowledgeBaseProvider SPI,为后续 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 装配平台继续演进打下了基础。

2026-05-27|Agent 装配工厂能力开发
https://jupiter-ws.cn/posts/internship/实习日报-2026-05-27/
作者
Jupiter
发布于
2026-05-27
许可协议
CC BY-NC-SA 4.0