From 24681c81c09022f584a57006f2534b5f74723414 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 30 六月 2026 09:27:31 +0800
Subject: [PATCH] 初始化项目

---
 yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/xinghuo/XingHuoChatModel.java |  136 +++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 123 insertions(+), 13 deletions(-)

diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/xinghuo/XingHuoChatModel.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/xinghuo/XingHuoChatModel.java
index cbac3b6..65a1c99 100644
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/xinghuo/XingHuoChatModel.java
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/xinghuo/XingHuoChatModel.java
@@ -1,11 +1,14 @@
 package cn.iocoder.yudao.module.ai.framework.ai.core.model.xinghuo;
 
-import lombok.RequiredArgsConstructor;
+import cn.hutool.core.util.StrUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.ai.chat.model.ChatModel;
 import org.springframework.ai.chat.model.ChatResponse;
 import org.springframework.ai.chat.prompt.ChatOptions;
 import org.springframework.ai.chat.prompt.Prompt;
+import org.springframework.ai.deepseek.DeepSeekChatModel;
+import org.springframework.ai.deepseek.DeepSeekChatOptions;
+import org.springframework.ai.deepseek.api.DeepSeekApi;
 import reactor.core.publisher.Flux;
 
 /**
@@ -14,37 +17,144 @@
  * @author fansili
  */
 @Slf4j
-@RequiredArgsConstructor
 public class XingHuoChatModel implements ChatModel {
 
-    public static final String BASE_URL_V1 = "https://spark-api-open.xf-yun.com";
-
-    public static final String BASE_URL_V2 = "https://spark-api-open.xf-yun.com";
-    public static final String BASE_COMPLETIONS_PATH_V2 = "/v2/chat/completions";
+    /**
+     * 鏄熺伀 X2
+     *
+     * @see <a href="https://spark-api-open.xf-yun.com/x2/chat/completions">鎺ュ彛鍦板潃</a>
+     */
+    public static final String MODEL_X2 = "x2";
 
     /**
-     * 宸茬煡妯″瀷鍚嶅垪琛細x1銆�4.0Ultra銆乬eneralv3.5銆乵ax-32k銆乬eneralv3銆乸ro-128k銆乴ite
+     * 鏄熺伀 X2 Flash
+     *
+     * @see <a href="https://spark-api-open.xf-yun.com/agent/v1/chat/completions">鎺ュ彛鍦板潃</a>
      */
-    public static final String MODEL_DEFAULT = "4.0Ultra";
+    public static final String MODEL_X2_FLASH = "x2-flash";
+
+    private static final String BASE_URL_X2 = "https://spark-api-open.xf-yun.com/x2";
+
+    private static final String BASE_URL_X2_FLASH = "https://spark-api-open.xf-yun.com/agent/v1";
+
+    public static final String MODEL_DEFAULT = MODEL_X2_FLASH;
+
+    private static String getBaseUrl(String model) {
+        if (MODEL_X2_FLASH.equals(model)) {
+            return BASE_URL_X2_FLASH;
+        }
+        return BASE_URL_X2;
+    }
+
+    private final String apiKey;
+
+    private final DeepSeekChatOptions options;
 
     /**
-     * v1 鍏煎 OpenAI 鎺ュ彛锛岃繘琛屽鐢�
+     * 鍏煎 OpenAI 鎺ュ彛锛岃繘琛屽鐢�
      */
-    private final ChatModel openAiChatModelV1;
+    private final ChatModel chatModelX2;
+
+    private final ChatModel chatModelX2Flash;
+
+    private XingHuoChatModel(String apiKey, DeepSeekChatOptions options) {
+        this.apiKey = apiKey;
+        this.options = options;
+        this.chatModelX2 = buildChatModel(MODEL_X2);
+        this.chatModelX2Flash = buildChatModel(MODEL_X2_FLASH);
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
 
     @Override
     public ChatResponse call(Prompt prompt) {
-        return openAiChatModelV1.call(prompt);
+        return getChatModel(prompt).call(buildApiPrompt(prompt));
     }
 
     @Override
     public Flux<ChatResponse> stream(Prompt prompt) {
-        return openAiChatModelV1.stream(prompt);
+        return getChatModel(prompt).stream(buildApiPrompt(prompt));
     }
 
     @Override
+    public ChatOptions getOptions() {
+        return options;
+    }
+
+    @Override
+    @Deprecated(forRemoval = true)
+    @SuppressWarnings("removal")
     public ChatOptions getDefaultOptions() {
-        return openAiChatModelV1.getDefaultOptions();
+        return getOptions();
+    }
+
+    private ChatModel getChatModel(Prompt prompt) {
+        String model = options.getModel();
+        ChatOptions options = prompt.getOptions();
+        if (options != null && isBusinessModel(options.getModel())) {
+            model = options.getModel();
+        }
+        return getChatModel(model);
+    }
+
+    private ChatModel getChatModel(String model) {
+        if (MODEL_X2_FLASH.equals(model)) {
+            return chatModelX2Flash;
+        }
+        return chatModelX2;
+    }
+
+    private ChatModel buildChatModel(String model) {
+        return DeepSeekChatModel.builder()
+                .deepSeekApi(DeepSeekApi.builder()
+                        .baseUrl(getBaseUrl(model))
+                        .apiKey(apiKey)
+                        .build())
+                .options(options.mutate().model("spark-x").build())
+                .build();
+    }
+
+    private static Prompt buildApiPrompt(Prompt prompt) {
+        ChatOptions options = prompt.getOptions();
+        if (options == null) {
+            return prompt;
+        }
+        return Prompt.builder()
+                .messages(prompt.getInstructions())
+                .chatOptions(options.mutate().model("spark-x").build())
+                .build();
+    }
+
+    private static boolean isBusinessModel(String model) {
+        return MODEL_X2.equals(model) || MODEL_X2_FLASH.equals(model);
+    }
+
+    public static final class Builder {
+
+        private String apiKey;
+
+        private DeepSeekChatOptions options;
+
+        public Builder apiKey(String apiKey) {
+            this.apiKey = apiKey;
+            return this;
+        }
+
+        public Builder options(DeepSeekChatOptions options) {
+            this.options = options;
+            return this;
+        }
+
+        public XingHuoChatModel build() {
+            DeepSeekChatOptions options = this.options != null ? this.options : DeepSeekChatOptions.builder().build();
+            if (StrUtil.isEmpty(options.getModel())) {
+                options = options.mutate().model(MODEL_DEFAULT).build();
+            }
+            return new XingHuoChatModel(apiKey, options);
+        }
+
     }
 
 }

--
Gitblit v1.9.3