办学质量监测教学评价系统
ageerle
2025-05-09 1bddf5df3b77e505a9f41a1efa7b081cde32f931
feat: 兼容多平台模型
已修改7个文件
已添加1个文件
59 ■■■■■ 文件已修改
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/constant/OpenAIConst.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/OpenAiStreamClient.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatModel.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatModelBo.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatModelVo.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/config/ChatConfig.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
script/sql/update/20250509.sql 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/constant/OpenAIConst.java
@@ -10,6 +10,8 @@
    public final static String OPENAI_HOST = "https://api.openai.com/";
    public final static String apiUrl = "v1/chat/completions";
    public final static int SUCCEED_CODE = 200;
}
ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/OpenAiStreamClient.java
@@ -72,6 +72,11 @@
    private String apiHost;
    /**
     * è‡ªå®šä¹‰url å…¼å®¹å¤šä¸ªå¹³å°
     */
    private String apiUrl;
    /**
     * è‡ªå®šä¹‰çš„okHttpClient
     * å¦‚果不自定义 ï¼Œå°±æ˜¯ç”¨sdk默认的OkHttpClient实例
     */
@@ -111,6 +116,11 @@
            builder.apiHost = OpenAIConst.OPENAI_HOST;
        }
        apiHost = builder.apiHost;
        if (StrUtil.isBlank(builder.apiUrl)) {
            builder.apiUrl = OpenAIConst.apiUrl;
        }
        apiUrl = builder.apiUrl;
        if (Objects.isNull(builder.keyStrategy)) {
            builder.keyStrategy = new KeyRandomStrategy();
@@ -180,7 +190,7 @@
            ObjectMapper mapper = new ObjectMapper();
            String requestBody = mapper.writeValueAsString(chatCompletion);
            Request request = new Request.Builder()
                .url(this.apiHost + "v1/chat/completions")
                .url(this.apiHost + apiUrl)
                .post(RequestBody.create(MediaType.parse(ContentType.JSON.getValue()), requestBody))
                .build();
            factory.newEventSource(request, eventSourceListener);
@@ -611,6 +621,8 @@
         */
        private String apiHost;
        private String apiUrl;
        /**
         * è‡ªå®šä¹‰OkhttpClient
         */
@@ -645,6 +657,16 @@
            return this;
        }
        /**
         * @param val è‡ªå®šä¹‰è¯·æ±‚后缀
         * @return Builder
         * @see OpenAIConst
         */
        public Builder apiUrl(String val) {
            apiUrl = val;
            return this;
        }
        public Builder keyStrategy(KeyStrategyFunction val) {
            keyStrategy = val;
            return this;
ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatModel.java
@@ -1,6 +1,7 @@
package org.ruoyi.domain;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -69,6 +70,12 @@
    private String apiHost;
    /**
     * è¯·æ±‚地址后缀 - å…¼å®¹å¤šå¹³å°
     */
    @ExcelProperty(value = "请求地址后缀")
    private String apiUrl;
    /**
     * å¯†é’¥
     */
    private String apiKey;
ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatModelBo.java
@@ -1,5 +1,6 @@
package org.ruoyi.domain.bo;
import com.alibaba.excel.annotation.ExcelProperty;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.domain.ChatModel;
@@ -80,6 +81,12 @@
    private String apiKey;
    /**
     * è¯·æ±‚地址后缀 - å…¼å®¹å¤šå¹³å°
     */
    @ExcelProperty(value = "请求地址后缀")
    private String apiUrl;
    /**
     * å¤‡æ³¨
     */
    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatModelVo.java
@@ -89,10 +89,15 @@
    private String apiKey;
    /**
     * è¯·æ±‚地址后缀 - å…¼å®¹å¤šå¹³å°
     */
    @ExcelProperty(value = "请求地址后缀")
    private String apiUrl;
    /**
     * å¤‡æ³¨
     */
    @ExcelProperty(value = "备注")
    private String remark;
}
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/config/ChatConfig.java
@@ -32,11 +32,12 @@
    public OpenAiStreamClient openAiStreamClient() {
        String apiHost = configService.getConfigValue("chat", "apiHost");
        String apiKey = configService.getConfigValue("chat", "apiKey");
        openAiStreamClient = createOpenAiStreamClient(apiHost,apiKey);
        String url = configService.getConfigValue("chat", "apiUrl");
        openAiStreamClient = createOpenAiStreamClient(apiHost,apiKey,url);
        return openAiStreamClient;
    }
    public static OpenAiStreamClient createOpenAiStreamClient(String apiHost, String apiKey) {
    public static OpenAiStreamClient createOpenAiStreamClient(String apiHost, String apiKey,String url) {
        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new OpenAILogger());
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
@@ -47,6 +48,7 @@
            .build();
        return OpenAiStreamClient.builder()
            .apiHost(apiHost)
            .apiUrl(url)
            .apiKey(Collections.singletonList(apiKey))
            .keyStrategy(new KeyRandomStrategy())
            .okHttpClient(okHttpClient)
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java
@@ -47,7 +47,7 @@
    @Override
    public SseEmitter chat(ChatRequest chatRequest,SseEmitter emitter) {
        ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel());
        openAiStreamClient = ChatConfig.createOpenAiStreamClient(chatModelVo.getApiHost(), chatModelVo.getApiKey());
        openAiStreamClient = ChatConfig.createOpenAiStreamClient(chatModelVo.getApiHost(), chatModelVo.getApiKey(),chatModelVo.getApiUrl());
        List<Message> messages = chatRequest.getMessages();
        if (enabled) {
            String toolString = mcpChat(chatRequest.getPrompt());
script/sql/update/20250509.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
ALTER TABLE `chat_model`
    ADD COLUMN `api_url` varchar(50) NULL COMMENT '请求后缀' AFTER `api_key`;
INSERT INTO `chat_config` (`id`, `category`, `config_name`, `config_value`, `config_dict`, `create_dept`, `create_time`, `create_by`, `update_by`, `update_time`, `remark`, `version`, `del_flag`, `update_ip`, `tenant_id`) VALUES (1779450794872414211, 'chat', 'apiUrl', 'v1/chat/completions', 'API è¯·æ±‚后缀', 103, '2024-04-14 18:05:05', '1', '1', '2025-04-23 22:29:04', NULL, NULL, '0', NULL, 0);