diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index bc654111..29c367f1 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -319,5 +319,15 @@ wechat: secret: '' token: '' aesKey: '' - +spring: + ai: + openai: + api-key: sk-xXe1WMPjhlVb1aiI1b4c6c8934D8463f9e4b67Ed8718B772 + base-url: https://api.pandarobot.chat/ + mcp: + client: + enabled: true + name: call-mcp-server + stdio: + servers-configuration: classpath:mcp-server.json diff --git a/ruoyi-admin/src/main/resources/mcp-server.json b/ruoyi-admin/src/main/resources/mcp-server.json new file mode 100644 index 00000000..869ca5de --- /dev/null +++ b/ruoyi-admin/src/main/resources/mcp-server.json @@ -0,0 +1,12 @@ +{ + "mcpServers": { + "fileSystem": { + "command": "C:\\Program Files\\nodejs\\npx.cmd", + "args": [ + "-y", + "@modelcontextprotocol/server-filesystem", + "D:\\software" + ] + } + } +} diff --git a/ruoyi-modules-api/ruoyi-chat-api/pom.xml b/ruoyi-modules-api/ruoyi-chat-api/pom.xml index 62578a0c..6fbae9ea 100644 --- a/ruoyi-modules-api/ruoyi-chat-api/pom.xml +++ b/ruoyi-modules-api/ruoyi-chat-api/pom.xml @@ -32,6 +32,14 @@ + + + io.modelcontextprotocol.sdk + mcp-spring-webflux + 0.8.0 + + + org.ruoyi ruoyi-common-chat @@ -55,16 +63,27 @@ org.springframework.ai - spring-ai-mcp-client-webflux-spring-boot-starter + spring-ai-openai-spring-boot-starter - io.modelcontextprotocol.sdk - mcp-spring-webflux - 0.8.0 - compile + org.springframework.ai + spring-ai-mcp-client-spring-boot-starter + + org.springframework.ai + spring-ai-mcp + + + + + org.springframework.ai + spring-ai-mcp-client-webflux-spring-boot-starter + + + + diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java index 1f2f47e6..2c9fd28a 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java @@ -2,6 +2,7 @@ package org.ruoyi.chat.service.chat.impl; import cn.hutool.json.JSONUtil; import io.modelcontextprotocol.client.McpClient; +import io.modelcontextprotocol.client.McpSyncClient; import io.modelcontextprotocol.client.transport.WebFluxSseClientTransport; import io.modelcontextprotocol.spec.McpSchema; import lombok.RequiredArgsConstructor; @@ -15,6 +16,12 @@ import org.ruoyi.common.chat.entity.chat.tool.ToolsFunction; import org.ruoyi.common.chat.openai.OpenAiStreamClient; import org.ruoyi.common.chat.request.ChatRequest; import org.ruoyi.common.core.exception.ServiceException; +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.memory.ChatMemory; +import org.springframework.ai.chat.memory.InMemoryChatMemory; +import org.springframework.ai.mcp.SyncMcpToolCallbackProvider; +import org.springframework.ai.tool.ToolCallbackProvider; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @@ -27,14 +34,33 @@ import java.util.Map; @Service @Slf4j -@RequiredArgsConstructor public class OpenAIServiceImpl implements IChatService { - private final OpenAiStreamClient openAiStreamClient; + @Autowired + private OpenAiStreamClient openAiStreamClient; + + private final ChatClient chatClient; + + private final ChatMemory chatMemory = new InMemoryChatMemory(); + + + + public OpenAIServiceImpl(ChatClient.Builder chatClientBuilder, List mcpSyncClients, ToolCallbackProvider tools) { + this.chatClient = chatClientBuilder + .defaultTools(new SyncMcpToolCallbackProvider(mcpSyncClients)) + .build(); + } + + + public String webMcpChat(String prompt){ + return this.chatClient.prompt(prompt).call().content(); + + } + @Override public SseEmitter chat(ChatRequest chatRequest,SseEmitter emitter) { - String toolString = mcpChat(chatRequest); + String toolString = webMcpChat(chatRequest.getPrompt()); Message userMessage = Message.builder().content("工具返回信息:"+toolString).role(Message.Role.ASSISTANT).build(); List messages = chatRequest.getMessages();