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 492c11d BIGTOP-4209: Add backend API for AI Chat functionality (#55)
492c11d is described below
commit 492c11d976a8befbdebf95191621a5d065ea637a
Author: haopeng <[email protected]>
AuthorDate: Fri Aug 30 11:12:30 2024 +0800
BIGTOP-4209: Add backend API for AI Chat functionality (#55)
---
.../bigtop-manager-ai-assistant/pom.xml | 4 +
.../ai/assistant/GeneralAssistantFactory.java | 50 ++--
.../ai/assistant/provider/AIAssistantConfig.java | 69 ++++-
.../provider/LocSystemPromptProvider.java | 21 +-
.../assistant/store/PersistentChatMemoryStore.java | 104 +++++++
.../ai/assistant/AIAssistantServiceTest.java | 21 +-
.../ai/assistant/SystemPromptProviderTests.java | 14 +-
.../manager/ai/core/AbstractAIAssistant.java | 38 ++-
.../{PlatformType.java => MessageSender.java} | 26 +-
.../bigtop/manager/ai/core/enums/PlatformType.java | 7 +-
.../bigtop/manager/ai/core/enums/SystemPrompt.java | 20 +-
.../manager/ai/core/factory/AIAssistant.java | 4 +-
.../ai/core/factory/AIAssistantFactory.java | 47 +--
.../core/provider/AIAssistantConfigProvider.java | 6 +-
.../ai/core/provider/SystemPromptProvider.java | 5 +-
.../bigtop/manager/ai/openai/OpenAIAssistant.java | 39 +--
bigtop-manager-dao/pom.xml | 4 +
.../manager/dao/handler/JsonTypeHandler.java | 72 +++++
.../bigtop/manager/dao/po/ChatMessagePO.java | 30 +-
.../apache/bigtop/manager/dao/po/ChatThreadPO.java | 33 ++-
.../manager/dao/po/PlatformAuthorizedPO.java | 34 ++-
.../apache/bigtop/manager/dao/po/PlatformPO.java | 31 +-
.../manager/dao/repository/ChatMessageDao.java | 14 +-
.../manager/dao/repository/ChatThreadDao.java | 17 +-
.../dao/repository/PlatformAuthorizedDao.java | 13 +-
.../bigtop/manager/dao/repository/PlatformDao.java | 8 +-
.../resources/mapper/mysql/ChatMessageMapper.xml | 36 +++
.../resources/mapper/mysql/ChatThreadMapper.xml | 39 +++
.../mapper/mysql/PlatformAuthorizedMapper.xml | 45 +++
.../main/resources/mapper/mysql/PlatformMapper.xml | 38 +++
bigtop-manager-server/pom.xml | 8 +
.../server/controller/AIChatController.java | 15 +-
.../manager/server/enums/ApiExceptionEnum.java | 8 +
.../bigtop/manager/server/enums/LocaleKeys.java | 9 +
...ormConverter.java => ChatMessageConverter.java} | 22 +-
...formConverter.java => ChatThreadConverter.java} | 12 +-
...erter.java => PlatformAuthorizedConverter.java} | 16 +-
.../server/model/converter/PlatformConverter.java | 24 ++
.../PlatformAuthorizedDTO.java} | 18 +-
.../manager/server/model/dto/PlatformDTO.java | 4 +-
.../manager/server/model/vo/ChatMessageVO.java | 6 +-
.../manager/server/model/vo/ChatThreadVO.java | 2 +
.../server/model/vo/PlatformAuthCredentialVO.java | 2 +-
.../server/model/vo/PlatformAuthorizedVO.java | 2 +
.../manager/server/service/AIChatService.java | 6 +-
.../server/service/impl/AIChatServiceImpl.java | 322 +++++++++++++++------
.../src/main/resources/ddl/MySQL-DDL-CREATE.sql | 62 +++-
.../main/resources/i18n/messages_en_US.properties | 7 +
.../main/resources/i18n/messages_zh_CN.properties | 7 +
.../server/controller/AIChatControllerTest.java | 127 +++++++-
50 files changed, 1187 insertions(+), 381 deletions(-)
diff --git a/bigtop-manager-ai/bigtop-manager-ai-assistant/pom.xml
b/bigtop-manager-ai/bigtop-manager-ai-assistant/pom.xml
index 6f1fea8..62ca8b3 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 @@
<groupId>org.apache.bigtop</groupId>
<artifactId>bigtop-manager-ai-core</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.apache.bigtop</groupId>
+ <artifactId>bigtop-manager-dao</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 2795678..dfae2f7 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 @@ package org.apache.bigtop.manager.ai.assistant;
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 @@ import java.util.Objects;
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 class GeneralAssistantFactory extends
AbstractAIAssistantFactory {
@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 f632f83..5266ead 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.HashMap;
import java.util.Map;
public class AIAssistantConfig implements AIAssistantConfigProvider {
- private final Map<String, String> configMap;
- private AIAssistantConfig(Map<String, String> configMap) {
- this.configMap = configMap;
+ /**
+ * Model name for platform that we want to use
+ */
+ private final String model;
+
+ /**
+ * Credentials for different platforms
+ */
+ private final Map<String, String> credentials;
+
+ /**
+ * Platform extra configs are put here
+ */
+ private final Map<String, String> configs;
+
+ private AIAssistantConfig(String model, Map<String, String> credentials,
Map<String, String> 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<String, String> configs() {
+ public Map<String, String> getCredentials() {
+ return credentials;
+ }
- return configMap;
+ @Override
+ public Map<String, String> getConfigs() {
+ return configs;
}
public static class Builder {
- private final Map<String, String> configs;
+ private String model;
+
+ private final Map<String, String> credentials = new HashMap<>();
+
+ private final Map<String, String> 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<String, String> credentialMap) {
+ credentials.putAll(credentialMap);
+ return this;
+ }
+
+ public Builder addConfig(String key, String value) {
configs.put(key, value);
return this;
}
+ public Builder addConfigs(Map<String, String> 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 1603601..b61dd16 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.File;
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 0000000..ba4fd95
--- /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<ChatMessage> getMessages(Object threadId) {
+ List<ChatMessagePO> 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<ChatMessage> 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 40c21d5..0e623ef 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 org.mockito.MockitoAnnotations;
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 class AIAssistantServiceTest {
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 class AIAssistantServiceTest {
@Test
public void createNew2StreamChat() throws InterruptedException {
- AIAssistant aiAssistant =
aiAssistantFactory.create(PlatformType.OPENAI, configProvider);
+ AIAssistant aiAssistant =
aiAssistantFactory.create(PlatformType.OPENAI, configProvider, threadId);
Flux<String> 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 db9be1a..1f768e1 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 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
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 e5087e3..5b0f383 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 abstract class AbstractAIAssistant implements
AIAssistant {
@Override
public Flux<String> streamAsk(ChatMessage chatMessage) {
chatMemory.add(chatMessage);
- Flux<String> 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<AiMessage> response) {
-
StreamingResponseHandler.super.onComplete(response);
- chatMemory.add(response.content());
- }
- });
- },
+ @Override
+ public void onComplete(Response<AiMessage> 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/PlatformType.java
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/MessageSender.java
similarity index 75%
copy from
bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/PlatformType.java
copy to
bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/MessageSender.java
index 0f5cb60..1c93085 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/MessageSender.java
@@ -18,37 +18,39 @@
*/
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;
-public enum PlatformType {
- OPENAI("openai");
+@Getter
+public enum MessageSender {
+ USER("user"),
+ AI("ai"),
+ SYSTEM("system");
private final String value;
- PlatformType(String value) {
+ MessageSender(String value) {
this.value = value;
}
- public static List<String> getPlatforms() {
+ public static List<String> getSenders() {
return Arrays.stream(values()).map(item ->
item.value).collect(Collectors.toList());
}
- public static PlatformType getPlatformType(String value) {
+ public static MessageSender getMessageSender(String value) {
if (Objects.isNull(value) || value.isEmpty()) {
return null;
}
- for (PlatformType platformType : PlatformType.values()) {
- if (platformType.value.equals(value)) {
- return platformType;
+ for (MessageSender messageSender : MessageSender.values()) {
+ if (messageSender.value.equals(value)) {
+ return messageSender;
}
}
- return null;
- }
- public String getValue() {
- return this.value;
+ 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 0f5cb60..cadbb2a 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 enum PlatformType {
}
return null;
}
-
- public String getValue() {
- return this.value;
- }
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthCredentialVO.java
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/SystemPrompt.java
similarity index 71%
copy from
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthCredentialVO.java
copy to
bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/SystemPrompt.java
index edfe0ff..be0eea3 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthCredentialVO.java
+++
b/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/enums/SystemPrompt.java
@@ -16,18 +16,20 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.bigtop.manager.server.model.vo;
+package org.apache.bigtop.manager.ai.core.enums;
-import lombok.Data;
+import lombok.Getter;
-@Data
-public class PlatformAuthCredentialVO {
- private String name;
+@Getter
+public enum SystemPrompt {
+ DEFAULT_PROMPT("default"),
+ BIGDATA_PROFESSOR("big-data-professor"),
+ LANGUAGE_PROMPT("language-prompt");
+ ;
- private String displayName;
+ private final String value;
- public PlatformAuthCredentialVO(String name, String displayName) {
- this.name = name;
- this.displayName = name;
+ 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 8f4ef8e..6834b05 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 6610f9c..d6b2403 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 ea05b98..04f9dbd 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 @@ package org.apache.bigtop.manager.ai.core.provider;
import java.util.Map;
public interface AIAssistantConfigProvider {
- Map<String, String> configs();
+ String getModel();
+
+ Map<String, String> getCredentials();
+
+ Map<String, String> 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 5d6865f..4340fc8 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 1d76b62..f532580 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.OpenAiChatModel;
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 @@ public class OpenAIAssistant extends AbstractAIAssistant {
}
@Override
- public String getPlatform() {
- return PLATFORM_NAME;
+ public PlatformType getPlatform() {
+ return PlatformType.OPENAI;
}
public static Builder builder() {
@@ -61,16 +55,13 @@ public class OpenAIAssistant extends AbstractAIAssistant {
public static class Builder {
private Object id;
- private Map<String, String> 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 class OpenAIAssistant extends AbstractAIAssistant {
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 6fed3ad..ff56c97 100644
--- a/bigtop-manager-dao/pom.xml
+++ b/bigtop-manager-dao/pom.xml
@@ -74,6 +74,10 @@
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.apache.bigtop</groupId>
+ <artifactId>bigtop-manager-ai-core</artifactId>
+ </dependency>
</dependencies>
</project>
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 0000000..4879753
--- /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<Map<String, String>> {
+
+ private static final ObjectMapper objectMapper = new ObjectMapper();
+
+ @Override
+ public void setNonNullParameter(PreparedStatement ps, int i, Map<String,
String> parameter, JdbcType jdbcType)
+ throws SQLException {
+ ps.setString(i, convertMapToJson(parameter));
+ }
+
+ @Override
+ public Map<String, String> getNullableResult(ResultSet rs, String
columnName) throws SQLException {
+ return convertJsonToMap(rs.getString(columnName));
+ }
+
+ @Override
+ public Map<String, String> getNullableResult(ResultSet rs, int
columnIndex) throws SQLException {
+ return convertJsonToMap(rs.getString(columnIndex));
+ }
+
+ @Override
+ public Map<String, String> getNullableResult(java.sql.CallableStatement
cs, int columnIndex) throws SQLException {
+ return convertJsonToMap(cs.getString(columnIndex));
+ }
+
+ private String convertMapToJson(Map<String, String> map) {
+ try {
+ return objectMapper.writeValueAsString(map);
+ } catch (Exception e) {
+ throw new RuntimeException("Error converting map to JSON string",
e);
+ }
+ }
+
+ private Map<String, String> convertJsonToMap(String json) {
+ try {
+ return objectMapper.readValue(json, new TypeReference<Map<String,
String>>() {});
+ } catch (Exception e) {
+ throw new RuntimeException("Error converting JSON string to map",
e);
+ }
+ }
+}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatMessageVO.java
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatMessagePO.java
similarity index 59%
copy from
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatMessageVO.java
copy to
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatMessagePO.java
index 981529b..4236810 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatMessageVO.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatMessagePO.java
@@ -16,21 +16,33 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.bigtop.manager.server.model.vo;
+package org.apache.bigtop.manager.dao.po;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import java.io.Serializable;
@Data
-public class ChatMessageVO {
- private String sender;
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "llm_chat_message")
+public class ChatMessagePO extends BasePO implements Serializable {
+ @Id
+ @Column(name = "id")
+ private Long id;
+ @Column(name = "message", nullable = false, length = 255)
private String message;
- private String createTime;
+ @Column(name = "sender")
+ private String sender;
+
+ @Column(name = "user_id")
+ private Long userId;
- public ChatMessageVO(String sender, String messageText, String createTime)
{
- this.sender = sender;
- this.message = messageText;
- this.createTime = createTime;
- }
+ @Column(name = "thread_id")
+ private Long threadId;
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
similarity index 62%
copy from
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
copy to
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
index 2349fdb..e4c8628 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
@@ -16,27 +16,30 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.bigtop.manager.server.model.vo;
+package org.apache.bigtop.manager.dao.po;
import lombok.Data;
+import lombok.EqualsAndHashCode;
-@Data
-public class ChatThreadVO {
- private Long threadId;
+import jakarta.persistence.Column;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import java.io.Serializable;
- private Long platformId;
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "llm_chat_thread")
+public class ChatThreadPO extends BasePO implements Serializable {
+ @Id
+ @Column(name = "id")
+ private Long id;
+ @Column(name = "model", nullable = false, length = 255)
private String model;
- private String createTime;
+ @Column(name = "user_id")
+ private Long userId;
- private String updateTime;
-
- public ChatThreadVO(Long threadId, Long platformId, String model, String
createTime) {
- this.threadId = threadId;
- this.platformId = platformId;
- this.model = model;
- this.createTime = createTime;
- this.updateTime = createTime;
- }
+ @Column(name = "platform_id")
+ private Long platformId;
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformAuthorizedPO.java
similarity index 59%
copy from
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
copy to
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformAuthorizedPO.java
index 2349fdb..f27fcd4 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformAuthorizedPO.java
@@ -16,27 +16,29 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.bigtop.manager.server.model.vo;
+package org.apache.bigtop.manager.dao.po;
import lombok.Data;
+import lombok.EqualsAndHashCode;
-@Data
-public class ChatThreadVO {
- private Long threadId;
-
- private Long platformId;
+import jakarta.persistence.Column;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import java.io.Serializable;
+import java.util.Map;
- private String model;
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "llm_platform_authorized")
+public class PlatformAuthorizedPO extends BasePO implements Serializable {
- private String createTime;
+ @Id
+ @Column(name = "id")
+ private Long id;
- private String updateTime;
+ @Column(name = "credentials", columnDefinition = "json", nullable = false)
+ private Map<String, String> credentials;
- public ChatThreadVO(Long threadId, Long platformId, String model, String
createTime) {
- this.threadId = threadId;
- this.platformId = platformId;
- this.model = model;
- this.createTime = createTime;
- this.updateTime = createTime;
- }
+ @Column(name = "platform_id")
+ private Long platformId;
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformPO.java
similarity index 56%
copy from
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
copy to
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformPO.java
index e957f7a..0180c51 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformPO.java
@@ -16,21 +16,32 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.bigtop.manager.server.model.vo;
+package org.apache.bigtop.manager.dao.po;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import java.io.Serializable;
+import java.util.Map;
@Data
-public class PlatformAuthorizedVO {
- private Long platformId;
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "llm_platform")
+public class PlatformPO extends BasePO implements Serializable {
- private String platformName;
+ @Id
+ @Column(name = "id")
+ private Long id;
- private String supportModels;
+ @Column(name = "name", nullable = false, length = 255)
+ private String name;
- public PlatformAuthorizedVO(long platformId, String name, String models) {
- this.platformId = platformId;
- this.platformName = name;
- this.supportModels = models;
- }
+ @Column(name = "credential", columnDefinition = "json", nullable = false)
+ private Map<String, String> credential;
+
+ @Column(name = "support_models", length = 255)
+ private String supportModels;
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatMessageDao.java
similarity index 70%
copy from
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
copy to
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatMessageDao.java
index f26245f..59721af 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatMessageDao.java
@@ -16,14 +16,16 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.bigtop.manager.server.model.dto;
+package org.apache.bigtop.manager.dao.repository;
-import lombok.Data;
+import org.apache.bigtop.manager.dao.po.ChatMessagePO;
+
+import org.apache.ibatis.annotations.Param;
import java.util.List;
-@Data
-public class PlatformDTO {
- private Long platformId;
- private List<AuthCredentialDTO> authCredentials;
+public interface ChatMessageDao extends BaseDao<ChatMessagePO> {
+ List<ChatMessagePO> findAllByThreadId(@Param("threadId") Long threadId);
+
+ void deleteByThreadId(@Param("threadId") Long threadId);
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatThreadDao.java
similarity index 63%
copy from
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
copy to
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatThreadDao.java
index f26245f..a691b7b 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatThreadDao.java
@@ -16,14 +16,19 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.bigtop.manager.server.model.dto;
+package org.apache.bigtop.manager.dao.repository;
-import lombok.Data;
+import org.apache.bigtop.manager.dao.po.ChatThreadPO;
+
+import org.apache.ibatis.annotations.Param;
import java.util.List;
-@Data
-public class PlatformDTO {
- private Long platformId;
- private List<AuthCredentialDTO> authCredentials;
+public interface ChatThreadDao extends BaseDao<ChatThreadPO> {
+ List<ChatThreadPO> findAllByUserId(@Param("userId") Long userId);
+
+ ChatThreadPO findById(Long id);
+
+ List<ChatThreadPO> findAllByPlatformAuthorizedIdAndUserId(
+ @Param("platformId") Long platformAuthorizedId, @Param("userId")
Long userId);
}
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-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformAuthorizedDao.java
similarity index 68%
copy from
bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/SystemPromptProvider.java
copy to
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformAuthorizedDao.java
index 5d6865f..fd801d7 100644
---
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/SystemPromptProvider.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformAuthorizedDao.java
@@ -16,15 +16,14 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.bigtop.manager.ai.core.provider;
+package org.apache.bigtop.manager.dao.repository;
-import dev.langchain4j.data.message.SystemMessage;
+import org.apache.bigtop.manager.dao.po.PlatformAuthorizedPO;
-public interface SystemPromptProvider {
+import org.apache.ibatis.annotations.Param;
- // Return the SystemPrompt for the specified ID.
- SystemMessage getSystemPrompt(Object id);
+public interface PlatformAuthorizedDao extends BaseDao<PlatformAuthorizedPO> {
+ PlatformAuthorizedPO findByPlatformId(@Param("id") Long platformId);
- // return default system prompt
- SystemMessage getSystemPrompt();
+ void saveWithCredentials(PlatformAuthorizedPO platformAuthorizedPO);
}
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-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformDao.java
similarity index 80%
copy from
bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/AIAssistantConfigProvider.java
copy to
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformDao.java
index ea05b98..e2d3c97 100644
---
a/bigtop-manager-ai/bigtop-manager-ai-core/src/main/java/org/apache/bigtop/manager/ai/core/provider/AIAssistantConfigProvider.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformDao.java
@@ -16,10 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.bigtop.manager.ai.core.provider;
+package org.apache.bigtop.manager.dao.repository;
-import java.util.Map;
+import org.apache.bigtop.manager.dao.po.PlatformPO;
-public interface AIAssistantConfigProvider {
- Map<String, String> configs();
+public interface PlatformDao extends BaseDao<PlatformPO> {
+ PlatformPO findByPlatformId(Long id);
}
diff --git
a/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatMessageMapper.xml
b/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatMessageMapper.xml
new file mode 100644
index 0000000..108410b
--- /dev/null
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatMessageMapper.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ 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.
+-->
+<!DOCTYPE mapper
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.apache.bigtop.manager.dao.repository.ChatMessageDao">
+
+ <select id="findAllByThreadId"
resultType="org.apache.bigtop.manager.dao.po.ChatMessagePO">
+ SELECT *
+ FROM llm_chat_message
+ WHERE thread_id = #{threadId}
+ </select>
+
+ <delete id="deleteByThreadId">
+ DELETE FROM llm_chat_message
+ WHERE thread_id = #{threadId}
+ </delete>
+
+</mapper>
\ No newline at end of file
diff --git
a/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatThreadMapper.xml
b/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatThreadMapper.xml
new file mode 100644
index 0000000..be70207
--- /dev/null
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatThreadMapper.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ 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.
+-->
+<!DOCTYPE mapper
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.apache.bigtop.manager.dao.repository.ChatThreadDao">
+ <sql id="baseColumns">
+ id, user_id, platform_id, model
+ </sql>
+ <select id="findAllByUserId"
resultType="org.apache.bigtop.manager.dao.po.ChatThreadPO">
+ SELECT *
+ FROM llm_chat_thread
+ WHERE user_id = #{userId}
+ </select>
+
+ <select id="findAllByPlatformAuthorizedIdAndUserId"
resultType="org.apache.bigtop.manager.dao.po.ChatThreadPO">
+ SELECT *
+ FROM llm_chat_thread
+ WHERE platform_id = #{platformId} AND user_id = #{userId}
+ </select>
+
+</mapper>
\ No newline at end of file
diff --git
a/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformAuthorizedMapper.xml
b/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformAuthorizedMapper.xml
new file mode 100644
index 0000000..f065a4c
--- /dev/null
+++
b/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformAuthorizedMapper.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ 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.
+-->
+<!DOCTYPE mapper
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper
namespace="org.apache.bigtop.manager.dao.repository.PlatformAuthorizedDao">
+
+ <sql id="baseColumns">
+ id, credentials, platfotrm_id
+ </sql>
+
+ <resultMap id="PlatformAuthorizedResultMap"
type="org.apache.bigtop.manager.dao.po.PlatformAuthorizedPO">
+ <result property="credentials" column="credentials"
typeHandler="org.apache.bigtop.manager.dao.handler.JsonTypeHandler"/>
+ </resultMap>
+
+ <select id="findByPlatformId" resultMap="PlatformAuthorizedResultMap">
+ SELECT * FROM llm_platform_authorized WHERE id = #{id}
+ </select>
+
+ <insert id="saveWithCredentials"
parameterType="org.apache.bigtop.manager.dao.po.PlatformAuthorizedPO"
useGeneratedKeys="true" keyProperty="id">
+ INSERT INTO llm_platform_authorized (platform_id, credentials)
+ VALUES (#{platformId}, #{credentials,
typeHandler=org.apache.bigtop.manager.dao.handler.JsonTypeHandler})
+ ON DUPLICATE KEY UPDATE
+ platform_id = VALUES(platform_id),
+ credentials = VALUES(credentials)
+ </insert>
+
+</mapper>
\ No newline at end of file
diff --git
a/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformMapper.xml
b/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformMapper.xml
new file mode 100644
index 0000000..e4ca903
--- /dev/null
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformMapper.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ ~ 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.
+-->
+<!DOCTYPE mapper
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.apache.bigtop.manager.dao.repository.PlatformDao">
+
+ <sql id="baseColumns">
+ id, name, credential, support_models
+ </sql>
+
+ <!-- Define the resultMap with the custom typeHandler for the credential
column -->
+ <resultMap id="PlatformResultMap"
type="org.apache.bigtop.manager.dao.po.PlatformPO">
+ <result property="credential" column="credential"
typeHandler="org.apache.bigtop.manager.dao.handler.JsonTypeHandler"/>
+ </resultMap>
+
+ <select id="findByPlatformId" resultMap="PlatformResultMap">
+ SELECT * FROM llm_platform WHERE id = #{id}
+ </select>
+
+</mapper>
\ No newline at end of file
diff --git a/bigtop-manager-server/pom.xml b/bigtop-manager-server/pom.xml
index 408b7f9..d6aecde 100644
--- a/bigtop-manager-server/pom.xml
+++ b/bigtop-manager-server/pom.xml
@@ -147,6 +147,14 @@
<groupId>net.devh</groupId>
<artifactId>grpc-client-spring-boot-starter</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.apache.bigtop</groupId>
+ <artifactId>bigtop-manager-ai-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.bigtop</groupId>
+ <artifactId>bigtop-manager-ai-assistant</artifactId>
+ </dependency>
</dependencies>
<build>
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/AIChatController.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/AIChatController.java
index 2e3b561..8446ab9 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/AIChatController.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/AIChatController.java
@@ -18,7 +18,6 @@
*/
package org.apache.bigtop.manager.server.controller;
-import org.apache.bigtop.manager.server.enums.ResponseStatus;
import org.apache.bigtop.manager.server.model.converter.PlatformConverter;
import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
import org.apache.bigtop.manager.server.model.req.PlatformReq;
@@ -75,7 +74,7 @@ public class AIChatController {
@Operation(summary = "platforms", description = "Add authorized platforms")
@PutMapping("/platforms")
- public ResponseEntity<PlatformVO> addAuthorizedPlatform(@RequestBody
PlatformReq platformReq) {
+ public ResponseEntity<PlatformAuthorizedVO>
addAuthorizedPlatform(@RequestBody PlatformReq platformReq) {
PlatformDTO platformDTO =
PlatformConverter.INSTANCE.fromReq2DTO(platformReq);
return
ResponseEntity.success(chatService.addAuthorizedPlatform(platformDTO));
}
@@ -83,11 +82,7 @@ public class AIChatController {
@Operation(summary = "platforms", description = "Delete authorized
platforms")
@DeleteMapping("/platforms/{platformId}")
public ResponseEntity<Boolean> deleteAuthorizedPlatform(@PathVariable Long
platformId) {
- int code = chatService.deleteAuthorizedPlatform(platformId);
- if (code != 0) {
- return ResponseEntity.error(ResponseStatus.PARAMETER_ERROR,
"Permission denied");
- }
- return ResponseEntity.success(true);
+ return
ResponseEntity.success(chatService.deleteAuthorizedPlatform(platformId));
}
@Operation(summary = "new threads", description = "Create a chat threads")
@@ -99,11 +94,7 @@ public class AIChatController {
@Operation(summary = "delete threads", description = "Delete a chat
threads")
@DeleteMapping("platforms/{platformId}/threads/{threadId}")
public ResponseEntity<Boolean> deleteChatThreads(@PathVariable Long
platformId, @PathVariable Long threadId) {
- int code = chatService.deleteChatThreads(platformId, threadId);
- if (code != 0) {
- return ResponseEntity.error(ResponseStatus.PARAMETER_ERROR, "No
Content");
- }
- return ResponseEntity.success(true);
+ return
ResponseEntity.success(chatService.deleteChatThreads(platformId, threadId));
}
@Operation(summary = "get", description = "Get all threads of a platform")
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
index 45ea423..01ed944 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/ApiExceptionEnum.java
@@ -60,6 +60,14 @@ public enum ApiExceptionEnum {
// Command Exceptions -- 18000 ~ 18999
COMMAND_NOT_FOUND(18000, LocaleKeys.COMMAND_NOT_FOUND),
COMMAND_NOT_SUPPORTED(18000, LocaleKeys.COMMAND_NOT_SUPPORTED),
+
+ // AI Chat Exceptions -- 19000 ~ 19999
+ PLATFORM_NOT_FOUND(19000, LocaleKeys.PLATFORM_NOT_FOUND),
+ PLATFORM_NOT_AUTHORIZED(19001, LocaleKeys.PLATFORM_NOT_AUTHORIZED),
+ PERMISSION_DENIED(19002, LocaleKeys.PERMISSION_DENIED),
+ CREDIT_INCORRECT(19003, LocaleKeys.CREDIT_INCORRECT),
+ MODEL_NOT_SUPPORTED(19004, LocaleKeys.MODEL_NOT_SUPPORTED),
+ CHAT_THREAD_NOT_FOUND(19005, LocaleKeys.CHAT_THREAD_NOT_FOUND),
;
private final Integer code;
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
index 22dc64a..bbb6af1 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/LocaleKeys.java
@@ -56,6 +56,15 @@ public enum LocaleKeys {
COMMAND_NOT_FOUND("command.not.found"),
COMMAND_NOT_SUPPORTED("command.not.supported"),
+
+ PLATFORM_NOT_FOUND("platform.not.found"),
+ PLATFORM_NOT_AUTHORIZED("platform.not.authorized"),
+ PERMISSION_DENIED("permission.denied"),
+ CREDIT_INCORRECT("credit.incorrect"),
+ MODEL_NOT_SUPPORTED("model.not.supported"),
+ CHAT_THREAD_NOT_FOUND("chat.thread.not.found"),
+
+ CHAT_LANGUAGE_PROMPT("chat.language.prompt"),
;
private final String key;
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatMessageConverter.java
similarity index 61%
copy from
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
copy to
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatMessageConverter.java
index aa4c343..b2c1723 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatMessageConverter.java
@@ -18,16 +18,28 @@
*/
package org.apache.bigtop.manager.server.model.converter;
+import org.apache.bigtop.manager.ai.core.enums.MessageSender;
+import org.apache.bigtop.manager.dao.po.ChatMessagePO;
import org.apache.bigtop.manager.server.config.MapStructSharedConfig;
-import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
-import org.apache.bigtop.manager.server.model.req.PlatformReq;
+import org.apache.bigtop.manager.server.model.vo.ChatMessageVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper(config = MapStructSharedConfig.class)
-public interface PlatformConverter {
- PlatformConverter INSTANCE = Mappers.getMapper(PlatformConverter.class);
+public interface ChatMessageConverter {
+ ChatMessageConverter INSTANCE =
Mappers.getMapper(ChatMessageConverter.class);
- PlatformDTO fromReq2DTO(PlatformReq platformReq);
+ ChatMessageVO fromPO2VO(ChatMessagePO chatMessagePO);
+
+ default MessageSender mapStringToMessageSender(String sender) {
+ if (sender == null) {
+ return null;
+ }
+ try {
+ return MessageSender.valueOf(sender.toUpperCase());
+ } catch (IllegalArgumentException e) {
+ return null;
+ }
+ }
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatThreadConverter.java
similarity index 73%
copy from
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
copy to
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatThreadConverter.java
index aa4c343..6931da2 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatThreadConverter.java
@@ -18,16 +18,18 @@
*/
package org.apache.bigtop.manager.server.model.converter;
+import org.apache.bigtop.manager.dao.po.ChatThreadPO;
import org.apache.bigtop.manager.server.config.MapStructSharedConfig;
-import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
-import org.apache.bigtop.manager.server.model.req.PlatformReq;
+import org.apache.bigtop.manager.server.model.vo.ChatThreadVO;
import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper(config = MapStructSharedConfig.class)
-public interface PlatformConverter {
- PlatformConverter INSTANCE = Mappers.getMapper(PlatformConverter.class);
+public interface ChatThreadConverter {
+ ChatThreadConverter INSTANCE =
Mappers.getMapper(ChatThreadConverter.class);
- PlatformDTO fromReq2DTO(PlatformReq platformReq);
+ @Mapping(source = "id", target = "threadId")
+ ChatThreadVO fromPO2VO(ChatThreadPO platformAuthorizedPO);
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformAuthorizedConverter.java
similarity index 59%
copy from
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
copy to
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformAuthorizedConverter.java
index aa4c343..2e3c87a 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformAuthorizedConverter.java
@@ -18,16 +18,22 @@
*/
package org.apache.bigtop.manager.server.model.converter;
+import org.apache.bigtop.manager.dao.po.PlatformAuthorizedPO;
+import org.apache.bigtop.manager.dao.po.PlatformPO;
import org.apache.bigtop.manager.server.config.MapStructSharedConfig;
-import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
-import org.apache.bigtop.manager.server.model.req.PlatformReq;
+import org.apache.bigtop.manager.server.model.vo.PlatformAuthorizedVO;
+import org.mapstruct.Context;
import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper(config = MapStructSharedConfig.class)
-public interface PlatformConverter {
- PlatformConverter INSTANCE = Mappers.getMapper(PlatformConverter.class);
+public interface PlatformAuthorizedConverter {
+ PlatformAuthorizedConverter INSTANCE =
Mappers.getMapper(PlatformAuthorizedConverter.class);
- PlatformDTO fromReq2DTO(PlatformReq platformReq);
+ @Mapping(target = "platformId", source = "id")
+ @Mapping(target = "supportModels", expression =
"java(platformPO.getSupportModels())")
+ @Mapping(target = "platformName", expression =
"java(platformPO.getName())")
+ PlatformAuthorizedVO fromPO2VO(PlatformAuthorizedPO platformAuthorizedPO,
@Context PlatformPO platformPO);
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
index aa4c343..85b6e15 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
@@ -18,16 +18,40 @@
*/
package org.apache.bigtop.manager.server.model.converter;
+import org.apache.bigtop.manager.dao.po.PlatformPO;
import org.apache.bigtop.manager.server.config.MapStructSharedConfig;
import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
+import org.apache.bigtop.manager.server.model.req.AuthCredentialReq;
import org.apache.bigtop.manager.server.model.req.PlatformReq;
+import org.apache.bigtop.manager.server.model.vo.PlatformVO;
+import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
+import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
@Mapper(config = MapStructSharedConfig.class)
public interface PlatformConverter {
PlatformConverter INSTANCE = Mappers.getMapper(PlatformConverter.class);
PlatformDTO fromReq2DTO(PlatformReq platformReq);
+
+ PlatformVO fromPO2VO(PlatformPO platformPO);
+
+ default Map<String, String> mapAuthCredentials(List<AuthCredentialReq>
authCredentials) {
+ if (authCredentials == null) {
+ return null;
+ }
+ return authCredentials.stream()
+ .collect(Collectors.toMap(AuthCredentialReq::getKey,
AuthCredentialReq::getValue));
+ }
+
+ @AfterMapping
+ default void afterMapping(@MappingTarget PlatformDTO platformDTO,
PlatformReq platformReq) {
+
platformDTO.setAuthCredentials(mapAuthCredentials(platformReq.getAuthCredentials()));
+ }
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformAuthorizedDTO.java
similarity index 72%
copy from
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
copy to
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformAuthorizedDTO.java
index e957f7a..da6cb1f 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformAuthorizedDTO.java
@@ -16,21 +16,21 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.bigtop.manager.server.model.vo;
+package org.apache.bigtop.manager.server.model.dto;
import lombok.Data;
-@Data
-public class PlatformAuthorizedVO {
- private Long platformId;
+import java.util.Map;
+@Data
+public class PlatformAuthorizedDTO {
private String platformName;
+ private String model;
+ private Map<String, String> credentials;
- private String supportModels;
-
- public PlatformAuthorizedVO(long platformId, String name, String models) {
- this.platformId = platformId;
+ public PlatformAuthorizedDTO(String name, Map<String, String>
credentialSet, String model) {
this.platformName = name;
- this.supportModels = models;
+ this.credentials = credentialSet;
+ this.model = model;
}
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
index f26245f..368bf2a 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PlatformDTO.java
@@ -20,10 +20,10 @@ package org.apache.bigtop.manager.server.model.dto;
import lombok.Data;
-import java.util.List;
+import java.util.Map;
@Data
public class PlatformDTO {
private Long platformId;
- private List<AuthCredentialDTO> authCredentials;
+ private Map<String, String> authCredentials;
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatMessageVO.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatMessageVO.java
index 981529b..da226da 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatMessageVO.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatMessageVO.java
@@ -18,17 +18,19 @@
*/
package org.apache.bigtop.manager.server.model.vo;
+import org.apache.bigtop.manager.ai.core.enums.MessageSender;
+
import lombok.Data;
@Data
public class ChatMessageVO {
- private String sender;
+ private MessageSender sender;
private String message;
private String createTime;
- public ChatMessageVO(String sender, String messageText, String createTime)
{
+ public ChatMessageVO(MessageSender sender, String messageText, String
createTime) {
this.sender = sender;
this.message = messageText;
this.createTime = createTime;
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
index 2349fdb..c5f84a9 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ChatThreadVO.java
@@ -39,4 +39,6 @@ public class ChatThreadVO {
this.createTime = createTime;
this.updateTime = createTime;
}
+
+ public ChatThreadVO() {}
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthCredentialVO.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthCredentialVO.java
index edfe0ff..7107422 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthCredentialVO.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthCredentialVO.java
@@ -28,6 +28,6 @@ public class PlatformAuthCredentialVO {
public PlatformAuthCredentialVO(String name, String displayName) {
this.name = name;
- this.displayName = name;
+ this.displayName = displayName;
}
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
index e957f7a..3532cf6 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/PlatformAuthorizedVO.java
@@ -33,4 +33,6 @@ public class PlatformAuthorizedVO {
this.platformName = name;
this.supportModels = models;
}
+
+ public PlatformAuthorizedVO() {}
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/AIChatService.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/AIChatService.java
index d3cf125..06042ba 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/AIChatService.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/AIChatService.java
@@ -34,15 +34,15 @@ public interface AIChatService {
List<PlatformAuthorizedVO> authorizedPlatforms();
- PlatformVO addAuthorizedPlatform(PlatformDTO platformDTO);
+ PlatformAuthorizedVO addAuthorizedPlatform(PlatformDTO platformDTO);
List<PlatformAuthCredentialVO> platformsAuthCredential(Long platformId);
- int deleteAuthorizedPlatform(Long platformId);
+ boolean deleteAuthorizedPlatform(Long platformId);
ChatThreadVO createChatThreads(Long platformId, String model);
- int deleteChatThreads(Long platformId, Long threadId);
+ boolean deleteChatThreads(Long platformId, Long threadId);
List<ChatThreadVO> getAllChatThreads(Long platformId, String 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 6dca1bc..e047871 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
@@ -18,7 +18,29 @@
*/
package org.apache.bigtop.manager.server.service.impl;
-import org.apache.bigtop.manager.common.utils.DateUtils;
+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.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.factory.AIAssistantFactory;
+import org.apache.bigtop.manager.dao.po.ChatMessagePO;
+import org.apache.bigtop.manager.dao.po.ChatThreadPO;
+import org.apache.bigtop.manager.dao.po.PlatformAuthorizedPO;
+import org.apache.bigtop.manager.dao.po.PlatformPO;
+import org.apache.bigtop.manager.dao.repository.ChatMessageDao;
+import org.apache.bigtop.manager.dao.repository.ChatThreadDao;
+import org.apache.bigtop.manager.dao.repository.PlatformAuthorizedDao;
+import org.apache.bigtop.manager.dao.repository.PlatformDao;
+import org.apache.bigtop.manager.server.enums.ApiExceptionEnum;
+import org.apache.bigtop.manager.server.exception.ApiException;
+import org.apache.bigtop.manager.server.holder.SessionUserHolder;
+import org.apache.bigtop.manager.server.model.converter.ChatMessageConverter;
+import org.apache.bigtop.manager.server.model.converter.ChatThreadConverter;
+import
org.apache.bigtop.manager.server.model.converter.PlatformAuthorizedConverter;
+import org.apache.bigtop.manager.server.model.converter.PlatformConverter;
+import org.apache.bigtop.manager.server.model.dto.PlatformAuthorizedDTO;
import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
import org.apache.bigtop.manager.server.model.vo.ChatMessageVO;
import org.apache.bigtop.manager.server.model.vo.ChatThreadVO;
@@ -27,153 +49,275 @@ import
org.apache.bigtop.manager.server.model.vo.PlatformAuthorizedVO;
import org.apache.bigtop.manager.server.model.vo.PlatformVO;
import org.apache.bigtop.manager.server.service.AIChatService;
+import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-import lombok.extern.slf4j.Slf4j;
+import reactor.core.publisher.Flux;
-import java.io.IOException;
+import jakarta.annotation.Resource;
import java.util.ArrayList;
-import java.util.Date;
+import java.util.HashMap;
import java.util.List;
-import java.util.Random;
+import java.util.Map;
+import java.util.Objects;
-@Slf4j
@Service
public class AIChatServiceImpl implements AIChatService {
+ @Resource
+ private PlatformDao platformDao;
+
+ @Resource
+ private PlatformAuthorizedDao platformAuthorizedDao;
+
+ @Resource
+ private ChatThreadDao chatThreadDao;
+
+ @Resource
+ private ChatMessageDao chatMessageDao;
+
+ private AIAssistantFactory aiAssistantFactory;
+
+ private final AIAssistantFactory aiTestFactory = new
GeneralAssistantFactory();
+
+ public AIAssistantFactory getAiAssistantFactory() {
+ if (aiAssistantFactory == null) {
+ aiAssistantFactory =
+ new GeneralAssistantFactory(new
PersistentChatMemoryStore(chatThreadDao, chatMessageDao));
+ }
+ return aiAssistantFactory;
+ }
+
+ private AIAssistantConfig getAIAssistantConfig(PlatformAuthorizedDTO
platformAuthorizedDTO) {
+ return AIAssistantConfig.builder()
+ .setModel(platformAuthorizedDTO.getModel())
+ .addCredentials(platformAuthorizedDTO.getCredentials())
+ .build();
+ }
+
+ private PlatformType getPlatformType(String platformName) {
+ return PlatformType.getPlatformType(platformName.toLowerCase());
+ }
+
+ private AIAssistant buildAIAssistant(PlatformAuthorizedDTO
platformAuthorizedDTO, Long threadId) {
+ return getAiAssistantFactory()
+ .create(
+
getPlatformType(platformAuthorizedDTO.getPlatformName()),
+ getAIAssistantConfig(platformAuthorizedDTO),
+ threadId);
+ }
+
+ private Boolean testAuthorization(PlatformAuthorizedDTO
platformAuthorizedDTO) {
+ AIAssistant aiAssistant = aiTestFactory.create(
+ getPlatformType(platformAuthorizedDTO.getPlatformName()),
getAIAssistantConfig(platformAuthorizedDTO));
+ try {
+ aiAssistant.ask("1+1=");
+ } catch (Exception e) {
+ throw new ApiException(ApiExceptionEnum.CREDIT_INCORRECT,
e.getMessage());
+ }
+
+ return true;
+ }
+
@Override
public List<PlatformVO> platforms() {
+ List<PlatformPO> platformPOs = platformDao.findAll();
List<PlatformVO> platforms = new ArrayList<>();
- platforms.add(new PlatformVO(1L, "OpenAI", "GPT-3.5,GPT-4o"));
- platforms.add(new PlatformVO(2L, "ChatGLM", "GPT-3.5,GPT-4o"));
+ for (PlatformPO platformPO : platformPOs) {
+ platforms.add(PlatformConverter.INSTANCE.fromPO2VO(platformPO));
+ }
return platforms;
}
@Override
public List<PlatformAuthorizedVO> authorizedPlatforms() {
List<PlatformAuthorizedVO> authorizedPlatforms = new ArrayList<>();
- authorizedPlatforms.add(new PlatformAuthorizedVO(1L, "OpenAI",
"GPT-3.5,GPT-4o"));
- authorizedPlatforms.add(new PlatformAuthorizedVO(2L, "ChatGLM",
"GPT-4o"));
+ List<PlatformAuthorizedPO> authorizedPlatformPOs =
platformAuthorizedDao.findAll();
+ for (PlatformAuthorizedPO authorizedPlatformPO :
authorizedPlatformPOs) {
+ PlatformPO platformPO =
platformDao.findById(authorizedPlatformPO.getPlatformId());
+
authorizedPlatforms.add(PlatformAuthorizedConverter.INSTANCE.fromPO2VO(authorizedPlatformPO,
platformPO));
+ }
+
return authorizedPlatforms;
}
@Override
- public PlatformVO addAuthorizedPlatform(PlatformDTO platformDTO) {
- log.info("Adding authorized platform: {}", platformDTO);
- log.info(platformDTO.getAuthCredentials().toString());
- return new PlatformVO(1L, "OpenAI", "GPT-3.5,GPT-4o");
+ public PlatformAuthorizedVO addAuthorizedPlatform(PlatformDTO platformDTO)
{
+ PlatformPO platformPO =
platformDao.findByPlatformId(platformDTO.getPlatformId());
+ if (platformPO == null) {
+ throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
+ }
+ Map<String, String> credentialSet = getStringMap(platformDTO,
platformPO);
+ List<String> models =
List.of(platformPO.getSupportModels().split(","));
+ if (models.isEmpty()) {
+ throw new ApiException(ApiExceptionEnum.MODEL_NOT_SUPPORTED);
+ }
+ PlatformAuthorizedDTO platformAuthorizedDTO =
+ new PlatformAuthorizedDTO(platformPO.getName(), credentialSet,
models.get(0));
+
+ if (!testAuthorization(platformAuthorizedDTO)) {
+ throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
+ }
+
+ PlatformAuthorizedPO platformAuthorizedPO = new PlatformAuthorizedPO();
+ platformAuthorizedPO.setCredentials(credentialSet);
+ platformAuthorizedPO.setPlatformId(platformPO.getId());
+
+ platformAuthorizedDao.saveWithCredentials(platformAuthorizedPO);
+ PlatformAuthorizedVO platformAuthorizedVO =
+
PlatformAuthorizedConverter.INSTANCE.fromPO2VO(platformAuthorizedPO,
platformPO);
+ platformAuthorizedVO.setSupportModels(platformPO.getSupportModels());
+ platformAuthorizedVO.setPlatformName(platformPO.getName());
+ return platformAuthorizedVO;
+ }
+
+ private static @NotNull Map<String, String> getStringMap(PlatformDTO
platformDTO, PlatformPO platformPO) {
+ if (platformPO == null) {
+ throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
+ }
+ Map<String, String> credentialNeed = platformPO.getCredential();
+ Map<String, String> credentialGet = platformDTO.getAuthCredentials();
+ Map<String, String> credentialSet = new HashMap<>();
+ for (String key : credentialNeed.keySet()) {
+ if (!credentialGet.containsKey(key)) {
+ throw new ApiException(ApiExceptionEnum.CREDIT_INCORRECT);
+ }
+ credentialSet.put(key, credentialGet.get(key));
+ }
+ return credentialSet;
}
@Override
public List<PlatformAuthCredentialVO> platformsAuthCredential(Long
platformId) {
- List<PlatformAuthCredentialVO> platformAuthCredentials = new
ArrayList<>();
- platformAuthCredentials.add(new PlatformAuthCredentialVO("api-key",
"API Key"));
- platformAuthCredentials.add(new PlatformAuthCredentialVO("api-secret",
"API Secret"));
- return platformAuthCredentials;
+ PlatformPO platformPO = platformDao.findByPlatformId(platformId);
+ if (platformPO == null) {
+ throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
+ }
+ List<PlatformAuthCredentialVO> platformAuthCredentialVOs = new
ArrayList<>();
+ for (String key : platformPO.getCredential().keySet()) {
+ PlatformAuthCredentialVO platformAuthCredentialVO =
+ new PlatformAuthCredentialVO(key,
platformPO.getCredential().get(key));
+ platformAuthCredentialVOs.add(platformAuthCredentialVO);
+ }
+ return platformAuthCredentialVOs;
}
@Override
- public int deleteAuthorizedPlatform(Long platformId) {
- Random random = new Random();
- int randomInt = random.nextInt();
- return randomInt % 2;
+ public boolean deleteAuthorizedPlatform(Long platformId) {
+ List<PlatformAuthorizedPO> authorizedPlatformPOs =
platformAuthorizedDao.findAll();
+ for (PlatformAuthorizedPO authorizedPlatformPO :
authorizedPlatformPOs) {
+ if (authorizedPlatformPO.getId().equals(platformId)) {
+ platformAuthorizedDao.deleteById(authorizedPlatformPO.getId());
+ return true;
+ }
+ }
+
+ throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
}
@Override
public ChatThreadVO createChatThreads(Long platformId, String model) {
-
- return new ChatThreadVO(1L, platformId, model, DateUtils.format(new
Date()));
+ PlatformAuthorizedPO platformAuthorizedPO =
platformAuthorizedDao.findByPlatformId(platformId);
+ if (platformAuthorizedPO == null) {
+ throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
+ }
+ Long userId = SessionUserHolder.getUserId();
+ PlatformPO platformPO =
platformDao.findByPlatformId(platformAuthorizedPO.getPlatformId());
+ List<String> supportModels =
List.of(platformPO.getSupportModels().split(","));
+ if (!supportModels.contains(model)) {
+ throw new ApiException(ApiExceptionEnum.MODEL_NOT_SUPPORTED);
+ }
+ ChatThreadPO chatThreadPO = new ChatThreadPO();
+ chatThreadPO.setUserId(userId);
+ chatThreadPO.setModel(model);
+ chatThreadPO.setPlatformId(platformAuthorizedPO.getId());
+ chatThreadDao.save(chatThreadPO);
+ return ChatThreadConverter.INSTANCE.fromPO2VO(chatThreadPO);
}
@Override
- public int deleteChatThreads(Long platformId, Long threadId) {
- Random random = new Random();
- int randomInt = random.nextInt();
- return randomInt % 2;
+ public boolean deleteChatThreads(Long platformId, Long threadId) {
+ Long userId = SessionUserHolder.getUserId();
+ List<ChatThreadPO> chatThreadPOS =
chatThreadDao.findAllByUserId(userId);
+ for (ChatThreadPO chatThreadPO : chatThreadPOS) {
+ if (chatThreadPO.getId().equals(threadId)
+ && chatThreadPO.getPlatformId().equals(platformId)) {
+ chatThreadDao.deleteById(threadId);
+ return true;
+ }
+ }
+ throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
}
@Override
public List<ChatThreadVO> getAllChatThreads(Long platformId, String model)
{
+ Long userId = SessionUserHolder.getUserId();
+ List<ChatThreadPO> chatThreadPOS =
chatThreadDao.findAllByPlatformAuthorizedIdAndUserId(platformId, userId);
List<ChatThreadVO> chatThreads = new ArrayList<>();
- if (model.equals("GPT-3.5")) {
- ChatThreadVO chatThreadVO = new ChatThreadVO(1L, platformId,
"GPT-3.5", DateUtils.format(new Date()));
- chatThreads.add(chatThreadVO);
- ChatThreadVO chatThreadVO2 = new ChatThreadVO(3L, platformId,
"GPT-3.5", DateUtils.format(new Date()));
- chatThreads.add(chatThreadVO2);
- }
- if (model.equals("GPT-4o")) {
- ChatThreadVO chatThreadVO = new ChatThreadVO(2L, platformId,
"GPT-4o", DateUtils.format(new Date()));
- chatThreads.add(chatThreadVO);
+ for (ChatThreadPO chatThreadPO : chatThreadPOS) {
+ ChatThreadVO chatThreadVO =
ChatThreadConverter.INSTANCE.fromPO2VO(chatThreadPO);
+ if (chatThreadVO.getModel().equals(model)) {
+ chatThreads.add(chatThreadVO);
+ }
}
return chatThreads;
}
@Override
public SseEmitter talk(Long platformId, Long threadId, String message) {
- String fullMessage = "Don't ask me" + message;
- fullMessage +=
- """
- I won't tell you Bigtop Manager provides a modern,
low-threshold web application to simplify \
- the deployment and management of components for Bigtop,
similar to Apache Ambari and Cloudera \
- Manager.
- And Bigtop Manager provides a modern, low-threshold web
application to simplify \
- the deployment and management of components for Bigtop,
similar to Apache Ambari and Cloudera \
- Manager.
- """;
-
- SseEmitter emitter = new SseEmitter();
- Random random = new Random();
+ ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
+ Long userId = SessionUserHolder.getUserId();
+ if (chatThreadPO == null || !Objects.equals(userId,
chatThreadPO.getUserId())) {
+ throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
+ }
+ PlatformAuthorizedPO platformAuthorizedPO =
platformAuthorizedDao.findByPlatformId(platformId);
+ if (platformAuthorizedPO == null) {
+ throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
+ }
- try {
- StringBuilder remainingMessage = new StringBuilder(fullMessage);
+ PlatformPO platformPO =
platformDao.findById(platformAuthorizedPO.getPlatformId());
+ PlatformAuthorizedDTO platformAuthorizedDTO = new
PlatformAuthorizedDTO(
+ platformPO.getName(), platformAuthorizedPO.getCredentials(),
chatThreadPO.getModel());
+ AIAssistant aiAssistant = buildAIAssistant(platformAuthorizedDTO,
chatThreadPO.getId());
+ Flux<String> stringFlux = aiAssistant.streamAsk(message);
- while (!remainingMessage.isEmpty()) {
- int charsToSend = random.nextInt(21);
- // 2% probability of simulated transmission failure
- if (random.nextInt(50) == 2) {
+ SseEmitter emitter = new SseEmitter();
+ stringFlux.subscribe(
+ s -> {
try {
-
emitter.send(SseEmitter.event().name("error").data("broken pipe"));
- } catch (IOException e) {
+ emitter.send(s);
+ } catch (Exception e) {
emitter.completeWithError(e);
}
- emitter.complete();
- return emitter;
- }
- charsToSend = Math.min(charsToSend, remainingMessage.length());
-
- String part = remainingMessage.substring(0, charsToSend);
- remainingMessage.delete(0, charsToSend);
-
- emitter.send(SseEmitter.event().name("message").data(part));
-
- int delay = random.nextInt(101);
- Thread.sleep(delay);
- }
- } catch (IOException | InterruptedException e) {
- emitter.completeWithError(e);
- throw new RuntimeException(e);
- }
+ },
+ Throwable::printStackTrace,
+ emitter::complete);
- emitter.complete();
+ emitter.onTimeout(emitter::complete);
return emitter;
}
@Override
public List<ChatMessageVO> history(Long platformId, Long threadId) {
List<ChatMessageVO> chatMessages = new ArrayList<>();
- Random random = new Random();
- int numberOfMessages = random.nextInt(11);
- boolean isUser = true;
-
- for (int i = 0; i < numberOfMessages; i++) {
- String sender = isUser ? "user" : "AI";
- String messageText = isUser ? "hello" : "hello, I'm GPT";
- messageText += i;
-
- ChatMessageVO message = new ChatMessageVO(sender, messageText,
DateUtils.format(new Date()));
- chatMessages.add(message);
-
- isUser = !isUser;
+ ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
+ if (chatThreadPO == null) {
+ throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
+ }
+ Long userId = SessionUserHolder.getUserId();
+ if (!chatThreadPO.getUserId().equals(userId)) {
+ throw new ApiException(ApiExceptionEnum.PERMISSION_DENIED);
+ }
+ List<ChatMessagePO> chatMessagePOs =
chatMessageDao.findAllByThreadId(threadId);
+ for (ChatMessagePO chatMessagePO : chatMessagePOs) {
+ ChatMessageVO chatMessageVO =
ChatMessageConverter.INSTANCE.fromPO2VO(chatMessagePO);
+ MessageSender sender = chatMessageVO.getSender();
+ if (sender == null) {
+ continue;
+ }
+ if (sender.equals(MessageSender.USER) ||
sender.equals(MessageSender.AI)) {
+ chatMessages.add(chatMessageVO);
+ }
}
return chatMessages;
}
diff --git a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
index 94a4ab5..23d3846 100644
--- a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
+++ b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
@@ -310,6 +310,66 @@ CREATE TABLE `stage`
KEY `idx_job_id` (`job_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+CREATE TABLE `llm_platform`
+(
+ `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(255) NOT NULL,
+ `credential` JSON DEFAULT NULL,
+ `support_models` VARCHAR(255) DEFAULT NULL,
+ `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
+ `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
+ `create_by` BIGINT DEFAULT NULL,
+ `update_by` BIGINT DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE `llm_platform_authorized`
+(
+ `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
+ `platform_id` BIGINT(20) UNSIGNED NOT NULL,
+ `credentials` JSON NOT NULL,
+ `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
+ `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
+ `create_by` BIGINT DEFAULT NULL,
+ `update_by` BIGINT DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `idx_platform_id` (`platform_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE `llm_chat_thread`
+(
+ `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
+ `platform_id` BIGINT(20) UNSIGNED NOT NULL,
+ `user_id` BIGINT(20) UNSIGNED NOT NULL,
+ `model` VARCHAR(255) NOT NULL,
+ `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
+ `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
+ `create_by` BIGINT DEFAULT NULL,
+ `update_by` BIGINT DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `idx_platform_id` (`platform_id`),
+ KEY `idx_user_id` (`user_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE `llm_chat_message`
+(
+ `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
+ `thread_id` BIGINT(20) UNSIGNED NOT NULL,
+ `user_id` BIGINT(20) UNSIGNED NOT NULL,
+ `message` TEXT NOT NULL,
+ `sender` VARCHAR(50) NOT NULL,
+ `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
+ `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`),
+ KEY `idx_thread_id` (`thread_id`),
+ KEY `idx_user_id` (`user_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
-- Adding default admin user
INSERT INTO bigtop_manager.user (id, create_time, update_time, nickname,
password, status, username)
-VALUES (1, now(), now(), 'Administrator', '21232f297a57a5a743894a0e4a801fc3',
true, 'admin');
\ No newline at end of file
+VALUES (1, now(), now(), 'Administrator', '21232f297a57a5a743894a0e4a801fc3',
true, 'admin');
+
+-- Adding default ai chat platform
+INSERT INTO bigtop_manager.llm_platform (id,credential,NAME,support_models)
+VALUES
+(1,'{"apiKey": "API
Key"}','OpenAI','gpt-3.5-turbo,gpt-4,gpt-4o,gpt-3.5-turbo-16k,gpt-4-turbo-preview,gpt-4-32k,gpt-4o-mini');
\ No newline at end of file
diff --git
a/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties
b/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties
index 5ae40e7..051df6d 100644
--- a/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties
+++ b/bigtop-manager-server/src/main/resources/i18n/messages_en_US.properties
@@ -50,3 +50,10 @@ config.not.found=Config not exist
command.not.found=Command not found for level [{0}]
command.not.supported=Command [{0}] not supported for level [{1}]
+
+platform.not.found=platform not found
+platform.not.authorized=platform not authorized
+permission.denied=permission denied
+credit.incorrect=credit incorrect
+model.not.supported=model not supported
+chat.thread.not.found=chat thread not found
diff --git
a/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties
b/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties
index a45ff71..e4c647f 100644
--- a/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties
+++ b/bigtop-manager-server/src/main/resources/i18n/messages_zh_CN.properties
@@ -50,3 +50,10 @@ config.not.found=配置不存在
command.not.found=不存在 [{0}] 级别的命令
command.not.supported=[{0}] 命令在 [{1}] 级别下不支持
+
+platform.not.found=平台不存在
+platform.not.authorized=平台未配置
+permission.denied=权限被拒绝
+credit.incorrect=凭证不正确
+model.not.supported=模型不支持
+chat.thread.not.found=线程不存在
diff --git
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/AIChatControllerTest.java
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/AIChatControllerTest.java
index e271b6d..5c434c4 100644
---
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/AIChatControllerTest.java
+++
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/AIChatControllerTest.java
@@ -18,6 +18,12 @@
*/
package org.apache.bigtop.manager.server.controller;
+import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
+import org.apache.bigtop.manager.server.model.req.PlatformReq;
+import org.apache.bigtop.manager.server.model.vo.ChatMessageVO;
+import org.apache.bigtop.manager.server.model.vo.ChatThreadVO;
+import org.apache.bigtop.manager.server.model.vo.PlatformAuthCredentialVO;
+import org.apache.bigtop.manager.server.model.vo.PlatformAuthorizedVO;
import org.apache.bigtop.manager.server.model.vo.PlatformVO;
import org.apache.bigtop.manager.server.service.AIChatService;
import org.apache.bigtop.manager.server.utils.MessageSourceUtils;
@@ -32,12 +38,15 @@ import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
@@ -64,14 +73,128 @@ class AIChatControllerTest {
@Test
void getAllPlatforms() {
-
List<PlatformVO> platforms = new ArrayList<>();
when(chatService.platforms()).thenReturn(platforms);
ResponseEntity<List<PlatformVO>> response = chatController.platforms();
+ assertTrue(response.isSuccess());
assertEquals(platforms, response.getData());
}
- // TODO
+ @Test
+ void getAuthorizedPlatforms() {
+ List<PlatformAuthorizedVO> authorizedPlatforms = new ArrayList<>();
+
when(chatService.authorizedPlatforms()).thenReturn(authorizedPlatforms);
+
+ ResponseEntity<List<PlatformAuthorizedVO>> response =
chatController.authorizedPlatforms();
+
+ assertTrue(response.isSuccess());
+ assertEquals(authorizedPlatforms, response.getData());
+ }
+
+ @Test
+ void platformsAuthCredential() {
+ Long platformId = 1L;
+ List<PlatformAuthCredentialVO> credentials = new ArrayList<>();
+
when(chatService.platformsAuthCredential(platformId)).thenReturn(credentials);
+
+ ResponseEntity<List<PlatformAuthCredentialVO>> response =
chatController.platformsAuthCredential(platformId);
+
+ assertTrue(response.isSuccess());
+ assertEquals(credentials, response.getData());
+ }
+
+ @Test
+ void addAuthorizedPlatform() {
+ PlatformReq platformReq = new PlatformReq();
+ PlatformAuthorizedVO authorizedVO = new PlatformAuthorizedVO();
+
+
when(chatService.addAuthorizedPlatform(any(PlatformDTO.class))).thenReturn(authorizedVO);
+
+ ResponseEntity<PlatformAuthorizedVO> response =
chatController.addAuthorizedPlatform(platformReq);
+
+ assertTrue(response.isSuccess());
+ assertEquals(authorizedVO, response.getData());
+ }
+
+ @Test
+ void deleteAuthorizedPlatform() {
+ Long platformId = 1L;
+
when(chatService.deleteAuthorizedPlatform(platformId)).thenReturn(true);
+
+ ResponseEntity<Boolean> response =
chatController.deleteAuthorizedPlatform(platformId);
+
+ assertTrue(response.isSuccess());
+ assertEquals(true, response.getData());
+ }
+
+ @Test
+ void createChatThreads() {
+ Long platformId = 1L;
+ String model = "model1";
+ ChatThreadVO chatThread = new ChatThreadVO();
+
+ when(chatService.createChatThreads(eq(platformId),
eq(model))).thenReturn(chatThread);
+
+ ResponseEntity<ChatThreadVO> response =
chatController.createChatThreads(platformId, model);
+
+ assertTrue(response.isSuccess());
+ assertEquals(chatThread, response.getData());
+ }
+
+ @Test
+ void deleteChatThreads() {
+ Long platformId = 1L;
+ Long threadId = 1L;
+
+ when(chatService.deleteChatThreads(platformId,
threadId)).thenReturn(true);
+
+ ResponseEntity<Boolean> response =
chatController.deleteChatThreads(platformId, threadId);
+
+ assertTrue(response.isSuccess());
+ assertEquals(true, response.getData());
+ }
+
+ @Test
+ void getAllChatThreads() {
+ Long platformId = 1L;
+ String model = "model1";
+ List<ChatThreadVO> chatThreads = new ArrayList<>();
+
+ when(chatService.getAllChatThreads(eq(platformId),
eq(model))).thenReturn(chatThreads);
+
+ ResponseEntity<List<ChatThreadVO>> response =
chatController.getAllChatThreads(platformId, model);
+
+ assertTrue(response.isSuccess());
+ assertEquals(chatThreads, response.getData());
+ }
+
+ @Test
+ void talk() {
+ Long platformId = 1L;
+ Long threadId = 1L;
+ String message = "Hello";
+
+ SseEmitter emitter = new SseEmitter();
+ when(chatService.talk(eq(platformId), eq(threadId),
eq(message))).thenReturn(emitter);
+
+ SseEmitter result = chatController.talk(platformId, threadId, message);
+
+ assertEquals(emitter, result);
+ }
+
+ @Test
+ void history() {
+ Long platformId = 1L;
+ Long threadId = 1L;
+ List<ChatMessageVO> history = new ArrayList<>();
+
+ when(chatService.history(platformId, threadId)).thenReturn(history);
+
+ ResponseEntity<List<ChatMessageVO>> response =
chatController.history(platformId, threadId);
+
+ assertTrue(response.isSuccess());
+ assertEquals(history, response.getData());
+ }
}