From 05148eeef860d33232874a640dbd67ba43ac5686 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 19 三月 2026 12:51:49 +0800
Subject: [PATCH] #AI.配置中心可运营化
---
rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/BuiltinMcpToolRegistryImpl.java | 122 ++++++++++++++++++++++++++++++++++++++--
1 files changed, 116 insertions(+), 6 deletions(-)
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/BuiltinMcpToolRegistryImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/BuiltinMcpToolRegistryImpl.java
index 01e72e0..41f0d52 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/BuiltinMcpToolRegistryImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/BuiltinMcpToolRegistryImpl.java
@@ -2,6 +2,7 @@
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.ai.config.AiDefaults;
+import com.vincent.rsf.server.ai.dto.AiMcpToolPreviewDto;
import com.vincent.rsf.server.ai.entity.AiMcpMount;
import com.vincent.rsf.server.ai.service.BuiltinMcpToolRegistry;
import com.vincent.rsf.server.ai.tool.RsfWmsBaseTools;
@@ -15,7 +16,9 @@
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map;
@Service
@RequiredArgsConstructor
@@ -41,21 +44,52 @@
validateBuiltinCode(builtinCode);
if (AiDefaults.MCP_BUILTIN_RSF_WMS.equals(builtinCode)) {
List<ToolCallback> callbacks = new ArrayList<>();
- callbacks.addAll(Arrays.asList(ToolCallbacks.from(rsfWmsStockTools)));
- callbacks.addAll(Arrays.asList(ToolCallbacks.from(rsfWmsTaskTools)));
- callbacks.addAll(Arrays.asList(ToolCallbacks.from(rsfWmsBaseTools)));
+ callbacks.addAll(createValidatedCallbacks(rsfWmsStockTools, AiDefaults.MCP_BUILTIN_RSF_WMS_STOCK));
+ callbacks.addAll(createValidatedCallbacks(rsfWmsTaskTools, AiDefaults.MCP_BUILTIN_RSF_WMS_TASK));
+ callbacks.addAll(createValidatedCallbacks(rsfWmsBaseTools, AiDefaults.MCP_BUILTIN_RSF_WMS_BASE));
return callbacks;
}
if (AiDefaults.MCP_BUILTIN_RSF_WMS_STOCK.equals(builtinCode)) {
- return Arrays.asList(ToolCallbacks.from(rsfWmsStockTools));
+ return createValidatedCallbacks(rsfWmsStockTools, builtinCode);
}
if (AiDefaults.MCP_BUILTIN_RSF_WMS_TASK.equals(builtinCode)) {
- return Arrays.asList(ToolCallbacks.from(rsfWmsTaskTools));
+ return createValidatedCallbacks(rsfWmsTaskTools, builtinCode);
}
if (AiDefaults.MCP_BUILTIN_RSF_WMS_BASE.equals(builtinCode)) {
- return Arrays.asList(ToolCallbacks.from(rsfWmsBaseTools));
+ return createValidatedCallbacks(rsfWmsBaseTools, builtinCode);
}
throw new CoolException("涓嶆敮鎸佺殑鍐呯疆 MCP 缂栫爜: " + builtinCode);
+ }
+
+ @Override
+ public List<AiMcpToolPreviewDto> listBuiltinToolCatalog(String builtinCode) {
+ validateBuiltinCode(builtinCode);
+ if (AiDefaults.MCP_BUILTIN_RSF_WMS.equals(builtinCode)) {
+ List<AiMcpToolPreviewDto> catalog = new ArrayList<>();
+ catalog.addAll(catalogByBuiltinCode(AiDefaults.MCP_BUILTIN_RSF_WMS_STOCK).values());
+ catalog.addAll(catalogByBuiltinCode(AiDefaults.MCP_BUILTIN_RSF_WMS_TASK).values());
+ catalog.addAll(catalogByBuiltinCode(AiDefaults.MCP_BUILTIN_RSF_WMS_BASE).values());
+ return catalog;
+ }
+ return new ArrayList<>(catalogByBuiltinCode(builtinCode).values());
+ }
+
+ private List<ToolCallback> createValidatedCallbacks(Object toolBean, String builtinCode) {
+ List<ToolCallback> callbacks = Arrays.asList(ToolCallbacks.from(toolBean));
+ Map<String, AiMcpToolPreviewDto> catalog = catalogByBuiltinCode(builtinCode);
+ for (ToolCallback callback : callbacks) {
+ if (callback == null || callback.getToolDefinition() == null) {
+ continue;
+ }
+ String toolName = callback.getToolDefinition().name();
+ if (!StringUtils.hasText(toolName) || !toolName.startsWith("rsf_query_")) {
+ throw new CoolException("鍐呯疆宸ュ叿鍛藉悕涓嶇鍚堣鑼冿紝蹇呴』浠� rsf_query_ 寮�澶�: " + toolName);
+ }
+ if (!catalog.containsKey(toolName)) {
+ throw new CoolException("鍐呯疆宸ュ叿缂哄皯娌荤悊鐩綍閰嶇疆: " + toolName);
+ }
+ }
+ return callbacks;
}
private List<String> supportedBuiltinCodes() {
@@ -66,4 +100,80 @@
AiDefaults.MCP_BUILTIN_RSF_WMS_BASE
);
}
+
+ private Map<String, AiMcpToolPreviewDto> catalogByBuiltinCode(String builtinCode) {
+ if (AiDefaults.MCP_BUILTIN_RSF_WMS_STOCK.equals(builtinCode)) {
+ Map<String, AiMcpToolPreviewDto> catalog = new LinkedHashMap<>();
+ catalog.put("rsf_query_available_inventory", buildCatalogItem(
+ "rsf_query_available_inventory",
+ "搴撳瓨鏌ヨ",
+ "鏌ヨ鎸囧畾鐗╂枡褰撳墠鍙敤浜庡嚭搴撶殑搴撳瓨鏄庣粏銆�",
+ "蹇呴』鎻愪緵鐗╂枡缂栫爜鎴栫墿鏂欏悕绉帮紝骞朵笖鏈�澶氳繑鍥� 50 鏉″簱瀛樿褰曘��",
+ List.of("鏌ヨ鐗╂枡 MAT001 褰撳墠鍙嚭搴撳簱瀛�", "鎸夌墿鏂欏悕绉版煡璇㈡墭鐩樺簱瀛樻槑缁�")
+ ));
+ catalog.put("rsf_query_station_list", buildCatalogItem(
+ "rsf_query_station_list",
+ "搴撳瓨鏌ヨ",
+ "鏌ヨ鎸囧畾浣滀笟绫诲瀷鍙敤鐨勮澶囩珯鐐广��",
+ "蹇呴』鎻愪緵绔欑偣绫诲瀷鍒楄〃锛岀被鍨嬫暟閲忔渶澶� 10 涓紝鏈�澶氳繑鍥� 50 涓珯鐐广��",
+ List.of("鏌ヨ鍏ュ簱鍜屽嚭搴撲綔涓氬彲鐢ㄧ珯鐐�", "鍒楀嚭 AGV_PICK 绫诲瀷鐨勪綔涓氱珯鐐�")
+ ));
+ return catalog;
+ }
+ if (AiDefaults.MCP_BUILTIN_RSF_WMS_TASK.equals(builtinCode)) {
+ Map<String, AiMcpToolPreviewDto> catalog = new LinkedHashMap<>();
+ catalog.put("rsf_query_task_list", buildCatalogItem(
+ "rsf_query_task_list",
+ "浠诲姟鏌ヨ",
+ "鎸変换鍔″彿銆佺姸鎬併�佺被鍨嬫垨绔欑偣鏉′欢鏌ヨ浠诲姟鍒楄〃銆�",
+ "鑷冲皯鎻愪緵涓�涓繃婊ゆ潯浠讹紝鏈�澶氳繑鍥� 50 鏉′换鍔¤褰曪紝涓嶆敮鎸佸叏琛ㄦ壂鎻忋��",
+ List.of("鏌ヨ鏈�杩� 10 鏉$姸鎬佷负鎵ц涓殑浠诲姟", "鎸変换鍔″彿鍏抽敭瀛楁煡璇换鍔″垪琛�")
+ ));
+ catalog.put("rsf_query_task_detail", buildCatalogItem(
+ "rsf_query_task_detail",
+ "浠诲姟鏌ヨ",
+ "鎸変换鍔� ID 鎴栦换鍔″彿鏌ヨ鍗曚釜浠诲姟璇︽儏銆�",
+ "蹇呴』鎻愪緵浠诲姟 ID 鎴栦换鍔″彿涔嬩竴锛屽彧杩斿洖鍗曚釜浠诲姟銆�",
+ List.of("鏌ヨ浠诲姟 12345 鐨勮鎯�", "鏍规嵁浠诲姟鍙� TASK24001 鏌ョ湅鎵ц鏄庣粏")
+ ));
+ return catalog;
+ }
+ if (AiDefaults.MCP_BUILTIN_RSF_WMS_BASE.equals(builtinCode)) {
+ Map<String, AiMcpToolPreviewDto> catalog = new LinkedHashMap<>();
+ catalog.put("rsf_query_warehouses", buildCatalogItem(
+ "rsf_query_warehouses",
+ "鍩虹璧勬枡",
+ "鏌ヨ浠撳簱鍩虹淇℃伅銆�",
+ "鑷冲皯鎻愪緵浠撳簱缂栫爜鎴栧悕绉帮紝鏈�澶氳繑鍥� 50 鏉′粨搴撹褰曘��",
+ List.of("鏌ヨ缂栫爜鍖呭惈 WH 鐨勪粨搴�", "鎸変粨搴撳悕绉版煡璇粨搴撳湴鍧�")
+ ));
+ catalog.put("rsf_query_bas_stations", buildCatalogItem(
+ "rsf_query_bas_stations",
+ "鍩虹璧勬枡",
+ "鏌ヨ鍩虹绔欑偣淇℃伅銆�",
+ "鑷冲皯鎻愪緵绔欑偣缂栧彿銆佺珯鐐瑰悕绉版垨浣跨敤鐘舵�佷箣涓�锛屾渶澶氳繑鍥� 50 鏉$珯鐐硅褰曘��",
+ List.of("鏌ヨ浣跨敤涓殑鍩虹绔欑偣", "鎸夌珯鐐圭紪鍙锋煡璇㈠熀纭�绔欑偣")
+ ));
+ catalog.put("rsf_query_dict_data", buildCatalogItem(
+ "rsf_query_dict_data",
+ "鍩虹璧勬枡",
+ "鏌ヨ鎸囧畾瀛楀吀绫诲瀷涓嬬殑瀛楀吀鏁版嵁銆�",
+ "蹇呴』鎻愪緵瀛楀吀绫诲瀷缂栫爜锛屾渶澶氳繑鍥� 100 鏉″瓧鍏歌褰曘��",
+ List.of("鏌ヨ task_status 瀛楀吀", "鎸夊瓧鍏告爣绛捐繃婊� task_type 瀛楀吀鏁版嵁")
+ ));
+ return catalog;
+ }
+ throw new CoolException("涓嶆敮鎸佺殑鍐呯疆 MCP 缂栫爜: " + builtinCode);
+ }
+
+ private AiMcpToolPreviewDto buildCatalogItem(String name, String toolGroup, String toolPurpose,
+ String queryBoundary, List<String> exampleQuestions) {
+ return AiMcpToolPreviewDto.builder()
+ .name(name)
+ .toolGroup(toolGroup)
+ .toolPurpose(toolPurpose)
+ .queryBoundary(queryBoundary)
+ .exampleQuestions(exampleQuestions)
+ .build();
+ }
}
--
Gitblit v1.9.1