From 9b32e3b3b226723cd43bfa37026e1e4487f6ef69 Mon Sep 17 00:00:00 2001
From: ageer <ageerle@163.com>
Date: 星期六, 12 四月 2025 10:08:51 +0800
Subject: [PATCH] feat: mcp支持

---
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java |   64 ++++++++++++++++++++++++++++++++
 1 files changed, 64 insertions(+), 0 deletions(-)

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 b9d2012..ebf37e1 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
@@ -5,14 +5,29 @@
 import org.ruoyi.chat.listener.SSEEventSourceListener;
 import org.ruoyi.chat.service.chat.IChatService;
 import org.ruoyi.common.chat.entity.chat.ChatCompletion;
+import org.ruoyi.common.chat.entity.chat.Message;
 import org.ruoyi.common.chat.openai.OpenAiStreamClient;
 import org.ruoyi.common.chat.request.ChatRequest;
 import org.ruoyi.domain.vo.ChatModelVo;
 import org.ruoyi.service.IChatModelService;
+import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
+import org.springframework.ai.chat.memory.ChatMemory;
+import org.springframework.ai.chat.memory.InMemoryChatMemory;
+import org.springframework.ai.chat.messages.UserMessage;
+import org.springframework.ai.openai.OpenAiChatOptions;
+import org.springframework.ai.tool.ToolCallbackProvider;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @author ageer
+ */
 @Service
 @Slf4j
 public class OpenAIServiceImpl implements IChatService {
@@ -23,6 +38,13 @@
     private ChatConfig chatConfig;
     @Autowired
     private OpenAiStreamClient openAiStreamClient;
+    @Autowired
+    private ChatClient chatClient;
+
+    @Autowired
+    private ToolCallbackProvider tools;
+
+    private final ChatMemory chatMemory = new InMemoryChatMemory();
 
     @Override
     public SseEmitter chat(ChatRequest chatRequest,SseEmitter emitter) {
@@ -47,4 +69,46 @@
 
         return emitter;
     }
+
+    @Override
+    public SseEmitter mcpChat(ChatRequest chatRequest, SseEmitter emitter) {
+        List<Message> msgList = chatRequest.getMessages();
+        // 娣诲姞璁板繂
+        for (int i = 0; i < msgList.size(); i++) {
+            org.springframework.ai.chat.messages.Message springAiMessage = new UserMessage(msgList.get(i).getContent().toString());
+            chatMemory.add(String.valueOf(i),springAiMessage);
+        }
+        var messageChatMemoryAdvisor = new MessageChatMemoryAdvisor(chatMemory, chatRequest.getUserId(), 10);
+        this.chatClient.prompt(chatRequest.getPrompt())
+                .advisors(messageChatMemoryAdvisor)
+                .tools(tools)
+                .options(OpenAiChatOptions.builder().model(chatRequest.getModel()).build())
+                .stream()
+                .chatResponse()
+                .subscribe(
+                        chatResponse -> {
+                            try {
+                                emitter.send(chatResponse, MediaType.APPLICATION_JSON);
+                            } catch (IOException e) {
+                                e.printStackTrace();
+                            }
+                        },
+                        error -> {
+                            try {
+                                emitter.completeWithError(error);
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        },
+                        () -> {
+                            try {
+                                emitter.complete();
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        }
+                );
+
+        return emitter;
+    }
 }

--
Gitblit v1.9.3