From a87d2e8275cf9db444b06f2abdc426fac9197c01 Mon Sep 17 00:00:00 2001 From: haopeng <657407891@qq.com> Date: Thu, 12 Sep 2024 15:41:26 +0800 Subject: [PATCH] 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 +++ .../core/provider/MessageStoreProvider.java | 29 ------- .../ai/core/repository/MessageRepository.java | 27 ------- .../ai/dashscope/DashScopeAssistant.java | 67 ++++++++-------- .../manager/ai/openai/OpenAIAssistant.java | 28 +------ .../service/impl/AIChatServiceImpl.java | 4 +- 10 files changed, 104 insertions(+), 285 deletions(-) delete mode 100644 bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/PersistentStoreProvider.java delete mode 100644 bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentMessageRepository.java delete mode 100644 bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/MessageStoreProvider.java delete mode 100644 bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/repository/MessageRepository.java 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 7ff16bcf..beffd287 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 AIAssistant createWithPrompt( 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 3e24ced9..00000000 --- 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 7b9c3715..00000000 --- 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 d7b155f8..72e0c6c5 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 b79474c5..81bc3af3 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 @@ default Map createThread() { * @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 9e7fee15..00000000 --- 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 1ad582f1..00000000 --- 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 538a6747..0c813e2d 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.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 @@ private String getValueFromAssistantStreamMessage(AssistantStreamMessage assista 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 void setSystemPrompt(String systemPrompt) { } 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 Object getId() { @Override public Flux 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 Flux streamAsk(String userMessage) { 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 String ask(String userMessage) { 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 Map createThread() { 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 AIAssistant build() { 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 59eba580..d4aed6d5 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.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.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 OpenAIAssistant( ChatLanguageModel chatLanguageModel, StreamingChatLanguageModel streamingChatLanguageModel, ChatMemory chatMemory) { + super(chatMemory); this.chatLanguageModel = chatLanguageModel; this.streamingChatLanguageModel = streamingChatLanguageModel; - this.chatMemory = chatMemory; } @Override @@ -129,28 +126,7 @@ public static Builder builder() { 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 025b4d48..c4336e8f 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 @@ 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; }