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;
}