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 492c11d  BIGTOP-4209: Add backend API for AI Chat functionality (#55)
492c11d is described below

commit 492c11d976a8befbdebf95191621a5d065ea637a
Author: haopeng <[email protected]>
AuthorDate: Fri Aug 30 11:12:30 2024 +0800

    BIGTOP-4209: Add backend API for AI Chat functionality (#55)
---
 .../bigtop-manager-ai-assistant/pom.xml            |   4 +
 .../ai/assistant/GeneralAssistantFactory.java      |  50 ++--
 .../ai/assistant/provider/AIAssistantConfig.java   |  69 ++++-
 .../provider/LocSystemPromptProvider.java          |  21 +-
 .../assistant/store/PersistentChatMemoryStore.java | 104 +++++++
 .../ai/assistant/AIAssistantServiceTest.java       |  21 +-
 .../ai/assistant/SystemPromptProviderTests.java    |  14 +-
 .../manager/ai/core/AbstractAIAssistant.java       |  38 ++-
 .../{PlatformType.java => MessageSender.java}      |  26 +-
 .../bigtop/manager/ai/core/enums/PlatformType.java |   7 +-
 .../bigtop/manager/ai/core/enums/SystemPrompt.java |  20 +-
 .../manager/ai/core/factory/AIAssistant.java       |   4 +-
 .../ai/core/factory/AIAssistantFactory.java        |  47 +--
 .../core/provider/AIAssistantConfigProvider.java   |   6 +-
 .../ai/core/provider/SystemPromptProvider.java     |   5 +-
 .../bigtop/manager/ai/openai/OpenAIAssistant.java  |  39 +--
 bigtop-manager-dao/pom.xml                         |   4 +
 .../manager/dao/handler/JsonTypeHandler.java       |  72 +++++
 .../bigtop/manager/dao/po/ChatMessagePO.java       |  30 +-
 .../apache/bigtop/manager/dao/po/ChatThreadPO.java |  33 ++-
 .../manager/dao/po/PlatformAuthorizedPO.java       |  34 ++-
 .../apache/bigtop/manager/dao/po/PlatformPO.java   |  31 +-
 .../manager/dao/repository/ChatMessageDao.java     |  14 +-
 .../manager/dao/repository/ChatThreadDao.java      |  17 +-
 .../dao/repository/PlatformAuthorizedDao.java      |  13 +-
 .../bigtop/manager/dao/repository/PlatformDao.java |   8 +-
 .../resources/mapper/mysql/ChatMessageMapper.xml   |  36 +++
 .../resources/mapper/mysql/ChatThreadMapper.xml    |  39 +++
 .../mapper/mysql/PlatformAuthorizedMapper.xml      |  45 +++
 .../main/resources/mapper/mysql/PlatformMapper.xml |  38 +++
 bigtop-manager-server/pom.xml                      |   8 +
 .../server/controller/AIChatController.java        |  15 +-
 .../manager/server/enums/ApiExceptionEnum.java     |   8 +
 .../bigtop/manager/server/enums/LocaleKeys.java    |   9 +
 ...ormConverter.java => ChatMessageConverter.java} |  22 +-
 ...formConverter.java => ChatThreadConverter.java} |  12 +-
 ...erter.java => PlatformAuthorizedConverter.java} |  16 +-
 .../server/model/converter/PlatformConverter.java  |  24 ++
 .../PlatformAuthorizedDTO.java}                    |  18 +-
 .../manager/server/model/dto/PlatformDTO.java      |   4 +-
 .../manager/server/model/vo/ChatMessageVO.java     |   6 +-
 .../manager/server/model/vo/ChatThreadVO.java      |   2 +
 .../server/model/vo/PlatformAuthCredentialVO.java  |   2 +-
 .../server/model/vo/PlatformAuthorizedVO.java      |   2 +
 .../manager/server/service/AIChatService.java      |   6 +-
 .../server/service/impl/AIChatServiceImpl.java     | 322 +++++++++++++++------
 .../src/main/resources/ddl/MySQL-DDL-CREATE.sql    |  62 +++-
 .../main/resources/i18n/messages_en_US.properties  |   7 +
 .../main/resources/i18n/messages_zh_CN.properties  |   7 +
 .../server/controller/AIChatControllerTest.java    | 127 +++++++-
 50 files changed, 1187 insertions(+), 381 deletions(-)

diff --git a/bigtop-manager-ai/bigtop-manager-ai-assistant/pom.xml 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/pom.xml
index 6f1fea8..62ca8b3 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-assistant/pom.xml
+++ b/bigtop-manager-ai/bigtop-manager-ai-assistant/pom.xml
@@ -39,6 +39,10 @@
             <groupId>org.apache.bigtop</groupId>
             <artifactId>bigtop-manager-ai-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.bigtop</groupId>
+            <artifactId>bigtop-manager-dao</artifactId>
+        </dependency>
     </dependencies>
 
 </project>
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 2795678..dfae2f7 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
@@ -21,12 +21,16 @@ package org.apache.bigtop.manager.ai.assistant;
 import org.apache.bigtop.manager.ai.assistant.provider.LocSystemPromptProvider;
 import org.apache.bigtop.manager.ai.core.AbstractAIAssistantFactory;
 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.PlatformNotFoundException;
 import org.apache.bigtop.manager.ai.core.factory.AIAssistant;
 import org.apache.bigtop.manager.ai.core.factory.ToolBox;
 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.apache.commons.lang3.NotImplementedException;
+
 import dev.langchain4j.data.message.SystemMessage;
 import dev.langchain4j.store.memory.chat.ChatMemoryStore;
 import dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore;
@@ -35,13 +39,19 @@ import java.util.Objects;
 
 public class GeneralAssistantFactory extends AbstractAIAssistantFactory {
 
-    private SystemPromptProvider systemPromptProvider = new 
LocSystemPromptProvider();
-    private ChatMemoryStore chatMemoryStore = new InMemoryChatMemoryStore();
+    private final SystemPromptProvider systemPromptProvider;
+    private final ChatMemoryStore chatMemoryStore;
 
-    public GeneralAssistantFactory() {}
+    public GeneralAssistantFactory() {
+        this(new LocSystemPromptProvider(), new InMemoryChatMemoryStore());
+    }
 
     public GeneralAssistantFactory(SystemPromptProvider systemPromptProvider) {
-        this.systemPromptProvider = systemPromptProvider;
+        this(systemPromptProvider, new InMemoryChatMemoryStore());
+    }
+
+    public GeneralAssistantFactory(ChatMemoryStore chatMemoryStore) {
+        this(new LocSystemPromptProvider(), chatMemoryStore);
     }
 
     public GeneralAssistantFactory(SystemPromptProvider systemPromptProvider, 
ChatMemoryStore chatMemoryStore) {
@@ -51,29 +61,33 @@ public class GeneralAssistantFactory extends 
AbstractAIAssistantFactory {
 
     @Override
     public AIAssistant createWithPrompt(
-            PlatformType platformType, AIAssistantConfigProvider 
assistantConfig, Object id, Object promptId) {
-        AIAssistant aiAssistant = create(platformType, assistantConfig, id);
-        SystemMessage systemPrompt = 
systemPromptProvider.getSystemPrompt(promptId);
-        aiAssistant.setSystemPrompt(systemPrompt);
-        return aiAssistant;
-    }
-
-    @Override
-    public AIAssistant create(PlatformType platformType, 
AIAssistantConfigProvider assistantConfig, Object id) {
+            PlatformType platformType,
+            AIAssistantConfigProvider assistantConfig,
+            Object id,
+            SystemPrompt systemPrompts) {
+        AIAssistant aiAssistant;
         if (Objects.requireNonNull(platformType) == PlatformType.OPENAI) {
-            AIAssistant aiAssistant = OpenAIAssistant.builder()
+            aiAssistant = OpenAIAssistant.builder()
                     .id(id)
                     .memoryStore(chatMemoryStore)
                     .withConfigProvider(assistantConfig)
                     .build();
-            
aiAssistant.setSystemPrompt(systemPromptProvider.getSystemPrompt());
-            return aiAssistant;
+        } else {
+            throw new PlatformNotFoundException(platformType.getValue());
         }
-        return null;
+
+        SystemMessage systemPrompt = 
systemPromptProvider.getSystemPrompt(systemPrompts);
+        aiAssistant.setSystemPrompt(systemPrompt);
+        return aiAssistant;
+    }
+
+    @Override
+    public AIAssistant create(PlatformType platformType, 
AIAssistantConfigProvider assistantConfig, Object id) {
+        return createWithPrompt(platformType, assistantConfig, id, 
SystemPrompt.DEFAULT_PROMPT);
     }
 
     @Override
     public ToolBox createToolBox(PlatformType platformType) {
-        return null;
+        throw new NotImplementedException("ToolBox is not implemented for 
GeneralAssistantFactory");
     }
 }
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/provider/AIAssistantConfig.java
index f632f83..5266ead 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/provider/AIAssistantConfig.java
@@ -24,42 +24,83 @@ import java.util.HashMap;
 import java.util.Map;
 
 public class AIAssistantConfig implements AIAssistantConfigProvider {
-    private final Map<String, String> configMap;
 
-    private AIAssistantConfig(Map<String, String> configMap) {
-        this.configMap = configMap;
+    /**
+     * Model name for platform that we want to use
+     */
+    private final String model;
+
+    /**
+     * Credentials for different platforms
+     */
+    private final Map<String, String> credentials;
+
+    /**
+     * Platform extra configs are put here
+     */
+    private final Map<String, String> configs;
+
+    private AIAssistantConfig(String model, Map<String, String> credentials, 
Map<String, String> configMap) {
+        this.model = model;
+        this.credentials = credentials;
+        this.configs = configMap;
     }
 
     public static Builder builder() {
         return new Builder();
     }
 
-    public static Builder withDefault(String baseUrl, String apiKey) {
-        Builder builder = new Builder();
-        return builder.set("baseUrl", baseUrl).set("apiKey", apiKey);
+    @Override
+    public String getModel() {
+        return model;
     }
 
     @Override
-    public Map<String, String> configs() {
+    public Map<String, String> getCredentials() {
+        return credentials;
+    }
 
-        return configMap;
+    @Override
+    public Map<String, String> getConfigs() {
+        return configs;
     }
 
     public static class Builder {
-        private final Map<String, String> configs;
+        private String model;
+
+        private final Map<String, String> credentials = new HashMap<>();
+
+        private final Map<String, String> configs = new HashMap<>();
 
-        public Builder() {
-            configs = new HashMap<>();
-            configs.put("memoryLen", "30");
+        public Builder() {}
+
+        public Builder setModel(String model) {
+            this.model = model;
+            return this;
         }
 
-        public Builder set(String key, String value) {
+        public Builder addCredential(String key, String value) {
+            credentials.put(key, value);
+            return this;
+        }
+
+        public Builder addCredentials(Map<String, String> credentialMap) {
+            credentials.putAll(credentialMap);
+            return this;
+        }
+
+        public Builder addConfig(String key, String value) {
             configs.put(key, value);
             return this;
         }
 
+        public Builder addConfigs(Map<String, String> configMap) {
+            configs.putAll(configMap);
+            return this;
+        }
+
         public AIAssistantConfig build() {
-            return new AIAssistantConfig(configs);
+            return new AIAssistantConfig(model, credentials, configs);
         }
     }
 }
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 1603601..b61dd16 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
@@ -18,6 +18,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.util.ResourceUtils;
@@ -29,41 +30,37 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
-import java.util.Objects;
 
 @Slf4j
 public class LocSystemPromptProvider implements SystemPromptProvider {
 
-    public static final String DEFAULT = "default";
     private static final String SYSTEM_PROMPT_PATH = "src/main/resources/";
-    private static final String DEFAULT_NAME = "big-data-professor.st";
 
     @Override
-    public SystemMessage getSystemPrompt(Object id) {
-        if (Objects.equals(id.toString(), DEFAULT)) {
-            return getSystemPrompt();
-        } else {
-            return loadPromptFromFile(id.toString());
+    public SystemMessage getSystemPrompt(SystemPrompt systemPrompt) {
+        if (systemPrompt == SystemPrompt.DEFAULT_PROMPT) {
+            systemPrompt = SystemPrompt.BIGDATA_PROFESSOR;
         }
+
+        return loadPromptFromFile(systemPrompt.getValue());
     }
 
     @Override
     public SystemMessage getSystemPrompt() {
-        return loadPromptFromFile(DEFAULT_NAME);
+        return getSystemPrompt(SystemPrompt.DEFAULT_PROMPT);
     }
 
     private SystemMessage loadPromptFromFile(String fileName) {
-        final String filePath = SYSTEM_PROMPT_PATH + fileName;
+        final String filePath = SYSTEM_PROMPT_PATH + fileName + ".st";
         try {
             File file = ResourceUtils.getFile(filePath);
             String text = Files.readString(file.toPath(), 
StandardCharsets.UTF_8);
             return SystemMessage.from(text);
         } catch (IOException e) {
-            //
             log.error(
                     "Exception occurred while loading SystemPrompt from local. 
Here is some information:{}",
                     e.getMessage());
-            return SystemMessage.from("");
+            return SystemMessage.from("You are a helpful assistant.");
         }
     }
 }
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
new file mode 100644
index 0000000..ba4fd95
--- /dev/null
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
@@ -0,0 +1,104 @@
+/*
+ * 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.assistant.store;
+
+import org.apache.bigtop.manager.ai.core.enums.MessageSender;
+import org.apache.bigtop.manager.dao.po.ChatMessagePO;
+import org.apache.bigtop.manager.dao.po.ChatThreadPO;
+import org.apache.bigtop.manager.dao.repository.ChatMessageDao;
+import org.apache.bigtop.manager.dao.repository.ChatThreadDao;
+
+import dev.langchain4j.data.message.AiMessage;
+import dev.langchain4j.data.message.ChatMessage;
+import dev.langchain4j.data.message.ChatMessageType;
+import dev.langchain4j.data.message.SystemMessage;
+import dev.langchain4j.data.message.UserMessage;
+import dev.langchain4j.store.memory.chat.ChatMemoryStore;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class PersistentChatMemoryStore implements ChatMemoryStore {
+
+    private final ChatThreadDao chatThreadDao;
+    private final ChatMessageDao chatMessageDao;
+
+    public PersistentChatMemoryStore(ChatThreadDao chatThreadDao, 
ChatMessageDao chatMessageDao) {
+        this.chatThreadDao = chatThreadDao;
+        this.chatMessageDao = chatMessageDao;
+    }
+
+    private ChatMessage convertToChatMessage(ChatMessagePO chatMessagePO) {
+        String sender = chatMessagePO.getSender().toLowerCase();
+        if (sender.equals(MessageSender.AI.getValue())) {
+            return new AiMessage(chatMessagePO.getMessage());
+        } else if (sender.equals(MessageSender.USER.getValue())) {
+            return new UserMessage(chatMessagePO.getMessage());
+        } else if (sender.equals(MessageSender.SYSTEM.getValue())) {
+            return new SystemMessage(chatMessagePO.getMessage());
+        } else {
+            return null;
+        }
+    }
+
+    private ChatMessagePO convertToChatMessagePO(ChatMessage chatMessage, Long 
chatThreadId) {
+        ChatMessagePO chatMessagePO = new ChatMessagePO();
+        if (chatMessage.type().equals(ChatMessageType.AI)) {
+            chatMessagePO.setSender(MessageSender.AI.getValue());
+            AiMessage aiMessage = (AiMessage) chatMessage;
+            chatMessagePO.setMessage(aiMessage.text());
+        } else if (chatMessage.type().equals(ChatMessageType.USER)) {
+            chatMessagePO.setSender(MessageSender.USER.getValue());
+            UserMessage userMessage = (UserMessage) chatMessage;
+            chatMessagePO.setMessage(userMessage.singleText());
+        } else if (chatMessage.type().equals(ChatMessageType.SYSTEM)) {
+            chatMessagePO.setSender(MessageSender.SYSTEM.getValue());
+            SystemMessage systemMessage = (SystemMessage) chatMessage;
+            chatMessagePO.setMessage(systemMessage.text());
+        } else {
+            chatMessagePO.setSender(chatMessage.type().toString());
+        }
+        ChatThreadPO chatThreadPO = chatThreadDao.findById(chatThreadId);
+        chatMessagePO.setUserId(chatThreadPO.getUserId());
+        chatMessagePO.setThreadId(chatThreadId);
+        return chatMessagePO;
+    }
+
+    @Override
+    public List<ChatMessage> getMessages(Object threadId) {
+        List<ChatMessagePO> chatMessages = 
chatMessageDao.findAllByThreadId((Long) threadId);
+        if (chatMessages.isEmpty()) {
+            return new ArrayList<>();
+        } else {
+            return 
chatMessages.stream().map(this::convertToChatMessage).collect(Collectors.toList());
+        }
+    }
+
+    @Override
+    public void updateMessages(Object threadId, List<ChatMessage> messages) {
+        ChatMessagePO chatMessagePO = 
convertToChatMessagePO(messages.get(messages.size() - 1), (Long) threadId);
+        chatMessageDao.save(chatMessagePO);
+    }
+
+    @Override
+    public void deleteMessages(Object threadId) {
+        chatMessageDao.deleteByThreadId((Long) threadId);
+    }
+}
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/AIAssistantServiceTest.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/AIAssistantServiceTest.java
index 40c21d5..0e623ef 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/AIAssistantServiceTest.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/AIAssistantServiceTest.java
@@ -32,18 +32,18 @@ import org.mockito.MockitoAnnotations;
 import dev.langchain4j.model.openai.OpenAiChatModelName;
 import reactor.core.publisher.Flux;
 
+import java.util.UUID;
+
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.mockito.Mockito.when;
 
 public class AIAssistantServiceTest {
 
     private AIAssistantConfigProvider configProvider = 
AIAssistantConfig.builder()
-            .set("apiKey", "sk-")
+            .addConfig("apiKey", "sk-")
             // The `baseUrl` has a default value that is automatically 
generated based on the `PlatformType`.
-            .set("baseUrl", "https://api.openai.com/v1";)
-            // default 30
-            .set("memoryLen", "10")
-            .set("modelName", OpenAiChatModelName.GPT_3_5_TURBO.toString())
+            .addConfig("baseUrl", "https://api.openai.com/v1";)
+            .addConfig("modelName", 
OpenAiChatModelName.GPT_3_5_TURBO.toString())
             .build();
 
     @Mock
@@ -52,6 +52,8 @@ public class AIAssistantServiceTest {
     @Mock
     private AIAssistantFactory aiAssistantFactory;
 
+    private final String threadId = UUID.randomUUID().toString();
+
     @BeforeEach
     public void init() {
         MockitoAnnotations.openMocks(this);
@@ -62,13 +64,14 @@ public class AIAssistantServiceTest {
                 emmit.next(text.charAt(i) + "");
             }
         }));
-        when(aiAssistantFactory.create(PlatformType.OPENAI, 
configProvider)).thenReturn(this.aiAssistant);
-        
when(aiAssistant.getPlatform()).thenReturn(PlatformType.OPENAI.getValue());
+        when(aiAssistantFactory.create(PlatformType.OPENAI, configProvider, 
threadId))
+                .thenReturn(this.aiAssistant);
+        when(aiAssistant.getPlatform()).thenReturn(PlatformType.OPENAI);
     }
 
     @Test
     public void createNew2SimpleChat() {
-        AIAssistant aiAssistant = 
aiAssistantFactory.create(PlatformType.OPENAI, configProvider);
+        AIAssistant aiAssistant = 
aiAssistantFactory.create(PlatformType.OPENAI, configProvider, threadId);
         String ask = aiAssistant.ask("1?");
         assertFalse(ask.isEmpty());
         System.out.println(ask);
@@ -76,7 +79,7 @@ public class AIAssistantServiceTest {
 
     @Test
     public void createNew2StreamChat() throws InterruptedException {
-        AIAssistant aiAssistant = 
aiAssistantFactory.create(PlatformType.OPENAI, configProvider);
+        AIAssistant aiAssistant = 
aiAssistantFactory.create(PlatformType.OPENAI, configProvider, threadId);
         Flux<String> stringFlux = aiAssistant.streamAsk("stream 1?");
         stringFlux.subscribe(
                 System.out::println,
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/SystemPromptProviderTests.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/SystemPromptProviderTests.java
index db9be1a..1f768e1 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/SystemPromptProviderTests.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/SystemPromptProviderTests.java
@@ -19,6 +19,7 @@
 package org.apache.bigtop.manager.ai.assistant;
 
 import org.apache.bigtop.manager.ai.assistant.provider.LocSystemPromptProvider;
+import org.apache.bigtop.manager.ai.core.enums.SystemPrompt;
 import org.apache.bigtop.manager.ai.core.provider.SystemPromptProvider;
 
 import org.junit.jupiter.api.Test;
@@ -30,22 +31,15 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
 
 public class SystemPromptProviderTests {
 
-    private SystemPromptProvider systemPromptProvider = new 
LocSystemPromptProvider();
-
-    @Test
-    public void loadSystemPromptTest() {
-        System.out.println(systemPromptProvider.getSystemPrompt());
-    }
+    private final SystemPromptProvider systemPromptProvider = new 
LocSystemPromptProvider();
 
     @Test
     public void loadSystemPromptByIdTest() {
-        SystemMessage systemPrompt1 = 
systemPromptProvider.getSystemPrompt("big-data-professor.st");
+        SystemMessage systemPrompt1 = 
systemPromptProvider.getSystemPrompt(SystemPrompt.BIGDATA_PROFESSOR);
         assertFalse(systemPrompt1.text().isEmpty());
-        System.out.println(systemPrompt1.text());
 
-        SystemMessage systemPrompt2 = 
systemPromptProvider.getSystemPrompt(LocSystemPromptProvider.DEFAULT);
+        SystemMessage systemPrompt2 = systemPromptProvider.getSystemPrompt();
         assertFalse(systemPrompt2.text().isEmpty());
-        System.out.println(systemPrompt2.text());
 
         assertEquals(systemPrompt1.text(), systemPrompt2.text());
     }
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 e5087e3..5b0f383 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
@@ -37,6 +37,8 @@ public abstract class AbstractAIAssistant implements 
AIAssistant {
     private final Object assistantId;
     private final ChatMemory chatMemory;
 
+    protected static final Integer MEMORY_LEN = 10;
+
     public AbstractAIAssistant(
             ChatLanguageModel chatLanguageModel,
             StreamingChatLanguageModel streamingChatLanguageModel,
@@ -50,29 +52,25 @@ public abstract class AbstractAIAssistant implements 
AIAssistant {
     @Override
     public Flux<String> streamAsk(ChatMessage chatMessage) {
         chatMemory.add(chatMessage);
-        Flux<String> streamAiMessage = Flux.create(
-                emitter -> {
-                    streamingChatLanguageModel.generate(chatMemory.messages(), 
new StreamingResponseHandler<>() {
-                        @Override
-                        public void onNext(String token) {
-                            emitter.next(token);
-                        }
+        return Flux.create(
+                emitter -> 
streamingChatLanguageModel.generate(chatMemory.messages(), new 
StreamingResponseHandler<>() {
+                    @Override
+                    public void onNext(String token) {
+                        emitter.next(token);
+                    }
 
-                        @Override
-                        public void onError(Throwable error) {
-                            emitter.error(error);
-                        }
+                    @Override
+                    public void onError(Throwable error) {
+                        emitter.error(error);
+                    }
 
-                        @Override
-                        public void onComplete(Response<AiMessage> response) {
-                            
StreamingResponseHandler.super.onComplete(response);
-                            chatMemory.add(response.content());
-                        }
-                    });
-                },
+                    @Override
+                    public void onComplete(Response<AiMessage> response) {
+                        StreamingResponseHandler.super.onComplete(response);
+                        chatMemory.add(response.content());
+                    }
+                }),
                 FluxSink.OverflowStrategy.BUFFER);
-
-        return streamAiMessage;
     }
 
     @Override
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/PlatformType.java
 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/MessageSender.java
similarity index 75%
copy from 
bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/PlatformType.java
copy to 
bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/MessageSender.java
index 0f5cb60..1c93085 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/PlatformType.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/MessageSender.java
@@ -18,37 +18,39 @@
  */
 package org.apache.bigtop.manager.ai.core.enums;
 
+import lombok.Getter;
+
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
-public enum PlatformType {
-    OPENAI("openai");
+@Getter
+public enum MessageSender {
+    USER("user"),
+    AI("ai"),
+    SYSTEM("system");
 
     private final String value;
 
-    PlatformType(String value) {
+    MessageSender(String value) {
         this.value = value;
     }
 
-    public static List<String> getPlatforms() {
+    public static List<String> getSenders() {
         return Arrays.stream(values()).map(item -> 
item.value).collect(Collectors.toList());
     }
 
-    public static PlatformType getPlatformType(String value) {
+    public static MessageSender getMessageSender(String value) {
         if (Objects.isNull(value) || value.isEmpty()) {
             return null;
         }
-        for (PlatformType platformType : PlatformType.values()) {
-            if (platformType.value.equals(value)) {
-                return platformType;
+        for (MessageSender messageSender : MessageSender.values()) {
+            if (messageSender.value.equals(value)) {
+                return messageSender;
             }
         }
-        return null;
-    }
 
-    public String getValue() {
-        return this.value;
+        return null;
     }
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/PlatformType.java
 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/PlatformType.java
index 0f5cb60..cadbb2a 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/PlatformType.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/PlatformType.java
@@ -18,11 +18,14 @@
  */
 package org.apache.bigtop.manager.ai.core.enums;
 
+import lombok.Getter;
+
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
+@Getter
 public enum PlatformType {
     OPENAI("openai");
 
@@ -47,8 +50,4 @@ public enum PlatformType {
         }
         return null;
     }
-
-    public String getValue() {
-        return this.value;
-    }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthCredentialVO.java
 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/SystemPrompt.java
similarity index 71%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthCredentialVO.java
copy to 
bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/SystemPrompt.java
index edfe0ff..be0eea3 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthCredentialVO.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/SystemPrompt.java
@@ -16,18 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.model.vo;
+package org.apache.bigtop.manager.ai.core.enums;
 
-import lombok.Data;
+import lombok.Getter;
 
-@Data
-public class PlatformAuthCredentialVO {
-    private String name;
+@Getter
+public enum SystemPrompt {
+    DEFAULT_PROMPT("default"),
+    BIGDATA_PROFESSOR("big-data-professor"),
+    LANGUAGE_PROMPT("language-prompt");
+    ;
 
-    private String displayName;
+    private final String value;
 
-    public PlatformAuthCredentialVO(String name, String displayName) {
-        this.name = name;
-        this.displayName = name;
+    SystemPrompt(String value) {
+        this.value = value;
     }
 }
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 8f4ef8e..6834b05 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,6 +18,8 @@
  */
 package org.apache.bigtop.manager.ai.core.factory;
 
+import org.apache.bigtop.manager.ai.core.enums.PlatformType;
+
 import dev.langchain4j.data.message.ChatMessage;
 import dev.langchain4j.data.message.SystemMessage;
 import dev.langchain4j.data.message.UserMessage;
@@ -57,7 +59,7 @@ public interface AIAssistant {
      * This is used to get the AIAssistant's Platform
      * @return
      */
-    String getPlatform();
+    PlatformType getPlatform();
 
     void setSystemPrompt(SystemMessage systemPrompt);
 
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 6610f9c..d6b2403 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
@@ -19,51 +19,28 @@
 package org.apache.bigtop.manager.ai.core.factory;
 
 import org.apache.bigtop.manager.ai.core.enums.PlatformType;
-import org.apache.bigtop.manager.ai.core.exception.PlatformNotFoundException;
+import org.apache.bigtop.manager.ai.core.enums.SystemPrompt;
 import org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
 
-import java.util.Objects;
 import java.util.UUID;
 
 public interface AIAssistantFactory {
 
     AIAssistant createWithPrompt(
-            PlatformType platformType, AIAssistantConfigProvider 
assistantConfig, Object id, Object promptId);
+            PlatformType platformType, AIAssistantConfigProvider 
assistantConfig, Object id, SystemPrompt systemPrompt);
 
     AIAssistant create(PlatformType platformType, AIAssistantConfigProvider 
assistantConfig, Object id);
 
-    ToolBox createToolBox(PlatformType platformType);
-
-    default AIAssistant createWithPrompt(
-            PlatformType platformType, AIAssistantConfigProvider 
assistantConfig, Object prompt) {
-        return createWithPrompt(platformType, assistantConfig, 
UUID.randomUUID().toString(), prompt);
-    }
-
-    default AIAssistant create(String platform, AIAssistantConfigProvider 
assistantConfigProvider, Object id) {
-        PlatformType platformType = PlatformType.getPlatformType(platform);
-        if (Objects.isNull(platformType)) {
-            throw new PlatformNotFoundException(platform);
-        }
-        return create(platformType, assistantConfigProvider, id);
-    }
-
-    default AIAssistant create(PlatformType platformType, 
AIAssistantConfigProvider assistantConfigProvider) {
-        return create(platformType, assistantConfigProvider, 
UUID.randomUUID().toString());
-    }
-
-    default AIAssistant create(String platform, AIAssistantConfigProvider 
assistantConfig) {
-        PlatformType platformType = PlatformType.getPlatformType(platform);
-        if (Objects.isNull(platformType)) {
-            throw new PlatformNotFoundException(platform);
-        }
-        return create(platformType, assistantConfig);
+    /**
+     * TODO Create AIAssistant without memory, should delete UUID
+     *
+     * @param platformType platform type
+     * @param assistantConfig assistant config
+     * @return AIAssistant
+     */
+    default AIAssistant create(PlatformType platformType, 
AIAssistantConfigProvider assistantConfig) {
+        return create(platformType, assistantConfig, 
UUID.randomUUID().toString());
     }
 
-    default ToolBox createToolBox(String platform) {
-        PlatformType platformType = PlatformType.getPlatformType(platform);
-        if (Objects.isNull(platformType)) {
-            throw new PlatformNotFoundException(platform);
-        }
-        return createToolBox(platformType);
-    }
+    ToolBox createToolBox(PlatformType platformType);
 }
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/provider/AIAssistantConfigProvider.java
index ea05b98..04f9dbd 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/provider/AIAssistantConfigProvider.java
@@ -21,5 +21,9 @@ package org.apache.bigtop.manager.ai.core.provider;
 import java.util.Map;
 
 public interface AIAssistantConfigProvider {
-    Map<String, String> configs();
+    String getModel();
+
+    Map<String, String> getCredentials();
+
+    Map<String, String> getConfigs();
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/SystemPromptProvider.java
 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/SystemPromptProvider.java
index 5d6865f..4340fc8 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/SystemPromptProvider.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/SystemPromptProvider.java
@@ -18,12 +18,13 @@
  */
 package org.apache.bigtop.manager.ai.core.provider;
 
+import org.apache.bigtop.manager.ai.core.enums.SystemPrompt;
+
 import dev.langchain4j.data.message.SystemMessage;
 
 public interface SystemPromptProvider {
 
-    // Return the SystemPrompt for the specified ID.
-    SystemMessage getSystemPrompt(Object id);
+    SystemMessage getSystemPrompt(SystemPrompt systemPrompt);
 
     // return default system prompt
     SystemMessage getSystemPrompt();
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 1d76b62..f532580 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
@@ -19,11 +19,10 @@
 package org.apache.bigtop.manager.ai.openai;
 
 import org.apache.bigtop.manager.ai.core.AbstractAIAssistant;
+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.provider.AIAssistantConfigProvider;
 
-import org.springframework.util.NumberUtils;
-
 import dev.langchain4j.internal.ValidationUtils;
 import dev.langchain4j.memory.ChatMemory;
 import dev.langchain4j.memory.chat.MessageWindowChatMemory;
@@ -33,14 +32,9 @@ import dev.langchain4j.model.openai.OpenAiChatModel;
 import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
 import dev.langchain4j.store.memory.chat.ChatMemoryStore;
 
-import java.util.HashMap;
-import java.util.Map;
-
 public class OpenAIAssistant extends AbstractAIAssistant {
 
-    private static final String PLATFORM_NAME = "openai";
     private static final String BASE_URL = "https://api.openai.com/v1";;
-    private static final String MODEL_NAME = "gpt-3.5-turbo";
 
     private OpenAIAssistant(
             ChatLanguageModel chatLanguageModel,
@@ -50,8 +44,8 @@ public class OpenAIAssistant extends AbstractAIAssistant {
     }
 
     @Override
-    public String getPlatform() {
-        return PLATFORM_NAME;
+    public PlatformType getPlatform() {
+        return PlatformType.OPENAI;
     }
 
     public static Builder builder() {
@@ -61,16 +55,13 @@ public class OpenAIAssistant extends AbstractAIAssistant {
     public static class Builder {
         private Object id;
 
-        private Map<String, String> configs = new HashMap<>();
         private ChatMemoryStore chatMemoryStore;
+        private AIAssistantConfigProvider configProvider;
 
-        public Builder() {
-            configs.put("baseUrl", BASE_URL);
-            configs.put("modelName", MODEL_NAME);
-        }
+        public Builder() {}
 
         public Builder withConfigProvider(AIAssistantConfigProvider 
configProvider) {
-            this.configs = configProvider.configs();
+            this.configProvider = configProvider;
             return this;
         }
 
@@ -86,25 +77,23 @@ public class OpenAIAssistant extends AbstractAIAssistant {
 
         public AIAssistant build() {
             ValidationUtils.ensureNotNull(id, "id");
-            String baseUrl = configs.get("baseUrl");
-            String modelName = configs.get("modelName");
-            String apiKey = 
ValidationUtils.ensureNotNull(configs.get("apiKey"), "apiKey");
-            Integer memoryLen = ValidationUtils.ensureNotNull(
-                    NumberUtils.parseNumber(configs.get("memoryLen"), 
Integer.class), "memoryLen not a number.");
+            String model = 
ValidationUtils.ensureNotNull(configProvider.getModel(), "model");
+            String apiKey = ValidationUtils.ensureNotNull(
+                    configProvider.getCredentials().get("apiKey"), "apiKey");
             ChatLanguageModel openAiChatModel = OpenAiChatModel.builder()
                     .apiKey(apiKey)
-                    .baseUrl(baseUrl)
-                    .modelName(modelName)
+                    .baseUrl(BASE_URL)
+                    .modelName(model)
                     .build();
             StreamingChatLanguageModel openaiStreamChatModel = 
OpenAiStreamingChatModel.builder()
                     .apiKey(apiKey)
-                    .baseUrl(baseUrl)
-                    .modelName(modelName)
+                    .baseUrl(BASE_URL)
+                    .modelName(model)
                     .build();
             MessageWindowChatMemory chatMemory = 
MessageWindowChatMemory.builder()
                     .id(id)
                     .chatMemoryStore(chatMemoryStore)
-                    .maxMessages(memoryLen)
+                    .maxMessages(MEMORY_LEN)
                     .build();
             return new OpenAIAssistant(openAiChatModel, openaiStreamChatModel, 
chatMemory);
         }
diff --git a/bigtop-manager-dao/pom.xml b/bigtop-manager-dao/pom.xml
index 6fed3ad..ff56c97 100644
--- a/bigtop-manager-dao/pom.xml
+++ b/bigtop-manager-dao/pom.xml
@@ -74,6 +74,10 @@
             <groupId>org.apache.tomcat.embed</groupId>
             <artifactId>tomcat-embed-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.bigtop</groupId>
+            <artifactId>bigtop-manager-ai-core</artifactId>
+        </dependency>
     </dependencies>
 
 </project>
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/handler/JsonTypeHandler.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/handler/JsonTypeHandler.java
new file mode 100644
index 0000000..4879753
--- /dev/null
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/handler/JsonTypeHandler.java
@@ -0,0 +1,72 @@
+/*
+ * 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
+ *
+ *   http://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.dao.handler;
+
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Map;
+
+public class JsonTypeHandler extends BaseTypeHandler<Map<String, String>> {
+
+    private static final ObjectMapper objectMapper = new ObjectMapper();
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, Map<String, 
String> parameter, JdbcType jdbcType)
+            throws SQLException {
+        ps.setString(i, convertMapToJson(parameter));
+    }
+
+    @Override
+    public Map<String, String> getNullableResult(ResultSet rs, String 
columnName) throws SQLException {
+        return convertJsonToMap(rs.getString(columnName));
+    }
+
+    @Override
+    public Map<String, String> getNullableResult(ResultSet rs, int 
columnIndex) throws SQLException {
+        return convertJsonToMap(rs.getString(columnIndex));
+    }
+
+    @Override
+    public Map<String, String> getNullableResult(java.sql.CallableStatement 
cs, int columnIndex) throws SQLException {
+        return convertJsonToMap(cs.getString(columnIndex));
+    }
+
+    private String convertMapToJson(Map<String, String> map) {
+        try {
+            return objectMapper.writeValueAsString(map);
+        } catch (Exception e) {
+            throw new RuntimeException("Error converting map to JSON string", 
e);
+        }
+    }
+
+    private Map<String, String> convertJsonToMap(String json) {
+        try {
+            return objectMapper.readValue(json, new TypeReference<Map<String, 
String>>() {});
+        } catch (Exception e) {
+            throw new RuntimeException("Error converting JSON string to map", 
e);
+        }
+    }
+}
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatMessageVO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatMessagePO.java
similarity index 59%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatMessageVO.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatMessagePO.java
index 981529b..4236810 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatMessageVO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatMessagePO.java
@@ -16,21 +16,33 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.model.vo;
+package org.apache.bigtop.manager.dao.po;
 
 import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import java.io.Serializable;
 
 @Data
-public class ChatMessageVO {
-    private String sender;
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "llm_chat_message")
+public class ChatMessagePO extends BasePO implements Serializable {
+    @Id
+    @Column(name = "id")
+    private Long id;
 
+    @Column(name = "message", nullable = false, length = 255)
     private String message;
 
-    private String createTime;
+    @Column(name = "sender")
+    private String sender;
+
+    @Column(name = "user_id")
+    private Long userId;
 
-    public ChatMessageVO(String sender, String messageText, String createTime) 
{
-        this.sender = sender;
-        this.message = messageText;
-        this.createTime = createTime;
-    }
+    @Column(name = "thread_id")
+    private Long threadId;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
similarity index 62%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
index 2349fdb..e4c8628 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
@@ -16,27 +16,30 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.model.vo;
+package org.apache.bigtop.manager.dao.po;
 
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
-@Data
-public class ChatThreadVO {
-    private Long threadId;
+import jakarta.persistence.Column;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import java.io.Serializable;
 
-    private Long platformId;
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "llm_chat_thread")
+public class ChatThreadPO extends BasePO implements Serializable {
+    @Id
+    @Column(name = "id")
+    private Long id;
 
+    @Column(name = "model", nullable = false, length = 255)
     private String model;
 
-    private String createTime;
+    @Column(name = "user_id")
+    private Long userId;
 
-    private String updateTime;
-
-    public ChatThreadVO(Long threadId, Long platformId, String model, String 
createTime) {
-        this.threadId = threadId;
-        this.platformId = platformId;
-        this.model = model;
-        this.createTime = createTime;
-        this.updateTime = createTime;
-    }
+    @Column(name = "platform_id")
+    private Long platformId;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformAuthorizedPO.java
similarity index 59%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformAuthorizedPO.java
index 2349fdb..f27fcd4 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformAuthorizedPO.java
@@ -16,27 +16,29 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.model.vo;
+package org.apache.bigtop.manager.dao.po;
 
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
-@Data
-public class ChatThreadVO {
-    private Long threadId;
-
-    private Long platformId;
+import jakarta.persistence.Column;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import java.io.Serializable;
+import java.util.Map;
 
-    private String model;
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "llm_platform_authorized")
+public class PlatformAuthorizedPO extends BasePO implements Serializable {
 
-    private String createTime;
+    @Id
+    @Column(name = "id")
+    private Long id;
 
-    private String updateTime;
+    @Column(name = "credentials", columnDefinition = "json", nullable = false)
+    private Map<String, String> credentials;
 
-    public ChatThreadVO(Long threadId, Long platformId, String model, String 
createTime) {
-        this.threadId = threadId;
-        this.platformId = platformId;
-        this.model = model;
-        this.createTime = createTime;
-        this.updateTime = createTime;
-    }
+    @Column(name = "platform_id")
+    private Long platformId;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformPO.java
similarity index 56%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformPO.java
index e957f7a..0180c51 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformPO.java
@@ -16,21 +16,32 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.model.vo;
+package org.apache.bigtop.manager.dao.po;
 
 import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import java.io.Serializable;
+import java.util.Map;
 
 @Data
-public class PlatformAuthorizedVO {
-    private Long platformId;
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "llm_platform")
+public class PlatformPO extends BasePO implements Serializable {
 
-    private String platformName;
+    @Id
+    @Column(name = "id")
+    private Long id;
 
-    private String supportModels;
+    @Column(name = "name", nullable = false, length = 255)
+    private String name;
 
-    public PlatformAuthorizedVO(long platformId, String name, String models) {
-        this.platformId = platformId;
-        this.platformName = name;
-        this.supportModels = models;
-    }
+    @Column(name = "credential", columnDefinition = "json", nullable = false)
+    private Map<String, String> credential;
+
+    @Column(name = "support_models", length = 255)
+    private String supportModels;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatMessageDao.java
similarity index 70%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatMessageDao.java
index f26245f..59721af 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatMessageDao.java
@@ -16,14 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.model.dto;
+package org.apache.bigtop.manager.dao.repository;
 
-import lombok.Data;
+import org.apache.bigtop.manager.dao.po.ChatMessagePO;
+
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
-@Data
-public class PlatformDTO {
-    private Long platformId;
-    private List<AuthCredentialDTO> authCredentials;
+public interface ChatMessageDao extends BaseDao<ChatMessagePO> {
+    List<ChatMessagePO> findAllByThreadId(@Param("threadId") Long threadId);
+
+    void deleteByThreadId(@Param("threadId") Long threadId);
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatThreadDao.java
similarity index 63%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatThreadDao.java
index f26245f..a691b7b 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatThreadDao.java
@@ -16,14 +16,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.model.dto;
+package org.apache.bigtop.manager.dao.repository;
 
-import lombok.Data;
+import org.apache.bigtop.manager.dao.po.ChatThreadPO;
+
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
-@Data
-public class PlatformDTO {
-    private Long platformId;
-    private List<AuthCredentialDTO> authCredentials;
+public interface ChatThreadDao extends BaseDao<ChatThreadPO> {
+    List<ChatThreadPO> findAllByUserId(@Param("userId") Long userId);
+
+    ChatThreadPO findById(Long id);
+
+    List<ChatThreadPO> findAllByPlatformAuthorizedIdAndUserId(
+            @Param("platformId") Long platformAuthorizedId, @Param("userId") 
Long userId);
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/SystemPromptProvider.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformAuthorizedDao.java
similarity index 68%
copy from 
bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/SystemPromptProvider.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformAuthorizedDao.java
index 5d6865f..fd801d7 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/SystemPromptProvider.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformAuthorizedDao.java
@@ -16,15 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.ai.core.provider;
+package org.apache.bigtop.manager.dao.repository;
 
-import dev.langchain4j.data.message.SystemMessage;
+import org.apache.bigtop.manager.dao.po.PlatformAuthorizedPO;
 
-public interface SystemPromptProvider {
+import org.apache.ibatis.annotations.Param;
 
-    // Return the SystemPrompt for the specified ID.
-    SystemMessage getSystemPrompt(Object id);
+public interface PlatformAuthorizedDao extends BaseDao<PlatformAuthorizedPO> {
+    PlatformAuthorizedPO findByPlatformId(@Param("id") Long platformId);
 
-    // return default system prompt
-    SystemMessage getSystemPrompt();
+    void saveWithCredentials(PlatformAuthorizedPO platformAuthorizedPO);
 }
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-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformDao.java
similarity index 80%
copy from 
bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/AIAssistantConfigProvider.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformDao.java
index ea05b98..e2d3c97 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/AIAssistantConfigProvider.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformDao.java
@@ -16,10 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.ai.core.provider;
+package org.apache.bigtop.manager.dao.repository;
 
-import java.util.Map;
+import org.apache.bigtop.manager.dao.po.PlatformPO;
 
-public interface AIAssistantConfigProvider {
-    Map<String, String> configs();
+public interface PlatformDao extends BaseDao<PlatformPO> {
+    PlatformPO findByPlatformId(Long id);
 }
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatMessageMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatMessageMapper.xml
new file mode 100644
index 0000000..108410b
--- /dev/null
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatMessageMapper.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  ~ 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
+  ~
+  ~   http://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.
+-->
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd";>
+<mapper namespace="org.apache.bigtop.manager.dao.repository.ChatMessageDao">
+
+    <select id="findAllByThreadId" 
resultType="org.apache.bigtop.manager.dao.po.ChatMessagePO">
+        SELECT *
+        FROM llm_chat_message
+        WHERE thread_id = #{threadId}
+    </select>
+
+    <delete id="deleteByThreadId">
+        DELETE FROM llm_chat_message
+        WHERE thread_id = #{threadId}
+    </delete>
+
+</mapper>
\ No newline at end of file
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatThreadMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatThreadMapper.xml
new file mode 100644
index 0000000..be70207
--- /dev/null
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatThreadMapper.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  ~ 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
+  ~
+  ~   http://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.
+-->
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd";>
+<mapper namespace="org.apache.bigtop.manager.dao.repository.ChatThreadDao">
+    <sql id="baseColumns">
+        id, user_id, platform_id, model
+    </sql>
+    <select id="findAllByUserId" 
resultType="org.apache.bigtop.manager.dao.po.ChatThreadPO">
+        SELECT *
+        FROM llm_chat_thread
+        WHERE user_id = #{userId}
+    </select>
+
+    <select id="findAllByPlatformAuthorizedIdAndUserId" 
resultType="org.apache.bigtop.manager.dao.po.ChatThreadPO">
+        SELECT *
+        FROM llm_chat_thread
+        WHERE platform_id = #{platformId} AND user_id = #{userId}
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformAuthorizedMapper.xml
 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformAuthorizedMapper.xml
new file mode 100644
index 0000000..f065a4c
--- /dev/null
+++ 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformAuthorizedMapper.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  ~ 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
+  ~
+  ~   http://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.
+-->
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd";>
+<mapper 
namespace="org.apache.bigtop.manager.dao.repository.PlatformAuthorizedDao">
+
+    <sql id="baseColumns">
+        id, credentials, platfotrm_id
+    </sql>
+
+    <resultMap id="PlatformAuthorizedResultMap" 
type="org.apache.bigtop.manager.dao.po.PlatformAuthorizedPO">
+        <result property="credentials" column="credentials" 
typeHandler="org.apache.bigtop.manager.dao.handler.JsonTypeHandler"/>
+    </resultMap>
+
+    <select id="findByPlatformId" resultMap="PlatformAuthorizedResultMap">
+        SELECT * FROM llm_platform_authorized WHERE id = #{id}
+    </select>
+
+    <insert id="saveWithCredentials" 
parameterType="org.apache.bigtop.manager.dao.po.PlatformAuthorizedPO" 
useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO llm_platform_authorized (platform_id, credentials)
+        VALUES (#{platformId}, #{credentials, 
typeHandler=org.apache.bigtop.manager.dao.handler.JsonTypeHandler})
+            ON DUPLICATE KEY UPDATE
+                                 platform_id = VALUES(platform_id),
+                                 credentials = VALUES(credentials)
+    </insert>
+
+</mapper>
\ No newline at end of file
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformMapper.xml
new file mode 100644
index 0000000..e4ca903
--- /dev/null
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformMapper.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  ~ 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
+  ~
+  ~   http://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.
+-->
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd";>
+<mapper namespace="org.apache.bigtop.manager.dao.repository.PlatformDao">
+
+    <sql id="baseColumns">
+        id, name, credential, support_models
+    </sql>
+
+    <!-- Define the resultMap with the custom typeHandler for the credential 
column -->
+    <resultMap id="PlatformResultMap" 
type="org.apache.bigtop.manager.dao.po.PlatformPO">
+        <result property="credential" column="credential" 
typeHandler="org.apache.bigtop.manager.dao.handler.JsonTypeHandler"/>
+    </resultMap>
+
+    <select id="findByPlatformId" resultMap="PlatformResultMap">
+        SELECT * FROM llm_platform WHERE id = #{id}
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/bigtop-manager-server/pom.xml b/bigtop-manager-server/pom.xml
index 408b7f9..d6aecde 100644
--- a/bigtop-manager-server/pom.xml
+++ b/bigtop-manager-server/pom.xml
@@ -147,6 +147,14 @@
             <groupId>net.devh</groupId>
             <artifactId>grpc-client-spring-boot-starter</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.bigtop</groupId>
+            <artifactId>bigtop-manager-ai-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.bigtop</groupId>
+            <artifactId>bigtop-manager-ai-assistant</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/AIChatController.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/AIChatController.java
index 2e3b561..8446ab9 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/AIChatController.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/AIChatController.java
@@ -18,7 +18,6 @@
  */
 package org.apache.bigtop.manager.server.controller;
 
-import org.apache.bigtop.manager.server.enums.ResponseStatus;
 import org.apache.bigtop.manager.server.model.converter.PlatformConverter;
 import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
 import org.apache.bigtop.manager.server.model.req.PlatformReq;
@@ -75,7 +74,7 @@ public class AIChatController {
 
     @Operation(summary = "platforms", description = "Add authorized platforms")
     @PutMapping("/platforms")
-    public ResponseEntity<PlatformVO> addAuthorizedPlatform(@RequestBody 
PlatformReq platformReq) {
+    public ResponseEntity<PlatformAuthorizedVO> 
addAuthorizedPlatform(@RequestBody PlatformReq platformReq) {
         PlatformDTO platformDTO = 
PlatformConverter.INSTANCE.fromReq2DTO(platformReq);
         return 
ResponseEntity.success(chatService.addAuthorizedPlatform(platformDTO));
     }
@@ -83,11 +82,7 @@ public class AIChatController {
     @Operation(summary = "platforms", description = "Delete authorized 
platforms")
     @DeleteMapping("/platforms/{platformId}")
     public ResponseEntity<Boolean> deleteAuthorizedPlatform(@PathVariable Long 
platformId) {
-        int code = chatService.deleteAuthorizedPlatform(platformId);
-        if (code != 0) {
-            return ResponseEntity.error(ResponseStatus.PARAMETER_ERROR, 
"Permission denied");
-        }
-        return ResponseEntity.success(true);
+        return 
ResponseEntity.success(chatService.deleteAuthorizedPlatform(platformId));
     }
 
     @Operation(summary = "new threads", description = "Create a chat threads")
@@ -99,11 +94,7 @@ public class AIChatController {
     @Operation(summary = "delete threads", description = "Delete a chat 
threads")
     @DeleteMapping("platforms/{platformId}/threads/{threadId}")
     public ResponseEntity<Boolean> deleteChatThreads(@PathVariable Long 
platformId, @PathVariable Long threadId) {
-        int code = chatService.deleteChatThreads(platformId, threadId);
-        if (code != 0) {
-            return ResponseEntity.error(ResponseStatus.PARAMETER_ERROR, "No 
Content");
-        }
-        return ResponseEntity.success(true);
+        return 
ResponseEntity.success(chatService.deleteChatThreads(platformId, threadId));
     }
 
     @Operation(summary = "get", description = "Get all threads of a platform")
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
index 45ea423..01ed944 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
@@ -60,6 +60,14 @@ public enum ApiExceptionEnum {
     // Command Exceptions -- 18000 ~ 18999
     COMMAND_NOT_FOUND(18000, LocaleKeys.COMMAND_NOT_FOUND),
     COMMAND_NOT_SUPPORTED(18000, LocaleKeys.COMMAND_NOT_SUPPORTED),
+
+    // AI Chat Exceptions -- 19000 ~ 19999
+    PLATFORM_NOT_FOUND(19000, LocaleKeys.PLATFORM_NOT_FOUND),
+    PLATFORM_NOT_AUTHORIZED(19001, LocaleKeys.PLATFORM_NOT_AUTHORIZED),
+    PERMISSION_DENIED(19002, LocaleKeys.PERMISSION_DENIED),
+    CREDIT_INCORRECT(19003, LocaleKeys.CREDIT_INCORRECT),
+    MODEL_NOT_SUPPORTED(19004, LocaleKeys.MODEL_NOT_SUPPORTED),
+    CHAT_THREAD_NOT_FOUND(19005, LocaleKeys.CHAT_THREAD_NOT_FOUND),
     ;
 
     private final Integer code;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
index 22dc64a..bbb6af1 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
@@ -56,6 +56,15 @@ public enum LocaleKeys {
 
     COMMAND_NOT_FOUND("command.not.found"),
     COMMAND_NOT_SUPPORTED("command.not.supported"),
+
+    PLATFORM_NOT_FOUND("platform.not.found"),
+    PLATFORM_NOT_AUTHORIZED("platform.not.authorized"),
+    PERMISSION_DENIED("permission.denied"),
+    CREDIT_INCORRECT("credit.incorrect"),
+    MODEL_NOT_SUPPORTED("model.not.supported"),
+    CHAT_THREAD_NOT_FOUND("chat.thread.not.found"),
+
+    CHAT_LANGUAGE_PROMPT("chat.language.prompt"),
     ;
 
     private final String key;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatMessageConverter.java
similarity index 61%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatMessageConverter.java
index aa4c343..b2c1723 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatMessageConverter.java
@@ -18,16 +18,28 @@
  */
 package org.apache.bigtop.manager.server.model.converter;
 
+import org.apache.bigtop.manager.ai.core.enums.MessageSender;
+import org.apache.bigtop.manager.dao.po.ChatMessagePO;
 import org.apache.bigtop.manager.server.config.MapStructSharedConfig;
-import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
-import org.apache.bigtop.manager.server.model.req.PlatformReq;
+import org.apache.bigtop.manager.server.model.vo.ChatMessageVO;
 
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 
 @Mapper(config = MapStructSharedConfig.class)
-public interface PlatformConverter {
-    PlatformConverter INSTANCE = Mappers.getMapper(PlatformConverter.class);
+public interface ChatMessageConverter {
+    ChatMessageConverter INSTANCE = 
Mappers.getMapper(ChatMessageConverter.class);
 
-    PlatformDTO fromReq2DTO(PlatformReq platformReq);
+    ChatMessageVO fromPO2VO(ChatMessagePO chatMessagePO);
+
+    default MessageSender mapStringToMessageSender(String sender) {
+        if (sender == null) {
+            return null;
+        }
+        try {
+            return MessageSender.valueOf(sender.toUpperCase());
+        } catch (IllegalArgumentException e) {
+            return null;
+        }
+    }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatThreadConverter.java
similarity index 73%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatThreadConverter.java
index aa4c343..6931da2 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatThreadConverter.java
@@ -18,16 +18,18 @@
  */
 package org.apache.bigtop.manager.server.model.converter;
 
+import org.apache.bigtop.manager.dao.po.ChatThreadPO;
 import org.apache.bigtop.manager.server.config.MapStructSharedConfig;
-import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
-import org.apache.bigtop.manager.server.model.req.PlatformReq;
+import org.apache.bigtop.manager.server.model.vo.ChatThreadVO;
 
 import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
 import org.mapstruct.factory.Mappers;
 
 @Mapper(config = MapStructSharedConfig.class)
-public interface PlatformConverter {
-    PlatformConverter INSTANCE = Mappers.getMapper(PlatformConverter.class);
+public interface ChatThreadConverter {
+    ChatThreadConverter INSTANCE = 
Mappers.getMapper(ChatThreadConverter.class);
 
-    PlatformDTO fromReq2DTO(PlatformReq platformReq);
+    @Mapping(source = "id", target = "threadId")
+    ChatThreadVO fromPO2VO(ChatThreadPO platformAuthorizedPO);
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformAuthorizedConverter.java
similarity index 59%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformAuthorizedConverter.java
index aa4c343..2e3c87a 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformAuthorizedConverter.java
@@ -18,16 +18,22 @@
  */
 package org.apache.bigtop.manager.server.model.converter;
 
+import org.apache.bigtop.manager.dao.po.PlatformAuthorizedPO;
+import org.apache.bigtop.manager.dao.po.PlatformPO;
 import org.apache.bigtop.manager.server.config.MapStructSharedConfig;
-import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
-import org.apache.bigtop.manager.server.model.req.PlatformReq;
+import org.apache.bigtop.manager.server.model.vo.PlatformAuthorizedVO;
 
+import org.mapstruct.Context;
 import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
 import org.mapstruct.factory.Mappers;
 
 @Mapper(config = MapStructSharedConfig.class)
-public interface PlatformConverter {
-    PlatformConverter INSTANCE = Mappers.getMapper(PlatformConverter.class);
+public interface PlatformAuthorizedConverter {
+    PlatformAuthorizedConverter INSTANCE = 
Mappers.getMapper(PlatformAuthorizedConverter.class);
 
-    PlatformDTO fromReq2DTO(PlatformReq platformReq);
+    @Mapping(target = "platformId", source = "id")
+    @Mapping(target = "supportModels", expression = 
"java(platformPO.getSupportModels())")
+    @Mapping(target = "platformName", expression = 
"java(platformPO.getName())")
+    PlatformAuthorizedVO fromPO2VO(PlatformAuthorizedPO platformAuthorizedPO, 
@Context PlatformPO platformPO);
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
index aa4c343..85b6e15 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
@@ -18,16 +18,40 @@
  */
 package org.apache.bigtop.manager.server.model.converter;
 
+import org.apache.bigtop.manager.dao.po.PlatformPO;
 import org.apache.bigtop.manager.server.config.MapStructSharedConfig;
 import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
+import org.apache.bigtop.manager.server.model.req.AuthCredentialReq;
 import org.apache.bigtop.manager.server.model.req.PlatformReq;
+import org.apache.bigtop.manager.server.model.vo.PlatformVO;
 
+import org.mapstruct.AfterMapping;
 import org.mapstruct.Mapper;
+import org.mapstruct.MappingTarget;
 import org.mapstruct.factory.Mappers;
 
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 @Mapper(config = MapStructSharedConfig.class)
 public interface PlatformConverter {
     PlatformConverter INSTANCE = Mappers.getMapper(PlatformConverter.class);
 
     PlatformDTO fromReq2DTO(PlatformReq platformReq);
+
+    PlatformVO fromPO2VO(PlatformPO platformPO);
+
+    default Map<String, String> mapAuthCredentials(List<AuthCredentialReq> 
authCredentials) {
+        if (authCredentials == null) {
+            return null;
+        }
+        return authCredentials.stream()
+                .collect(Collectors.toMap(AuthCredentialReq::getKey, 
AuthCredentialReq::getValue));
+    }
+
+    @AfterMapping
+    default void afterMapping(@MappingTarget PlatformDTO platformDTO, 
PlatformReq platformReq) {
+        
platformDTO.setAuthCredentials(mapAuthCredentials(platformReq.getAuthCredentials()));
+    }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformAuthorizedDTO.java
similarity index 72%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformAuthorizedDTO.java
index e957f7a..da6cb1f 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformAuthorizedDTO.java
@@ -16,21 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.model.vo;
+package org.apache.bigtop.manager.server.model.dto;
 
 import lombok.Data;
 
-@Data
-public class PlatformAuthorizedVO {
-    private Long platformId;
+import java.util.Map;
 
+@Data
+public class PlatformAuthorizedDTO {
     private String platformName;
+    private String model;
+    private Map<String, String> credentials;
 
-    private String supportModels;
-
-    public PlatformAuthorizedVO(long platformId, String name, String models) {
-        this.platformId = platformId;
+    public PlatformAuthorizedDTO(String name, Map<String, String> 
credentialSet, String model) {
         this.platformName = name;
-        this.supportModels = models;
+        this.credentials = credentialSet;
+        this.model = model;
     }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
index f26245f..368bf2a 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
@@ -20,10 +20,10 @@ package org.apache.bigtop.manager.server.model.dto;
 
 import lombok.Data;
 
-import java.util.List;
+import java.util.Map;
 
 @Data
 public class PlatformDTO {
     private Long platformId;
-    private List<AuthCredentialDTO> authCredentials;
+    private Map<String, String> authCredentials;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatMessageVO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatMessageVO.java
index 981529b..da226da 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatMessageVO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatMessageVO.java
@@ -18,17 +18,19 @@
  */
 package org.apache.bigtop.manager.server.model.vo;
 
+import org.apache.bigtop.manager.ai.core.enums.MessageSender;
+
 import lombok.Data;
 
 @Data
 public class ChatMessageVO {
-    private String sender;
+    private MessageSender sender;
 
     private String message;
 
     private String createTime;
 
-    public ChatMessageVO(String sender, String messageText, String createTime) 
{
+    public ChatMessageVO(MessageSender sender, String messageText, String 
createTime) {
         this.sender = sender;
         this.message = messageText;
         this.createTime = createTime;
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
index 2349fdb..c5f84a9 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
@@ -39,4 +39,6 @@ public class ChatThreadVO {
         this.createTime = createTime;
         this.updateTime = createTime;
     }
+
+    public ChatThreadVO() {}
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthCredentialVO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthCredentialVO.java
index edfe0ff..7107422 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthCredentialVO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthCredentialVO.java
@@ -28,6 +28,6 @@ public class PlatformAuthCredentialVO {
 
     public PlatformAuthCredentialVO(String name, String displayName) {
         this.name = name;
-        this.displayName = name;
+        this.displayName = displayName;
     }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
index e957f7a..3532cf6 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
@@ -33,4 +33,6 @@ public class PlatformAuthorizedVO {
         this.platformName = name;
         this.supportModels = models;
     }
+
+    public PlatformAuthorizedVO() {}
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/AIChatService.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/AIChatService.java
index d3cf125..06042ba 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/AIChatService.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/AIChatService.java
@@ -34,15 +34,15 @@ public interface AIChatService {
 
     List<PlatformAuthorizedVO> authorizedPlatforms();
 
-    PlatformVO addAuthorizedPlatform(PlatformDTO platformDTO);
+    PlatformAuthorizedVO addAuthorizedPlatform(PlatformDTO platformDTO);
 
     List<PlatformAuthCredentialVO> platformsAuthCredential(Long platformId);
 
-    int deleteAuthorizedPlatform(Long platformId);
+    boolean deleteAuthorizedPlatform(Long platformId);
 
     ChatThreadVO createChatThreads(Long platformId, String model);
 
-    int deleteChatThreads(Long platformId, Long threadId);
+    boolean deleteChatThreads(Long platformId, Long threadId);
 
     List<ChatThreadVO> getAllChatThreads(Long platformId, String model);
 
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/AIChatServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/AIChatServiceImpl.java
index 6dca1bc..e047871 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/AIChatServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/AIChatServiceImpl.java
@@ -18,7 +18,29 @@
  */
 package org.apache.bigtop.manager.server.service.impl;
 
-import org.apache.bigtop.manager.common.utils.DateUtils;
+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.PersistentChatMemoryStore;
+import org.apache.bigtop.manager.ai.core.enums.MessageSender;
+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;
+import org.apache.bigtop.manager.dao.po.ChatMessagePO;
+import org.apache.bigtop.manager.dao.po.ChatThreadPO;
+import org.apache.bigtop.manager.dao.po.PlatformAuthorizedPO;
+import org.apache.bigtop.manager.dao.po.PlatformPO;
+import org.apache.bigtop.manager.dao.repository.ChatMessageDao;
+import org.apache.bigtop.manager.dao.repository.ChatThreadDao;
+import org.apache.bigtop.manager.dao.repository.PlatformAuthorizedDao;
+import org.apache.bigtop.manager.dao.repository.PlatformDao;
+import org.apache.bigtop.manager.server.enums.ApiExceptionEnum;
+import org.apache.bigtop.manager.server.exception.ApiException;
+import org.apache.bigtop.manager.server.holder.SessionUserHolder;
+import org.apache.bigtop.manager.server.model.converter.ChatMessageConverter;
+import org.apache.bigtop.manager.server.model.converter.ChatThreadConverter;
+import 
org.apache.bigtop.manager.server.model.converter.PlatformAuthorizedConverter;
+import org.apache.bigtop.manager.server.model.converter.PlatformConverter;
+import org.apache.bigtop.manager.server.model.dto.PlatformAuthorizedDTO;
 import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
 import org.apache.bigtop.manager.server.model.vo.ChatMessageVO;
 import org.apache.bigtop.manager.server.model.vo.ChatThreadVO;
@@ -27,153 +49,275 @@ import 
org.apache.bigtop.manager.server.model.vo.PlatformAuthorizedVO;
 import org.apache.bigtop.manager.server.model.vo.PlatformVO;
 import org.apache.bigtop.manager.server.service.AIChatService;
 
+import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
-import lombok.extern.slf4j.Slf4j;
+import reactor.core.publisher.Flux;
 
-import java.io.IOException;
+import jakarta.annotation.Resource;
 import java.util.ArrayList;
-import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
-import java.util.Random;
+import java.util.Map;
+import java.util.Objects;
 
-@Slf4j
 @Service
 public class AIChatServiceImpl implements AIChatService {
+    @Resource
+    private PlatformDao platformDao;
+
+    @Resource
+    private PlatformAuthorizedDao platformAuthorizedDao;
+
+    @Resource
+    private ChatThreadDao chatThreadDao;
+
+    @Resource
+    private ChatMessageDao chatMessageDao;
+
+    private AIAssistantFactory aiAssistantFactory;
+
+    private final AIAssistantFactory aiTestFactory = new 
GeneralAssistantFactory();
+
+    public AIAssistantFactory getAiAssistantFactory() {
+        if (aiAssistantFactory == null) {
+            aiAssistantFactory =
+                    new GeneralAssistantFactory(new 
PersistentChatMemoryStore(chatThreadDao, chatMessageDao));
+        }
+        return aiAssistantFactory;
+    }
+
+    private AIAssistantConfig getAIAssistantConfig(PlatformAuthorizedDTO 
platformAuthorizedDTO) {
+        return AIAssistantConfig.builder()
+                .setModel(platformAuthorizedDTO.getModel())
+                .addCredentials(platformAuthorizedDTO.getCredentials())
+                .build();
+    }
+
+    private PlatformType getPlatformType(String platformName) {
+        return PlatformType.getPlatformType(platformName.toLowerCase());
+    }
+
+    private AIAssistant buildAIAssistant(PlatformAuthorizedDTO 
platformAuthorizedDTO, Long threadId) {
+        return getAiAssistantFactory()
+                .create(
+                        
getPlatformType(platformAuthorizedDTO.getPlatformName()),
+                        getAIAssistantConfig(platformAuthorizedDTO),
+                        threadId);
+    }
+
+    private Boolean testAuthorization(PlatformAuthorizedDTO 
platformAuthorizedDTO) {
+        AIAssistant aiAssistant = aiTestFactory.create(
+                getPlatformType(platformAuthorizedDTO.getPlatformName()), 
getAIAssistantConfig(platformAuthorizedDTO));
+        try {
+            aiAssistant.ask("1+1=");
+        } catch (Exception e) {
+            throw new ApiException(ApiExceptionEnum.CREDIT_INCORRECT, 
e.getMessage());
+        }
+
+        return true;
+    }
+
     @Override
     public List<PlatformVO> platforms() {
+        List<PlatformPO> platformPOs = platformDao.findAll();
         List<PlatformVO> platforms = new ArrayList<>();
-        platforms.add(new PlatformVO(1L, "OpenAI", "GPT-3.5,GPT-4o"));
-        platforms.add(new PlatformVO(2L, "ChatGLM", "GPT-3.5,GPT-4o"));
+        for (PlatformPO platformPO : platformPOs) {
+            platforms.add(PlatformConverter.INSTANCE.fromPO2VO(platformPO));
+        }
         return platforms;
     }
 
     @Override
     public List<PlatformAuthorizedVO> authorizedPlatforms() {
         List<PlatformAuthorizedVO> authorizedPlatforms = new ArrayList<>();
-        authorizedPlatforms.add(new PlatformAuthorizedVO(1L, "OpenAI", 
"GPT-3.5,GPT-4o"));
-        authorizedPlatforms.add(new PlatformAuthorizedVO(2L, "ChatGLM", 
"GPT-4o"));
+        List<PlatformAuthorizedPO> authorizedPlatformPOs = 
platformAuthorizedDao.findAll();
+        for (PlatformAuthorizedPO authorizedPlatformPO : 
authorizedPlatformPOs) {
+            PlatformPO platformPO = 
platformDao.findById(authorizedPlatformPO.getPlatformId());
+            
authorizedPlatforms.add(PlatformAuthorizedConverter.INSTANCE.fromPO2VO(authorizedPlatformPO,
 platformPO));
+        }
+
         return authorizedPlatforms;
     }
 
     @Override
-    public PlatformVO addAuthorizedPlatform(PlatformDTO platformDTO) {
-        log.info("Adding authorized platform: {}", platformDTO);
-        log.info(platformDTO.getAuthCredentials().toString());
-        return new PlatformVO(1L, "OpenAI", "GPT-3.5,GPT-4o");
+    public PlatformAuthorizedVO addAuthorizedPlatform(PlatformDTO platformDTO) 
{
+        PlatformPO platformPO = 
platformDao.findByPlatformId(platformDTO.getPlatformId());
+        if (platformPO == null) {
+            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
+        }
+        Map<String, String> credentialSet = getStringMap(platformDTO, 
platformPO);
+        List<String> models = 
List.of(platformPO.getSupportModels().split(","));
+        if (models.isEmpty()) {
+            throw new ApiException(ApiExceptionEnum.MODEL_NOT_SUPPORTED);
+        }
+        PlatformAuthorizedDTO platformAuthorizedDTO =
+                new PlatformAuthorizedDTO(platformPO.getName(), credentialSet, 
models.get(0));
+
+        if (!testAuthorization(platformAuthorizedDTO)) {
+            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
+        }
+
+        PlatformAuthorizedPO platformAuthorizedPO = new PlatformAuthorizedPO();
+        platformAuthorizedPO.setCredentials(credentialSet);
+        platformAuthorizedPO.setPlatformId(platformPO.getId());
+
+        platformAuthorizedDao.saveWithCredentials(platformAuthorizedPO);
+        PlatformAuthorizedVO platformAuthorizedVO =
+                
PlatformAuthorizedConverter.INSTANCE.fromPO2VO(platformAuthorizedPO, 
platformPO);
+        platformAuthorizedVO.setSupportModels(platformPO.getSupportModels());
+        platformAuthorizedVO.setPlatformName(platformPO.getName());
+        return platformAuthorizedVO;
+    }
+
+    private static @NotNull Map<String, String> getStringMap(PlatformDTO 
platformDTO, PlatformPO platformPO) {
+        if (platformPO == null) {
+            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
+        }
+        Map<String, String> credentialNeed = platformPO.getCredential();
+        Map<String, String> credentialGet = platformDTO.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 List<PlatformAuthCredentialVO> platformsAuthCredential(Long 
platformId) {
-        List<PlatformAuthCredentialVO> platformAuthCredentials = new 
ArrayList<>();
-        platformAuthCredentials.add(new PlatformAuthCredentialVO("api-key", 
"API Key"));
-        platformAuthCredentials.add(new PlatformAuthCredentialVO("api-secret", 
"API Secret"));
-        return platformAuthCredentials;
+        PlatformPO platformPO = platformDao.findByPlatformId(platformId);
+        if (platformPO == null) {
+            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
+        }
+        List<PlatformAuthCredentialVO> platformAuthCredentialVOs = new 
ArrayList<>();
+        for (String key : platformPO.getCredential().keySet()) {
+            PlatformAuthCredentialVO platformAuthCredentialVO =
+                    new PlatformAuthCredentialVO(key, 
platformPO.getCredential().get(key));
+            platformAuthCredentialVOs.add(platformAuthCredentialVO);
+        }
+        return platformAuthCredentialVOs;
     }
 
     @Override
-    public int deleteAuthorizedPlatform(Long platformId) {
-        Random random = new Random();
-        int randomInt = random.nextInt();
-        return randomInt % 2;
+    public boolean deleteAuthorizedPlatform(Long platformId) {
+        List<PlatformAuthorizedPO> authorizedPlatformPOs = 
platformAuthorizedDao.findAll();
+        for (PlatformAuthorizedPO authorizedPlatformPO : 
authorizedPlatformPOs) {
+            if (authorizedPlatformPO.getId().equals(platformId)) {
+                platformAuthorizedDao.deleteById(authorizedPlatformPO.getId());
+                return true;
+            }
+        }
+
+        throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
     }
 
     @Override
     public ChatThreadVO createChatThreads(Long platformId, String model) {
-
-        return new ChatThreadVO(1L, platformId, model, DateUtils.format(new 
Date()));
+        PlatformAuthorizedPO platformAuthorizedPO = 
platformAuthorizedDao.findByPlatformId(platformId);
+        if (platformAuthorizedPO == null) {
+            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
+        }
+        Long userId = SessionUserHolder.getUserId();
+        PlatformPO platformPO = 
platformDao.findByPlatformId(platformAuthorizedPO.getPlatformId());
+        List<String> supportModels = 
List.of(platformPO.getSupportModels().split(","));
+        if (!supportModels.contains(model)) {
+            throw new ApiException(ApiExceptionEnum.MODEL_NOT_SUPPORTED);
+        }
+        ChatThreadPO chatThreadPO = new ChatThreadPO();
+        chatThreadPO.setUserId(userId);
+        chatThreadPO.setModel(model);
+        chatThreadPO.setPlatformId(platformAuthorizedPO.getId());
+        chatThreadDao.save(chatThreadPO);
+        return ChatThreadConverter.INSTANCE.fromPO2VO(chatThreadPO);
     }
 
     @Override
-    public int deleteChatThreads(Long platformId, Long threadId) {
-        Random random = new Random();
-        int randomInt = random.nextInt();
-        return randomInt % 2;
+    public boolean deleteChatThreads(Long platformId, Long threadId) {
+        Long userId = SessionUserHolder.getUserId();
+        List<ChatThreadPO> chatThreadPOS = 
chatThreadDao.findAllByUserId(userId);
+        for (ChatThreadPO chatThreadPO : chatThreadPOS) {
+            if (chatThreadPO.getId().equals(threadId)
+                    && chatThreadPO.getPlatformId().equals(platformId)) {
+                chatThreadDao.deleteById(threadId);
+                return true;
+            }
+        }
+        throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
     }
 
     @Override
     public List<ChatThreadVO> getAllChatThreads(Long platformId, String model) 
{
+        Long userId = SessionUserHolder.getUserId();
+        List<ChatThreadPO> chatThreadPOS = 
chatThreadDao.findAllByPlatformAuthorizedIdAndUserId(platformId, userId);
         List<ChatThreadVO> chatThreads = new ArrayList<>();
-        if (model.equals("GPT-3.5")) {
-            ChatThreadVO chatThreadVO = new ChatThreadVO(1L, platformId, 
"GPT-3.5", DateUtils.format(new Date()));
-            chatThreads.add(chatThreadVO);
-            ChatThreadVO chatThreadVO2 = new ChatThreadVO(3L, platformId, 
"GPT-3.5", DateUtils.format(new Date()));
-            chatThreads.add(chatThreadVO2);
-        }
-        if (model.equals("GPT-4o")) {
-            ChatThreadVO chatThreadVO = new ChatThreadVO(2L, platformId, 
"GPT-4o", DateUtils.format(new Date()));
-            chatThreads.add(chatThreadVO);
+        for (ChatThreadPO chatThreadPO : chatThreadPOS) {
+            ChatThreadVO chatThreadVO = 
ChatThreadConverter.INSTANCE.fromPO2VO(chatThreadPO);
+            if (chatThreadVO.getModel().equals(model)) {
+                chatThreads.add(chatThreadVO);
+            }
         }
         return chatThreads;
     }
 
     @Override
     public SseEmitter talk(Long platformId, Long threadId, String message) {
-        String fullMessage = "Don't ask me" + message;
-        fullMessage +=
-                """
-                I won't tell you Bigtop Manager provides a modern, 
low-threshold web application to simplify \
-                the deployment and management of components for Bigtop, 
similar to Apache Ambari and Cloudera \
-                Manager.
-                And Bigtop Manager provides a modern, low-threshold web 
application to simplify \
-                the deployment and management of components for Bigtop, 
similar to Apache Ambari and Cloudera \
-                Manager.
-                """;
-
-        SseEmitter emitter = new SseEmitter();
-        Random random = new Random();
+        ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
+        Long userId = SessionUserHolder.getUserId();
+        if (chatThreadPO == null || !Objects.equals(userId, 
chatThreadPO.getUserId())) {
+            throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
+        }
+        PlatformAuthorizedPO platformAuthorizedPO = 
platformAuthorizedDao.findByPlatformId(platformId);
+        if (platformAuthorizedPO == null) {
+            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
+        }
 
-        try {
-            StringBuilder remainingMessage = new StringBuilder(fullMessage);
+        PlatformPO platformPO = 
platformDao.findById(platformAuthorizedPO.getPlatformId());
+        PlatformAuthorizedDTO platformAuthorizedDTO = new 
PlatformAuthorizedDTO(
+                platformPO.getName(), platformAuthorizedPO.getCredentials(), 
chatThreadPO.getModel());
+        AIAssistant aiAssistant = buildAIAssistant(platformAuthorizedDTO, 
chatThreadPO.getId());
+        Flux<String> stringFlux = aiAssistant.streamAsk(message);
 
-            while (!remainingMessage.isEmpty()) {
-                int charsToSend = random.nextInt(21);
-                // 2% probability of simulated transmission failure
-                if (random.nextInt(50) == 2) {
+        SseEmitter emitter = new SseEmitter();
+        stringFlux.subscribe(
+                s -> {
                     try {
-                        
emitter.send(SseEmitter.event().name("error").data("broken pipe"));
-                    } catch (IOException e) {
+                        emitter.send(s);
+                    } catch (Exception e) {
                         emitter.completeWithError(e);
                     }
-                    emitter.complete();
-                    return emitter;
-                }
-                charsToSend = Math.min(charsToSend, remainingMessage.length());
-
-                String part = remainingMessage.substring(0, charsToSend);
-                remainingMessage.delete(0, charsToSend);
-
-                emitter.send(SseEmitter.event().name("message").data(part));
-
-                int delay = random.nextInt(101);
-                Thread.sleep(delay);
-            }
-        } catch (IOException | InterruptedException e) {
-            emitter.completeWithError(e);
-            throw new RuntimeException(e);
-        }
+                },
+                Throwable::printStackTrace,
+                emitter::complete);
 
-        emitter.complete();
+        emitter.onTimeout(emitter::complete);
         return emitter;
     }
 
     @Override
     public List<ChatMessageVO> history(Long platformId, Long threadId) {
         List<ChatMessageVO> chatMessages = new ArrayList<>();
-        Random random = new Random();
-        int numberOfMessages = random.nextInt(11);
-        boolean isUser = true;
-
-        for (int i = 0; i < numberOfMessages; i++) {
-            String sender = isUser ? "user" : "AI";
-            String messageText = isUser ? "hello" : "hello, I'm GPT";
-            messageText += i;
-
-            ChatMessageVO message = new ChatMessageVO(sender, messageText, 
DateUtils.format(new Date()));
-            chatMessages.add(message);
-
-            isUser = !isUser;
+        ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
+        if (chatThreadPO == null) {
+            throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
+        }
+        Long userId = SessionUserHolder.getUserId();
+        if (!chatThreadPO.getUserId().equals(userId)) {
+            throw new ApiException(ApiExceptionEnum.PERMISSION_DENIED);
+        }
+        List<ChatMessagePO> chatMessagePOs = 
chatMessageDao.findAllByThreadId(threadId);
+        for (ChatMessagePO chatMessagePO : chatMessagePOs) {
+            ChatMessageVO chatMessageVO = 
ChatMessageConverter.INSTANCE.fromPO2VO(chatMessagePO);
+            MessageSender sender = chatMessageVO.getSender();
+            if (sender == null) {
+                continue;
+            }
+            if (sender.equals(MessageSender.USER) || 
sender.equals(MessageSender.AI)) {
+                chatMessages.add(chatMessageVO);
+            }
         }
         return chatMessages;
     }
diff --git a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql 
b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
index 94a4ab5..23d3846 100644
--- a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
+++ b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
@@ -310,6 +310,66 @@ CREATE TABLE `stage`
     KEY              `idx_job_id` (`job_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
+CREATE TABLE `llm_platform`
+(
+    `id`             BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
+    `name`           VARCHAR(255)        NOT NULL,
+    `credential`     JSON                DEFAULT NULL,
+    `support_models` VARCHAR(255)        DEFAULT NULL,
+    `create_time`    DATETIME            DEFAULT CURRENT_TIMESTAMP,
+    `update_time`    DATETIME            DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
+    `create_by`      BIGINT              DEFAULT NULL,
+    `update_by`      BIGINT              DEFAULT NULL,
+    PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE `llm_platform_authorized`
+(
+    `id`          BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
+    `platform_id` BIGINT(20) UNSIGNED NOT NULL,
+    `credentials` JSON                NOT NULL,
+    `create_time` DATETIME            DEFAULT CURRENT_TIMESTAMP,
+    `update_time` DATETIME            DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
+    `create_by`   BIGINT              DEFAULT NULL,
+    `update_by`   BIGINT              DEFAULT NULL,
+    PRIMARY KEY (`id`),
+    KEY `idx_platform_id` (`platform_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE `llm_chat_thread`
+(
+    `id`          BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
+    `platform_id` BIGINT(20) UNSIGNED NOT NULL,
+    `user_id`     BIGINT(20) UNSIGNED NOT NULL,
+    `model`       VARCHAR(255)        NOT NULL,
+    `create_time` DATETIME            DEFAULT CURRENT_TIMESTAMP,
+    `update_time` DATETIME            DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
+    `create_by`   BIGINT              DEFAULT NULL,
+    `update_by`   BIGINT              DEFAULT NULL,
+    PRIMARY KEY (`id`),
+    KEY             `idx_platform_id` (`platform_id`),
+    KEY             `idx_user_id` (`user_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE `llm_chat_message`
+(
+    `id`          BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
+    `thread_id`   BIGINT(20) UNSIGNED NOT NULL,
+    `user_id`     BIGINT(20) UNSIGNED NOT NULL,
+    `message`     TEXT                NOT NULL,
+    `sender`      VARCHAR(50)         NOT NULL,
+    `create_time` DATETIME            DEFAULT CURRENT_TIMESTAMP,
+    `update_time` DATETIME            DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
+    PRIMARY KEY (`id`),
+    KEY              `idx_thread_id` (`thread_id`),
+    KEY              `idx_user_id` (`user_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
 -- Adding default admin user
 INSERT INTO bigtop_manager.user (id, create_time, update_time, nickname, 
password, status, username)
-VALUES (1, now(), now(), 'Administrator', '21232f297a57a5a743894a0e4a801fc3', 
true, 'admin');
\ No newline at end of file
+VALUES (1, now(), now(), 'Administrator', '21232f297a57a5a743894a0e4a801fc3', 
true, 'admin');
+
+-- Adding default ai chat platform
+INSERT INTO bigtop_manager.llm_platform (id,credential,NAME,support_models)
+VALUES
+(1,'{"apiKey": "API 
Key"}','OpenAI','gpt-3.5-turbo,gpt-4,gpt-4o,gpt-3.5-turbo-16k,gpt-4-turbo-preview,gpt-4-32k,gpt-4o-mini');
\ No newline at end of file
diff --git 
a/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties 
b/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties
index 5ae40e7..051df6d 100644
--- a/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties
+++ b/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties
@@ -50,3 +50,10 @@ config.not.found=Config not exist
 
 command.not.found=Command not found for level [{0}]
 command.not.supported=Command [{0}] not supported for level [{1}]
+
+platform.not.found=platform not found
+platform.not.authorized=platform not authorized
+permission.denied=permission denied
+credit.incorrect=credit incorrect
+model.not.supported=model not supported
+chat.thread.not.found=chat thread not found
diff --git 
a/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties 
b/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties
index a45ff71..e4c647f 100644
--- a/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties
+++ b/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties
@@ -50,3 +50,10 @@ config.not.found=配置不存在
 
 command.not.found=不存在 [{0}] 级别的命令
 command.not.supported=[{0}] 命令在 [{1}] 级别下不支持
+
+platform.not.found=平台不存在
+platform.not.authorized=平台未配置
+permission.denied=权限被拒绝
+credit.incorrect=凭证不正确
+model.not.supported=模型不支持
+chat.thread.not.found=线程不存在
diff --git 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/AIChatControllerTest.java
 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/AIChatControllerTest.java
index e271b6d..5c434c4 100644
--- 
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/AIChatControllerTest.java
+++ 
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/AIChatControllerTest.java
@@ -18,6 +18,12 @@
  */
 package org.apache.bigtop.manager.server.controller;
 
+import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
+import org.apache.bigtop.manager.server.model.req.PlatformReq;
+import org.apache.bigtop.manager.server.model.vo.ChatMessageVO;
+import org.apache.bigtop.manager.server.model.vo.ChatThreadVO;
+import org.apache.bigtop.manager.server.model.vo.PlatformAuthCredentialVO;
+import org.apache.bigtop.manager.server.model.vo.PlatformAuthorizedVO;
 import org.apache.bigtop.manager.server.model.vo.PlatformVO;
 import org.apache.bigtop.manager.server.service.AIChatService;
 import org.apache.bigtop.manager.server.utils.MessageSourceUtils;
@@ -32,12 +38,15 @@ import org.mockito.Mock;
 import org.mockito.MockedStatic;
 import org.mockito.Mockito;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
 import java.util.ArrayList;
 import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.when;
 
 @ExtendWith(MockitoExtension.class)
@@ -64,14 +73,128 @@ class AIChatControllerTest {
 
     @Test
     void getAllPlatforms() {
-
         List<PlatformVO> platforms = new ArrayList<>();
         when(chatService.platforms()).thenReturn(platforms);
 
         ResponseEntity<List<PlatformVO>> response = chatController.platforms();
 
+        assertTrue(response.isSuccess());
         assertEquals(platforms, response.getData());
     }
 
-    // TODO
+    @Test
+    void getAuthorizedPlatforms() {
+        List<PlatformAuthorizedVO> authorizedPlatforms = new ArrayList<>();
+        
when(chatService.authorizedPlatforms()).thenReturn(authorizedPlatforms);
+
+        ResponseEntity<List<PlatformAuthorizedVO>> response = 
chatController.authorizedPlatforms();
+
+        assertTrue(response.isSuccess());
+        assertEquals(authorizedPlatforms, response.getData());
+    }
+
+    @Test
+    void platformsAuthCredential() {
+        Long platformId = 1L;
+        List<PlatformAuthCredentialVO> credentials = new ArrayList<>();
+        
when(chatService.platformsAuthCredential(platformId)).thenReturn(credentials);
+
+        ResponseEntity<List<PlatformAuthCredentialVO>> response = 
chatController.platformsAuthCredential(platformId);
+
+        assertTrue(response.isSuccess());
+        assertEquals(credentials, response.getData());
+    }
+
+    @Test
+    void addAuthorizedPlatform() {
+        PlatformReq platformReq = new PlatformReq();
+        PlatformAuthorizedVO authorizedVO = new PlatformAuthorizedVO();
+
+        
when(chatService.addAuthorizedPlatform(any(PlatformDTO.class))).thenReturn(authorizedVO);
+
+        ResponseEntity<PlatformAuthorizedVO> response = 
chatController.addAuthorizedPlatform(platformReq);
+
+        assertTrue(response.isSuccess());
+        assertEquals(authorizedVO, response.getData());
+    }
+
+    @Test
+    void deleteAuthorizedPlatform() {
+        Long platformId = 1L;
+        
when(chatService.deleteAuthorizedPlatform(platformId)).thenReturn(true);
+
+        ResponseEntity<Boolean> response = 
chatController.deleteAuthorizedPlatform(platformId);
+
+        assertTrue(response.isSuccess());
+        assertEquals(true, response.getData());
+    }
+
+    @Test
+    void createChatThreads() {
+        Long platformId = 1L;
+        String model = "model1";
+        ChatThreadVO chatThread = new ChatThreadVO();
+
+        when(chatService.createChatThreads(eq(platformId), 
eq(model))).thenReturn(chatThread);
+
+        ResponseEntity<ChatThreadVO> response = 
chatController.createChatThreads(platformId, model);
+
+        assertTrue(response.isSuccess());
+        assertEquals(chatThread, response.getData());
+    }
+
+    @Test
+    void deleteChatThreads() {
+        Long platformId = 1L;
+        Long threadId = 1L;
+
+        when(chatService.deleteChatThreads(platformId, 
threadId)).thenReturn(true);
+
+        ResponseEntity<Boolean> response = 
chatController.deleteChatThreads(platformId, threadId);
+
+        assertTrue(response.isSuccess());
+        assertEquals(true, response.getData());
+    }
+
+    @Test
+    void getAllChatThreads() {
+        Long platformId = 1L;
+        String model = "model1";
+        List<ChatThreadVO> chatThreads = new ArrayList<>();
+
+        when(chatService.getAllChatThreads(eq(platformId), 
eq(model))).thenReturn(chatThreads);
+
+        ResponseEntity<List<ChatThreadVO>> response = 
chatController.getAllChatThreads(platformId, model);
+
+        assertTrue(response.isSuccess());
+        assertEquals(chatThreads, response.getData());
+    }
+
+    @Test
+    void talk() {
+        Long platformId = 1L;
+        Long threadId = 1L;
+        String message = "Hello";
+
+        SseEmitter emitter = new SseEmitter();
+        when(chatService.talk(eq(platformId), eq(threadId), 
eq(message))).thenReturn(emitter);
+
+        SseEmitter result = chatController.talk(platformId, threadId, message);
+
+        assertEquals(emitter, result);
+    }
+
+    @Test
+    void history() {
+        Long platformId = 1L;
+        Long threadId = 1L;
+        List<ChatMessageVO> history = new ArrayList<>();
+
+        when(chatService.history(platformId, threadId)).thenReturn(history);
+
+        ResponseEntity<List<ChatMessageVO>> response = 
chatController.history(platformId, threadId);
+
+        assertTrue(response.isSuccess());
+        assertEquals(history, response.getData());
+    }
 }

Reply via email to