办学质量监测教学评价系统
ageerle
2025-04-24 8fc7ad0359ba7c0ce1e144525d1d59f1dc23512e
feat: mcp开启后才执行工具调用
已修改5个文件
39 ■■■■ 文件已修改
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/BillingType.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/ChatModeType.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/DisplayType.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/BillingType.java
@@ -4,8 +4,8 @@
@Getter
public enum BillingType {
    TOKEN("1", "token扣费"), // token扣费
    TIMES("2", "次数扣费");   // 次数扣费
    TOKEN("1", "token扣费"),
    TIMES("2", "次数扣费");
    private final String code;
    private final String description;
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/ChatModeType.java
@@ -4,9 +4,9 @@
@Getter
public enum ChatModeType {
    OLLAMA("ollama", "本地部署模型"), // token扣费
    CHAT("chat", "中转模型"),   // 次数扣费
    VECTOR("vector", "知识库向量模型");   // 次数扣费
    OLLAMA("ollama", "本地部署模型"),
    CHAT("chat", "中转模型"),
    VECTOR("vector", "知识库向量模型");
    private final String code;
    private final String description;
@@ -16,11 +16,4 @@
        this.description = description;
    }
    public String getCode() {
        return code;
    }
    public String getDescription() {
        return description;
    }
}
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/enums/DisplayType.java
@@ -3,7 +3,7 @@
import lombok.Getter;
/**
 * 描述:
 * 描述:是否显示
 *
 * @author ageerle@163.com
 * date 2025/4/10
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java
@@ -15,6 +15,7 @@
import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;
import org.springframework.ai.openai.OpenAiChatOptions;
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;
@@ -28,6 +29,10 @@
    private IChatModelService chatModelService;
    private OpenAiStreamClient openAiStreamClient;
    @Value("${spring.ai.mcp.client.enabled}")
    private Boolean enabled;
    private final ChatClient chatClient;
@@ -43,10 +48,12 @@
    public SseEmitter chat(ChatRequest chatRequest,SseEmitter emitter) {
        ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel());
        openAiStreamClient = ChatConfig.createOpenAiStreamClient(chatModelVo.getApiHost(), chatModelVo.getApiKey());
        String toolString = mcpChat(chatRequest.getPrompt());
        Message userMessage = Message.builder().content("工具返回信息:"+toolString).role(Message.Role.USER).build();
        List<Message> messages = chatRequest.getMessages();
        messages.add(userMessage);
        if (enabled) {
            String toolString = mcpChat(chatRequest.getPrompt());
            Message userMessage = Message.builder().content("工具返回信息:"+toolString).role(Message.Role.USER).build();
            messages.add(userMessage);
        }
        SSEEventSourceListener listener = new SSEEventSourceListener(emitter);
        ChatCompletion completion = ChatCompletion
                .builder()
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java
@@ -80,12 +80,11 @@
                checkUnauthenticatedUserChatLimit(request);
            }else {
                LocalCache.CACHE.put("userId", chatCostService.getUserId());
                chatRequest.setUserId(chatCostService.getUserId());
                // 保存消息记录 并扣除费用
                chatCostService.deductToken(chatRequest);
            }
            // 根据模型名称前缀调用不同的处理逻辑
            // 根据模型分类调用不同的处理逻辑
            switchModelAndHandle(chatRequest,sseEmitter);
        } catch (Exception e) {
            log.error(e.getMessage(),e);
@@ -119,7 +118,6 @@
                count++;
                RedisUtils.setCacheObject(redisKey, count);
            }
    }
    /**
@@ -145,8 +143,7 @@
        if(StringUtils.isEmpty(sysPrompt)){
            sysPrompt ="你是一个由RuoYI-AI开发的人工智能助手,名字叫熊猫助手。你擅长中英文对话,能够理解并处理各种问题,提供安全、有帮助、准确的回答。" +
                    "当前时间:"+ DateUtils.getDate()+
                    "#注意:回复之前注意结合上下文和工具返回内容。";
                    "#注意:回复之前注意结合上下文和工具返回内容进行回复。";
        }
        // 设置系统默认提示词
        Message sysMessage = Message.builder().content(sysPrompt).role(Message.Role.SYSTEM).build();