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