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 17997478 BIGTOP-4284: Refactor AIAssistant with AIService (#110)
17997478 is described below

commit 17997478d0b8704b1617b5b39db11ceda7507331
Author: haopeng <[email protected]>
AuthorDate: Tue Nov 26 11:42:30 2024 +0800

    BIGTOP-4284: Refactor AIAssistant with AIService (#110)
---
 .../bigtop-manager-ai-assistant/pom.xml            | 10 ++++
 .../ai/assistant/GeneralAssistantFactory.java      | 48 ++++++++---------
 .../provider/LocSystemPromptProvider.java          | 10 ++++
 .../assistant/store/ChatMemoryStoreProvider.java   | 46 +++++++++++++++++
 .../assistant/store/PersistentChatMemoryStore.java | 31 +++++------
 .../ai/assistant/GeneralAssistantFactoryTest.java  | 23 +++------
 .../store/PersistentChatMemoryStoreTest.java       |  4 --
 .../manager/ai/core/AbstractAIAssistant.java       | 60 +++++++---------------
 .../manager/ai/core/factory/AIAssistant.java       | 17 +++---
 .../ai/core/factory/AIAssistantFactory.java        | 15 ++++--
 .../ai/core/provider/SystemPromptProvider.java     |  4 ++
 .../bigtop-manager-ai-dashscope/pom.xml            |  5 ++
 .../manager/ai/dashscope/DashScopeAssistant.java   | 34 ++++++------
 .../manager/ai/dashscope/DashScopeToolBox.java     | 42 ---------------
 .../bigtop/manager/ai/openai/OpenAIAssistant.java  | 28 +++++-----
 .../bigtop/manager/ai/openai/OpenAIToolBox.java    | 42 ---------------
 .../manager/ai/qianfan/QianFanAssistant.java       | 40 ++++++---------
 .../bigtop/manager/ai/qianfan/QianFanToolBox.java  | 42 ---------------
 bigtop-manager-bom/pom.xml                         |  5 ++
 .../server/service/impl/ChatbotServiceImpl.java    | 31 +++++------
 .../server/service/impl/LLMConfigServiceImpl.java  |  4 +-
 21 files changed, 233 insertions(+), 308 deletions(-)

diff --git a/bigtop-manager-ai/bigtop-manager-ai-assistant/pom.xml 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/pom.xml
index 70bb2036..b04e793e 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-assistant/pom.xml
+++ b/bigtop-manager-ai/bigtop-manager-ai-assistant/pom.xml
@@ -42,6 +42,12 @@
         <dependency>
             <groupId>org.apache.bigtop</groupId>
             <artifactId>bigtop-manager-ai-dashscope</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-simple</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.apache.bigtop</groupId>
@@ -51,6 +57,10 @@
             <groupId>org.apache.bigtop</groupId>
             <artifactId>bigtop-manager-dao</artifactId>
         </dependency>
+        <dependency>
+            <groupId>dev.langchain4j</groupId>
+            <artifactId>langchain4j-reactor</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 1169fa75..fadd3732 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
@@ -19,35 +19,35 @@
 package org.apache.bigtop.manager.ai.assistant;
 
 import org.apache.bigtop.manager.ai.assistant.provider.LocSystemPromptProvider;
-import org.apache.bigtop.manager.ai.assistant.store.PersistentChatMemoryStore;
+import org.apache.bigtop.manager.ai.assistant.store.ChatMemoryStoreProvider;
 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.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.dashscope.DashScopeAssistant;
 import org.apache.bigtop.manager.ai.openai.OpenAIAssistant;
 import org.apache.bigtop.manager.ai.qianfan.QianFanAssistant;
 
-import org.apache.commons.lang3.NotImplementedException;
-
-import dev.langchain4j.store.memory.chat.ChatMemoryStore;
+import dev.langchain4j.service.tool.ToolProvider;
 import dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore;
 
+import java.util.List;
+
 public class GeneralAssistantFactory extends AbstractAIAssistantFactory {
 
     private final SystemPromptProvider systemPromptProvider;
-    private final ChatMemoryStore chatMemoryStore;
+    private final ChatMemoryStoreProvider chatMemoryStoreProvider;
 
-    public GeneralAssistantFactory(ChatMemoryStore chatMemoryStore) {
-        this(new LocSystemPromptProvider(), chatMemoryStore);
+    public GeneralAssistantFactory(ChatMemoryStoreProvider 
chatMemoryStoreProvider) {
+        this(new LocSystemPromptProvider(), chatMemoryStoreProvider);
     }
 
-    public GeneralAssistantFactory(SystemPromptProvider systemPromptProvider, 
ChatMemoryStore chatMemoryStore) {
+    public GeneralAssistantFactory(
+            SystemPromptProvider systemPromptProvider, ChatMemoryStoreProvider 
chatMemoryStoreProvider) {
         this.systemPromptProvider = systemPromptProvider;
-        this.chatMemoryStore = chatMemoryStore;
+        this.chatMemoryStoreProvider = chatMemoryStoreProvider;
     }
 
     @Override
@@ -55,37 +55,37 @@ public class GeneralAssistantFactory extends 
AbstractAIAssistantFactory {
             PlatformType platformType,
             AIAssistantConfigProvider assistantConfig,
             Object id,
-            SystemPrompt systemPrompts) {
+            ToolProvider toolProvider,
+            SystemPrompt systemPrompt) {
         AIAssistant.Builder builder =
                 switch (platformType) {
                     case OPENAI -> OpenAIAssistant.builder();
                     case DASH_SCOPE -> DashScopeAssistant.builder();
                     case QIANFAN -> QianFanAssistant.builder();
                 };
-        AIAssistant aiAssistant = builder.id(id)
+        builder = builder.id(id)
                 .memoryStore(
                         (id == null)
                                 ? new InMemoryChatMemoryStore()
-                                : ((PersistentChatMemoryStore) 
chatMemoryStore).clone())
+                                : 
chatMemoryStoreProvider.createPersistentChatMemoryStore())
                 .withConfigProvider(assistantConfig)
-                .build();
+                .withToolProvider(toolProvider);
 
-        String systemPrompt = 
systemPromptProvider.getSystemMessage(systemPrompts);
-        aiAssistant.setSystemPrompt(systemPrompt);
+        List<String> systemPrompts = new java.util.ArrayList<>();
+        systemPrompts.add(systemPromptProvider.getSystemMessage(systemPrompt));
         String locale = assistantConfig.getLanguage();
         if (locale != null) {
-            
aiAssistant.setSystemPrompt(systemPromptProvider.getLanguagePrompt(locale));
+            systemPrompts.add(systemPromptProvider.getLanguagePrompt(locale));
         }
-        return aiAssistant;
-    }
 
-    @Override
-    public AIAssistant create(PlatformType platformType, 
AIAssistantConfigProvider assistantConfig, Object id) {
-        return createWithPrompt(platformType, assistantConfig, id, 
SystemPrompt.DEFAULT_PROMPT);
+        
builder.withSystemPrompt(systemPromptProvider.getSystemMessages(systemPrompts));
+
+        return builder.build();
     }
 
     @Override
-    public ToolBox createToolBox(PlatformType platformType) {
-        throw new NotImplementedException("ToolBox is not implemented for 
GeneralAssistantFactory");
+    public AIAssistant createAiService(
+            PlatformType platformType, AIAssistantConfigProvider 
assistantConfig, Long id, ToolProvider toolProvider) {
+        return createWithPrompt(platformType, assistantConfig, id, 
toolProvider, SystemPrompt.DEFAULT_PROMPT);
     }
 }
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 33e16e7d..a3cb9894 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
@@ -29,6 +29,7 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
+import java.util.List;
 import java.util.Objects;
 
 @Slf4j
@@ -82,4 +83,13 @@ public class LocSystemPromptProvider implements 
SystemPromptProvider {
             return text;
         }
     }
+
+    @Override
+    public String getSystemMessages(List<String> systemPrompts) {
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int i = 0; i < systemPrompts.size(); i++) {
+            stringBuilder.append(String.format("prompt%d: %s\n", i + 1, 
systemPrompts.get(i)));
+        }
+        return stringBuilder.toString();
+    }
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/ChatMemoryStoreProvider.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/ChatMemoryStoreProvider.java
new file mode 100644
index 00000000..90e24e6c
--- /dev/null
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/ChatMemoryStoreProvider.java
@@ -0,0 +1,46 @@
+/*
+ * 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.dao.repository.ChatMessageDao;
+import org.apache.bigtop.manager.dao.repository.ChatThreadDao;
+
+import dev.langchain4j.store.memory.chat.ChatMemoryStore;
+import dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore;
+
+public class ChatMemoryStoreProvider {
+    private final ChatThreadDao chatThreadDao;
+    private final ChatMessageDao chatMessageDao;
+
+    public ChatMemoryStoreProvider(ChatThreadDao chatThreadDao, ChatMessageDao 
chatMessageDao) {
+        this.chatThreadDao = chatThreadDao;
+        this.chatMessageDao = chatMessageDao;
+    }
+
+    public ChatMemoryStoreProvider() {
+        this(null, null);
+    }
+
+    public ChatMemoryStore createPersistentChatMemoryStore() {
+        if (chatThreadDao == null || chatMessageDao == null) {
+            return new InMemoryChatMemoryStore();
+        }
+        return new PersistentChatMemoryStore(chatThreadDao, chatMessageDao);
+    }
+}
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
index 4c3ee255..8bc3e980 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
@@ -27,20 +27,22 @@ 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 lombok.extern.slf4j.Slf4j;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
 
+@Slf4j
 public class PersistentChatMemoryStore implements ChatMemoryStore {
 
-    private final ChatThreadDao chatThreadDao;
-    private final ChatMessageDao chatMessageDao;
-
-    private final List<ChatMessage> systemMessages = new ArrayList<>();
+    private final Map<Object, List<ChatMessage>> messagesByMemoryId = new 
ConcurrentHashMap<>();
+    protected final ChatThreadDao chatThreadDao;
+    protected final ChatMessageDao chatMessageDao;
 
     public PersistentChatMemoryStore(ChatThreadDao chatThreadDao, 
ChatMessageDao chatMessageDao) {
         this.chatThreadDao = chatThreadDao;
@@ -63,6 +65,9 @@ public class PersistentChatMemoryStore implements 
ChatMemoryStore {
         if (chatMessage.type().equals(ChatMessageType.AI)) {
             chatMessagePO.setSender(MessageType.AI.getValue());
             AiMessage aiMessage = (AiMessage) chatMessage;
+            if (aiMessage.text() == null) {
+                return null;
+            }
             chatMessagePO.setMessage(aiMessage.text());
         } else if (chatMessage.type().equals(ChatMessageType.USER)) {
             chatMessagePO.setSender(MessageType.USER.getValue());
@@ -79,25 +84,25 @@ public class PersistentChatMemoryStore implements 
ChatMemoryStore {
 
     @Override
     public List<ChatMessage> getMessages(Object threadId) {
+        List<ChatMessage> messages = this.messagesByMemoryId.get(threadId);
         List<ChatMessagePO> chatMessages = 
chatMessageDao.findAllByThreadId((Long) threadId);
-        List<ChatMessage> allChatMessages = new ArrayList<>(systemMessages);
+        List<ChatMessage> allChatMessages = new ArrayList<>();
         if (!chatMessages.isEmpty()) {
             allChatMessages.addAll(chatMessages.stream()
                     .map(this::convertToChatMessage)
                     .filter(Objects::nonNull)
                     .toList());
         }
+        if (messages != null) {
+            allChatMessages.addAll(messages);
+        }
         return allChatMessages;
     }
 
     @Override
     public void updateMessages(Object threadId, List<ChatMessage> messages) {
+        this.messagesByMemoryId.put(threadId, messages);
         ChatMessage newMessage = messages.get(messages.size() - 1);
-        if (newMessage.type().equals(ChatMessageType.SYSTEM)) {
-            SystemMessage systemMessage = (SystemMessage) newMessage;
-            systemMessages.add(systemMessage);
-            return;
-        }
         ChatMessagePO chatMessagePO = convertToChatMessagePO(newMessage, 
(Long) threadId);
         if (chatMessagePO == null) {
             return;
@@ -111,8 +116,4 @@ public class PersistentChatMemoryStore implements 
ChatMemoryStore {
         chatMessagePOS.forEach(chatMessage -> chatMessage.setIsDeleted(true));
         chatMessageDao.partialUpdateByIds(chatMessagePOS);
     }
-
-    public PersistentChatMemoryStore clone() {
-        return new PersistentChatMemoryStore(chatThreadDao, chatMessageDao);
-    }
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactoryTest.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactoryTest.java
index 9b7af8a5..0a559b44 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactoryTest.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactoryTest.java
@@ -18,15 +18,13 @@
  */
 package org.apache.bigtop.manager.ai.assistant;
 
-import org.apache.bigtop.manager.ai.assistant.store.PersistentChatMemoryStore;
+import org.apache.bigtop.manager.ai.assistant.store.ChatMemoryStoreProvider;
 import org.apache.bigtop.manager.ai.core.enums.PlatformType;
 import org.apache.bigtop.manager.ai.core.factory.AIAssistant;
 import org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
 import org.apache.bigtop.manager.ai.core.provider.SystemPromptProvider;
 import org.apache.bigtop.manager.ai.openai.OpenAIAssistant;
 
-import org.apache.commons.lang3.NotImplementedException;
-
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
@@ -34,12 +32,8 @@ import org.mockito.Mock;
 import org.mockito.MockedStatic;
 import org.mockito.MockitoAnnotations;
 
-import dev.langchain4j.store.memory.chat.ChatMemoryStore;
-
 import java.util.Map;
-import java.util.UUID;
 
-import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockStatic;
@@ -50,9 +44,6 @@ class GeneralAssistantFactoryTest {
     @Mock
     private SystemPromptProvider systemPromptProvider;
 
-    @Mock
-    private ChatMemoryStore chatMemoryStore;
-
     @Mock
     private AIAssistantConfigProvider assistantConfigProvider;
 
@@ -62,8 +53,7 @@ class GeneralAssistantFactoryTest {
     @BeforeEach
     void setUp() {
         MockitoAnnotations.openMocks(this);
-        chatMemoryStore = new PersistentChatMemoryStore(null, null);
-        generalAssistantFactory = new 
GeneralAssistantFactory(systemPromptProvider, chatMemoryStore);
+        generalAssistantFactory = new 
GeneralAssistantFactory(systemPromptProvider, new ChatMemoryStoreProvider());
         Map<String, String> credentials = Map.of("apiKey", "123456");
         when(assistantConfigProvider.getModel()).thenReturn("model");
         when(assistantConfigProvider.getCredentials()).thenReturn(credentials);
@@ -77,6 +67,8 @@ class GeneralAssistantFactoryTest {
         when(mockBuilder.id(any())).thenReturn(mockBuilder);
         when(mockBuilder.memoryStore(any())).thenReturn(mockBuilder);
         when(mockBuilder.withConfigProvider(any())).thenReturn(mockBuilder);
+        when(mockBuilder.withToolProvider(any())).thenReturn(mockBuilder);
+        when(mockBuilder.withSystemPrompt(any())).thenReturn(mockBuilder);
         when(mockBuilder.build()).thenReturn(mock(AIAssistant.class));
 
         try (MockedStatic<OpenAIAssistant> openAIAssistantMockedStatic = 
mockStatic(OpenAIAssistant.class)) {
@@ -84,11 +76,8 @@ class GeneralAssistantFactoryTest {
 
             PlatformType platformType = PlatformType.OPENAI;
             generalAssistantFactory.create(platformType, 
assistantConfigProvider);
-            generalAssistantFactory = new 
GeneralAssistantFactory(chatMemoryStore);
-            generalAssistantFactory.create(platformType, 
assistantConfigProvider, UUID.randomUUID());
-            assertThrows(NotImplementedException.class, () -> {
-                generalAssistantFactory.createToolBox(platformType);
-            });
+            generalAssistantFactory = new GeneralAssistantFactory(new 
ChatMemoryStoreProvider());
+            generalAssistantFactory.create(platformType, 
assistantConfigProvider);
         }
     }
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStoreTest.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStoreTest.java
index 6dca8075..95250681 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStoreTest.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStoreTest.java
@@ -136,9 +136,5 @@ class PersistentChatMemoryStoreTest {
         assertEquals(1, result.size());
         assertTrue(result.get(0) instanceof SystemMessage);
         assertEquals("Hello from System", ((SystemMessage) 
result.get(0)).text());
-
-        persistentChatMemoryStore = persistentChatMemoryStore.clone();
-        result = persistentChatMemoryStore.getMessages(threadId);
-        assertEquals(0, result.size());
     }
 }
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 5dcf6d61..4699a840 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
@@ -21,32 +21,20 @@ package org.apache.bigtop.manager.ai.core;
 import org.apache.bigtop.manager.ai.core.factory.AIAssistant;
 import org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
 
-import dev.langchain4j.data.message.AiMessage;
-import dev.langchain4j.data.message.UserMessage;
 import dev.langchain4j.memory.ChatMemory;
 import dev.langchain4j.memory.chat.MessageWindowChatMemory;
-import dev.langchain4j.model.StreamingResponseHandler;
-import dev.langchain4j.model.chat.ChatLanguageModel;
-import dev.langchain4j.model.chat.StreamingChatLanguageModel;
-import dev.langchain4j.model.output.Response;
+import dev.langchain4j.service.tool.ToolProvider;
 import dev.langchain4j.store.memory.chat.ChatMemoryStore;
 import reactor.core.publisher.Flux;
-import reactor.core.publisher.FluxSink;
 
 public abstract class AbstractAIAssistant implements AIAssistant {
-
-    protected final ChatLanguageModel chatLanguageModel;
-    protected final StreamingChatLanguageModel streamingChatLanguageModel;
+    protected final AIAssistant.Service aiServices;
     protected static final Integer MEMORY_LEN = 10;
     protected final ChatMemory chatMemory;
 
-    protected AbstractAIAssistant(
-            ChatLanguageModel chatLanguageModel,
-            StreamingChatLanguageModel streamingChatLanguageModel,
-            ChatMemory chatMemory) {
-        this.chatLanguageModel = chatLanguageModel;
-        this.streamingChatLanguageModel = streamingChatLanguageModel;
+    protected AbstractAIAssistant(ChatMemory chatMemory, AIAssistant.Service 
aiServices) {
         this.chatMemory = chatMemory;
+        this.aiServices = aiServices;
     }
 
     @Override
@@ -61,35 +49,12 @@ public abstract class AbstractAIAssistant implements 
AIAssistant {
 
     @Override
     public Flux<String> streamAsk(String chatMessage) {
-        chatMemory.add(UserMessage.from(chatMessage));
-        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 onComplete(Response<AiMessage> response) {
-                        StreamingResponseHandler.super.onComplete(response);
-                        chatMemory.add(response.content());
-                    }
-                }),
-                FluxSink.OverflowStrategy.BUFFER);
+        return aiServices.streamChat(chatMessage);
     }
 
     @Override
     public String ask(String chatMessage) {
-        chatMemory.add(UserMessage.from(chatMessage));
-        Response<AiMessage> generate = 
chatLanguageModel.generate(chatMemory.messages());
-        String aiMessage = generate.content().text();
-        chatMemory.add(AiMessage.from(aiMessage));
-        return aiMessage;
+        return aiServices.chat(chatMessage);
     }
 
     public abstract static class Builder implements AIAssistant.Builder {
@@ -98,8 +63,21 @@ public abstract class AbstractAIAssistant implements 
AIAssistant {
         protected ChatMemoryStore chatMemoryStore;
         protected AIAssistantConfigProvider configProvider;
 
+        protected ToolProvider toolProvider;
+        protected String systemPrompt;
+
         public Builder() {}
 
+        public Builder withToolProvider(ToolProvider toolProvider) {
+            this.toolProvider = toolProvider;
+            return this;
+        }
+
+        public Builder withSystemPrompt(String systemPrompt) {
+            this.systemPrompt = systemPrompt;
+            return this;
+        }
+
         public Builder withConfigProvider(AIAssistantConfigProvider 
configProvider) {
             this.configProvider = configProvider;
             return this;
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 788d1515..8257c4e7 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
@@ -24,6 +24,7 @@ import 
org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
 import dev.langchain4j.memory.ChatMemory;
 import dev.langchain4j.model.chat.ChatLanguageModel;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
+import dev.langchain4j.service.tool.ToolProvider;
 import dev.langchain4j.store.memory.chat.ChatMemoryStore;
 import reactor.core.publisher.Flux;
 
@@ -56,18 +57,18 @@ public interface AIAssistant {
      */
     PlatformType getPlatform();
 
-    /**
-     * This is used to set system prompt
-     * @return
-     */
-    void setSystemPrompt(String systemPrompt);
-
     /**
      * This is used to test whether the configuration is correct
      * @return
      */
     boolean test();
 
+    interface Service {
+        String chat(String userMessage);
+
+        Flux<String> streamChat(String userMessage);
+    }
+
     interface Builder {
         Builder id(Object id);
 
@@ -75,6 +76,10 @@ public interface AIAssistant {
 
         Builder withConfigProvider(AIAssistantConfigProvider configProvider);
 
+        Builder withToolProvider(ToolProvider toolProvider);
+
+        Builder withSystemPrompt(String systemPrompt);
+
         AIAssistant build();
 
         ChatLanguageModel getChatLanguageModel();
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 5a7d63a0..f06a6127 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
@@ -22,16 +22,21 @@ 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.provider.AIAssistantConfigProvider;
 
+import dev.langchain4j.service.tool.ToolProvider;
+
 public interface AIAssistantFactory {
 
     AIAssistant createWithPrompt(
-            PlatformType platformType, AIAssistantConfigProvider 
assistantConfig, Object id, SystemPrompt systemPrompt);
-
-    AIAssistant create(PlatformType platformType, AIAssistantConfigProvider 
assistantConfig, Object id);
+            PlatformType platformType,
+            AIAssistantConfigProvider assistantConfig,
+            Object id,
+            ToolProvider toolProvider,
+            SystemPrompt systemPrompt);
 
     default AIAssistant create(PlatformType platformType, 
AIAssistantConfigProvider assistantConfig) {
-        return create(platformType, assistantConfig, null);
+        return createAiService(platformType, assistantConfig, null, null);
     }
 
-    ToolBox createToolBox(PlatformType platformType);
+    AIAssistant createAiService(
+            PlatformType platformType, AIAssistantConfigProvider 
assistantConfig, Long id, ToolProvider toolProvider);
 }
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 83bb0d50..5e041096 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
@@ -20,6 +20,8 @@ package org.apache.bigtop.manager.ai.core.provider;
 
 import org.apache.bigtop.manager.ai.core.enums.SystemPrompt;
 
+import java.util.List;
+
 public interface SystemPromptProvider {
 
     String getSystemMessage(SystemPrompt systemPrompt);
@@ -28,4 +30,6 @@ public interface SystemPromptProvider {
     String getSystemMessage();
 
     String getLanguagePrompt(String locale);
+
+    String getSystemMessages(List<String> systemPrompts);
 }
diff --git a/bigtop-manager-ai/bigtop-manager-ai-dashscope/pom.xml 
b/bigtop-manager-ai/bigtop-manager-ai-dashscope/pom.xml
index d062fa1f..794a5b11 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-dashscope/pom.xml
+++ b/bigtop-manager-ai/bigtop-manager-ai-dashscope/pom.xml
@@ -40,5 +40,10 @@
             <groupId>dev.langchain4j</groupId>
             <artifactId>langchain4j-dashscope</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>dev.langchain4j</groupId>
+            <artifactId>langchain4j-dashscope</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-dashscope/src/main/java/org/apache/bigtop/manager/ai/dashscope/DashScopeAssistant.java
 
b/bigtop-manager-ai/bigtop-manager-ai-dashscope/src/main/java/org/apache/bigtop/manager/ai/dashscope/DashScopeAssistant.java
index 1588a345..53c6be9d 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-dashscope/src/main/java/org/apache/bigtop/manager/ai/dashscope/DashScopeAssistant.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-dashscope/src/main/java/org/apache/bigtop/manager/ai/dashscope/DashScopeAssistant.java
@@ -22,26 +22,18 @@ 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 dev.langchain4j.data.message.SystemMessage;
 import dev.langchain4j.internal.ValidationUtils;
 import dev.langchain4j.memory.ChatMemory;
 import dev.langchain4j.model.chat.ChatLanguageModel;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
 import dev.langchain4j.model.dashscope.QwenChatModel;
 import dev.langchain4j.model.dashscope.QwenStreamingChatModel;
+import dev.langchain4j.service.AiServices;
 
 public class DashScopeAssistant extends AbstractAIAssistant {
 
-    public DashScopeAssistant(
-            ChatLanguageModel chatLanguageModel,
-            StreamingChatLanguageModel streamingChatLanguageModel,
-            ChatMemory chatMemory) {
-        super(chatLanguageModel, streamingChatLanguageModel, chatMemory);
-    }
-
-    @Override
-    public void setSystemPrompt(String systemPrompt) {
-        chatMemory.add(SystemMessage.systemMessage(systemPrompt));
+    public DashScopeAssistant(ChatMemory chatMemory, AIAssistant.Service 
aiServices) {
+        super(chatMemory, aiServices);
     }
 
     @Override
@@ -55,6 +47,22 @@ public class DashScopeAssistant extends AbstractAIAssistant {
 
     public static class Builder extends AbstractAIAssistant.Builder {
 
+        public AIAssistant build() {
+            AIAssistant.Service aiService = 
AiServices.builder(AIAssistant.Service.class)
+                    .chatLanguageModel(getChatLanguageModel())
+                    
.streamingChatLanguageModel(getStreamingChatLanguageModel())
+                    .chatMemory(getChatMemory())
+                    .toolProvider(toolProvider)
+                    .systemMessageProvider(threadId -> {
+                        if (threadId != null) {
+                            return systemPrompt;
+                        }
+                        return null;
+                    })
+                    .build();
+            return new DashScopeAssistant(getChatMemory(), aiService);
+        }
+
         @Override
         public ChatLanguageModel getChatLanguageModel() {
             String model = 
ValidationUtils.ensureNotNull(configProvider.getModel(), "model");
@@ -73,9 +81,5 @@ public class DashScopeAssistant extends AbstractAIAssistant {
                     .modelName(model)
                     .build();
         }
-
-        public AIAssistant build() {
-            return new DashScopeAssistant(getChatLanguageModel(), 
getStreamingChatLanguageModel(), getChatMemory());
-        }
     }
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-dashscope/src/main/java/org/apache/bigtop/manager/ai/dashscope/DashScopeToolBox.java
 
b/bigtop-manager-ai/bigtop-manager-ai-dashscope/src/main/java/org/apache/bigtop/manager/ai/dashscope/DashScopeToolBox.java
deleted file mode 100644
index 6a5ac84e..00000000
--- 
a/bigtop-manager-ai/bigtop-manager-ai-dashscope/src/main/java/org/apache/bigtop/manager/ai/dashscope/DashScopeToolBox.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.bigtop.manager.ai.dashscope;
-
-import org.apache.bigtop.manager.ai.core.factory.ToolBox;
-
-import reactor.core.publisher.Flux;
-
-import java.util.List;
-
-public class DashScopeToolBox implements ToolBox {
-    @Override
-    public List<String> getTools() {
-        return null;
-    }
-
-    @Override
-    public String invoke(String toolName) {
-        return null;
-    }
-
-    @Override
-    public Flux<String> streamInvoke(String toolName) {
-        return null;
-    }
-}
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 e56adad6..d5fb43cf 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
@@ -22,28 +22,20 @@ 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 dev.langchain4j.data.message.SystemMessage;
 import dev.langchain4j.internal.ValidationUtils;
 import dev.langchain4j.memory.ChatMemory;
 import dev.langchain4j.model.chat.ChatLanguageModel;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
 import dev.langchain4j.model.openai.OpenAiChatModel;
 import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
+import dev.langchain4j.service.AiServices;
 
 public class OpenAIAssistant extends AbstractAIAssistant {
 
     private static final String BASE_URL = "https://api.openai.com/v1";;
 
-    public OpenAIAssistant(
-            ChatLanguageModel chatLanguageModel,
-            StreamingChatLanguageModel streamingChatLanguageModel,
-            ChatMemory chatMemory) {
-        super(chatLanguageModel, streamingChatLanguageModel, chatMemory);
-    }
-
-    @Override
-    public void setSystemPrompt(String systemPrompt) {
-        chatMemory.add(SystemMessage.systemMessage(systemPrompt));
+    public OpenAIAssistant(ChatMemory chatMemory, AIAssistant.Service 
aiServices) {
+        super(chatMemory, aiServices);
     }
 
     @Override
@@ -82,7 +74,19 @@ public class OpenAIAssistant extends AbstractAIAssistant {
         }
 
         public AIAssistant build() {
-            return new OpenAIAssistant(getChatLanguageModel(), 
getStreamingChatLanguageModel(), getChatMemory());
+            AIAssistant.Service aiService = 
AiServices.builder(AIAssistant.Service.class)
+                    .chatLanguageModel(getChatLanguageModel())
+                    
.streamingChatLanguageModel(getStreamingChatLanguageModel())
+                    .chatMemory(getChatMemory())
+                    .toolProvider(toolProvider)
+                    .systemMessageProvider(threadId -> {
+                        if (threadId != null) {
+                            return systemPrompt;
+                        }
+                        return null;
+                    })
+                    .build();
+            return new OpenAIAssistant(getChatMemory(), aiService);
         }
     }
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-openai/src/main/java/org/apache/bigtop/manager/ai/openai/OpenAIToolBox.java
 
b/bigtop-manager-ai/bigtop-manager-ai-openai/src/main/java/org/apache/bigtop/manager/ai/openai/OpenAIToolBox.java
deleted file mode 100644
index 26b7a549..00000000
--- 
a/bigtop-manager-ai/bigtop-manager-ai-openai/src/main/java/org/apache/bigtop/manager/ai/openai/OpenAIToolBox.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.bigtop.manager.ai.openai;
-
-import org.apache.bigtop.manager.ai.core.factory.ToolBox;
-
-import reactor.core.publisher.Flux;
-
-import java.util.List;
-
-public class OpenAIToolBox implements ToolBox {
-    @Override
-    public List<String> getTools() {
-        return null;
-    }
-
-    @Override
-    public String invoke(String toolName) {
-        return null;
-    }
-
-    @Override
-    public Flux<String> streamInvoke(String toolName) {
-        return null;
-    }
-}
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-qianfan/src/main/java/org/apache/bigtop/manager/ai/qianfan/QianFanAssistant.java
 
b/bigtop-manager-ai/bigtop-manager-ai-qianfan/src/main/java/org/apache/bigtop/manager/ai/qianfan/QianFanAssistant.java
index 6b385c25..80010eb8 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-qianfan/src/main/java/org/apache/bigtop/manager/ai/qianfan/QianFanAssistant.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-qianfan/src/main/java/org/apache/bigtop/manager/ai/qianfan/QianFanAssistant.java
@@ -22,38 +22,18 @@ 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 dev.langchain4j.data.message.ChatMessage;
-import dev.langchain4j.data.message.SystemMessage;
 import dev.langchain4j.internal.ValidationUtils;
 import dev.langchain4j.memory.ChatMemory;
 import dev.langchain4j.model.chat.ChatLanguageModel;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
 import dev.langchain4j.model.qianfan.QianfanChatModel;
 import dev.langchain4j.model.qianfan.QianfanStreamingChatModel;
+import dev.langchain4j.service.AiServices;
 
 public class QianFanAssistant extends AbstractAIAssistant {
 
-    private SystemMessage systemMessage;
-
-    public QianFanAssistant(
-            ChatLanguageModel chatLanguageModel,
-            StreamingChatLanguageModel streamingChatLanguageModel,
-            ChatMemory chatMemory) {
-        super(chatLanguageModel, streamingChatLanguageModel, chatMemory);
-        for (ChatMessage chatMessage : chatMemory.messages()) {
-            if (chatMessage instanceof SystemMessage) {
-                this.systemMessage = (SystemMessage) chatMessage;
-            }
-        }
-    }
-
-    @Override
-    public void setSystemPrompt(String systemPrompt) {
-        // Multiple system messages are not supported
-        if (this.systemMessage == null) {
-            this.systemMessage = SystemMessage.systemMessage(systemPrompt);
-            chatMemory.add(this.systemMessage);
-        }
+    public QianFanAssistant(ChatMemory chatMemory, AIAssistant.Service 
aiServices) {
+        super(chatMemory, aiServices);
     }
 
     @Override
@@ -68,7 +48,19 @@ public class QianFanAssistant extends AbstractAIAssistant {
     public static class Builder extends AbstractAIAssistant.Builder {
 
         public AIAssistant build() {
-            return new QianFanAssistant(getChatLanguageModel(), 
getStreamingChatLanguageModel(), getChatMemory());
+            AIAssistant.Service aiService = 
AiServices.builder(AIAssistant.Service.class)
+                    .chatLanguageModel(getChatLanguageModel())
+                    
.streamingChatLanguageModel(getStreamingChatLanguageModel())
+                    .chatMemory(getChatMemory())
+                    .toolProvider(toolProvider)
+                    .systemMessageProvider(threadId -> {
+                        if (threadId != null) {
+                            return systemPrompt;
+                        }
+                        return null;
+                    })
+                    .build();
+            return new QianFanAssistant(getChatMemory(), aiService);
         }
 
         @Override
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-qianfan/src/main/java/org/apache/bigtop/manager/ai/qianfan/QianFanToolBox.java
 
b/bigtop-manager-ai/bigtop-manager-ai-qianfan/src/main/java/org/apache/bigtop/manager/ai/qianfan/QianFanToolBox.java
deleted file mode 100644
index 7dd2b9a3..00000000
--- 
a/bigtop-manager-ai/bigtop-manager-ai-qianfan/src/main/java/org/apache/bigtop/manager/ai/qianfan/QianFanToolBox.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.bigtop.manager.ai.qianfan;
-
-import org.apache.bigtop.manager.ai.core.factory.ToolBox;
-
-import reactor.core.publisher.Flux;
-
-import java.util.List;
-
-public class QianFanToolBox implements ToolBox {
-    @Override
-    public List<String> getTools() {
-        return null;
-    }
-
-    @Override
-    public String invoke(String toolName) {
-        return null;
-    }
-
-    @Override
-    public Flux<String> streamInvoke(String toolName) {
-        return null;
-    }
-}
diff --git a/bigtop-manager-bom/pom.xml b/bigtop-manager-bom/pom.xml
index 226f28c0..628e6901 100644
--- a/bigtop-manager-bom/pom.xml
+++ b/bigtop-manager-bom/pom.xml
@@ -266,6 +266,11 @@
                 <artifactId>langchain4j-dashscope</artifactId>
                 <version>${langchain4j.version}</version>
             </dependency>
+            <dependency>
+                <groupId>dev.langchain4j</groupId>
+                <artifactId>langchain4j-reactor</artifactId>
+                <version>${langchain4j.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 </project>
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
index 9bd1e318..6bc70776 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
@@ -20,7 +20,7 @@ package org.apache.bigtop.manager.server.service.impl;
 
 import org.apache.bigtop.manager.ai.assistant.GeneralAssistantFactory;
 import org.apache.bigtop.manager.ai.assistant.provider.AIAssistantConfig;
-import org.apache.bigtop.manager.ai.assistant.store.PersistentChatMemoryStore;
+import org.apache.bigtop.manager.ai.assistant.store.ChatMemoryStoreProvider;
 import org.apache.bigtop.manager.ai.core.enums.MessageType;
 import org.apache.bigtop.manager.ai.core.enums.PlatformType;
 import org.apache.bigtop.manager.ai.core.factory.AIAssistant;
@@ -89,7 +89,7 @@ public class ChatbotServiceImpl implements ChatbotService {
     public AIAssistantFactory getAIAssistantFactory() {
         if (aiAssistantFactory == null) {
             aiAssistantFactory =
-                    new GeneralAssistantFactory(new 
PersistentChatMemoryStore(chatThreadDao, chatMessageDao));
+                    new GeneralAssistantFactory(new 
ChatMemoryStoreProvider(chatThreadDao, chatMessageDao));
         }
         return aiAssistantFactory;
     }
@@ -119,7 +119,8 @@ public class ChatbotServiceImpl implements ChatbotService {
     private AIAssistant buildAIAssistant(
             String platformName, String model, Map<String, String> 
credentials, Long threadId) {
         return getAIAssistantFactory()
-                .create(getPlatformType(platformName), 
getAIAssistantConfig(model, credentials), threadId);
+                .createAiService(
+                        getPlatformType(platformName), 
getAIAssistantConfig(model, credentials), threadId, null);
     }
 
     @Override
@@ -128,7 +129,7 @@ public class ChatbotServiceImpl implements ChatbotService {
         if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
             throw new ApiException(ApiExceptionEnum.NO_PLATFORM_IN_USE);
         }
-        AuthPlatformDTO authPlatformDTO = 
AuthPlatformConverter.INSTANCE.fromPO2DTO(authPlatformPO);
+
         Long userId = SessionUserHolder.getUserId();
         PlatformPO platformPO = 
platformDao.findById(authPlatformPO.getPlatformId());
 
@@ -177,8 +178,7 @@ public class ChatbotServiceImpl implements ChatbotService {
         return chatThreads;
     }
 
-    @Override
-    public SseEmitter talk(Long threadId, String message) {
+    private AIAssistant prepareTalk(Long threadId) {
         ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
         Long userId = SessionUserHolder.getUserId();
         if (!Objects.equals(userId, chatThreadPO.getUserId()) || 
chatThreadPO.getIsDeleted()) {
@@ -191,19 +191,16 @@ public class ChatbotServiceImpl implements ChatbotService 
{
             throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_IN_USE);
         }
 
-        if (chatThreadPO.getName() == null) {
-            chatThreadPO.setName(getNameFromMessage(message));
-            chatThreadDao.partialUpdateById(chatThreadPO);
-        }
-
         AuthPlatformDTO authPlatformDTO = 
AuthPlatformConverter.INSTANCE.fromPO2DTO(authPlatformPO);
-        ChatThreadDTO chatThreadDTO = 
ChatThreadConverter.INSTANCE.fromPO2DTO(chatThreadPO);
+
         PlatformPO platformPO = 
platformDao.findById(authPlatformPO.getPlatformId());
-        AIAssistant aiAssistant = buildAIAssistant(
-                platformPO.getName(),
-                authPlatformDTO.getModel(),
-                authPlatformDTO.getAuthCredentials(),
-                chatThreadPO.getId());
+        return buildAIAssistant(
+                platformPO.getName(), authPlatformDTO.getModel(), 
authPlatformDTO.getAuthCredentials(), threadId);
+    }
+
+    @Override
+    public SseEmitter talk(Long threadId, String message) {
+        AIAssistant aiAssistant = prepareTalk(threadId);
         Flux<String> stringFlux = aiAssistant.streamAsk(message);
 
         SseEmitter emitter = new SseEmitter();
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/LLMConfigServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/LLMConfigServiceImpl.java
index 48a2b592..f5cf12c9 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/LLMConfigServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/LLMConfigServiceImpl.java
@@ -20,7 +20,7 @@ package org.apache.bigtop.manager.server.service.impl;
 
 import org.apache.bigtop.manager.ai.assistant.GeneralAssistantFactory;
 import org.apache.bigtop.manager.ai.assistant.provider.AIAssistantConfig;
-import org.apache.bigtop.manager.ai.assistant.store.PersistentChatMemoryStore;
+import org.apache.bigtop.manager.ai.assistant.store.ChatMemoryStoreProvider;
 import org.apache.bigtop.manager.ai.core.enums.PlatformType;
 import org.apache.bigtop.manager.ai.core.factory.AIAssistant;
 import org.apache.bigtop.manager.ai.core.factory.AIAssistantFactory;
@@ -76,7 +76,7 @@ public class LLMConfigServiceImpl implements LLMConfigService 
{
     public AIAssistantFactory getAIAssistantFactory() {
         if (aiAssistantFactory == null) {
             aiAssistantFactory =
-                    new GeneralAssistantFactory(new 
PersistentChatMemoryStore(chatThreadDao, chatMessageDao));
+                    new GeneralAssistantFactory(new 
ChatMemoryStoreProvider(chatThreadDao, chatMessageDao));
         }
         return aiAssistantFactory;
     }

Reply via email to