From 4af26fe4b42c4056f1226ba6f1e36e3fcc03a588 Mon Sep 17 00:00:00 2001 From: ageer <ageerle@163.com> Date: 星期日, 20 四月 2025 22:52:00 +0800 Subject: [PATCH] feat: mcp升级依赖 --- ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java | 88 +++++-------------------------------------- 1 files changed, 11 insertions(+), 77 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 85d3848..03fb18a 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 @@ -1,123 +1,57 @@ 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; import lombok.extern.slf4j.Slf4j; import org.ruoyi.chat.listener.SSEEventSourceListener; import org.ruoyi.chat.service.chat.IChatService; -import org.ruoyi.common.chat.entity.chat.*; -import org.ruoyi.common.chat.entity.chat.tool.ToolCallFunction; -import org.ruoyi.common.chat.entity.chat.tool.Tools; -import org.ruoyi.common.chat.entity.chat.tool.ToolsFunction; +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.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.ai.openai.OpenAiChatOptions; 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; - -import java.io.IOException; -import java.util.ArrayList; import java.util.List; -import java.util.Map; @Service @Slf4j public class OpenAIServiceImpl implements IChatService { - @Autowired private OpenAiStreamClient openAiStreamClient; private final ChatClient chatClient; - private final ChatMemory chatMemory = new InMemoryChatMemory(); - - - - public OpenAIServiceImpl(ChatClient.Builder chatClientBuilder, List<McpSyncClient> mcpSyncClients, ToolCallbackProvider tools) { + public OpenAIServiceImpl(ChatClient.Builder chatClientBuilder, List<McpSyncClient> mcpSyncClients) { this.chatClient = chatClientBuilder + .defaultOptions( + OpenAiChatOptions.builder().model("gpt-4o-mini").build()) .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 = webMcpChat(chatRequest.getPrompt()); - + String toolString = mcpChat(chatRequest.getPrompt()); Message userMessage = Message.builder().content("宸ュ叿杩斿洖淇℃伅锛�"+toolString).role(Message.Role.USER).build(); List<Message> messages = chatRequest.getMessages(); messages.add(userMessage); - - SSEEventSourceListener openAIEventSourceListener = new SSEEventSourceListener(emitter); + SSEEventSourceListener listener = new SSEEventSourceListener(emitter); ChatCompletion completion = ChatCompletion .builder() .messages(messages) .model(chatRequest.getModel()) .stream(true) .build(); - openAiStreamClient.streamChatCompletion(completion, openAIEventSourceListener); + openAiStreamClient.streamChatCompletion(completion, listener); return emitter; - } - public String mcpChat(ChatRequest chatRequest) { - WebFluxSseClientTransport webFluxSseClientTransport = new WebFluxSseClientTransport(WebClient.builder().baseUrl("http://localhost:8080")); - ChatCompletion completion = ChatCompletion - .builder() - .messages(chatRequest.getMessages()) - .model(chatRequest.getModel()) - .stream(false) - .build(); - List<Tools> tools = new ArrayList<>(); - McpSchema.Content content = null; - try (var client = McpClient.sync(webFluxSseClientTransport).build()) { - client.initialize(); - McpSchema.ListToolsResult toolsList = client.listTools(); - - for (McpSchema.Tool mcpTool : toolsList.tools()) { - - McpSchema.JsonSchema jsonSchema = mcpTool.inputSchema(); - - Parameters parameters = Parameters.builder() - .type(jsonSchema.type()) - .properties(jsonSchema.properties()) - .required(jsonSchema.required()).build(); - - Tools tool = Tools.builder() - .type(Tools.Type.FUNCTION.getName()) - .function(ToolsFunction.builder().name(mcpTool.name()).description(mcpTool.description()).parameters(parameters).build()) - .build(); - tools.add(tool); - } - completion.setTools(tools); - ChatCompletionResponse chatCompletionResponse = openAiStreamClient.chatCompletion(completion); - String arguments = chatCompletionResponse.getChoices().get(0).getMessage().getToolCalls().get(0).getFunction().getArguments(); - String name = chatCompletionResponse.getChoices().get(0).getMessage().getToolCalls().get(0).getFunction().getName(); - Map<String, Object> map = JSONUtil.toBean(arguments, Map.class); - McpSchema.CallToolResult sumResult = client.callTool(new McpSchema.CallToolRequest(name, map)); - content= sumResult.content().get(0); - } catch (Exception e) { - throw new ServiceException("璇锋眰澶辫触"+e); - } - return content.toString(); + public String mcpChat(String prompt){ + return this.chatClient.prompt(prompt).call().content(); } } -- Gitblit v1.9.3