From 80a6d9236ade191a5de0975abe4de5a6e7e63915 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 19 三月 2026 14:03:10 +0800
Subject: [PATCH] #AI.注释
---
rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/McpMountRuntimeFactoryImpl.java | 78 ++++++++++++++++++++++++++++++++++++---
1 files changed, 72 insertions(+), 6 deletions(-)
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/McpMountRuntimeFactoryImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/McpMountRuntimeFactoryImpl.java
index 6b36785..befeb3f 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/McpMountRuntimeFactoryImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/McpMountRuntimeFactoryImpl.java
@@ -6,6 +6,7 @@
import com.vincent.rsf.server.ai.config.AiDefaults;
import com.vincent.rsf.server.ai.entity.AiMcpMount;
import com.vincent.rsf.server.ai.service.BuiltinMcpToolRegistry;
+import com.vincent.rsf.server.ai.service.MountedToolCallback;
import com.vincent.rsf.server.ai.service.McpMountRuntimeFactory;
import io.modelcontextprotocol.client.McpClient;
import io.modelcontextprotocol.client.McpSyncClient;
@@ -38,6 +39,11 @@
private final ObjectMapper objectMapper;
private final BuiltinMcpToolRegistry builtinMcpToolRegistry;
+ /**
+ * 鎶婁竴缁� MCP 鎸傝浇璁板綍瑙f瀽鎴愪竴娆″璇濆彲鐩存帴浣跨敤鐨勮繍琛屾椂瀵硅薄銆�
+ * 璇ユ柟娉曠粺涓�澶勭悊鍐呯疆 MCP銆佽繙绋� SSE MCP 鍜屾湰鍦� STDIO MCP锛�
+ * 鍚屾椂鏀堕泦鎸傝浇鎴愬姛椤广�佸け璐ラ」浠ュ強鏈�缁堟毚闇茬粰妯″瀷鐨勫伐鍏峰洖璋冨垪琛ㄣ��
+ */
@Override
public McpMountRuntime create(List<AiMcpMount> mounts, Long userId) {
List<McpSyncClient> clients = new ArrayList<>();
@@ -47,7 +53,10 @@
for (AiMcpMount mount : mounts) {
try {
if (AiDefaults.MCP_TRANSPORT_BUILTIN.equals(mount.getTransportType())) {
- callbacks.addAll(builtinMcpToolRegistry.createToolCallbacks(mount, userId));
+ callbacks.addAll(wrapMountedCallbacks(
+ builtinMcpToolRegistry.createToolCallbacks(mount, userId),
+ mount.getName()
+ ));
mountedNames.add(mount.getName());
continue;
}
@@ -55,6 +64,10 @@
client.initialize();
client.listTools();
clients.add(client);
+ callbacks.addAll(wrapMountedCallbacks(
+ Arrays.asList(SyncMcpToolCallbackProvider.builder().mcpClients(List.of(client)).build().getToolCallbacks()),
+ mount.getName()
+ ));
mountedNames.add(mount.getName());
} catch (Exception e) {
String message = mount.getName() + " 鎸傝浇澶辫触: " + e.getMessage();
@@ -62,16 +75,24 @@
log.warn(message, e);
}
}
- if (!clients.isEmpty()) {
- callbacks.addAll(Arrays.asList(
- SyncMcpToolCallbackProvider.builder().mcpClients(clients).build().getToolCallbacks()
- ));
- }
ensureUniqueToolNames(callbacks);
return new DefaultMcpMountRuntime(clients, callbacks.toArray(new ToolCallback[0]), mountedNames, errors);
}
+ private List<ToolCallback> wrapMountedCallbacks(List<ToolCallback> source, String mountName) {
+ /** 涓烘瘡涓伐鍏峰洖璋冭ˉ涓婃寕杞芥潵婧愶紝渚夸簬鍚庣画瀹¤銆佽娴嬪拰鍓嶇宸ュ叿杞ㄨ抗灞曠ず銆� */
+ List<ToolCallback> mountedCallbacks = new ArrayList<>();
+ for (ToolCallback callback : source) {
+ if (callback == null) {
+ continue;
+ }
+ mountedCallbacks.add(new MountedToolCallbackImpl(callback, mountName));
+ }
+ return mountedCallbacks;
+ }
+
private void ensureUniqueToolNames(List<ToolCallback> callbacks) {
+ /** 纭繚澶氭寕杞借仛鍚堝悗涓嶄細鍑虹幇鍚屽悕宸ュ叿锛屽惁鍒欐ā鍨嬩晶鏃犳硶姝g‘鍒嗚鲸宸ュ叿瀹氫箟銆� */
LinkedHashSet<String> duplicateNames = new LinkedHashSet<>();
LinkedHashSet<String> seenNames = new LinkedHashSet<>();
for (ToolCallback callback : callbacks) {
@@ -92,6 +113,10 @@
}
private McpSyncClient createClient(AiMcpMount mount) {
+ /**
+ * 鎸夋寕杞介厤缃姩鎬佸垱寤� MCP Client銆�
+ * 璇ユ柟娉曞彧璐熻矗 transport 灞傚垵濮嬪寲锛屼笉璐熻矗宸ュ叿鍘婚噸鍜岄敊璇仛鍚堛��
+ */
Duration timeout = Duration.ofMillis(mount.getRequestTimeoutMs() == null
? AiDefaults.DEFAULT_TIMEOUT_MS
: mount.getRequestTimeoutMs());
@@ -139,6 +164,7 @@
}
private List<String> readStringList(String json) {
+ /** 瑙f瀽鎸傝浇琛ㄩ噷鐨� JSON 鏁扮粍閰嶇疆锛屼緥濡� STDIO args銆� */
if (!StringUtils.hasText(json)) {
return Collections.emptyList();
}
@@ -151,6 +177,7 @@
}
private Map<String, String> readStringMap(String json) {
+ /** 瑙f瀽鎸傝浇琛ㄩ噷鐨� JSON Map 閰嶇疆锛屼緥濡� headers 鎴栫幆澧冨彉閲忋�� */
if (!StringUtils.hasText(json)) {
return Collections.emptyMap();
}
@@ -170,6 +197,7 @@
private final List<String> mountedNames;
private final List<String> errors;
+ /** 杩愯鏃跺璞℃湰韬彧鍋氭暟鎹皝瑁呭拰璧勬簮閲婃斁锛屼笉寮曞叆棰濆涓氬姟閫昏緫銆� */
private DefaultMcpMountRuntime(List<McpSyncClient> clients, ToolCallback[] callbacks, List<String> mountedNames, List<String> errors) {
this.clients = clients;
this.callbacks = callbacks;
@@ -199,6 +227,7 @@
@Override
public void close() {
+ /** 缁熶竴鍏抽棴鏈杩愯鏃堕噷鍒涘缓鐨勫閮� MCP Client锛岄伩鍏嶈繛鎺ユ硠婕忋�� */
for (McpSyncClient client : clients) {
try {
client.close();
@@ -208,4 +237,41 @@
}
}
}
+
+ private static class MountedToolCallbackImpl implements MountedToolCallback {
+
+ private final ToolCallback delegate;
+ private final String mountName;
+
+ /** 瑁呴グ鍣ㄤ粎琛ュ厖鎸傝浇鏉ユ簮锛屼笉鏀瑰彉搴曞眰宸ュ叿瀹氫箟鍜岃皟鐢ㄨ涓恒�� */
+ private MountedToolCallbackImpl(ToolCallback delegate, String mountName) {
+ this.delegate = delegate;
+ this.mountName = mountName;
+ }
+
+ @Override
+ public String getMountName() {
+ return mountName;
+ }
+
+ @Override
+ public org.springframework.ai.tool.definition.ToolDefinition getToolDefinition() {
+ return delegate.getToolDefinition();
+ }
+
+ @Override
+ public org.springframework.ai.tool.metadata.ToolMetadata getToolMetadata() {
+ return delegate.getToolMetadata();
+ }
+
+ @Override
+ public String call(String toolInput) {
+ return delegate.call(toolInput);
+ }
+
+ @Override
+ public String call(String toolInput, org.springframework.ai.chat.model.ToolContext toolContext) {
+ return delegate.call(toolInput, toolContext);
+ }
+ }
}
--
Gitblit v1.9.1