| | |
| | | private final RsfWmsTaskTools rsfWmsTaskTools; |
| | | private final RsfWmsBaseTools rsfWmsBaseTools; |
| | | |
| | | /** |
| | | * 校验内置 MCP 编码是否合法。 |
| | | * 当前版本只允许使用显式登记在注册表中的编码,未知编码直接拒绝, |
| | | * 这样可以确保“页面可选项”和“运行时可挂载项”始终一致。 |
| | | */ |
| | | @Override |
| | | public void validateBuiltinCode(String builtinCode) { |
| | | if (!StringUtils.hasText(builtinCode)) { |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 根据挂载记录创建内置工具回调。 |
| | | * 这里不会做任何动态发现,所有工具都必须经过显式注册和治理目录校验后才能暴露给模型。 |
| | | */ |
| | | @Override |
| | | public List<ToolCallback> createToolCallbacks(AiMcpMount mount, Long userId) { |
| | | String builtinCode = mount.getBuiltinCode(); |
| | |
| | | throw new CoolException("不支持的内置 MCP 编码: " + builtinCode); |
| | | } |
| | | |
| | | /** |
| | | * 返回某个内置编码下可预览的工具目录信息。 |
| | | * 该目录比运行时回调多了工具用途、查询边界和示例提问,供管理页展示。 |
| | | */ |
| | | @Override |
| | | public List<AiMcpToolPreviewDto> listBuiltinToolCatalog(String builtinCode) { |
| | | validateBuiltinCode(builtinCode); |
| | |
| | | } |
| | | |
| | | private List<ToolCallback> createValidatedCallbacks(Object toolBean, String builtinCode) { |
| | | /** |
| | | * 把 `@Tool` Bean 转成 Spring AI ToolCallback,并强制校验: |
| | | * 1. 工具名必须符合命名规范 |
| | | * 2. 每个工具都必须出现在治理目录里 |
| | | */ |
| | | List<ToolCallback> callbacks = Arrays.asList(ToolCallbacks.from(toolBean)); |
| | | Map<String, AiMcpToolPreviewDto> catalog = catalogByBuiltinCode(builtinCode); |
| | | for (ToolCallback callback : callbacks) { |
| | |
| | | } |
| | | |
| | | private List<String> supportedBuiltinCodes() { |
| | | /** 当前版本允许挂载的全部内置 MCP 编码。 */ |
| | | return List.of(AiDefaults.MCP_BUILTIN_RSF_WMS); |
| | | } |
| | | |
| | | private Map<String, AiMcpToolPreviewDto> catalogByBuiltinCode(String builtinCode) { |
| | | /** |
| | | * 构造内置工具治理目录。 |
| | | * 这里的目录是运行时校验和管理端预览的共同事实来源,不能与工具实现脱节。 |
| | | */ |
| | | if (AiDefaults.MCP_BUILTIN_RSF_WMS.equals(builtinCode)) { |
| | | Map<String, AiMcpToolPreviewDto> catalog = new LinkedHashMap<>(); |
| | | catalog.put("rsf_query_available_inventory", buildCatalogItem( |
| | |
| | | |
| | | private AiMcpToolPreviewDto buildCatalogItem(String name, String toolGroup, String toolPurpose, |
| | | String queryBoundary, List<String> exampleQuestions) { |
| | | /** 统一创建工具目录条目,避免不同工具组出现字段风格不一致。 */ |
| | | return AiMcpToolPreviewDto.builder() |
| | | .name(name) |
| | | .toolGroup(toolGroup) |