Ver Fonte

mcp 功能测试

Grizzly há 5 meses atrás
pai
commit
6037883fe1

+ 2 - 2
src/main/java/edu/nju/software/aipaasagent/agent/core/AgentFactory.java

@@ -81,8 +81,8 @@ public class AgentFactory {
 
         // 根据类型创建不同的 Agent
         if ("react".equalsIgnoreCase(config.getType())) {
-            // 使用 Spring Alibaba React Agent
-            //currentAgent = createSpringAlibabaReactAgent(agentId, config);
+            // 使用自定义的 ToolCallAgent 作为 ReAct Agent
+            currentAgent = createReActAgent(agentId, config);
         } else if ("tool".equalsIgnoreCase(config.getType())) {
             // 使用自定义的 ToolCallAgent
             currentAgent = createReActAgent(agentId, config);

+ 37 - 26
src/main/resources/agent-config.yml

@@ -1,45 +1,56 @@
-# Agent 配置
-# 单 Pod 单 Agent 模式 - SeeCoderManus 测试智能体配置
+# Agent 配置文件
+# 对应 Kubernetes ConfigMap
 
+# Agent 基本信息
 agentId: seeCoderManus
 name: SeeCoderManus
-description: 智能代码助手,支持代码分析和生成
-type: tool             #可选模式 tool(自主实现的react智能体),react(spring alibaba react智能体 暂未上线),其它为baseagent
-systemPrompt: |
-  你是一个智能代码助手,可以帮助用户:
-  1. 分析和理解代码
-  2. 生成代码示例
-  3. 解释编程概念
-  4. 调试和优化代码
-  
-  请使用专业但易懂的方式回答技术问题。
+description: 智能编程助手
+type: react
+
+# 模型配置
 model:
   provider: dashscope
   name: qwen3-max-2026-01-23
   temperature: 0.7
-  maxTokens: 2048
+  maxTokens: 4096
+
+# 记忆配置
 memory:
   strategy: redis
-  size: 2
-  ttl: 3600
-# 思考配置 如最大思考步骤 仅tool/react模式生效
+  size: 20
+  ttl: 7200
+  enabled: true
+
+# 系统提示词
+systemPrompt: |
+  你是 SeeCoderManus,一个智能编程助手。
+  你能够帮助用户解决编程问题,提供代码示例,解释技术概念。
+  当遇到复杂问题时,你会使用工具来获取更多信息。
+
+# 本地工具列表
+tools:
+  - calculator
+  - terminate
+
+# ReAct 配置
 react:
   maxSteps: 20
+  observationEnabled: true
+  toolTimeout: 30
   verbose: true
 
-# MCP 工具配置  mode: auto(自动选择,已经注册的工具)  intelligence(智能路由,将智能路由搜索到的工具加入到工具列表,再auto选择)  force(强制使用 已注册的工具) disabled(禁用)
+# MCP 配置
 mcp:
+  # MCP 工具列表(从同学接口获取)
   tool:
-    - calculator
-    - terminate
+    - everything_get-sum
+    - everything_echo
+    - chat_improve_prompt
+  # MCP 策略配置
   policy:
+    # 模式:auto(自动)、force(强制)、disabled(禁用)
     mode: auto
 
-# RAG 知识库配置
+# RAG 配置
 rag:
-  enabled: true
-  vector_stores:
-    - vector_store_id: seecoder
-      top_k: 2
-      score_threshold: 0.5
-
+  enabled: false

+ 43 - 0
src/test/java/edu/nju/software/aipaasagent/agent/core/AgentFactoryTest.java

@@ -0,0 +1,43 @@
+package edu.nju.software.aipaasagent.agent.core;
+
+import edu.nju.software.aipaasagent.agent.config.AgentConfigRegistry;
+import edu.nju.software.aipaasagent.agent.config.AgentConfiguration;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class AgentFactoryTest {
+
+    @Autowired
+    private AgentFactory agentFactory;
+
+    @Autowired
+    private AgentConfigRegistry agentConfigRegistry;
+
+    @Test
+    public void testCreateAgent() {
+        System.out.println("Testing Agent creation...");
+        try {
+            // 检查配置是否加载
+            AgentConfiguration config = agentConfigRegistry.getConfig();
+            System.out.println("Agent ID: " + config.getAgentId());
+            System.out.println("Agent Type: " + config.getType());
+            System.out.println("Local tools: " + config.getTools());
+            
+            // 检查MCP配置
+            if (config.getMcp() != null) {
+                System.out.println("MCP tools: " + config.getMcp().getTool());
+                System.out.println("MCP mode: " + config.getMcp().getPolicy().getMode());
+            }
+
+            // 创建Agent
+            var agent = agentFactory.createAgent();
+            System.out.println("Agent created successfully: " + agent.getClass().getSimpleName());
+
+        } catch (Exception e) {
+            System.out.println("Error: " + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+}

+ 246 - 10
架构设计文档.md

@@ -283,24 +283,243 @@ public abstract String act();
 - **ReAct 配置**:是否启用 ReAct 模式
 - **RAG 配置**:向量存储、TopK、分数阈值等
 - **记忆配置**:存储类型、过期时间等
+- **MCP 配置**:MCP Hub 地址、鉴权信息等
 
-## 6. 系统工作流程
+## 6. MCP 功能集成
 
-### 6.1 典型流程
+### 6.1 MCP 架构设计
+
+**核心实现文件**:
+- `McpClientService.java`:MCP 客户端服务,负责与 MCP Hub 通信
+- `McpTool.java`:MCP 工具封装,将 MCP 工具转换为 Spring AI 工具
+- `McpServerConfig.java`:MCP 服务器配置
+
+**设计理念**:
+- **模块化设计**:独立的 MCP 客户端模块,与其他模块解耦
+- **会话管理**:支持多会话管理,每个会话对应一个 MCP 连接
+- **智能路由**:支持智能路由模式,提供更智能的工具搜索和执行
+
+### 6.2 MCP 核心功能
+
+**功能列表**:
+1. **连接管理**:建立和管理与 MCP Hub 的 SSE 连接
+2. **工具列表**:获取 MCP Hub 提供的工具列表
+3. **工具调用**:调用 MCP Hub 中的工具
+4. **智能路由**:使用智能路由搜索和执行工具
+
+**关键代码**:
+
+```java
+// MCP 连接管理
+public synchronized String connect(String group) {
+    // 如果已有连接,先关闭
+    if (sessions.containsKey(group)) {
+        closeSession(sessions.get(group));
+    }
+
+    SessionInfo sessionInfo = new SessionInfo();
+    sessionInfo.setGroup(group);
+    sessionInfo.setSessionId(UUID.randomUUID().toString()); // 临时ID,会被覆盖
+    
+    try {
+        // 获取 sessionId
+        String sessionId = getMCPSessionId();
+        
+        sessionInfo.setSessionId(sessionId);
+        sessions.put(group, sessionInfo);
+        
+        log.info("MCP 连接成功 [group={}, sessionId={}]", group, sessionId);
+        return sessionId;
+        
+    } catch (Exception e) {
+        log.error("MCP 连接失败 [group={}]: {}", group, e.getMessage());
+        throw new RuntimeException("无法建立 MCP 连接: " + e.getMessage(), e);
+    }
+}
+
+// 工具调用
+public ToolCallResult callTool(String group, String toolName, Map<String, Object> arguments) {
+    SessionInfo session = getOrCreateSession(group);
+    
+    ToolCallParams params = ToolCallParams.builder()
+            .name(toolName)
+            .arguments(arguments)
+            .build();
+    
+    JsonRpcRequest request = JsonRpcRequest.builder()
+            .jsonrpc("2.0")
+            .id(requestIdGenerator.incrementAndGet())
+            .method("tools/call")
+            .params(objectMapper.valueToTree(params))
+            .build();
+
+    JsonNode response = sendRequest(session, request);
+    return parseToolCallResult(response);
+}
+
+// 智能路由搜索工具
+public ToolCallResult searchTools(String group, String query, int limit) {
+    SessionInfo session = getOrCreateSession(group);
+    
+    if (!"intelligence".equals(session.getMode())) {
+        // 如果不是智能路由模式,先切换到智能路由
+        connectIntelligence(group);
+        session = sessions.get(group);
+    }
+    
+    Map<String, Object> arguments = Map.of(
+            "query", query,
+            "limit", limit
+    );
+    
+    ToolCallParams params = ToolCallParams.builder()
+            .name("search_tools")
+            .arguments(arguments)
+            .build();
+    
+    JsonRpcRequest request = JsonRpcRequest.builder()
+            .jsonrpc("2.0")
+            .id(requestIdGenerator.incrementAndGet())
+            .method("tools/call")
+            .params(objectMapper.valueToTree(params))
+            .build();
+
+    JsonNode response = sendRequest(session, request);
+    return parseToolCallResult(response);
+}
+```
+
+### 6.3 MCP 工具集成
+
+**McpTool 实现**:
+
+```java
+public class McpTool implements ToolCallback {
+
+    private final String name;
+    private final String description;
+    private final String group;
+    private final McpClientService mcpClientService;
+
+    @Override
+    public ToolDefinition getToolDefinition() {
+        return ToolDefinition.builder()
+                .name(name)
+                .description(description)
+                // MCP 工具的参数 schema 由 MCP Hub 提供
+                // 这里使用一个通用的 object schema
+                .inputSchema("""
+                    {
+                        "type": "object",
+                        "properties": {
+                            "args": {
+                                "type": "object",
+                                "description": "工具参数,由 MCP Hub 定义"
+                            }
+                        }
+                    }
+                    """)
+                .build();
+    }
+
+    @Override
+    public String call(String toolInput) {
+        log.info("执行 MCP 工具 [name={}, group={}, input={}]", name, group, toolInput);
+        
+        try {
+            // 解析输入参数
+            Map<String, Object> args = parseInput(toolInput);
+            
+            // 调用 MCP Hub
+            ToolCallResult result;
+            // 这里简化处理,实际应该根据会话的模式来选择调用方法
+            // 暂时使用普通的 callTool 方法
+            result = mcpClientService.callTool(group, name, args);
+            
+            if (result.isError()) {
+                log.error("MCP 工具执行失败 [name={}]: {}", name, result.getContent());
+                return "工具执行失败: " + result.getContent();
+            }
+            
+            // 返回结果内容
+            String content = result.getContent();
+            log.info("MCP 工具执行成功 [name={}], 结果长度: {}", name, 
+                    content != null ? content.length() : 0);
+            
+            return content != null ? content : "工具执行成功,但无返回内容";
+            
+        } catch (Exception e) {
+            log.error("MCP 工具执行异常 [name={}]: {}", name, e.getMessage(), e);
+            return "工具执行异常: " + e.getMessage();
+        }
+    }
+}
+```
+
+### 6.4 MCP 配置
+
+**配置项**:
+
+```java
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "mcp.hub")
+public class McpServerConfig {
+    
+    /**
+     * MCP Hub 基础 URL
+     */
+    private String baseUrl = "https://ai-paas-mcp-endpoint.njuu.top";
+    
+    /**
+     * 鉴权 token
+     */
+    private String authorization = "sqGYuMvKgdxmzmTM5lNBgLdVpl6XNnPX";
+    
+    /**
+     * 连接超时(秒)
+     */
+    private int connectTimeout = 10;
+    
+    /**
+     * 请求超时(秒)
+     */
+    private int requestTimeout = 60;
+    
+    /**
+     * 是否自动重连
+     */
+    private boolean autoReconnect = true;
+}
+```
+
+## 7. 系统工作流程
+
+### 7.1 典型流程
 
 1. **客户端请求**:客户端发送聊天请求
 2. **配置加载**:加载对应 Agent 的配置
 3. **记忆检索**:获取对话历史
 4. **RAG 处理**:执行 RAG 检索,获取相关知识
 5. **ReAct 处理**:执行 ReAct 思考和行动
+   - **工具调用**:如需调用工具,可选择本地工具或 MCP 工具
+   - **MCP 工具调用**:通过 McpClientService 调用 MCP Hub 中的工具
 6. **响应生成**:生成响应并返回给客户端
 7. **记忆更新**:更新对话记忆
 
-### 6.2 异步处理
+### 7.2 MCP 集成流程
+
+1. **MCP 连接**:建立与 MCP Hub 的 SSE 连接
+2. **工具发现**:获取 MCP Hub 提供的工具列表
+3. **工具注册**:将 MCP 工具注册为 Spring AI 工具
+4. **工具调用**:在 ReAct 过程中调用 MCP 工具
+5. **结果处理**:处理 MCP 工具返回的结果
+
+### 7.3 异步处理
 
 系统使用 Spring 的异步处理能力,将保全信息等耗时操作异步解耦,提高系统响应速度。
 
-## 7. 技术选型
+## 8. 技术选型
 
 | 技术 | 版本 | 用途 |
 |------|------|------|
@@ -310,21 +529,38 @@ public abstract String act();
 | Kryo | 5.x | 高效序列化 |
 | Ollama | 0.1.x | 本地模型 |
 | Maven | 3.x | 构建工具 |
+| MCP Hub | - | 工具服务平台 |
 
-## 8. 未来扩展
+## 9. 未来扩展
 
-### 8.1 存储扩展
+### 9.1 存储扩展
 - **MySQL 存储**:实现多一级别的 MySQL 存储,支持更复杂的查询和分析
 
-### 8.2 模型扩展
+### 9.2 模型扩展
 - **模型列表**:补充更多模型支持
 - **多模态调用**:实现完整的多模态调用功能
 
-### 8.3 客户端集成
-- **MCP 完整集成**:完善 MCP 客户端功能
+### 9.3 客户端集成
+- **MCP 功能增强**:扩展 MCP 客户端功能,支持更多 MCP Hub 特性
 - **A2A 集成**:实现 A2A 相关功能
 
-### 8.4 工具完善
+### 9.4 工具完善
 - **工具连接**:完善工具连接和使用
 - **辅助工具**:补充更多辅助工具
+- **工具管理**:实现工具的动态注册和管理
+
+### 9.5 智能路由优化
+- **智能路由增强**:优化智能路由算法,提高工具匹配准确性
+- **多模态工具**:支持多模态工具的智能路由
+
+## 10. 总结
+
+AI PaaS 平台采用分层架构设计,实现了配置管理、Agent 核心、记忆系统、RAG 功能和 MCP 集成。系统架构清晰,代码组织合理,功能完整。
+
+- **记忆层**:使用 Kryo 序列化和 Redis 存储,实现了高效的对话记忆管理
+- **RAG**:实现了完整的 RAG 流程,包括查询词生成、向量检索、结果处理和关键信息提取
+- **ReAct**:实现了 ReAct 模式,包含思考和行动两个阶段,支持工具调用
+- **MCP 集成**:实现了与 MCP Hub 的完整集成,支持工具发现、调用和智能路由
+
+系统已经具备了 AI PaaS 平台的核心功能,为未来的扩展和优化奠定了基础。MCP 功能的集成使得系统能够利用外部工具服务,大大扩展了 Agent 的能力范围。