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 a87d2e8  BIGTOP-4220: Remove Message Repository and replace it with 
ChatMemory (#64)
a87d2e8 is described below

commit a87d2e8275cf9db444b06f2abdc426fac9197c01
Author: haopeng <[email protected]>
AuthorDate: Thu Sep 12 15:41:26 2024 +0800

    BIGTOP-4220: Remove Message Repository and replace it with ChatMemory (#64)
---
 .../ai/assistant/GeneralAssistantFactory.java      | 48 ++++++-------
 .../provider/PersistentStoreProvider.java          | 61 -----------------
 .../store/PersistentMessageRepository.java         | 80 ----------------------
 .../manager/ai/core/AbstractAIAssistant.java       | 33 +++++++++
 .../manager/ai/core/factory/AIAssistant.java       | 12 ++++
 .../ai/core/provider/MessageStoreProvider.java     | 29 --------
 .../ai/core/repository/MessageRepository.java      | 27 --------
 .../manager/ai/dashscope/DashScopeAssistant.java   | 67 +++++++++---------
 .../bigtop/manager/ai/openai/OpenAIAssistant.java  | 28 +-------
 .../server/service/impl/AIChatServiceImpl.java     |  4 +-
 10 files changed, 104 insertions(+), 285 deletions(-)

diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactory.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactory.java
index 7ff16bc..beffd28 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,44 +19,41 @@
 package org.apache.bigtop.manager.ai.assistant;
 
 import org.apache.bigtop.manager.ai.assistant.provider.LocSystemPromptProvider;
-import org.apache.bigtop.manager.ai.assistant.provider.PersistentStoreProvider;
 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.MessageStoreProvider;
 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.commons.lang3.NotImplementedException;
 
-import java.util.Objects;
+import dev.langchain4j.store.memory.chat.ChatMemoryStore;
+import dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore;
 
 public class GeneralAssistantFactory extends AbstractAIAssistantFactory {
 
     private final SystemPromptProvider systemPromptProvider;
-    private final MessageStoreProvider messageStoreProvider;
+    private final ChatMemoryStore chatMemoryStore;
 
     public GeneralAssistantFactory() {
-        this(new LocSystemPromptProvider(), new PersistentStoreProvider());
+        this(new LocSystemPromptProvider(), new InMemoryChatMemoryStore());
     }
 
     public GeneralAssistantFactory(SystemPromptProvider systemPromptProvider) {
-        this(systemPromptProvider, new PersistentStoreProvider());
+        this(systemPromptProvider, new InMemoryChatMemoryStore());
     }
 
-    public GeneralAssistantFactory(MessageStoreProvider messageStoreProvider) {
-        this(new LocSystemPromptProvider(), messageStoreProvider);
+    public GeneralAssistantFactory(ChatMemoryStore chatMemoryStore) {
+        this(new LocSystemPromptProvider(), chatMemoryStore);
     }
 
-    public GeneralAssistantFactory(
-            SystemPromptProvider systemPromptProvider, MessageStoreProvider 
messageStoreProvider) {
+    public GeneralAssistantFactory(SystemPromptProvider systemPromptProvider, 
ChatMemoryStore chatMemoryStore) {
         this.systemPromptProvider = systemPromptProvider;
-        this.messageStoreProvider = messageStoreProvider;
+        this.chatMemoryStore = chatMemoryStore;
     }
 
     @Override
@@ -65,22 +62,17 @@ public class GeneralAssistantFactory extends 
AbstractAIAssistantFactory {
             AIAssistantConfigProvider assistantConfig,
             Object id,
             SystemPrompt systemPrompts) {
-        AIAssistant aiAssistant;
-        if (Objects.requireNonNull(platformType) == PlatformType.OPENAI) {
-            aiAssistant = OpenAIAssistant.builder()
-                    .id(id)
-                    .memoryStore(messageStoreProvider.getChatMemoryStore())
-                    .withConfigProvider(assistantConfig)
-                    .build();
-        } else if (Objects.requireNonNull(platformType) == 
PlatformType.DASH_SCOPE) {
-            aiAssistant = DashScopeAssistant.builder()
-                    .id(id)
-                    .withConfigProvider(assistantConfig)
-                    
.messageRepository(messageStoreProvider.getMessageRepository())
-                    .build();
-        } else {
-            throw new PlatformNotFoundException(platformType.getValue());
-        }
+        AIAssistant.Builder builder =
+                switch (platformType) {
+                    case OPENAI -> OpenAIAssistant.builder();
+                    case DASH_SCOPE -> DashScopeAssistant.builder();
+                };
+
+        AIAssistant aiAssistant = builder.id(id)
+                .memoryStore((id == null) ? new InMemoryChatMemoryStore() : 
chatMemoryStore)
+                .withConfigProvider(assistantConfig)
+                .build();
+
         String systemPrompt = 
systemPromptProvider.getSystemMessage(systemPrompts);
         aiAssistant.setSystemPrompt(systemPrompt);
         String locale = assistantConfig.getLanguage();
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/PersistentStoreProvider.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/PersistentStoreProvider.java
deleted file mode 100644
index 3e24ced..0000000
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/PersistentStoreProvider.java
+++ /dev/null
@@ -1,61 +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.assistant.provider;
-
-import org.apache.bigtop.manager.ai.assistant.store.PersistentChatMemoryStore;
-import 
org.apache.bigtop.manager.ai.assistant.store.PersistentMessageRepository;
-import org.apache.bigtop.manager.ai.core.provider.MessageStoreProvider;
-import org.apache.bigtop.manager.ai.core.repository.MessageRepository;
-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;
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-public class PersistentStoreProvider implements MessageStoreProvider {
-    private final ChatThreadDao chatThreadDao;
-    private final ChatMessageDao chatMessageDao;
-
-    public PersistentStoreProvider(ChatThreadDao chatThreadDao, ChatMessageDao 
chatMessageDao) {
-        this.chatThreadDao = chatThreadDao;
-        this.chatMessageDao = chatMessageDao;
-    }
-
-    public PersistentStoreProvider() {
-        chatMessageDao = null;
-        chatThreadDao = null;
-    }
-
-    @Override
-    public MessageRepository getMessageRepository() {
-        return new PersistentMessageRepository(chatThreadDao, chatMessageDao);
-    }
-
-    @Override
-    public ChatMemoryStore getChatMemoryStore() {
-        if (chatThreadDao == 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/PersistentMessageRepository.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentMessageRepository.java
deleted file mode 100644
index 7b9c371..0000000
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentMessageRepository.java
+++ /dev/null
@@ -1,80 +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.assistant.store;
-
-import org.apache.bigtop.manager.ai.core.enums.MessageSender;
-import org.apache.bigtop.manager.ai.core.repository.MessageRepository;
-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;
-
-public class PersistentMessageRepository implements MessageRepository {
-    private final ChatThreadDao chatThreadDao;
-    private final ChatMessageDao chatMessageDao;
-
-    private boolean noPersistent() {
-        return chatThreadDao == null || chatMessageDao == null;
-    }
-
-    public PersistentMessageRepository(ChatThreadDao chatThreadDao, 
ChatMessageDao chatMessageDao) {
-        this.chatThreadDao = chatThreadDao;
-        this.chatMessageDao = chatMessageDao;
-    }
-
-    private ChatMessagePO getChatMessagePO(String message, Long threadId, 
MessageSender sender) {
-        if (noPersistent()) {
-            return null;
-        }
-        ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
-        ChatMessagePO chatMessagePO = new ChatMessagePO();
-        chatMessagePO.setUserId(chatThreadPO.getUserId());
-        chatMessagePO.setThreadId(threadId);
-        chatMessagePO.setSender(sender.getValue());
-        chatMessagePO.setMessage(message);
-        return chatMessagePO;
-    }
-
-    @Override
-    public void saveUserMessage(String message, Long threadId) {
-        if (noPersistent()) {
-            return;
-        }
-        ChatMessagePO chatMessagePO = getChatMessagePO(message, threadId, 
MessageSender.USER);
-        chatMessageDao.save(chatMessagePO);
-    }
-
-    @Override
-    public void saveAiMessage(String message, Long threadId) {
-        if (noPersistent()) {
-            return;
-        }
-        ChatMessagePO chatMessagePO = getChatMessagePO(message, threadId, 
MessageSender.AI);
-        chatMessageDao.save(chatMessagePO);
-    }
-
-    @Override
-    public void saveSystemMessage(String message, Long threadId) {
-        if (noPersistent()) {
-            return;
-        }
-        ChatMessagePO chatMessagePO = getChatMessagePO(message, threadId, 
MessageSender.SYSTEM);
-        chatMessageDao.save(chatMessagePO);
-    }
-}
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 d7b155f..72e0c6c 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
@@ -19,13 +19,46 @@
 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.memory.ChatMemory;
+import dev.langchain4j.store.memory.chat.ChatMemoryStore;
 
 public abstract class AbstractAIAssistant implements AIAssistant {
 
     protected static final Integer MEMORY_LEN = 10;
+    protected final ChatMemory chatMemory;
+
+    protected AbstractAIAssistant(ChatMemory chatMemory) {
+        this.chatMemory = chatMemory;
+    }
 
     @Override
     public boolean test() {
         return ask("1+1=") != null;
     }
+
+    public abstract static class Builder implements AIAssistant.Builder {
+        protected Object id;
+
+        protected ChatMemoryStore chatMemoryStore;
+        protected AIAssistantConfigProvider configProvider;
+
+        public Builder() {}
+
+        public Builder withConfigProvider(AIAssistantConfigProvider 
configProvider) {
+            this.configProvider = configProvider;
+            return this;
+        }
+
+        public Builder id(Object id) {
+            this.id = id;
+            return this;
+        }
+
+        public Builder memoryStore(ChatMemoryStore chatMemoryStore) {
+            this.chatMemoryStore = chatMemoryStore;
+            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 b79474c..81bc3af 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
@@ -19,7 +19,9 @@
 package org.apache.bigtop.manager.ai.core.factory;
 
 import org.apache.bigtop.manager.ai.core.enums.PlatformType;
+import org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
 
+import dev.langchain4j.store.memory.chat.ChatMemoryStore;
 import reactor.core.publisher.Flux;
 
 import java.util.HashMap;
@@ -73,4 +75,14 @@ public interface AIAssistant {
      * @return
      */
     boolean test();
+
+    interface Builder {
+        Builder id(Object id);
+
+        Builder memoryStore(ChatMemoryStore memoryStore);
+
+        Builder withConfigProvider(AIAssistantConfigProvider configProvider);
+
+        AIAssistant build();
+    }
 }
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/MessageStoreProvider.java
 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/MessageStoreProvider.java
deleted file mode 100644
index 9e7fee1..0000000
--- 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/MessageStoreProvider.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.bigtop.manager.ai.core.provider;
-
-import org.apache.bigtop.manager.ai.core.repository.MessageRepository;
-
-import dev.langchain4j.store.memory.chat.ChatMemoryStore;
-
-public interface MessageStoreProvider {
-    MessageRepository getMessageRepository();
-
-    ChatMemoryStore getChatMemoryStore();
-}
diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/repository/MessageRepository.java
 
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/repository/MessageRepository.java
deleted file mode 100644
index 1ad582f..0000000
--- 
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/repository/MessageRepository.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.bigtop.manager.ai.core.repository;
-
-public interface MessageRepository {
-    default void saveUserMessage(String message, Long threadId) {}
-
-    default void saveAiMessage(String message, Long threadId) {}
-
-    default void saveSystemMessage(String message, Long threadId) {}
-}
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 538a674..0c813e2 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
@@ -19,10 +19,9 @@
 package org.apache.bigtop.manager.ai.dashscope;
 
 import org.apache.bigtop.manager.ai.core.AbstractAIAssistant;
+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.provider.AIAssistantConfigProvider;
-import org.apache.bigtop.manager.ai.core.repository.MessageRepository;
 
 import com.alibaba.dashscope.aigc.generation.Generation;
 import com.alibaba.dashscope.aigc.generation.GenerationParam;
@@ -50,7 +49,13 @@ import 
com.alibaba.dashscope.threads.runs.AssistantStreamMessage;
 import com.alibaba.dashscope.threads.runs.Run;
 import com.alibaba.dashscope.threads.runs.RunParam;
 import com.alibaba.dashscope.threads.runs.Runs;
+import dev.langchain4j.data.message.AiMessage;
+import dev.langchain4j.data.message.ChatMessage;
+import dev.langchain4j.data.message.SystemMessage;
+import dev.langchain4j.data.message.UserMessage;
 import dev.langchain4j.internal.ValidationUtils;
+import dev.langchain4j.memory.ChatMemory;
+import dev.langchain4j.memory.chat.MessageWindowChatMemory;
 import io.reactivex.Flowable;
 import reactor.core.publisher.Flux;
 
@@ -64,11 +69,10 @@ public class DashScopeAssistant extends AbstractAIAssistant 
{
     private final Messages messages = new Messages();
     private final Threads threads = new Threads();
     private final Runs runs = new Runs();
-    private final MessageRepository messageRepository;
     private final DashScopeThreadParam dashScopeThreadParam;
 
-    public DashScopeAssistant(MessageRepository messageRepository, 
DashScopeThreadParam dashScopeThreadParam) {
-        this.messageRepository = messageRepository;
+    public DashScopeAssistant(ChatMemory chatMemory, DashScopeThreadParam 
dashScopeThreadParam) {
+        super(chatMemory);
         this.dashScopeThreadParam = dashScopeThreadParam;
     }
 
@@ -84,6 +88,20 @@ public class DashScopeAssistant extends AbstractAIAssistant {
         return streamMessage.toString();
     }
 
+    private void saveMessage(String message, MessageSender sender) {
+        ChatMessage chatMessage;
+        if (sender.equals(MessageSender.AI)) {
+            chatMessage = new AiMessage(message);
+        } else if (sender.equals(MessageSender.USER)) {
+            chatMessage = new UserMessage(message);
+        } else if (sender.equals(MessageSender.SYSTEM)) {
+            chatMessage = new SystemMessage(message);
+        } else {
+            return;
+        }
+        chatMemory.add(chatMessage);
+    }
+
     @Override
     public PlatformType getPlatform() {
         return PlatformType.DASH_SCOPE;
@@ -113,7 +131,7 @@ public class DashScopeAssistant extends AbstractAIAssistant 
{
         } catch (NoApiKeyException | InputRequiredException | 
InvalidateParameter e) {
             throw new RuntimeException(e);
         }
-        messageRepository.saveSystemMessage(systemPrompt, (Long) 
dashScopeThreadParam.getThreadId());
+        saveMessage(systemPrompt, MessageSender.SYSTEM);
     }
 
     public static Builder builder() {
@@ -127,7 +145,7 @@ public class DashScopeAssistant extends AbstractAIAssistant 
{
 
     @Override
     public Flux<String> streamAsk(String userMessage) {
-        messageRepository.saveUserMessage(userMessage, (Long) 
dashScopeThreadParam.getThreadId());
+        saveMessage(userMessage, MessageSender.USER);
         TextMessageParam textMessageParam = TextMessageParam.builder()
                 .apiKey(dashScopeThreadParam.getApiKey())
                 .role(Role.USER.getValue())
@@ -161,13 +179,13 @@ public class DashScopeAssistant extends 
AbstractAIAssistant {
                     return message;
                 })
                 .doOnComplete(() -> {
-                    messageRepository.saveAiMessage(finalMessage.toString(), 
(Long) dashScopeThreadParam.getThreadId());
+                    saveMessage(finalMessage.toString(), MessageSender.AI);
                 });
     }
 
     @Override
     public String ask(String userMessage) {
-        messageRepository.saveUserMessage(userMessage, (Long) 
dashScopeThreadParam.getThreadId());
+        saveMessage(userMessage, MessageSender.USER);
         TextMessageParam textMessageParam = TextMessageParam.builder()
                 .apiKey(dashScopeThreadParam.getApiKey())
                 .role(Role.USER.getValue())
@@ -231,7 +249,7 @@ public class DashScopeAssistant extends AbstractAIAssistant 
{
             ContentText contentText = (ContentText) content;
             finalMessage.append(contentText.getText().getValue());
         }
-        messageRepository.saveAiMessage(finalMessage.toString(), (Long) 
dashScopeThreadParam.getThreadId());
+        saveMessage(finalMessage.toString(), MessageSender.AI);
         return finalMessage.toString();
     }
 
@@ -279,27 +297,7 @@ public class DashScopeAssistant extends 
AbstractAIAssistant {
         return threadInfo;
     }
 
-    public static class Builder {
-        private Object id;
-        private AIAssistantConfigProvider configProvider;
-        private MessageRepository messageRepository;
-
-        public Builder() {}
-
-        public Builder withConfigProvider(AIAssistantConfigProvider 
configProvider) {
-            this.configProvider = configProvider;
-            return this;
-        }
-
-        public Builder id(Object id) {
-            this.id = id;
-            return this;
-        }
-
-        public Builder messageRepository(MessageRepository messageRepository) {
-            this.messageRepository = messageRepository;
-            return this;
-        }
+    public static class Builder extends AbstractAIAssistant.Builder {
 
         public AIAssistant build() {
             String model = 
ValidationUtils.ensureNotNull(configProvider.getModel(), "model");
@@ -316,10 +314,15 @@ public class DashScopeAssistant extends 
AbstractAIAssistant {
             if (assistantId != null) {
                 param.setAssistantId(assistantId);
             }
+            MessageWindowChatMemory.Builder builder = 
MessageWindowChatMemory.builder()
+                    .chatMemoryStore(chatMemoryStore)
+                    .maxMessages(MEMORY_LEN);
             if (id != null) {
+                builder.id(id);
                 param.setThreadId(id);
             }
-            return new DashScopeAssistant(messageRepository, param);
+            MessageWindowChatMemory chatMemory = builder.build();
+            return new DashScopeAssistant(chatMemory, param);
         }
     }
 }
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 59eba58..d4aed6d 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,7 +22,6 @@ import org.apache.bigtop.manager.ai.core.AbstractAIAssistant;
 import org.apache.bigtop.manager.ai.core.enums.PlatformType;
 import 
org.apache.bigtop.manager.ai.core.exception.AssistantConfigNotSetException;
 import org.apache.bigtop.manager.ai.core.factory.AIAssistant;
-import org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
 
 import dev.langchain4j.data.message.AiMessage;
 import dev.langchain4j.data.message.SystemMessage;
@@ -36,7 +35,6 @@ import dev.langchain4j.model.chat.StreamingChatLanguageModel;
 import dev.langchain4j.model.openai.OpenAiChatModel;
 import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
 import dev.langchain4j.model.output.Response;
-import dev.langchain4j.store.memory.chat.ChatMemoryStore;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.FluxSink;
 
@@ -44,7 +42,6 @@ public class OpenAIAssistant extends AbstractAIAssistant {
 
     private final ChatLanguageModel chatLanguageModel;
     private final StreamingChatLanguageModel streamingChatLanguageModel;
-    private final ChatMemory chatMemory;
 
     private static final String BASE_URL = "https://api.openai.com/v1";;
 
@@ -52,9 +49,9 @@ public class OpenAIAssistant extends AbstractAIAssistant {
             ChatLanguageModel chatLanguageModel,
             StreamingChatLanguageModel streamingChatLanguageModel,
             ChatMemory chatMemory) {
+        super(chatMemory);
         this.chatLanguageModel = chatLanguageModel;
         this.streamingChatLanguageModel = streamingChatLanguageModel;
-        this.chatMemory = chatMemory;
     }
 
     @Override
@@ -129,28 +126,7 @@ public class OpenAIAssistant extends AbstractAIAssistant {
         return new Builder();
     }
 
-    public static class Builder {
-        private Object id;
-
-        private ChatMemoryStore chatMemoryStore;
-        private AIAssistantConfigProvider configProvider;
-
-        public Builder() {}
-
-        public Builder withConfigProvider(AIAssistantConfigProvider 
configProvider) {
-            this.configProvider = configProvider;
-            return this;
-        }
-
-        public Builder id(Object id) {
-            this.id = id;
-            return this;
-        }
-
-        public Builder memoryStore(ChatMemoryStore chatMemoryStore) {
-            this.chatMemoryStore = chatMemoryStore;
-            return this;
-        }
+    public static class Builder extends AbstractAIAssistant.Builder {
 
         public AIAssistant build() {
             String model = 
ValidationUtils.ensureNotNull(configProvider.getModel(), "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 025b4d4..c4336e8 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
@@ -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.provider.PersistentStoreProvider;
+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;
@@ -84,7 +84,7 @@ public class AIChatServiceImpl implements AIChatService {
     public AIAssistantFactory getAiAssistantFactory() {
         if (aiAssistantFactory == null) {
             aiAssistantFactory =
-                    new GeneralAssistantFactory(new 
PersistentStoreProvider(chatThreadDao, chatMessageDao));
+                    new GeneralAssistantFactory(new 
PersistentChatMemoryStore(chatThreadDao, chatMessageDao));
         }
         return aiAssistantFactory;
     }

Reply via email to