From 1bddf5df3b77e505a9f41a1efa7b081cde32f931 Mon Sep 17 00:00:00 2001
From: ageerle <ageerle@163.com>
Date: 星期五, 09 五月 2025 16:45:41 +0800
Subject: [PATCH] feat: 兼容多平台模型

---
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/config/ChatConfig.java                      |    6 ++++--
 script/sql/update/20250509.sql                                                                    |    4 ++++
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatModelVo.java               |    7 ++++++-
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatModel.java                    |    7 +++++++
 ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatModelBo.java               |    7 +++++++
 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/OpenAiStreamClient.java |   24 +++++++++++++++++++++++-
 ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/constant/OpenAIConst.java      |    2 ++
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java    |    2 +-
 8 files changed, 54 insertions(+), 5 deletions(-)

diff --git a/ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/constant/OpenAIConst.java b/ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/constant/OpenAIConst.java
index bab2821..6ac62d2 100644
--- a/ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/constant/OpenAIConst.java
+++ b/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;
 
 }
diff --git a/ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/OpenAiStreamClient.java b/ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/OpenAiStreamClient.java
index ef03cb2..4b3cb97 100644
--- a/ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/OpenAiStreamClient.java
+++ b/ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/openai/OpenAiStreamClient.java
@@ -72,6 +72,11 @@
     private String apiHost;
 
     /**
+     * 鑷畾涔塽rl 鍏煎澶氫釜骞冲彴
+     */
+    private String apiUrl;
+
+    /**
      * 鑷畾涔夌殑okHttpClient
      * 濡傛灉涓嶈嚜瀹氫箟 锛屽氨鏄敤sdk榛樿鐨凮kHttpClient瀹炰緥
      */
@@ -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;
+
         /**
          * 鑷畾涔塐khttpClient
          */
@@ -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;
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatModel.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatModel.java
index f67e765..5dfce09 100644
--- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatModel.java
+++ b/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;
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatModelBo.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatModelBo.java
index 45e0705..f66908a 100644
--- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatModelBo.java
+++ b/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 })
diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatModelVo.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatModelVo.java
index 56efb59..49bd93c 100644
--- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatModelVo.java
+++ b/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;
-
 
 }
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/config/ChatConfig.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/config/ChatConfig.java
index e49dce7..ec577d3 100644
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/config/ChatConfig.java
+++ b/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)
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 c2e5ed3..b202ea0 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
@@ -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());
diff --git a/script/sql/update/20250509.sql b/script/sql/update/20250509.sql
new file mode 100644
index 0000000..19bfe5e
--- /dev/null
+++ b/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);

--
Gitblit v1.9.3