办学质量监测教学评价系统
酒亦
2025-06-02 d635e30b4aa0ec38844f1094038193308dd8fdd8
上传图片支持使用后台image分类模型
已修改4个文件
已添加1个文件
101 ■■■■■ 文件已修改
ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatModelService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatModelServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/ChatModeType.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/ImageOpenAiServiceImpl.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/IChatModelService.java
@@ -53,9 +53,13 @@
     * é€šè¿‡æ¨¡åž‹åç§°èŽ·å–æ¨¡åž‹ä¿¡æ¯
     */
    ChatModelVo selectModelByName(String modelName);
    /**
     * é€šè¿‡æ¨¡åž‹åˆ†ç±»èŽ·å–æ¨¡åž‹ä¿¡æ¯
     */
    ChatModelVo selectModelByCategory(String image);
    /**
     * èŽ·å–ppt模型信息
     */
    ChatModel getPPT();
}
ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/service/impl/ChatModelServiceImpl.java
@@ -129,6 +129,13 @@
    public ChatModelVo selectModelByName(String modelName) {
        return baseMapper.selectVoOne(Wrappers.<ChatModel>lambdaQuery().eq(ChatModel::getModelName, modelName));
    }
    /**
     * é€šè¿‡æ¨¡åž‹åˆ†ç±»èŽ·å–æ¨¡åž‹ä¿¡æ¯
     */
    @Override
    public ChatModelVo selectModelByCategory(String  category) {
        return baseMapper.selectVoOne(Wrappers.<ChatModel>lambdaQuery().eq(ChatModel::getCategory, category));
    }
    @Override
    public ChatModel getPPT() {
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/ChatModeType.java
@@ -15,7 +15,9 @@
    QIANWEN("qianwen", "通义千问"),
    VECTOR("vector", "知识库向量模型");
    VECTOR("vector", "知识库向量模型"),
    IMAGE("image", "图片识别模型");
    private final String code;
    private final String description;
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<Message> 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();
    }
}
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java
@@ -125,7 +125,16 @@
     */
    private void buildChatMessageList(ChatRequest chatRequest){
        String sysPrompt;
        // çŸ«æ­£æ¨¡åž‹åç§° å¦‚果是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<Message> messages = chatRequest.getMessages();
        // æŸ¥è¯¢å‘量库相关信息加入到上下文