From d635e30b4aa0ec38844f1094038193308dd8fdd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=85=92=E4=BA=A6?= Date: Mon, 2 Jun 2025 08:11:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=9B=BE=E7=89=87=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=BD=BF=E7=94=A8=E5=90=8E=E5=8F=B0image=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/ruoyi/service/IChatModelService.java | 6 +- .../service/impl/ChatModelServiceImpl.java | 7 ++ .../org/ruoyi/chat/enums/ChatModeType.java | 4 +- .../chat/impl/ImageOpenAiServiceImpl.java | 75 +++++++++++++++++++ .../service/chat/impl/SseServiceImpl.java | 11 ++- 5 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/ImageOpenAiServiceImpl.java diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatModelService.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatModelService.java index 86eef8dd..62dbf970 100644 --- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatModelService.java +++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatModelService.java @@ -53,9 +53,13 @@ public interface IChatModelService { * 通过模型名称获取模型信息 */ ChatModelVo selectModelByName(String modelName); - + /** + * 通过模型分类获取模型信息 + */ + ChatModelVo selectModelByCategory(String image); /** * 获取ppt模型信息 */ ChatModel getPPT(); + } diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatModelServiceImpl.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatModelServiceImpl.java index 4c82f3df..d0b5f5cd 100644 --- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatModelServiceImpl.java +++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatModelServiceImpl.java @@ -129,6 +129,13 @@ public class ChatModelServiceImpl implements IChatModelService { public ChatModelVo selectModelByName(String modelName) { return baseMapper.selectVoOne(Wrappers.lambdaQuery().eq(ChatModel::getModelName, modelName)); } + /** + * 通过模型分类获取模型信息 + */ + @Override + public ChatModelVo selectModelByCategory(String category) { + return baseMapper.selectVoOne(Wrappers.lambdaQuery().eq(ChatModel::getCategory, category)); + } @Override public ChatModel getPPT() { diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/ChatModeType.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/ChatModeType.java index 8388ad2f..13a39d90 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/ChatModeType.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/ChatModeType.java @@ -15,7 +15,9 @@ public enum ChatModeType { QIANWEN("qianwen", "通义千问"), - VECTOR("vector", "知识库向量模型"); + VECTOR("vector", "知识库向量模型"), + + IMAGE("image", "图片识别模型"); private final String code; private final String description; diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/ImageOpenAiServiceImpl.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/ImageOpenAiServiceImpl.java new file mode 100644 index 00000000..11b4c1ec --- /dev/null +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/ImageOpenAiServiceImpl.java @@ -0,0 +1,75 @@ +package org.ruoyi.chat.service.chat.impl; + +import io.modelcontextprotocol.client.McpSyncClient; +import lombok.extern.slf4j.Slf4j; +import org.ruoyi.chat.config.ChatConfig; +import org.ruoyi.chat.enums.ChatModeType; +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.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.util.List; + +/** + * 图片识别模型 + */ +@Service +@Slf4j +public class ImageOpenAiServiceImpl implements IChatService { + + @Autowired + private IChatModelService chatModelService; + + private final ChatClient chatClient; + + public ImageOpenAiServiceImpl(ChatClient.Builder chatClientBuilder) { + this.chatClient = chatClientBuilder.build(); + } + + @Override + public SseEmitter chat(ChatRequest chatRequest, SseEmitter emitter) { + // 从数据库获取 image 类型的模型配置 + ChatModelVo chatModelVo = chatModelService.selectModelByCategory(ChatModeType.IMAGE.getCode()); + if (chatModelVo == null) { + log.error("未找到 image 类型的模型配置"); + emitter.completeWithError(new IllegalStateException("未找到 image 类型的模型配置")); + return emitter; + } + + // 创建 OpenAI 流客户端 + OpenAiStreamClient openAiStreamClient = ChatConfig.createOpenAiStreamClient(chatModelVo.getApiHost(), chatModelVo.getApiKey()); + List messages = chatRequest.getMessages(); + + // 创建 SSE 事件源监听器 + SSEEventSourceListener listener = new SSEEventSourceListener(emitter, chatRequest.getUserId(), chatRequest.getSessionId()); + + // 构建聊天完成请求 + ChatCompletion completion = ChatCompletion + .builder() + .messages(messages) + .model(chatModelVo.getModelName()) // 使用数据库中配置的模型名称 + .stream(true) + .build(); + + // 发起流式聊天完成请求 + openAiStreamClient.streamChatCompletion(completion, listener); + + return emitter; + } + + + @Override + public String getCategory() { + return ChatModeType.IMAGE.getCode(); + } +} diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java index 472fd7b8..f7dee9a6 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java @@ -125,7 +125,16 @@ public class SseServiceImpl implements ISseService { */ private void buildChatMessageList(ChatRequest chatRequest){ String sysPrompt; - chatModelVo = chatModelService.selectModelByName(chatRequest.getModel()); + // 矫正模型名称 如果是gpt-image 则查询image类型模型 获取模型名称 + if(chatRequest.getModel().equals("gpt-image")) { + chatModelVo = chatModelService.selectModelByCategory("image"); + if (chatModelVo == null) { + log.error("未找到image类型的模型配置"); + throw new IllegalStateException("未找到image类型的模型配置"); + }// chatRequest.setModel(chatModelVo.getModelName()); + }else{ + chatModelVo = chatModelService.selectModelByName(chatRequest.getModel()); + } // 获取对话消息列表 List messages = chatRequest.getMessages(); // 查询向量库相关信息加入到上下文