diff --git a/bigtop-manager-ai/bigtop-manager-ai-assistant/pom.xml b/bigtop-manager-ai/bigtop-manager-ai-assistant/pom.xml
index 6f1fea818..62ca8b3f7 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-assistant/pom.xml
+++ b/bigtop-manager-ai/bigtop-manager-ai-assistant/pom.xml
@@ -39,6 +39,10 @@
org.apache.bigtop
bigtop-manager-ai-core
+
+ org.apache.bigtop
+ bigtop-manager-dao
+
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 279567837..dfae2f71b 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactory.java
+++ b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/GeneralAssistantFactory.java
@@ -21,12 +21,16 @@
import org.apache.bigtop.manager.ai.assistant.provider.LocSystemPromptProvider;
import org.apache.bigtop.manager.ai.core.AbstractAIAssistantFactory;
import org.apache.bigtop.manager.ai.core.enums.PlatformType;
+import org.apache.bigtop.manager.ai.core.enums.SystemPrompt;
+import org.apache.bigtop.manager.ai.core.exception.PlatformNotFoundException;
import org.apache.bigtop.manager.ai.core.factory.AIAssistant;
import org.apache.bigtop.manager.ai.core.factory.ToolBox;
import org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
import org.apache.bigtop.manager.ai.core.provider.SystemPromptProvider;
import org.apache.bigtop.manager.ai.openai.OpenAIAssistant;
+import org.apache.commons.lang3.NotImplementedException;
+
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.store.memory.chat.ChatMemoryStore;
import dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore;
@@ -35,13 +39,19 @@
public class GeneralAssistantFactory extends AbstractAIAssistantFactory {
- private SystemPromptProvider systemPromptProvider = new LocSystemPromptProvider();
- private ChatMemoryStore chatMemoryStore = new InMemoryChatMemoryStore();
+ private final SystemPromptProvider systemPromptProvider;
+ private final ChatMemoryStore chatMemoryStore;
- public GeneralAssistantFactory() {}
+ public GeneralAssistantFactory() {
+ this(new LocSystemPromptProvider(), new InMemoryChatMemoryStore());
+ }
public GeneralAssistantFactory(SystemPromptProvider systemPromptProvider) {
- this.systemPromptProvider = systemPromptProvider;
+ this(systemPromptProvider, new InMemoryChatMemoryStore());
+ }
+
+ public GeneralAssistantFactory(ChatMemoryStore chatMemoryStore) {
+ this(new LocSystemPromptProvider(), chatMemoryStore);
}
public GeneralAssistantFactory(SystemPromptProvider systemPromptProvider, ChatMemoryStore chatMemoryStore) {
@@ -51,29 +61,33 @@ public GeneralAssistantFactory(SystemPromptProvider systemPromptProvider, ChatMe
@Override
public AIAssistant createWithPrompt(
- PlatformType platformType, AIAssistantConfigProvider assistantConfig, Object id, Object promptId) {
- AIAssistant aiAssistant = create(platformType, assistantConfig, id);
- SystemMessage systemPrompt = systemPromptProvider.getSystemPrompt(promptId);
- aiAssistant.setSystemPrompt(systemPrompt);
- return aiAssistant;
- }
-
- @Override
- public AIAssistant create(PlatformType platformType, AIAssistantConfigProvider assistantConfig, Object id) {
+ PlatformType platformType,
+ AIAssistantConfigProvider assistantConfig,
+ Object id,
+ SystemPrompt systemPrompts) {
+ AIAssistant aiAssistant;
if (Objects.requireNonNull(platformType) == PlatformType.OPENAI) {
- AIAssistant aiAssistant = OpenAIAssistant.builder()
+ aiAssistant = OpenAIAssistant.builder()
.id(id)
.memoryStore(chatMemoryStore)
.withConfigProvider(assistantConfig)
.build();
- aiAssistant.setSystemPrompt(systemPromptProvider.getSystemPrompt());
- return aiAssistant;
+ } else {
+ throw new PlatformNotFoundException(platformType.getValue());
}
- return null;
+
+ SystemMessage systemPrompt = systemPromptProvider.getSystemPrompt(systemPrompts);
+ aiAssistant.setSystemPrompt(systemPrompt);
+ return aiAssistant;
+ }
+
+ @Override
+ public AIAssistant create(PlatformType platformType, AIAssistantConfigProvider assistantConfig, Object id) {
+ return createWithPrompt(platformType, assistantConfig, id, SystemPrompt.DEFAULT_PROMPT);
}
@Override
public ToolBox createToolBox(PlatformType platformType) {
- return null;
+ throw new NotImplementedException("ToolBox is not implemented for GeneralAssistantFactory");
}
}
diff --git a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/AIAssistantConfig.java b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/AIAssistantConfig.java
index f632f8392..5266eadb1 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/AIAssistantConfig.java
+++ b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/AIAssistantConfig.java
@@ -24,42 +24,83 @@
import java.util.Map;
public class AIAssistantConfig implements AIAssistantConfigProvider {
- private final Map configMap;
- private AIAssistantConfig(Map configMap) {
- this.configMap = configMap;
+ /**
+ * Model name for platform that we want to use
+ */
+ private final String model;
+
+ /**
+ * Credentials for different platforms
+ */
+ private final Map credentials;
+
+ /**
+ * Platform extra configs are put here
+ */
+ private final Map configs;
+
+ private AIAssistantConfig(String model, Map credentials, Map configMap) {
+ this.model = model;
+ this.credentials = credentials;
+ this.configs = configMap;
}
public static Builder builder() {
return new Builder();
}
- public static Builder withDefault(String baseUrl, String apiKey) {
- Builder builder = new Builder();
- return builder.set("baseUrl", baseUrl).set("apiKey", apiKey);
+ @Override
+ public String getModel() {
+ return model;
}
@Override
- public Map configs() {
+ public Map getCredentials() {
+ return credentials;
+ }
- return configMap;
+ @Override
+ public Map getConfigs() {
+ return configs;
}
public static class Builder {
- private final Map configs;
+ private String model;
+
+ private final Map credentials = new HashMap<>();
+
+ private final Map configs = new HashMap<>();
- public Builder() {
- configs = new HashMap<>();
- configs.put("memoryLen", "30");
+ public Builder() {}
+
+ public Builder setModel(String model) {
+ this.model = model;
+ return this;
}
- public Builder set(String key, String value) {
+ public Builder addCredential(String key, String value) {
+ credentials.put(key, value);
+ return this;
+ }
+
+ public Builder addCredentials(Map credentialMap) {
+ credentials.putAll(credentialMap);
+ return this;
+ }
+
+ public Builder addConfig(String key, String value) {
configs.put(key, value);
return this;
}
+ public Builder addConfigs(Map configMap) {
+ configs.putAll(configMap);
+ return this;
+ }
+
public AIAssistantConfig build() {
- return new AIAssistantConfig(configs);
+ return new AIAssistantConfig(model, credentials, configs);
}
}
}
diff --git a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/LocSystemPromptProvider.java b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/LocSystemPromptProvider.java
index 1603601a1..b61dd16cd 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/LocSystemPromptProvider.java
+++ b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/provider/LocSystemPromptProvider.java
@@ -18,6 +18,7 @@
*/
package org.apache.bigtop.manager.ai.assistant.provider;
+import org.apache.bigtop.manager.ai.core.enums.SystemPrompt;
import org.apache.bigtop.manager.ai.core.provider.SystemPromptProvider;
import org.springframework.util.ResourceUtils;
@@ -29,41 +30,37 @@
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
-import java.util.Objects;
@Slf4j
public class LocSystemPromptProvider implements SystemPromptProvider {
- public static final String DEFAULT = "default";
private static final String SYSTEM_PROMPT_PATH = "src/main/resources/";
- private static final String DEFAULT_NAME = "big-data-professor.st";
@Override
- public SystemMessage getSystemPrompt(Object id) {
- if (Objects.equals(id.toString(), DEFAULT)) {
- return getSystemPrompt();
- } else {
- return loadPromptFromFile(id.toString());
+ public SystemMessage getSystemPrompt(SystemPrompt systemPrompt) {
+ if (systemPrompt == SystemPrompt.DEFAULT_PROMPT) {
+ systemPrompt = SystemPrompt.BIGDATA_PROFESSOR;
}
+
+ return loadPromptFromFile(systemPrompt.getValue());
}
@Override
public SystemMessage getSystemPrompt() {
- return loadPromptFromFile(DEFAULT_NAME);
+ return getSystemPrompt(SystemPrompt.DEFAULT_PROMPT);
}
private SystemMessage loadPromptFromFile(String fileName) {
- final String filePath = SYSTEM_PROMPT_PATH + fileName;
+ final String filePath = SYSTEM_PROMPT_PATH + fileName + ".st";
try {
File file = ResourceUtils.getFile(filePath);
String text = Files.readString(file.toPath(), StandardCharsets.UTF_8);
return SystemMessage.from(text);
} catch (IOException e) {
- //
log.error(
"Exception occurred while loading SystemPrompt from local. Here is some information:{}",
e.getMessage());
- return SystemMessage.from("");
+ return SystemMessage.from("You are a helpful assistant.");
}
}
}
diff --git a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
new file mode 100644
index 000000000..ba4fd95ef
--- /dev/null
+++ b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.bigtop.manager.ai.assistant.store;
+
+import org.apache.bigtop.manager.ai.core.enums.MessageSender;
+import org.apache.bigtop.manager.dao.po.ChatMessagePO;
+import org.apache.bigtop.manager.dao.po.ChatThreadPO;
+import org.apache.bigtop.manager.dao.repository.ChatMessageDao;
+import org.apache.bigtop.manager.dao.repository.ChatThreadDao;
+
+import dev.langchain4j.data.message.AiMessage;
+import dev.langchain4j.data.message.ChatMessage;
+import dev.langchain4j.data.message.ChatMessageType;
+import dev.langchain4j.data.message.SystemMessage;
+import dev.langchain4j.data.message.UserMessage;
+import dev.langchain4j.store.memory.chat.ChatMemoryStore;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class PersistentChatMemoryStore implements ChatMemoryStore {
+
+ private final ChatThreadDao chatThreadDao;
+ private final ChatMessageDao chatMessageDao;
+
+ public PersistentChatMemoryStore(ChatThreadDao chatThreadDao, ChatMessageDao chatMessageDao) {
+ this.chatThreadDao = chatThreadDao;
+ this.chatMessageDao = chatMessageDao;
+ }
+
+ private ChatMessage convertToChatMessage(ChatMessagePO chatMessagePO) {
+ String sender = chatMessagePO.getSender().toLowerCase();
+ if (sender.equals(MessageSender.AI.getValue())) {
+ return new AiMessage(chatMessagePO.getMessage());
+ } else if (sender.equals(MessageSender.USER.getValue())) {
+ return new UserMessage(chatMessagePO.getMessage());
+ } else if (sender.equals(MessageSender.SYSTEM.getValue())) {
+ return new SystemMessage(chatMessagePO.getMessage());
+ } else {
+ return null;
+ }
+ }
+
+ private ChatMessagePO convertToChatMessagePO(ChatMessage chatMessage, Long chatThreadId) {
+ ChatMessagePO chatMessagePO = new ChatMessagePO();
+ if (chatMessage.type().equals(ChatMessageType.AI)) {
+ chatMessagePO.setSender(MessageSender.AI.getValue());
+ AiMessage aiMessage = (AiMessage) chatMessage;
+ chatMessagePO.setMessage(aiMessage.text());
+ } else if (chatMessage.type().equals(ChatMessageType.USER)) {
+ chatMessagePO.setSender(MessageSender.USER.getValue());
+ UserMessage userMessage = (UserMessage) chatMessage;
+ chatMessagePO.setMessage(userMessage.singleText());
+ } else if (chatMessage.type().equals(ChatMessageType.SYSTEM)) {
+ chatMessagePO.setSender(MessageSender.SYSTEM.getValue());
+ SystemMessage systemMessage = (SystemMessage) chatMessage;
+ chatMessagePO.setMessage(systemMessage.text());
+ } else {
+ chatMessagePO.setSender(chatMessage.type().toString());
+ }
+ ChatThreadPO chatThreadPO = chatThreadDao.findById(chatThreadId);
+ chatMessagePO.setUserId(chatThreadPO.getUserId());
+ chatMessagePO.setThreadId(chatThreadId);
+ return chatMessagePO;
+ }
+
+ @Override
+ public List getMessages(Object threadId) {
+ List chatMessages = chatMessageDao.findAllByThreadId((Long) threadId);
+ if (chatMessages.isEmpty()) {
+ return new ArrayList<>();
+ } else {
+ return chatMessages.stream().map(this::convertToChatMessage).collect(Collectors.toList());
+ }
+ }
+
+ @Override
+ public void updateMessages(Object threadId, List messages) {
+ ChatMessagePO chatMessagePO = convertToChatMessagePO(messages.get(messages.size() - 1), (Long) threadId);
+ chatMessageDao.save(chatMessagePO);
+ }
+
+ @Override
+ public void deleteMessages(Object threadId) {
+ chatMessageDao.deleteByThreadId((Long) threadId);
+ }
+}
diff --git a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/AIAssistantServiceTest.java b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/AIAssistantServiceTest.java
index 40c21d58d..0e623ef00 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/AIAssistantServiceTest.java
+++ b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/AIAssistantServiceTest.java
@@ -32,18 +32,18 @@
import dev.langchain4j.model.openai.OpenAiChatModelName;
import reactor.core.publisher.Flux;
+import java.util.UUID;
+
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.mockito.Mockito.when;
public class AIAssistantServiceTest {
private AIAssistantConfigProvider configProvider = AIAssistantConfig.builder()
- .set("apiKey", "sk-")
+ .addConfig("apiKey", "sk-")
// The `baseUrl` has a default value that is automatically generated based on the `PlatformType`.
- .set("baseUrl", "https://api.openai.com/v1")
- // default 30
- .set("memoryLen", "10")
- .set("modelName", OpenAiChatModelName.GPT_3_5_TURBO.toString())
+ .addConfig("baseUrl", "https://api.openai.com/v1")
+ .addConfig("modelName", OpenAiChatModelName.GPT_3_5_TURBO.toString())
.build();
@Mock
@@ -52,6 +52,8 @@ public class AIAssistantServiceTest {
@Mock
private AIAssistantFactory aiAssistantFactory;
+ private final String threadId = UUID.randomUUID().toString();
+
@BeforeEach
public void init() {
MockitoAnnotations.openMocks(this);
@@ -62,13 +64,14 @@ public void init() {
emmit.next(text.charAt(i) + "");
}
}));
- when(aiAssistantFactory.create(PlatformType.OPENAI, configProvider)).thenReturn(this.aiAssistant);
- when(aiAssistant.getPlatform()).thenReturn(PlatformType.OPENAI.getValue());
+ when(aiAssistantFactory.create(PlatformType.OPENAI, configProvider, threadId))
+ .thenReturn(this.aiAssistant);
+ when(aiAssistant.getPlatform()).thenReturn(PlatformType.OPENAI);
}
@Test
public void createNew2SimpleChat() {
- AIAssistant aiAssistant = aiAssistantFactory.create(PlatformType.OPENAI, configProvider);
+ AIAssistant aiAssistant = aiAssistantFactory.create(PlatformType.OPENAI, configProvider, threadId);
String ask = aiAssistant.ask("1?");
assertFalse(ask.isEmpty());
System.out.println(ask);
@@ -76,7 +79,7 @@ public void createNew2SimpleChat() {
@Test
public void createNew2StreamChat() throws InterruptedException {
- AIAssistant aiAssistant = aiAssistantFactory.create(PlatformType.OPENAI, configProvider);
+ AIAssistant aiAssistant = aiAssistantFactory.create(PlatformType.OPENAI, configProvider, threadId);
Flux stringFlux = aiAssistant.streamAsk("stream 1?");
stringFlux.subscribe(
System.out::println,
diff --git a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/SystemPromptProviderTests.java b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/SystemPromptProviderTests.java
index db9be1ae0..1f768e17d 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/SystemPromptProviderTests.java
+++ b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/test/java/org/apache/bigtop/manager/ai/assistant/SystemPromptProviderTests.java
@@ -19,6 +19,7 @@
package org.apache.bigtop.manager.ai.assistant;
import org.apache.bigtop.manager.ai.assistant.provider.LocSystemPromptProvider;
+import org.apache.bigtop.manager.ai.core.enums.SystemPrompt;
import org.apache.bigtop.manager.ai.core.provider.SystemPromptProvider;
import org.junit.jupiter.api.Test;
@@ -30,22 +31,15 @@
public class SystemPromptProviderTests {
- private SystemPromptProvider systemPromptProvider = new LocSystemPromptProvider();
-
- @Test
- public void loadSystemPromptTest() {
- System.out.println(systemPromptProvider.getSystemPrompt());
- }
+ private final SystemPromptProvider systemPromptProvider = new LocSystemPromptProvider();
@Test
public void loadSystemPromptByIdTest() {
- SystemMessage systemPrompt1 = systemPromptProvider.getSystemPrompt("big-data-professor.st");
+ SystemMessage systemPrompt1 = systemPromptProvider.getSystemPrompt(SystemPrompt.BIGDATA_PROFESSOR);
assertFalse(systemPrompt1.text().isEmpty());
- System.out.println(systemPrompt1.text());
- SystemMessage systemPrompt2 = systemPromptProvider.getSystemPrompt(LocSystemPromptProvider.DEFAULT);
+ SystemMessage systemPrompt2 = systemPromptProvider.getSystemPrompt();
assertFalse(systemPrompt2.text().isEmpty());
- System.out.println(systemPrompt2.text());
assertEquals(systemPrompt1.text(), systemPrompt2.text());
}
diff --git a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/AbstractAIAssistant.java b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/AbstractAIAssistant.java
index e5087e303..5b0f383a8 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/AbstractAIAssistant.java
+++ b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/AbstractAIAssistant.java
@@ -37,6 +37,8 @@ public abstract class AbstractAIAssistant implements AIAssistant {
private final Object assistantId;
private final ChatMemory chatMemory;
+ protected static final Integer MEMORY_LEN = 10;
+
public AbstractAIAssistant(
ChatLanguageModel chatLanguageModel,
StreamingChatLanguageModel streamingChatLanguageModel,
@@ -50,29 +52,25 @@ public AbstractAIAssistant(
@Override
public Flux streamAsk(ChatMessage chatMessage) {
chatMemory.add(chatMessage);
- Flux streamAiMessage = Flux.create(
- emitter -> {
- streamingChatLanguageModel.generate(chatMemory.messages(), new StreamingResponseHandler<>() {
- @Override
- public void onNext(String token) {
- emitter.next(token);
- }
+ return Flux.create(
+ emitter -> streamingChatLanguageModel.generate(chatMemory.messages(), new StreamingResponseHandler<>() {
+ @Override
+ public void onNext(String token) {
+ emitter.next(token);
+ }
- @Override
- public void onError(Throwable error) {
- emitter.error(error);
- }
+ @Override
+ public void onError(Throwable error) {
+ emitter.error(error);
+ }
- @Override
- public void onComplete(Response response) {
- StreamingResponseHandler.super.onComplete(response);
- chatMemory.add(response.content());
- }
- });
- },
+ @Override
+ public void onComplete(Response response) {
+ StreamingResponseHandler.super.onComplete(response);
+ chatMemory.add(response.content());
+ }
+ }),
FluxSink.OverflowStrategy.BUFFER);
-
- return streamAiMessage;
}
@Override
diff --git a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/MessageSender.java b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/MessageSender.java
new file mode 100644
index 000000000..1c93085a8
--- /dev/null
+++ b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/MessageSender.java
@@ -0,0 +1,56 @@
+/*
+ * 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.enums;
+
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Getter
+public enum MessageSender {
+ USER("user"),
+ AI("ai"),
+ SYSTEM("system");
+
+ private final String value;
+
+ MessageSender(String value) {
+ this.value = value;
+ }
+
+ public static List getSenders() {
+ return Arrays.stream(values()).map(item -> item.value).collect(Collectors.toList());
+ }
+
+ public static MessageSender getMessageSender(String value) {
+ if (Objects.isNull(value) || value.isEmpty()) {
+ return null;
+ }
+ for (MessageSender messageSender : MessageSender.values()) {
+ if (messageSender.value.equals(value)) {
+ return messageSender;
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/PlatformType.java b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/PlatformType.java
index 0f5cb6082..cadbb2a66 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/PlatformType.java
+++ b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/PlatformType.java
@@ -18,11 +18,14 @@
*/
package org.apache.bigtop.manager.ai.core.enums;
+import lombok.Getter;
+
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
+@Getter
public enum PlatformType {
OPENAI("openai");
@@ -47,8 +50,4 @@ public static PlatformType getPlatformType(String value) {
}
return null;
}
-
- public String getValue() {
- return this.value;
- }
}
diff --git a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/SystemPrompt.java b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/SystemPrompt.java
new file mode 100644
index 000000000..be0eea340
--- /dev/null
+++ b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/SystemPrompt.java
@@ -0,0 +1,35 @@
+/*
+ * 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.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum SystemPrompt {
+ DEFAULT_PROMPT("default"),
+ BIGDATA_PROFESSOR("big-data-professor"),
+ LANGUAGE_PROMPT("language-prompt");
+ ;
+
+ private final String value;
+
+ SystemPrompt(String value) {
+ this.value = value;
+ }
+}
diff --git a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistant.java b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistant.java
index 8f4ef8e2e..6834b0513 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistant.java
+++ b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistant.java
@@ -18,6 +18,8 @@
*/
package org.apache.bigtop.manager.ai.core.factory;
+import org.apache.bigtop.manager.ai.core.enums.PlatformType;
+
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.data.message.UserMessage;
@@ -57,7 +59,7 @@ public interface AIAssistant {
* This is used to get the AIAssistant's Platform
* @return
*/
- String getPlatform();
+ PlatformType getPlatform();
void setSystemPrompt(SystemMessage systemPrompt);
diff --git a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistantFactory.java b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistantFactory.java
index 6610f9c4b..d6b24034b 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistantFactory.java
+++ b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/factory/AIAssistantFactory.java
@@ -19,51 +19,28 @@
package org.apache.bigtop.manager.ai.core.factory;
import org.apache.bigtop.manager.ai.core.enums.PlatformType;
-import org.apache.bigtop.manager.ai.core.exception.PlatformNotFoundException;
+import org.apache.bigtop.manager.ai.core.enums.SystemPrompt;
import org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
-import java.util.Objects;
import java.util.UUID;
public interface AIAssistantFactory {
AIAssistant createWithPrompt(
- PlatformType platformType, AIAssistantConfigProvider assistantConfig, Object id, Object promptId);
+ PlatformType platformType, AIAssistantConfigProvider assistantConfig, Object id, SystemPrompt systemPrompt);
AIAssistant create(PlatformType platformType, AIAssistantConfigProvider assistantConfig, Object id);
- ToolBox createToolBox(PlatformType platformType);
-
- default AIAssistant createWithPrompt(
- PlatformType platformType, AIAssistantConfigProvider assistantConfig, Object prompt) {
- return createWithPrompt(platformType, assistantConfig, UUID.randomUUID().toString(), prompt);
- }
-
- default AIAssistant create(String platform, AIAssistantConfigProvider assistantConfigProvider, Object id) {
- PlatformType platformType = PlatformType.getPlatformType(platform);
- if (Objects.isNull(platformType)) {
- throw new PlatformNotFoundException(platform);
- }
- return create(platformType, assistantConfigProvider, id);
- }
-
- default AIAssistant create(PlatformType platformType, AIAssistantConfigProvider assistantConfigProvider) {
- return create(platformType, assistantConfigProvider, UUID.randomUUID().toString());
- }
-
- default AIAssistant create(String platform, AIAssistantConfigProvider assistantConfig) {
- PlatformType platformType = PlatformType.getPlatformType(platform);
- if (Objects.isNull(platformType)) {
- throw new PlatformNotFoundException(platform);
- }
- return create(platformType, assistantConfig);
+ /**
+ * TODO Create AIAssistant without memory, should delete UUID
+ *
+ * @param platformType platform type
+ * @param assistantConfig assistant config
+ * @return AIAssistant
+ */
+ default AIAssistant create(PlatformType platformType, AIAssistantConfigProvider assistantConfig) {
+ return create(platformType, assistantConfig, UUID.randomUUID().toString());
}
- default ToolBox createToolBox(String platform) {
- PlatformType platformType = PlatformType.getPlatformType(platform);
- if (Objects.isNull(platformType)) {
- throw new PlatformNotFoundException(platform);
- }
- return createToolBox(platformType);
- }
+ ToolBox createToolBox(PlatformType platformType);
}
diff --git a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/AIAssistantConfigProvider.java b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/AIAssistantConfigProvider.java
index ea05b98ed..04f9dbd59 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/AIAssistantConfigProvider.java
+++ b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/AIAssistantConfigProvider.java
@@ -21,5 +21,9 @@
import java.util.Map;
public interface AIAssistantConfigProvider {
- Map configs();
+ String getModel();
+
+ Map getCredentials();
+
+ Map getConfigs();
}
diff --git a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/SystemPromptProvider.java b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/SystemPromptProvider.java
index 5d6865fbd..4340fc8d0 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/SystemPromptProvider.java
+++ b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/SystemPromptProvider.java
@@ -18,12 +18,13 @@
*/
package org.apache.bigtop.manager.ai.core.provider;
+import org.apache.bigtop.manager.ai.core.enums.SystemPrompt;
+
import dev.langchain4j.data.message.SystemMessage;
public interface SystemPromptProvider {
- // Return the SystemPrompt for the specified ID.
- SystemMessage getSystemPrompt(Object id);
+ SystemMessage getSystemPrompt(SystemPrompt systemPrompt);
// return default system prompt
SystemMessage getSystemPrompt();
diff --git a/bigtop-manager-ai/bigtop-manager-ai-openai/src/main/java/org/apache/bigtop/manager/ai/openai/OpenAIAssistant.java b/bigtop-manager-ai/bigtop-manager-ai-openai/src/main/java/org/apache/bigtop/manager/ai/openai/OpenAIAssistant.java
index 1d76b6254..f5325802b 100644
--- a/bigtop-manager-ai/bigtop-manager-ai-openai/src/main/java/org/apache/bigtop/manager/ai/openai/OpenAIAssistant.java
+++ b/bigtop-manager-ai/bigtop-manager-ai-openai/src/main/java/org/apache/bigtop/manager/ai/openai/OpenAIAssistant.java
@@ -19,11 +19,10 @@
package org.apache.bigtop.manager.ai.openai;
import org.apache.bigtop.manager.ai.core.AbstractAIAssistant;
+import org.apache.bigtop.manager.ai.core.enums.PlatformType;
import org.apache.bigtop.manager.ai.core.factory.AIAssistant;
import org.apache.bigtop.manager.ai.core.provider.AIAssistantConfigProvider;
-import org.springframework.util.NumberUtils;
-
import dev.langchain4j.internal.ValidationUtils;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
@@ -33,14 +32,9 @@
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
import dev.langchain4j.store.memory.chat.ChatMemoryStore;
-import java.util.HashMap;
-import java.util.Map;
-
public class OpenAIAssistant extends AbstractAIAssistant {
- private static final String PLATFORM_NAME = "openai";
private static final String BASE_URL = "https://api.openai.com/v1";
- private static final String MODEL_NAME = "gpt-3.5-turbo";
private OpenAIAssistant(
ChatLanguageModel chatLanguageModel,
@@ -50,8 +44,8 @@ private OpenAIAssistant(
}
@Override
- public String getPlatform() {
- return PLATFORM_NAME;
+ public PlatformType getPlatform() {
+ return PlatformType.OPENAI;
}
public static Builder builder() {
@@ -61,16 +55,13 @@ public static Builder builder() {
public static class Builder {
private Object id;
- private Map configs = new HashMap<>();
private ChatMemoryStore chatMemoryStore;
+ private AIAssistantConfigProvider configProvider;
- public Builder() {
- configs.put("baseUrl", BASE_URL);
- configs.put("modelName", MODEL_NAME);
- }
+ public Builder() {}
public Builder withConfigProvider(AIAssistantConfigProvider configProvider) {
- this.configs = configProvider.configs();
+ this.configProvider = configProvider;
return this;
}
@@ -86,25 +77,23 @@ public Builder memoryStore(ChatMemoryStore chatMemoryStore) {
public AIAssistant build() {
ValidationUtils.ensureNotNull(id, "id");
- String baseUrl = configs.get("baseUrl");
- String modelName = configs.get("modelName");
- String apiKey = ValidationUtils.ensureNotNull(configs.get("apiKey"), "apiKey");
- Integer memoryLen = ValidationUtils.ensureNotNull(
- NumberUtils.parseNumber(configs.get("memoryLen"), Integer.class), "memoryLen not a number.");
+ String model = ValidationUtils.ensureNotNull(configProvider.getModel(), "model");
+ String apiKey = ValidationUtils.ensureNotNull(
+ configProvider.getCredentials().get("apiKey"), "apiKey");
ChatLanguageModel openAiChatModel = OpenAiChatModel.builder()
.apiKey(apiKey)
- .baseUrl(baseUrl)
- .modelName(modelName)
+ .baseUrl(BASE_URL)
+ .modelName(model)
.build();
StreamingChatLanguageModel openaiStreamChatModel = OpenAiStreamingChatModel.builder()
.apiKey(apiKey)
- .baseUrl(baseUrl)
- .modelName(modelName)
+ .baseUrl(BASE_URL)
+ .modelName(model)
.build();
MessageWindowChatMemory chatMemory = MessageWindowChatMemory.builder()
.id(id)
.chatMemoryStore(chatMemoryStore)
- .maxMessages(memoryLen)
+ .maxMessages(MEMORY_LEN)
.build();
return new OpenAIAssistant(openAiChatModel, openaiStreamChatModel, chatMemory);
}
diff --git a/bigtop-manager-dao/pom.xml b/bigtop-manager-dao/pom.xml
index 6fed3ad75..ff56c9712 100644
--- a/bigtop-manager-dao/pom.xml
+++ b/bigtop-manager-dao/pom.xml
@@ -74,6 +74,10 @@
org.apache.tomcat.embed
tomcat-embed-core
+
+ org.apache.bigtop
+ bigtop-manager-ai-core
+
diff --git a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/handler/JsonTypeHandler.java b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/handler/JsonTypeHandler.java
new file mode 100644
index 000000000..4879753b5
--- /dev/null
+++ b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/handler/JsonTypeHandler.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.bigtop.manager.dao.handler;
+
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Map;
+
+public class JsonTypeHandler extends BaseTypeHandler