This is an automated email from the ASF dual-hosted git repository.

wuzhiguo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/bigtop-manager.git


The following commit(s) were added to refs/heads/main by this push:
     new 55292043 BIGTOP-4313: Adjust the code of AI module (#136)
55292043 is described below

commit 55292043bd317efcf8e3c2bde10712e048ad612b
Author: haopeng <[email protected]>
AuthorDate: Fri Jan 3 16:50:11 2025 +0800

    BIGTOP-4313: Adjust the code of AI module (#136)
---
 .../ai/assistant/GeneralAssistantFactory.java      |  93 ++++---
 .../GeneralAssistantConfig.java}                   |  64 ++---
 .../ChatMemoryStoreProvider.java                   |  29 ++-
 .../provider/LocSystemPromptProvider.java          |  15 +-
 .../assistant/store/PersistentChatMemoryStore.java |   4 +-
 .../ai/assistant/GeneralAssistantFactoryTest.java  |  21 +-
 ...igTest.java => GeneralAssistantConfigTest.java} |  25 +-
 .../manager/ai/core/AbstractAIAssistant.java       |   8 +-
 .../AIAssistantConfig.java}                        |   6 +-
 .../manager/ai/core/factory/AIAssistant.java       |   4 +-
 .../ai/core/factory/AIAssistantFactory.java        |  19 +-
 .../bigtop/manager/ai/core/factory/ToolBox.java    |  32 ---
 .../manager/ai/dashscope/DashScopeAssistant.java   |  12 +-
 .../bigtop/manager/ai/openai/OpenAIAssistant.java  |  12 +-
 .../manager/ai/qianfan/QianFanAssistant.java       |  20 +-
 .../bigtop/manager/server/ServerApplication.java   |   7 +-
 .../server/service/impl/ChatbotServiceImpl.java    | 263 ++++++++-----------
 .../server/service/impl/LLMConfigServiceImpl.java  | 283 ++++++++++-----------
 18 files changed, 420 insertions(+), 497 deletions(-)

diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactory.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactory.java
index fadd3732..bf4b5290 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactory.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactory.java
@@ -18,74 +18,87 @@
  */
 package org.apache.bigtop.manager.ai.assistant;
 
-import org.apache.bigtop.manager.ai.assistant.provider.LocSystemPromptProvider;
-import org.apache.bigtop.manager.ai.assistant.store.ChatMemoryStoreProvider;
+import org.apache.bigtop.manager.ai.assistant.config.GeneralAssistantConfig;
+import org.apache.bigtop.manager.ai.assistant.provider.ChatMemoryStoreProvider;
 import org.apache.bigtop.manager.ai.core.AbstractAIAssistantFactory;
+import org.apache.bigtop.manager.ai.core.config.AIAssistantConfig;
 import org.apache.bigtop.manager.ai.core.enums.PlatformType;
 import org.apache.bigtop.manager.ai.core.enums.SystemPrompt;
+import 
org.apache.bigtop.manager.ai.core.exception.AssistantConfigNotSetException;
 import org.apache.bigtop.manager.ai.core.factory.AIAssistant;
-import org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
 import org.apache.bigtop.manager.ai.core.provider.SystemPromptProvider;
 import org.apache.bigtop.manager.ai.dashscope.DashScopeAssistant;
 import org.apache.bigtop.manager.ai.openai.OpenAIAssistant;
 import org.apache.bigtop.manager.ai.qianfan.QianFanAssistant;
 
+import org.springframework.stereotype.Component;
+
 import dev.langchain4j.service.tool.ToolProvider;
-import dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore;
 
+import jakarta.annotation.Resource;
+import java.util.ArrayList;
 import java.util.List;
 
+@Component
 public class GeneralAssistantFactory extends AbstractAIAssistantFactory {
 
-    private final SystemPromptProvider systemPromptProvider;
-    private final ChatMemoryStoreProvider chatMemoryStoreProvider;
+    @Resource
+    private SystemPromptProvider systemPromptProvider;
+
+    @Resource
+    private ChatMemoryStoreProvider chatMemoryStoreProvider;
 
-    public GeneralAssistantFactory(ChatMemoryStoreProvider 
chatMemoryStoreProvider) {
-        this(new LocSystemPromptProvider(), chatMemoryStoreProvider);
+    private void configureSystemPrompt(AIAssistant.Builder builder, 
SystemPrompt systemPrompt, String locale) {
+        List<String> systemPrompts = new ArrayList<>();
+        if (systemPrompt != null) {
+            
systemPrompts.add(systemPromptProvider.getSystemMessage(systemPrompt));
+        }
+        if (locale != null) {
+            systemPrompts.add(systemPromptProvider.getLanguagePrompt(locale));
+        }
+        
builder.withSystemPrompt(systemPromptProvider.getSystemMessages(systemPrompts));
     }
 
-    public GeneralAssistantFactory(
-            SystemPromptProvider systemPromptProvider, ChatMemoryStoreProvider 
chatMemoryStoreProvider) {
-        this.systemPromptProvider = systemPromptProvider;
-        this.chatMemoryStoreProvider = chatMemoryStoreProvider;
+    private AIAssistant.Builder initializeBuilder(PlatformType platformType) {
+        return switch (platformType) {
+            case OPENAI -> OpenAIAssistant.builder();
+            case DASH_SCOPE -> DashScopeAssistant.builder();
+            case QIANFAN -> QianFanAssistant.builder();
+        };
     }
 
     @Override
     public AIAssistant createWithPrompt(
-            PlatformType platformType,
-            AIAssistantConfigProvider assistantConfig,
-            Object id,
-            ToolProvider toolProvider,
-            SystemPrompt systemPrompt) {
-        AIAssistant.Builder builder =
-                switch (platformType) {
-                    case OPENAI -> OpenAIAssistant.builder();
-                    case DASH_SCOPE -> DashScopeAssistant.builder();
-                    case QIANFAN -> QianFanAssistant.builder();
-                };
-        builder = builder.id(id)
-                .memoryStore(
-                        (id == null)
-                                ? new InMemoryChatMemoryStore()
-                                : 
chatMemoryStoreProvider.createPersistentChatMemoryStore())
-                .withConfigProvider(assistantConfig)
-                .withToolProvider(toolProvider);
-
-        List<String> systemPrompts = new java.util.ArrayList<>();
-        systemPrompts.add(systemPromptProvider.getSystemMessage(systemPrompt));
-        String locale = assistantConfig.getLanguage();
-        if (locale != null) {
-            systemPrompts.add(systemPromptProvider.getLanguagePrompt(locale));
+            AIAssistantConfig config, ToolProvider toolProvider, SystemPrompt 
systemPrompt) {
+        GeneralAssistantConfig generalAssistantConfig = 
(GeneralAssistantConfig) config;
+        PlatformType platformType = generalAssistantConfig.getPlatformType();
+        Object id = generalAssistantConfig.getId();
+        if (id == null) {
+            throw new AssistantConfigNotSetException("ID");
         }
 
-        
builder.withSystemPrompt(systemPromptProvider.getSystemMessages(systemPrompts));
+        AIAssistant.Builder builder = initializeBuilder(platformType);
+        builder.id(id)
+                
.memoryStore(chatMemoryStoreProvider.createPersistentChatMemoryStore())
+                .withConfig(generalAssistantConfig)
+                .withToolProvider(toolProvider);
+
+        configureSystemPrompt(builder, systemPrompt, 
generalAssistantConfig.getLanguage());
 
         return builder.build();
     }
 
     @Override
-    public AIAssistant createAiService(
-            PlatformType platformType, AIAssistantConfigProvider 
assistantConfig, Long id, ToolProvider toolProvider) {
-        return createWithPrompt(platformType, assistantConfig, id, 
toolProvider, SystemPrompt.DEFAULT_PROMPT);
+    public AIAssistant createForTest(AIAssistantConfig config, ToolProvider 
toolProvider) {
+        GeneralAssistantConfig generalAssistantConfig = 
(GeneralAssistantConfig) config;
+        PlatformType platformType = generalAssistantConfig.getPlatformType();
+        AIAssistant.Builder builder = initializeBuilder(platformType);
+
+        builder.id(null)
+                
.memoryStore(chatMemoryStoreProvider.createInMemoryChatMemoryStore())
+                .withConfig(generalAssistantConfig)
+                .withToolProvider(toolProvider);
+
+        return builder.build();
     }
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/AIAssistantConfig.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/config/GeneralAssistantConfig.java
similarity index 68%
rename from 
bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/AIAssistantConfig.java
rename to 
bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/config/GeneralAssistantConfig.java
index 132c37a1..2838529e 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/AIAssistantConfig.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/config/GeneralAssistantConfig.java
@@ -16,37 +16,34 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.ai.assistant.provider;
+package org.apache.bigtop.manager.ai.assistant.config;
 
-import org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
+import org.apache.bigtop.manager.ai.core.config.AIAssistantConfig;
+import org.apache.bigtop.manager.ai.core.enums.PlatformType;
+
+import lombok.Getter;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 
-public class AIAssistantConfig implements AIAssistantConfigProvider {
+@Getter
+public class GeneralAssistantConfig implements AIAssistantConfig {
 
-    /**
-     * Model name for platform that we want to use
-     */
+    private final Long id;
     private final String model;
-
-    /**
-     * Credentials for different platforms
-     */
-    private final Map<String, String> credentials;
-
     private final String language;
-    /**
-     * Platform extra configs are put here
-     */
+    private final PlatformType platformType;
+    private final Map<String, String> credentials;
     private final Map<String, String> configs;
 
-    private AIAssistantConfig(
-            String model, Map<String, String> credentials, String language, 
Map<String, String> configMap) {
-        this.model = model;
-        this.credentials = credentials;
-        this.language = language;
-        this.configs = configMap;
+    private GeneralAssistantConfig(Builder builder) {
+        this.model = Objects.requireNonNull(builder.model);
+        this.credentials = Objects.requireNonNull(builder.credentials);
+        this.platformType = Objects.requireNonNull(builder.platformType);
+        this.language = builder.language;
+        this.id = builder.id;
+        this.configs = builder.configs;
     }
 
     public static Builder builder() {
@@ -68,26 +65,29 @@ public class AIAssistantConfig implements 
AIAssistantConfigProvider {
         return configs;
     }
 
-    @Override
-    public String getLanguage() {
-        return language;
-    }
-
     public static class Builder {
+        private Long id;
         private String model;
         private String language;
-
+        private PlatformType platformType;
         private final Map<String, String> credentials = new HashMap<>();
-
         private final Map<String, String> configs = new HashMap<>();
 
-        public Builder() {}
-
         public Builder setModel(String model) {
             this.model = model;
             return this;
         }
 
+        public Builder setPlatformType(PlatformType platformType) {
+            this.platformType = platformType;
+            return this;
+        }
+
+        public Builder setId(Long id) {
+            this.id = id;
+            return this;
+        }
+
         public Builder addCredential(String key, String value) {
             credentials.put(key, value);
             return this;
@@ -115,8 +115,8 @@ public class AIAssistantConfig implements 
AIAssistantConfigProvider {
             return this;
         }
 
-        public AIAssistantConfig build() {
-            return new AIAssistantConfig(model, credentials, language, 
configs);
+        public GeneralAssistantConfig build() {
+            return new GeneralAssistantConfig(this);
         }
     }
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/ChatMemoryStoreProvider.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/ChatMemoryStoreProvider.java
similarity index 70%
rename from 
bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/ChatMemoryStoreProvider.java
rename to 
bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/ChatMemoryStoreProvider.java
index 90e24e6c..67003f10 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/ChatMemoryStoreProvider.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/ChatMemoryStoreProvider.java
@@ -16,31 +16,32 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.ai.assistant.store;
+package org.apache.bigtop.manager.ai.assistant.provider;
 
+import org.apache.bigtop.manager.ai.assistant.store.PersistentChatMemoryStore;
 import org.apache.bigtop.manager.dao.repository.ChatMessageDao;
 import org.apache.bigtop.manager.dao.repository.ChatThreadDao;
 
+import org.springframework.stereotype.Component;
+
 import dev.langchain4j.store.memory.chat.ChatMemoryStore;
 import dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore;
 
+import jakarta.annotation.Resource;
+
+@Component
 public class ChatMemoryStoreProvider {
-    private final ChatThreadDao chatThreadDao;
-    private final ChatMessageDao chatMessageDao;
+    @Resource
+    private ChatThreadDao chatThreadDao;
 
-    public ChatMemoryStoreProvider(ChatThreadDao chatThreadDao, ChatMessageDao 
chatMessageDao) {
-        this.chatThreadDao = chatThreadDao;
-        this.chatMessageDao = chatMessageDao;
-    }
-
-    public ChatMemoryStoreProvider() {
-        this(null, null);
-    }
+    @Resource
+    private ChatMessageDao chatMessageDao;
 
     public ChatMemoryStore createPersistentChatMemoryStore() {
-        if (chatThreadDao == null || chatMessageDao == null) {
-            return new InMemoryChatMemoryStore();
-        }
         return new PersistentChatMemoryStore(chatThreadDao, chatMessageDao);
     }
+
+    public ChatMemoryStore createInMemoryChatMemoryStore() {
+        return new InMemoryChatMemoryStore();
+    }
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/LocSystemPromptProvider.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/LocSystemPromptProvider.java
index a3cb9894..756bcf33 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/LocSystemPromptProvider.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/LocSystemPromptProvider.java
@@ -21,6 +21,7 @@ package org.apache.bigtop.manager.ai.assistant.provider;
 import org.apache.bigtop.manager.ai.core.enums.SystemPrompt;
 import org.apache.bigtop.manager.ai.core.provider.SystemPromptProvider;
 
+import org.springframework.stereotype.Component;
 import org.springframework.util.ResourceUtils;
 
 import lombok.extern.slf4j.Slf4j;
@@ -33,6 +34,7 @@ import java.util.List;
 import java.util.Objects;
 
 @Slf4j
+@Component
 public class LocSystemPromptProvider implements SystemPromptProvider {
 
     @Override
@@ -67,21 +69,14 @@ public class LocSystemPromptProvider implements 
SystemPromptProvider {
     private String loadPromptFromFile(String fileName) {
         final String filePath = fileName + ".st";
         String text = loadTextFromFile(filePath);
-        if (text == null) {
-            return "You are a helpful assistant.";
-        } else {
-            return text;
-        }
+        return Objects.requireNonNullElse(text, "You are a helpful 
assistant.");
     }
 
+    @Override
     public String getLanguagePrompt(String locale) {
         final String filePath = SystemPrompt.LANGUAGE_PROMPT.getValue() + '-' 
+ locale + ".st";
         String text = loadTextFromFile(filePath);
-        if (text == null) {
-            return "Answer in " + locale;
-        } else {
-            return text;
-        }
+        return Objects.requireNonNullElseGet(text, () -> "Answer in " + 
locale);
     }
 
     @Override
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
index 8bc3e980..d165c781 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
@@ -41,8 +41,8 @@ import java.util.concurrent.ConcurrentHashMap;
 public class PersistentChatMemoryStore implements ChatMemoryStore {
 
     private final Map<Object, List<ChatMessage>> messagesByMemoryId = new 
ConcurrentHashMap<>();
-    protected final ChatThreadDao chatThreadDao;
-    protected final ChatMessageDao chatMessageDao;
+    private final ChatThreadDao chatThreadDao;
+    private final ChatMessageDao chatMessageDao;
 
     public PersistentChatMemoryStore(ChatThreadDao chatThreadDao, 
ChatMessageDao chatMessageDao) {
         this.chatThreadDao = chatThreadDao;
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactoryTest.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactoryTest.java
index 0a559b44..b80149ad 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactoryTest.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactoryTest.java
@@ -18,16 +18,12 @@
  */
 package org.apache.bigtop.manager.ai.assistant;
 
-import org.apache.bigtop.manager.ai.assistant.store.ChatMemoryStoreProvider;
-import org.apache.bigtop.manager.ai.core.enums.PlatformType;
+import org.apache.bigtop.manager.ai.core.config.AIAssistantConfig;
 import org.apache.bigtop.manager.ai.core.factory.AIAssistant;
-import org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
-import org.apache.bigtop.manager.ai.core.provider.SystemPromptProvider;
 import org.apache.bigtop.manager.ai.openai.OpenAIAssistant;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.MockedStatic;
 import org.mockito.MockitoAnnotations;
@@ -42,23 +38,18 @@ import static org.mockito.Mockito.when;
 class GeneralAssistantFactoryTest {
 
     @Mock
-    private SystemPromptProvider systemPromptProvider;
+    private AIAssistantConfig assistantConfigProvider;
 
     @Mock
-    private AIAssistantConfigProvider assistantConfigProvider;
-
-    @InjectMocks
     private GeneralAssistantFactory generalAssistantFactory;
 
     @BeforeEach
     void setUp() {
         MockitoAnnotations.openMocks(this);
-        generalAssistantFactory = new 
GeneralAssistantFactory(systemPromptProvider, new ChatMemoryStoreProvider());
         Map<String, String> credentials = Map.of("apiKey", "123456");
         when(assistantConfigProvider.getModel()).thenReturn("model");
         when(assistantConfigProvider.getCredentials()).thenReturn(credentials);
         when(assistantConfigProvider.getConfigs()).thenReturn(null);
-        when(assistantConfigProvider.getLanguage()).thenReturn("en");
     }
 
     @Test
@@ -66,7 +57,7 @@ class GeneralAssistantFactoryTest {
         AIAssistant.Builder mockBuilder = mock(OpenAIAssistant.Builder.class);
         when(mockBuilder.id(any())).thenReturn(mockBuilder);
         when(mockBuilder.memoryStore(any())).thenReturn(mockBuilder);
-        when(mockBuilder.withConfigProvider(any())).thenReturn(mockBuilder);
+        when(mockBuilder.withConfig(any())).thenReturn(mockBuilder);
         when(mockBuilder.withToolProvider(any())).thenReturn(mockBuilder);
         when(mockBuilder.withSystemPrompt(any())).thenReturn(mockBuilder);
         when(mockBuilder.build()).thenReturn(mock(AIAssistant.class));
@@ -74,10 +65,8 @@ class GeneralAssistantFactoryTest {
         try (MockedStatic<OpenAIAssistant> openAIAssistantMockedStatic = 
mockStatic(OpenAIAssistant.class)) {
             
openAIAssistantMockedStatic.when(OpenAIAssistant::builder).thenReturn(mockBuilder);
 
-            PlatformType platformType = PlatformType.OPENAI;
-            generalAssistantFactory.create(platformType, 
assistantConfigProvider);
-            generalAssistantFactory = new GeneralAssistantFactory(new 
ChatMemoryStoreProvider());
-            generalAssistantFactory.create(platformType, 
assistantConfigProvider);
+            generalAssistantFactory.createAIService(assistantConfigProvider, 
null);
+            generalAssistantFactory.createForTest(assistantConfigProvider, 
null);
         }
     }
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/provider/AIAssistantConfigTest.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/provider/GeneralAssistantConfigTest.java
similarity index 80%
rename from 
bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/provider/AIAssistantConfigTest.java
rename to 
bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/provider/GeneralAssistantConfigTest.java
index 6b70a5fa..cbe44f03 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/provider/AIAssistantConfigTest.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/provider/GeneralAssistantConfigTest.java
@@ -18,6 +18,9 @@
  */
 package org.apache.bigtop.manager.ai.assistant.provider;
 
+import org.apache.bigtop.manager.ai.assistant.config.GeneralAssistantConfig;
+import org.apache.bigtop.manager.ai.core.enums.PlatformType;
+
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -31,9 +34,9 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
 @ExtendWith(MockitoExtension.class)
-public class AIAssistantConfigTest {
+public class GeneralAssistantConfigTest {
 
-    private AIAssistantConfig.Builder builder;
+    private GeneralAssistantConfig.Builder builder;
     private String model;
     private String language;
     private Map<String, String> credentials;
@@ -41,7 +44,7 @@ public class AIAssistantConfigTest {
 
     @BeforeEach
     public void setUp() {
-        builder = AIAssistantConfig.builder();
+        builder = GeneralAssistantConfig.builder();
         model = "test-model";
         language = "en-US";
         credentials = new HashMap<>();
@@ -53,7 +56,8 @@ public class AIAssistantConfigTest {
 
     @Test
     public void testBuilderSetsValuesCorrectly() {
-        AIAssistantConfig config = builder.setModel(model)
+        GeneralAssistantConfig config = 
builder.setPlatformType(PlatformType.OPENAI)
+                .setModel(model)
                 .setLanguage(language)
                 .addCredentials(credentials)
                 .addConfigs(configs)
@@ -68,7 +72,8 @@ public class AIAssistantConfigTest {
 
     @Test
     public void testBuilderAddsSingleCredential() {
-        AIAssistantConfig config = builder.setModel(model)
+        GeneralAssistantConfig config = 
builder.setPlatformType(PlatformType.OPENAI)
+                .setModel(model)
                 .setLanguage(language)
                 .addCredential("client_id", "abcd1234")
                 .build();
@@ -79,7 +84,8 @@ public class AIAssistantConfigTest {
 
     @Test
     public void testBuilderAddsSingleConfig() {
-        AIAssistantConfig config = builder.setModel(model)
+        GeneralAssistantConfig config = 
builder.setPlatformType(PlatformType.OPENAI)
+                .setModel(model)
                 .setLanguage(language)
                 .addConfig("threadId", "123")
                 .build();
@@ -90,10 +96,10 @@ public class AIAssistantConfigTest {
 
     @Test
     public void testEmptyBuilder() {
-        AIAssistantConfig config = builder.build();
+        GeneralAssistantConfig config =
+                
builder.setPlatformType(PlatformType.OPENAI).setModel(model).build();
 
         assertNotNull(config);
-        assertNull(config.getModel());
         assertNull(config.getLanguage());
         assertEquals(0, config.getCredentials().size());
         assertEquals(0, config.getConfigs().size());
@@ -108,7 +114,8 @@ public class AIAssistantConfigTest {
         Map<String, String> extraConfigs = new HashMap<>();
         extraConfigs.put("retry", "3");
 
-        AIAssistantConfig config = builder.setModel(model)
+        GeneralAssistantConfig config = 
builder.setPlatformType(PlatformType.OPENAI)
+                .setModel(model)
                 .setLanguage(language)
                 .addCredentials(extraCredentials)
                 .addConfigs(extraConfigs)
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/AbstractAIAssistant.java
 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/AbstractAIAssistant.java
index 4699a840..58e8268a 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/AbstractAIAssistant.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/AbstractAIAssistant.java
@@ -18,8 +18,8 @@
  */
 package org.apache.bigtop.manager.ai.core;
 
+import org.apache.bigtop.manager.ai.core.config.AIAssistantConfig;
 import org.apache.bigtop.manager.ai.core.factory.AIAssistant;
-import org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
 
 import dev.langchain4j.memory.ChatMemory;
 import dev.langchain4j.memory.chat.MessageWindowChatMemory;
@@ -61,7 +61,7 @@ public abstract class AbstractAIAssistant implements 
AIAssistant {
         protected Object id;
 
         protected ChatMemoryStore chatMemoryStore;
-        protected AIAssistantConfigProvider configProvider;
+        protected AIAssistantConfig config;
 
         protected ToolProvider toolProvider;
         protected String systemPrompt;
@@ -78,8 +78,8 @@ public abstract class AbstractAIAssistant implements 
AIAssistant {
             return this;
         }
 
-        public Builder withConfigProvider(AIAssistantConfigProvider 
configProvider) {
-            this.configProvider = configProvider;
+        public Builder withConfig(AIAssistantConfig config) {
+            this.config = config;
             return this;
         }
 
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/AIAssistantConfigProvider.java
 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/config/AIAssistantConfig.java
similarity index 88%
rename from 
bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/AIAssistantConfigProvider.java
rename to 
bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/config/AIAssistantConfig.java
index b49d99c8..42d8e9ef 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/AIAssistantConfigProvider.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/config/AIAssistantConfig.java
@@ -16,16 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.ai.core.provider;
+package org.apache.bigtop.manager.ai.core.config;
 
 import java.util.Map;
 
-public interface AIAssistantConfigProvider {
+public interface AIAssistantConfig {
     String getModel();
 
     Map<String, String> getCredentials();
 
     Map<String, String> getConfigs();
-
-    String getLanguage();
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistant.java
 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistant.java
index 8257c4e7..9a7074e6 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistant.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistant.java
@@ -18,8 +18,8 @@
  */
 package org.apache.bigtop.manager.ai.core.factory;
 
+import org.apache.bigtop.manager.ai.core.config.AIAssistantConfig;
 import org.apache.bigtop.manager.ai.core.enums.PlatformType;
-import org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
 
 import dev.langchain4j.memory.ChatMemory;
 import dev.langchain4j.model.chat.ChatLanguageModel;
@@ -74,7 +74,7 @@ public interface AIAssistant {
 
         Builder memoryStore(ChatMemoryStore memoryStore);
 
-        Builder withConfigProvider(AIAssistantConfigProvider configProvider);
+        Builder withConfig(AIAssistantConfig configProvider);
 
         Builder withToolProvider(ToolProvider toolProvider);
 
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistantFactory.java
 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistantFactory.java
index f06a6127..d947e778 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistantFactory.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistantFactory.java
@@ -18,25 +18,18 @@
  */
 package org.apache.bigtop.manager.ai.core.factory;
 
-import org.apache.bigtop.manager.ai.core.enums.PlatformType;
+import org.apache.bigtop.manager.ai.core.config.AIAssistantConfig;
 import org.apache.bigtop.manager.ai.core.enums.SystemPrompt;
-import org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
 
 import dev.langchain4j.service.tool.ToolProvider;
 
 public interface AIAssistantFactory {
 
-    AIAssistant createWithPrompt(
-            PlatformType platformType,
-            AIAssistantConfigProvider assistantConfig,
-            Object id,
-            ToolProvider toolProvider,
-            SystemPrompt systemPrompt);
+    AIAssistant createWithPrompt(AIAssistantConfig config, ToolProvider 
toolProvider, SystemPrompt systemPrompt);
 
-    default AIAssistant create(PlatformType platformType, 
AIAssistantConfigProvider assistantConfig) {
-        return createAiService(platformType, assistantConfig, null, null);
-    }
+    AIAssistant createForTest(AIAssistantConfig config, ToolProvider 
toolProvider);
 
-    AIAssistant createAiService(
-            PlatformType platformType, AIAssistantConfigProvider 
assistantConfig, Long id, ToolProvider toolProvider);
+    default AIAssistant createAIService(AIAssistantConfig config, ToolProvider 
toolProvider) {
+        return createWithPrompt(config, toolProvider, 
SystemPrompt.DEFAULT_PROMPT);
+    }
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/ToolBox.java
 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/ToolBox.java
deleted file mode 100644
index 47ee0044..00000000
--- 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/ToolBox.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.bigtop.manager.ai.core.factory;
-
-import reactor.core.publisher.Flux;
-
-import java.util.List;
-
-public interface ToolBox {
-
-    List<String> getTools();
-
-    String invoke(String toolName);
-
-    Flux<String> streamInvoke(String toolName);
-}
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-dashscope/src/main/java/org/apache/bigtop/manager/ai/dashscope/DashScopeAssistant.java
 
b/bigtop-manager-ai/bigtop-manager-ai-dashscope/src/main/java/org/apache/bigtop/manager/ai/dashscope/DashScopeAssistant.java
index 53c6be9d..9a6531ea 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-dashscope/src/main/java/org/apache/bigtop/manager/ai/dashscope/DashScopeAssistant.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-dashscope/src/main/java/org/apache/bigtop/manager/ai/dashscope/DashScopeAssistant.java
@@ -65,17 +65,17 @@ public class DashScopeAssistant extends AbstractAIAssistant 
{
 
         @Override
         public ChatLanguageModel getChatLanguageModel() {
-            String model = 
ValidationUtils.ensureNotNull(configProvider.getModel(), "model");
-            String apiKey = ValidationUtils.ensureNotNull(
-                    configProvider.getCredentials().get("apiKey"), "apiKey");
+            String model = ValidationUtils.ensureNotNull(config.getModel(), 
"model");
+            String apiKey =
+                    
ValidationUtils.ensureNotNull(config.getCredentials().get("apiKey"), "apiKey");
             return 
QwenChatModel.builder().apiKey(apiKey).modelName(model).build();
         }
 
         @Override
         public StreamingChatLanguageModel getStreamingChatLanguageModel() {
-            String model = 
ValidationUtils.ensureNotNull(configProvider.getModel(), "model");
-            String apiKey = ValidationUtils.ensureNotNull(
-                    configProvider.getCredentials().get("apiKey"), "apiKey");
+            String model = ValidationUtils.ensureNotNull(config.getModel(), 
"model");
+            String apiKey =
+                    
ValidationUtils.ensureNotNull(config.getCredentials().get("apiKey"), "apiKey");
             return QwenStreamingChatModel.builder()
                     .apiKey(apiKey)
                     .modelName(model)
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-openai/src/main/java/org/apache/bigtop/manager/ai/openai/OpenAIAssistant.java
 
b/bigtop-manager-ai/bigtop-manager-ai-openai/src/main/java/org/apache/bigtop/manager/ai/openai/OpenAIAssistant.java
index d5fb43cf..ec60173c 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-openai/src/main/java/org/apache/bigtop/manager/ai/openai/OpenAIAssistant.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-openai/src/main/java/org/apache/bigtop/manager/ai/openai/OpenAIAssistant.java
@@ -51,9 +51,9 @@ public class OpenAIAssistant extends AbstractAIAssistant {
 
         @Override
         public ChatLanguageModel getChatLanguageModel() {
-            String model = 
ValidationUtils.ensureNotNull(configProvider.getModel(), "model");
-            String apiKey = ValidationUtils.ensureNotNull(
-                    configProvider.getCredentials().get("apiKey"), "apiKey");
+            String model = ValidationUtils.ensureNotNull(config.getModel(), 
"model");
+            String apiKey =
+                    
ValidationUtils.ensureNotNull(config.getCredentials().get("apiKey"), "apiKey");
             return OpenAiChatModel.builder()
                     .apiKey(apiKey)
                     .baseUrl(BASE_URL)
@@ -63,9 +63,9 @@ public class OpenAIAssistant extends AbstractAIAssistant {
 
         @Override
         public StreamingChatLanguageModel getStreamingChatLanguageModel() {
-            String model = 
ValidationUtils.ensureNotNull(configProvider.getModel(), "model");
-            String apiKey = ValidationUtils.ensureNotNull(
-                    configProvider.getCredentials().get("apiKey"), "apiKey");
+            String model = ValidationUtils.ensureNotNull(config.getModel(), 
"model");
+            String apiKey =
+                    
ValidationUtils.ensureNotNull(config.getCredentials().get("apiKey"), "apiKey");
             return OpenAiStreamingChatModel.builder()
                     .apiKey(apiKey)
                     .baseUrl(BASE_URL)
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-qianfan/src/main/java/org/apache/bigtop/manager/ai/qianfan/QianFanAssistant.java
 
b/bigtop-manager-ai/bigtop-manager-ai-qianfan/src/main/java/org/apache/bigtop/manager/ai/qianfan/QianFanAssistant.java
index 80010eb8..344a8820 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-qianfan/src/main/java/org/apache/bigtop/manager/ai/qianfan/QianFanAssistant.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-qianfan/src/main/java/org/apache/bigtop/manager/ai/qianfan/QianFanAssistant.java
@@ -65,11 +65,11 @@ public class QianFanAssistant extends AbstractAIAssistant {
 
         @Override
         public ChatLanguageModel getChatLanguageModel() {
-            String model = 
ValidationUtils.ensureNotNull(configProvider.getModel(), "model");
-            String apiKey = ValidationUtils.ensureNotNull(
-                    configProvider.getCredentials().get("apiKey"), "apiKey");
-            String secretKey = ValidationUtils.ensureNotNull(
-                    configProvider.getCredentials().get("secretKey"), 
"secretKey");
+            String model = ValidationUtils.ensureNotNull(config.getModel(), 
"model");
+            String apiKey =
+                    
ValidationUtils.ensureNotNull(config.getCredentials().get("apiKey"), "apiKey");
+            String secretKey =
+                    
ValidationUtils.ensureNotNull(config.getCredentials().get("secretKey"), 
"secretKey");
             return QianfanChatModel.builder()
                     .apiKey(apiKey)
                     .secretKey(secretKey)
@@ -79,11 +79,11 @@ public class QianFanAssistant extends AbstractAIAssistant {
 
         @Override
         public StreamingChatLanguageModel getStreamingChatLanguageModel() {
-            String model = 
ValidationUtils.ensureNotNull(configProvider.getModel(), "model");
-            String apiKey = ValidationUtils.ensureNotNull(
-                    configProvider.getCredentials().get("apiKey"), "apiKey");
-            String secretKey = ValidationUtils.ensureNotNull(
-                    configProvider.getCredentials().get("secretKey"), 
"secretKey");
+            String model = ValidationUtils.ensureNotNull(config.getModel(), 
"model");
+            String apiKey =
+                    
ValidationUtils.ensureNotNull(config.getCredentials().get("apiKey"), "apiKey");
+            String secretKey =
+                    
ValidationUtils.ensureNotNull(config.getCredentials().get("secretKey"), 
"secretKey");
             return QianfanStreamingChatModel.builder()
                     .apiKey(apiKey)
                     .secretKey(secretKey)
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/ServerApplication.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/ServerApplication.java
index cc6a5a5c..7c03ea33 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/ServerApplication.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/ServerApplication.java
@@ -25,7 +25,12 @@ import 
org.springframework.scheduling.annotation.EnableScheduling;
 
 @EnableAsync
 @EnableScheduling
-@SpringBootApplication(scanBasePackages = {"org.apache.bigtop.manager.server", 
"org.apache.bigtop.manager.common"})
+@SpringBootApplication(
+        scanBasePackages = {
+            "org.apache.bigtop.manager.server",
+            "org.apache.bigtop.manager.common",
+            "org.apache.bigtop.manager.ai"
+        })
 public class ServerApplication {
 
     public static void main(String[] args) {
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
index 41522581..45ae57ae 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
@@ -18,9 +18,7 @@
  */
 package org.apache.bigtop.manager.server.service.impl;
 
-import org.apache.bigtop.manager.ai.assistant.GeneralAssistantFactory;
-import org.apache.bigtop.manager.ai.assistant.provider.AIAssistantConfig;
-import org.apache.bigtop.manager.ai.assistant.store.ChatMemoryStoreProvider;
+import org.apache.bigtop.manager.ai.assistant.config.GeneralAssistantConfig;
 import org.apache.bigtop.manager.ai.core.enums.MessageType;
 import org.apache.bigtop.manager.ai.core.enums.PlatformType;
 import org.apache.bigtop.manager.ai.core.factory.AIAssistant;
@@ -60,7 +58,6 @@ import jakarta.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 
 @Service
 @Slf4j
@@ -80,86 +77,30 @@ public class ChatbotServiceImpl implements ChatbotService {
     @Resource
     private AIServiceToolsProvider aiServiceToolsProvider;
 
+    @Resource
     private AIAssistantFactory aiAssistantFactory;
 
-    private static final int CHAT_THREAD_NAME_LENGTH = 100;
-
-    public static String getNameFromMessage(String input) {
-        if (input == null || input.length() <= CHAT_THREAD_NAME_LENGTH) {
-            return input;
-        } else {
-            return input.substring(0, CHAT_THREAD_NAME_LENGTH);
-        }
-    }
-
-    public AIAssistantFactory getAIAssistantFactory() {
-        if (aiAssistantFactory == null) {
-            aiAssistantFactory =
-                    new GeneralAssistantFactory(new 
ChatMemoryStoreProvider(chatThreadDao, chatMessageDao));
-        }
-        return aiAssistantFactory;
-    }
-
-    private AuthPlatformPO getActiveAuthPlatform() {
-        List<AuthPlatformPO> authPlatformPOS = authPlatformDao.findAll();
-        for (AuthPlatformPO authPlatformPO : authPlatformPOS) {
-            if (AuthPlatformStatus.isActive(authPlatformPO.getStatus())) {
-                return authPlatformPO;
-            }
-        }
-        return null;
-    }
-
-    private AIAssistantConfig getAIAssistantConfig(String model, Map<String, 
String> credentials) {
-        return AIAssistantConfig.builder()
-                .setModel(model)
-                .setLanguage(LocaleContextHolder.getLocale().toString())
-                .addCredentials(credentials)
-                .build();
-    }
-
-    private PlatformType getPlatformType(String platformName) {
-        return PlatformType.getPlatformType(platformName.toLowerCase());
-    }
-
-    private AIAssistant buildAIAssistant(
-            String platformName, String model, Map<String, String> 
credentials, Long threadId, ChatbotCommand command) {
-        return getAIAssistantFactory()
-                .createAiService(
-                        getPlatformType(platformName),
-                        getAIAssistantConfig(model, credentials),
-                        threadId,
-                        aiServiceToolsProvider.getToolsProvide(command));
-    }
-
     @Override
     public ChatThreadVO createChatThread(ChatThreadDTO chatThreadDTO) {
-        AuthPlatformPO authPlatformPO = getActiveAuthPlatform();
-        if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
-            throw new ApiException(ApiExceptionEnum.NO_PLATFORM_IN_USE);
-        }
-
-        Long userId = SessionUserHolder.getUserId();
+        AuthPlatformPO authPlatformPO = validateAndGetActiveAuthPlatform();
         PlatformPO platformPO = 
platformDao.findById(authPlatformPO.getPlatformId());
 
         chatThreadDTO.setPlatformId(platformPO.getId());
         chatThreadDTO.setAuthId(authPlatformPO.getId());
 
         ChatThreadPO chatThreadPO = 
ChatThreadConverter.INSTANCE.fromDTO2PO(chatThreadDTO);
-        chatThreadPO.setUserId(userId);
+        chatThreadPO.setUserId(SessionUserHolder.getUserId());
         chatThreadDao.save(chatThreadPO);
+
         return ChatThreadConverter.INSTANCE.fromPO2VO(chatThreadPO, 
authPlatformPO, platformPO);
     }
 
     @Override
     public boolean deleteChatThread(Long threadId) {
-        ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
-        if (chatThreadPO == null || chatThreadPO.getIsDeleted()) {
-            throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
-        }
-
+        ChatThreadPO chatThreadPO = validateAndGetChatThread(threadId);
         chatThreadPO.setIsDeleted(true);
         chatThreadDao.partialUpdateById(chatThreadPO);
+
         List<ChatMessagePO> chatMessagePOS = 
chatMessageDao.findAllByThreadId(threadId);
         chatMessagePOS.forEach(chatMessagePO -> 
chatMessagePO.setIsDeleted(true));
         chatMessageDao.partialUpdateByIds(chatMessagePOS);
@@ -169,15 +110,11 @@ public class ChatbotServiceImpl implements ChatbotService 
{
 
     @Override
     public List<ChatThreadVO> getAllChatThreads() {
-        AuthPlatformPO authPlatformPO = getActiveAuthPlatform();
-        if (authPlatformPO == null) {
-            throw new ApiException(ApiExceptionEnum.NO_PLATFORM_IN_USE);
-        }
+        AuthPlatformPO authPlatformPO = validateAndGetActiveAuthPlatform();
         PlatformPO platformPO = 
platformDao.findById(authPlatformPO.getPlatformId());
 
-        Long authId = authPlatformPO.getId();
-        Long userId = SessionUserHolder.getUserId();
-        List<ChatThreadPO> chatThreadPOS = 
chatThreadDao.findAllByAuthIdAndUserId(authId, userId);
+        List<ChatThreadPO> chatThreadPOS =
+                chatThreadDao.findAllByAuthIdAndUserId(authPlatformPO.getId(), 
SessionUserHolder.getUserId());
         List<ChatThreadVO> chatThreads = new ArrayList<>();
         for (ChatThreadPO chatThreadPO : chatThreadPOS) {
             if (chatThreadPO.getIsDeleted()) {
@@ -190,89 +127,30 @@ public class ChatbotServiceImpl implements ChatbotService 
{
         return chatThreads;
     }
 
-    private AIAssistant prepareTalk(Long threadId, ChatbotCommand command) {
-        ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
-        Long userId = SessionUserHolder.getUserId();
-        if (!Objects.equals(userId, chatThreadPO.getUserId()) || 
chatThreadPO.getIsDeleted()) {
-            throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
-        }
-        AuthPlatformPO authPlatformPO = getActiveAuthPlatform();
-        if (authPlatformPO == null
-                || authPlatformPO.getIsDeleted()
-                || !authPlatformPO.getId().equals(chatThreadPO.getAuthId())) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_IN_USE);
-        }
-
-        AuthPlatformDTO authPlatformDTO = 
AuthPlatformConverter.INSTANCE.fromPO2DTO(authPlatformPO);
-
-        PlatformPO platformPO = 
platformDao.findById(authPlatformPO.getPlatformId());
-        return buildAIAssistant(
-                platformPO.getName(),
-                authPlatformDTO.getModel(),
-                authPlatformDTO.getAuthCredentials(),
-                threadId,
-                command);
-    }
-
     @Override
     public SseEmitter talk(Long threadId, ChatbotCommand command, String 
message) {
         AIAssistant aiAssistant = prepareTalk(threadId, command);
-        Flux<String> stringFlux;
-        if (command == null) {
-            stringFlux = aiAssistant.streamAsk(message);
-        } else {
-            stringFlux = Flux.just(aiAssistant.ask(message));
-        }
+
+        Flux<String> stringFlux =
+                (command == null) ? aiAssistant.streamAsk(message) : 
Flux.just(aiAssistant.ask(message));
+
         SseEmitter emitter = new SseEmitter();
+
         stringFlux.subscribe(
-                s -> {
-                    try {
-                        TalkVO talkVO = new TalkVO();
-                        talkVO.setContent(s);
-                        talkVO.setFinishReason(null);
-                        emitter.send(talkVO);
-                    } catch (Exception e) {
-                        emitter.completeWithError(e);
-                    }
-                },
-                throwable -> {
-                    try {
-                        TalkVO errorVO = new TalkVO();
-                        errorVO.setContent(null);
-                        errorVO.setFinishReason("Error: " + 
throwable.getMessage());
-                        emitter.send(errorVO);
-                    } catch (Exception sendException) {
-                        sendException.printStackTrace();
-                    }
-                    emitter.completeWithError(throwable);
-                },
-                () -> {
-                    try {
-                        TalkVO finishVO = new TalkVO();
-                        finishVO.setContent(null);
-                        finishVO.setFinishReason("completed");
-                        emitter.send(finishVO);
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                    emitter.complete();
-                });
+                s -> sendTalkVO(emitter, s, null),
+                throwable -> handleError(emitter, throwable),
+                () -> completeEmitter(emitter));
 
         emitter.onTimeout(emitter::complete);
+
         return emitter;
     }
 
     @Override
     public List<ChatMessageVO> history(Long threadId) {
         List<ChatMessageVO> chatMessages = new ArrayList<>();
-        ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
-        if (chatThreadPO == null || chatThreadPO.getIsDeleted()) {
-            throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
-        }
-        Long userId = SessionUserHolder.getUserId();
-        if (!chatThreadPO.getUserId().equals(userId)) {
-            throw new ApiException(ApiExceptionEnum.PERMISSION_DENIED);
-        }
+        validateAndGetChatThread(threadId);
+
         List<ChatMessagePO> chatMessagePOs = 
chatMessageDao.findAllByThreadId(threadId);
         for (ChatMessagePO chatMessagePO : chatMessagePOs) {
             ChatMessageVO chatMessageVO = 
ChatMessageConverter.INSTANCE.fromPO2VO(chatMessagePO);
@@ -289,14 +167,7 @@ public class ChatbotServiceImpl implements ChatbotService {
 
     @Override
     public ChatThreadVO updateChatThread(ChatThreadDTO chatThreadDTO) {
-        ChatThreadPO chatThreadPO = 
chatThreadDao.findById(chatThreadDTO.getId());
-        if (chatThreadPO == null || chatThreadPO.getIsDeleted()) {
-            throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
-        }
-        Long userId = SessionUserHolder.getUserId();
-        if (!chatThreadPO.getUserId().equals(userId)) {
-            throw new ApiException(ApiExceptionEnum.PERMISSION_DENIED);
-        }
+        ChatThreadPO chatThreadPO = 
validateAndGetChatThread(chatThreadDTO.getId());
 
         chatThreadPO.setName(chatThreadDTO.getName());
         chatThreadDao.partialUpdateById(chatThreadPO);
@@ -313,6 +184,28 @@ public class ChatbotServiceImpl implements ChatbotService {
 
     @Override
     public ChatThreadVO getChatThread(Long threadId) {
+        ChatThreadPO chatThreadPO = validateAndGetChatThread(threadId);
+
+        AuthPlatformPO authPlatformPO = 
authPlatformDao.findById(chatThreadPO.getAuthId());
+        return ChatThreadConverter.INSTANCE.fromPO2VO(
+                chatThreadPO, authPlatformPO, 
platformDao.findById(authPlatformPO.getPlatformId()));
+    }
+
+    private AuthPlatformPO validateAndGetActiveAuthPlatform() {
+        AuthPlatformPO authPlatform = null;
+        List<AuthPlatformPO> authPlatformPOS = authPlatformDao.findAll();
+        for (AuthPlatformPO authPlatformPO : authPlatformPOS) {
+            if (AuthPlatformStatus.isActive(authPlatformPO.getStatus())) {
+                authPlatform = authPlatformPO;
+            }
+        }
+        if (authPlatform == null || authPlatform.getIsDeleted()) {
+            throw new ApiException(ApiExceptionEnum.NO_PLATFORM_IN_USE);
+        }
+        return authPlatform;
+    }
+
+    private ChatThreadPO validateAndGetChatThread(Long threadId) {
         ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
         if (chatThreadPO == null || chatThreadPO.getIsDeleted()) {
             throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
@@ -321,8 +214,70 @@ public class ChatbotServiceImpl implements ChatbotService {
         if (!chatThreadPO.getUserId().equals(userId)) {
             throw new ApiException(ApiExceptionEnum.PERMISSION_DENIED);
         }
-        AuthPlatformPO authPlatformPO = 
authPlatformDao.findById(chatThreadPO.getAuthId());
-        return ChatThreadConverter.INSTANCE.fromPO2VO(
-                chatThreadPO, authPlatformPO, 
platformDao.findById(authPlatformPO.getPlatformId()));
+        return chatThreadPO;
+    }
+
+    private GeneralAssistantConfig getAIAssistantConfig(
+            String platformName, String model, Map<String, String> 
credentials, Long id) {
+        return GeneralAssistantConfig.builder()
+                .setPlatformType(getPlatformType(platformName))
+                .setModel(model)
+                .setId(id)
+                .setLanguage(LocaleContextHolder.getLocale().toString())
+                .addCredentials(credentials)
+                .build();
+    }
+
+    private PlatformType getPlatformType(String platformName) {
+        return PlatformType.getPlatformType(platformName.toLowerCase());
+    }
+
+    private AIAssistant buildAIAssistant(
+            String platformName, String model, Map<String, String> 
credentials, Long threadId, ChatbotCommand command) {
+        return aiAssistantFactory.createAIService(
+                getAIAssistantConfig(platformName, model, credentials, 
threadId),
+                aiServiceToolsProvider.getToolsProvide(command));
+    }
+
+    private AIAssistant prepareTalk(Long threadId, ChatbotCommand command) {
+        ChatThreadPO chatThreadPO = validateAndGetChatThread(threadId);
+        AuthPlatformPO authPlatformPO = validateAndGetActiveAuthPlatform();
+
+        if (!authPlatformPO.getId().equals(chatThreadPO.getAuthId())) {
+            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_IN_USE);
+        }
+
+        AuthPlatformDTO authPlatformDTO = 
AuthPlatformConverter.INSTANCE.fromPO2DTO(authPlatformPO);
+        PlatformPO platformPO = 
platformDao.findById(authPlatformPO.getPlatformId());
+
+        return buildAIAssistant(
+                platformPO.getName(),
+                authPlatformDTO.getModel(),
+                authPlatformDTO.getAuthCredentials(),
+                threadId,
+                command);
+    }
+
+    private void sendTalkVO(SseEmitter emitter, String content, String 
finishReason) {
+        try {
+            TalkVO talkVO = new TalkVO();
+            talkVO.setContent(content);
+            talkVO.setFinishReason(finishReason);
+            emitter.send(talkVO);
+        } catch (Exception e) {
+            log.error("Error sending data to SseEmitter", e);
+            emitter.completeWithError(e);
+        }
+    }
+
+    private void handleError(SseEmitter emitter, Throwable throwable) {
+        log.error("Error during SSE streaming: {}", throwable.getMessage(), 
throwable);
+        sendTalkVO(emitter, null, "Error: " + throwable.getMessage());
+        emitter.completeWithError(throwable);
+    }
+
+    private void completeEmitter(SseEmitter emitter) {
+        sendTalkVO(emitter, null, "completed");
+        emitter.complete();
     }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/LLMConfigServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/LLMConfigServiceImpl.java
index 7b1e1ead..1ca5558e 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/LLMConfigServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/LLMConfigServiceImpl.java
@@ -18,9 +18,7 @@
  */
 package org.apache.bigtop.manager.server.service.impl;
 
-import org.apache.bigtop.manager.ai.assistant.GeneralAssistantFactory;
-import org.apache.bigtop.manager.ai.assistant.provider.AIAssistantConfig;
-import org.apache.bigtop.manager.ai.assistant.store.ChatMemoryStoreProvider;
+import org.apache.bigtop.manager.ai.assistant.config.GeneralAssistantConfig;
 import org.apache.bigtop.manager.ai.core.enums.PlatformType;
 import org.apache.bigtop.manager.ai.core.factory.AIAssistant;
 import org.apache.bigtop.manager.ai.core.factory.AIAssistantFactory;
@@ -77,91 +75,12 @@ public class LLMConfigServiceImpl implements 
LLMConfigService {
     @Resource
     private ChatMessageDao chatMessageDao;
 
+    @Resource
     private AIAssistantFactory aiAssistantFactory;
 
     private static final String TEST_FLAG = "ZmxhZw==";
     private static final String TEST_KEY = "bm";
 
-    public AIAssistantFactory getAIAssistantFactory() {
-        if (aiAssistantFactory == null) {
-            aiAssistantFactory =
-                    new GeneralAssistantFactory(new 
ChatMemoryStoreProvider(chatThreadDao, chatMessageDao));
-        }
-        return aiAssistantFactory;
-    }
-
-    private AIAssistantConfig getAIAssistantConfig(
-            String model, Map<String, String> credentials, Map<String, String> 
configs) {
-        return AIAssistantConfig.builder()
-                .setModel(model)
-                .setLanguage(LocaleContextHolder.getLocale().toString())
-                .addCredentials(credentials)
-                .addConfigs(configs)
-                .build();
-    }
-
-    private PlatformType getPlatformType(String platformName) {
-        return PlatformType.getPlatformType(platformName.toLowerCase());
-    }
-
-    private Boolean testAuthorization(String platformName, String model, 
Map<String, String> credentials) {
-        Boolean result = testFuncCalling(platformName, model, credentials);
-        log.info("Test func calling result: {}", result);
-        AIAssistantConfig aiAssistantConfig = getAIAssistantConfig(model, 
credentials, null);
-        AIAssistant aiAssistant = 
getAIAssistantFactory().create(getPlatformType(platformName), 
aiAssistantConfig);
-        try {
-            return aiAssistant.test();
-        } catch (Exception e) {
-            throw new ApiException(ApiExceptionEnum.CREDIT_INCORRECT, 
e.getMessage());
-        }
-    }
-
-    private Boolean testFuncCalling(String platformName, String model, 
Map<String, String> credentials) {
-        ToolProvider toolProvider = (toolProviderRequest) -> {
-            ToolSpecification toolSpecification = ToolSpecification.builder()
-                    .name("getFlag")
-                    .description("Get flag based on key")
-                    .addParameter("key", JsonSchemaProperty.STRING, 
JsonSchemaProperty.description("Lowercase key"))
-                    .build();
-            ToolExecutor toolExecutor = (toolExecutionRequest, memoryId) -> {
-                Map<String, Object> arguments = 
JsonUtils.readFromString(toolExecutionRequest.arguments());
-                String key = arguments.get("key").toString();
-                if (key.equals(TEST_KEY)) {
-                    return TEST_FLAG;
-                }
-                return null;
-            };
-
-            return ToolProviderResult.builder()
-                    .add(toolSpecification, toolExecutor)
-                    .build();
-        };
-
-        AIAssistantConfig aiAssistantConfig = getAIAssistantConfig(model, 
credentials, null);
-        AIAssistant aiAssistant = getAIAssistantFactory()
-                .createAiService(getPlatformType(platformName), 
aiAssistantConfig, null, toolProvider);
-        try {
-            return aiAssistant.ask("What is the flag of " + 
TEST_KEY).contains(TEST_FLAG);
-        } catch (Exception e) {
-            throw new ApiException(ApiExceptionEnum.CREDIT_INCORRECT, 
e.getMessage());
-        }
-    }
-
-    private void switchActivePlatform(Long id) {
-        List<AuthPlatformPO> authPlatformPOS = authPlatformDao.findAll();
-        for (AuthPlatformPO authPlatformPO : authPlatformPOS) {
-            if (!AuthPlatformStatus.available(authPlatformPO.getStatus())) {
-                continue;
-            }
-            if (authPlatformPO.getId().equals(id)) {
-                authPlatformPO.setStatus(AuthPlatformStatus.ACTIVE.getCode());
-            } else {
-                
authPlatformPO.setStatus(AuthPlatformStatus.AVAILABLE.getCode());
-            }
-        }
-        authPlatformDao.partialUpdateByIds(authPlatformPOS);
-    }
-
     @Override
     public List<PlatformVO> platforms() {
         List<PlatformPO> platformPOs = platformDao.findAll();
@@ -202,10 +121,7 @@ public class LLMConfigServiceImpl implements 
LLMConfigService {
 
     @Override
     public AuthPlatformVO addAuthorizedPlatform(AuthPlatformDTO 
authPlatformDTO) {
-        PlatformPO platformPO = 
platformDao.findById(authPlatformDTO.getPlatformId());
-        if (platformPO == null) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
-        }
+        PlatformPO platformPO = 
validateAndGetPlatform(authPlatformDTO.getPlatformId());
 
         Map<String, String> credentialSet =
                 getStringMap(authPlatformDTO, 
PlatformConverter.INSTANCE.fromPO2DTO(platformPO));
@@ -222,28 +138,9 @@ public class LLMConfigServiceImpl implements 
LLMConfigService {
         return AuthPlatformConverter.INSTANCE.fromPO2VO(authPlatformPO, 
platformPO);
     }
 
-    private static @NotNull Map<String, String> getStringMap(AuthPlatformDTO 
authPlatformDTO, PlatformDTO platformDTO) {
-        if (platformDTO == null) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
-        }
-        Map<String, String> credentialNeed = platformDTO.getAuthCredentials();
-        Map<String, String> credentialGet = 
authPlatformDTO.getAuthCredentials();
-        Map<String, String> credentialSet = new HashMap<>();
-        for (String key : credentialNeed.keySet()) {
-            if (!credentialGet.containsKey(key)) {
-                throw new ApiException(ApiExceptionEnum.CREDIT_INCORRECT);
-            }
-            credentialSet.put(key, credentialGet.get(key));
-        }
-        return credentialSet;
-    }
-
     @Override
     public boolean deleteAuthorizedPlatform(Long authId) {
-        AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
-        if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
-        }
+        AuthPlatformPO authPlatformPO = validateAndGetAuthPlatform(authId);
 
         if (AuthPlatformStatus.isActive(authPlatformPO.getStatus())) {
             throw new ApiException(ApiExceptionEnum.PLATFORM_IS_ACTIVE);
@@ -253,15 +150,7 @@ public class LLMConfigServiceImpl implements 
LLMConfigService {
         authPlatformDao.partialUpdateById(authPlatformPO);
 
         List<ChatThreadPO> chatThreadPOS = 
chatThreadDao.findAllByAuthId(authPlatformPO.getId());
-        for (ChatThreadPO chatThreadPO : chatThreadPOS) {
-            chatThreadPO.setIsDeleted(true);
-            chatThreadDao.partialUpdateById(chatThreadPO);
-            List<ChatMessagePO> chatMessagePOS = 
chatMessageDao.findAllByThreadId(chatThreadPO.getId());
-            for (ChatMessagePO chatMessagePO : chatMessagePOS) {
-                chatMessagePO.setIsDeleted(true);
-                chatMessageDao.partialUpdateById(chatMessagePO);
-            }
-        }
+        softDeleteChatThreads(chatThreadPOS);
 
         return true;
     }
@@ -273,20 +162,16 @@ public class LLMConfigServiceImpl implements 
LLMConfigService {
                     
AuthPlatformConverter.INSTANCE.fromPO2DTO(authPlatformDao.findById(authPlatformDTO.getId()));
         }
 
-        PlatformPO platformPO = 
platformDao.findById(authPlatformDTO.getPlatformId());
-        if (platformPO == null) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
-        }
+        PlatformPO platformPO = 
validateAndGetPlatform(authPlatformDTO.getPlatformId());
+
         List<String> supportModels = 
List.of(platformPO.getSupportModels().split(","));
         if (supportModels.isEmpty() || 
!supportModels.contains(authPlatformDTO.getModel())) {
             throw new ApiException(ApiExceptionEnum.MODEL_NOT_SUPPORTED);
         }
 
         if (authPlatformDTO.getId() != null) {
-            AuthPlatformPO authPlatformPO = 
authPlatformDao.findById(authPlatformDTO.getId());
-            if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
-                throw new 
ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
-            }
+            AuthPlatformPO authPlatformPO = 
validateAndGetAuthPlatform(authPlatformDTO.getId());
+
             AuthPlatformDTO existAuthPlatformDTO = 
AuthPlatformConverter.INSTANCE.fromPO2DTO(authPlatformPO);
             
authPlatformDTO.setAuthCredentials(existAuthPlatformDTO.getAuthCredentials());
             authPlatformDTO.setModel(existAuthPlatformDTO.getModel());
@@ -294,6 +179,7 @@ public class LLMConfigServiceImpl implements 
LLMConfigService {
 
         Map<String, String> credentialSet =
                 getStringMap(authPlatformDTO, 
PlatformConverter.INSTANCE.fromPO2DTO(platformPO));
+
         if (!testAuthorization(platformPO.getName(), 
authPlatformDTO.getModel(), credentialSet)) {
             throw new ApiException(ApiExceptionEnum.CREDIT_INCORRECT);
         }
@@ -309,10 +195,7 @@ public class LLMConfigServiceImpl implements 
LLMConfigService {
 
     @Override
     public AuthPlatformVO updateAuthorizedPlatform(AuthPlatformDTO 
authPlatformDTO) {
-        AuthPlatformPO authPlatformPO = 
authPlatformDao.findById(authPlatformDTO.getId());
-        if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
-        }
+        AuthPlatformPO authPlatformPO = 
validateAndGetAuthPlatform(authPlatformDTO.getId());
 
         String newModel = authPlatformDTO.getModel();
         if (newModel != null) {
@@ -340,10 +223,7 @@ public class LLMConfigServiceImpl implements 
LLMConfigService {
 
     @Override
     public boolean activateAuthorizedPlatform(Long authId) {
-        AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
-        if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
-        }
+        AuthPlatformPO authPlatformPO = validateAndGetAuthPlatform(authId);
 
         if (!AuthPlatformStatus.available(authPlatformPO.getStatus())) {
             return false;
@@ -358,10 +238,8 @@ public class LLMConfigServiceImpl implements 
LLMConfigService {
 
     @Override
     public boolean deactivateAuthorizedPlatform(Long authId) {
-        AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
-        if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
-        }
+        AuthPlatformPO authPlatformPO = validateAndGetAuthPlatform(authId);
+
         AuthPlatformStatus authPlatformStatus = 
AuthPlatformStatus.fromCode(authPlatformPO.getStatus());
         if (authPlatformStatus.equals(AuthPlatformStatus.ACTIVE)) {
             authPlatformPO.setStatus(AuthPlatformStatus.AVAILABLE.getCode());
@@ -373,10 +251,7 @@ public class LLMConfigServiceImpl implements 
LLMConfigService {
 
     @Override
     public AuthPlatformVO getAuthorizedPlatform(Long authId) {
-        AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
-        if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
-        }
+        AuthPlatformPO authPlatformPO = validateAndGetAuthPlatform(authId);
 
         return AuthPlatformConverter.INSTANCE.fromPO2VO(
                 authPlatformPO, 
platformDao.findById(authPlatformPO.getPlatformId()));
@@ -384,10 +259,134 @@ public class LLMConfigServiceImpl implements 
LLMConfigService {
 
     @Override
     public PlatformVO getPlatform(Long id) {
-        PlatformPO platformPO = platformDao.findById(id);
+        PlatformPO platformPO = validateAndGetPlatform(id);
+
+        return PlatformConverter.INSTANCE.fromPO2VO(platformPO);
+    }
+
+    public PlatformPO validateAndGetPlatform(Long platformId) {
+        if (platformId == null) {
+            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
+        }
+
+        PlatformPO platformPO = platformDao.findById(platformId);
         if (platformPO == null) {
             throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
         }
-        return PlatformConverter.INSTANCE.fromPO2VO(platformPO);
+        return platformPO;
+    }
+
+    public AuthPlatformPO validateAndGetAuthPlatform(Long authId) {
+        if (authId == null) {
+            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
+        }
+        AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
+        if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
+            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
+        }
+        return authPlatformPO;
+    }
+
+    private GeneralAssistantConfig getAIAssistantConfig(
+            String platformName, String model, Map<String, String> 
credentials) {
+        return GeneralAssistantConfig.builder()
+                .setPlatformType(getPlatformType(platformName))
+                .setModel(model)
+                .setLanguage(LocaleContextHolder.getLocale().toString())
+                .addCredentials(credentials)
+                .build();
+    }
+
+    private PlatformType getPlatformType(String platformName) {
+        return PlatformType.getPlatformType(platformName.toLowerCase());
+    }
+
+    private Boolean testAuthorization(String platformName, String model, 
Map<String, String> credentials) {
+        Boolean result = testFuncCalling(platformName, model, credentials);
+        log.info("Test func calling result: {}", result);
+        GeneralAssistantConfig generalAssistantConfig = 
getAIAssistantConfig(platformName, model, credentials);
+        AIAssistant aiAssistant = 
aiAssistantFactory.createForTest(generalAssistantConfig, null);
+        try {
+            return aiAssistant.test();
+        } catch (Exception e) {
+            throw new ApiException(ApiExceptionEnum.CREDIT_INCORRECT, 
e.getMessage());
+        }
+    }
+
+    private Boolean testFuncCalling(String platformName, String model, 
Map<String, String> credentials) {
+        ToolProvider toolProvider = (toolProviderRequest) -> {
+            ToolSpecification toolSpecification = ToolSpecification.builder()
+                    .name("getFlag")
+                    .description("Get flag based on key")
+                    .addParameter("key", JsonSchemaProperty.STRING, 
JsonSchemaProperty.description("Lowercase key"))
+                    .build();
+            ToolExecutor toolExecutor = (toolExecutionRequest, memoryId) -> {
+                Map<String, Object> arguments = 
JsonUtils.readFromString(toolExecutionRequest.arguments());
+                String key = arguments.get("key").toString();
+                if (key.equals(TEST_KEY)) {
+                    return TEST_FLAG;
+                }
+                return null;
+            };
+
+            return ToolProviderResult.builder()
+                    .add(toolSpecification, toolExecutor)
+                    .build();
+        };
+
+        GeneralAssistantConfig generalAssistantConfig = 
getAIAssistantConfig(platformName, model, credentials);
+        AIAssistant aiAssistant = 
aiAssistantFactory.createForTest(generalAssistantConfig, toolProvider);
+        try {
+            return aiAssistant.ask("What is the flag of " + 
TEST_KEY).contains(TEST_FLAG);
+        } catch (Exception e) {
+            throw new ApiException(ApiExceptionEnum.CREDIT_INCORRECT, 
e.getMessage());
+        }
+    }
+
+    private void switchActivePlatform(Long id) {
+        List<AuthPlatformPO> authPlatformPOS = authPlatformDao.findAll();
+        for (AuthPlatformPO authPlatformPO : authPlatformPOS) {
+            if (!AuthPlatformStatus.available(authPlatformPO.getStatus())) {
+                continue;
+            }
+            if (authPlatformPO.getId().equals(id)) {
+                authPlatformPO.setStatus(AuthPlatformStatus.ACTIVE.getCode());
+            } else {
+                
authPlatformPO.setStatus(AuthPlatformStatus.AVAILABLE.getCode());
+            }
+        }
+        authPlatformDao.partialUpdateByIds(authPlatformPOS);
+    }
+
+    private void softDeleteChatMessages(List<ChatMessagePO> chatMessagePOS) {
+        for (ChatMessagePO chatMessagePO : chatMessagePOS) {
+            chatMessagePO.setIsDeleted(true);
+            chatMessageDao.partialUpdateById(chatMessagePO);
+        }
+    }
+
+    private void softDeleteChatThreads(List<ChatThreadPO> chatThreadPOS) {
+        for (ChatThreadPO chatThreadPO : chatThreadPOS) {
+            chatThreadPO.setIsDeleted(true);
+            chatThreadDao.partialUpdateById(chatThreadPO);
+            List<ChatMessagePO> chatMessagePOS = 
chatMessageDao.findAllByThreadId(chatThreadPO.getId());
+            softDeleteChatMessages(chatMessagePOS);
+        }
+    }
+
+    private static @NotNull Map<String, String> getStringMap(AuthPlatformDTO 
authPlatformDTO, PlatformDTO platformDTO) {
+        if (platformDTO == null) {
+            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
+        }
+        Map<String, String> credentialNeed = platformDTO.getAuthCredentials();
+        Map<String, String> credentialGet = 
authPlatformDTO.getAuthCredentials();
+        Map<String, String> credentialSet = new HashMap<>();
+        for (String key : credentialNeed.keySet()) {
+            if (!credentialGet.containsKey(key)) {
+                throw new ApiException(ApiExceptionEnum.CREDIT_INCORRECT);
+            }
+            credentialSet.put(key, credentialGet.get(key));
+        }
+        return credentialSet;
     }
 }

Reply via email to