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 6216d66 BIGTOP-4248: Refactor APIs for Chatbot (#91)
6216d66 is described below
commit 6216d6667665a7d3f85e229709c8295cfb4a43ba
Author: haopeng <[email protected]>
AuthorDate: Wed Oct 23 15:39:28 2024 +0800
BIGTOP-4248: Refactor APIs for Chatbot (#91)
---
.../apache/bigtop/manager/dao/po/ChatThreadPO.java | 9 +-
.../server/controller/ChatbotController.java | 44 +++++-----
.../manager/server/enums/ApiExceptionEnum.java | 5 +-
.../bigtop/manager/server/enums/LocaleKeys.java | 3 +
.../model/converter/ChatThreadConverter.java | 3 +
.../manager/server/model/dto/ChatThreadDTO.java | 2 +
.../manager/server/model/vo/ChatThreadVO.java | 10 +--
.../manager/server/service/ChatbotService.java | 13 +--
.../server/service/impl/ChatbotServiceImpl.java | 97 ++++++++++++++++------
.../server/service/impl/LLMConfigServiceImpl.java | 11 +--
.../src/main/resources/ddl/MySQL-DDL-CREATE.sql | 4 +-
.../main/resources/ddl/PostgreSQL-DDL-CREATE.sql | 6 +-
.../main/resources/i18n/messages_en_US.properties | 15 ++--
.../main/resources/i18n/messages_zh_CN.properties | 3 +
.../server/controller/ChatbotControllerTest.java | 34 +++-----
15 files changed, 153 insertions(+), 106 deletions(-)
diff --git
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
index 11ebef6..d5f9eb1 100644
---
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
+++
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
@@ -34,9 +34,6 @@ public class ChatThreadPO extends BasePO implements
Serializable {
@Column(name = "id")
private Long id;
- @Column(name = "model", nullable = false, length = 255)
- private String model;
-
@Column(name = "thread_info")
private String threadInfo;
@@ -46,9 +43,9 @@ public class ChatThreadPO extends BasePO implements
Serializable {
@Column(name = "auth_id", nullable = false)
private Long authId;
- @Column(name = "platform_id", nullable = false)
- private Long platformId;
-
@Column(name = "is_deleted")
private Boolean isDeleted;
+
+ @Column(name = "name")
+ private String name;
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/ChatbotController.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/ChatbotController.java
index 999e528..993563e 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/ChatbotController.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/ChatbotController.java
@@ -18,6 +18,8 @@
*/
package org.apache.bigtop.manager.server.controller;
+import org.apache.bigtop.manager.server.model.converter.ChatThreadConverter;
+import org.apache.bigtop.manager.server.model.dto.ChatThreadDTO;
import org.apache.bigtop.manager.server.model.req.ChatbotMessageReq;
import org.apache.bigtop.manager.server.model.req.ChatbotThreadReq;
import org.apache.bigtop.manager.server.model.vo.ChatMessageVO;
@@ -50,40 +52,42 @@ public class ChatbotController {
private ChatbotService chatbotService;
@Operation(summary = "new thread", description = "Create a chat threads")
- @PostMapping("/auth-platforms/{authId}/threads")
- public ResponseEntity<ChatThreadVO> createChatThreads(@PathVariable Long
authId) {
- return ResponseEntity.success(chatbotService.createChatThreads(authId,
""));
+ @PostMapping("/threads")
+ public ResponseEntity<ChatThreadVO> createChatThread(@RequestBody
ChatbotThreadReq chatbotThreadReq) {
+ ChatThreadDTO chatThreadDTO =
ChatThreadConverter.INSTANCE.fromReq2DTO(chatbotThreadReq);
+ return
ResponseEntity.success(chatbotService.createChatThread(chatThreadDTO));
}
@Operation(summary = "update thread", description = "Update a chat
threads")
- @PutMapping("/auth-platforms/{authId}/threads")
- public ResponseEntity<ChatThreadVO> updateChatThreads(
- @PathVariable Long authId, @RequestBody ChatbotThreadReq
chatbotThreadReq) {
- return ResponseEntity.success(chatbotService.createChatThreads(authId,
""));
+ @PutMapping("/threads/{threadId}")
+ public ResponseEntity<ChatThreadVO> updateChatThread(
+ @PathVariable Long threadId, @RequestBody ChatbotThreadReq
chatbotThreadReq) {
+ ChatThreadDTO chatThreadDTO =
ChatThreadConverter.INSTANCE.fromReq2DTO(chatbotThreadReq);
+ chatThreadDTO.setId(threadId);
+ return
ResponseEntity.success(chatbotService.updateChatThread(chatThreadDTO));
}
@Operation(summary = "delete thread", description = "Delete a chat
threads")
- @DeleteMapping("/auth-platforms/{authId}/threads/{threadId}")
- public ResponseEntity<Boolean> deleteChatThreads(@PathVariable Long
authId, @PathVariable Long threadId) {
- return ResponseEntity.success(chatbotService.deleteChatThreads(authId,
threadId));
+ @DeleteMapping("/threads/{threadId}")
+ public ResponseEntity<Boolean> deleteChatThread(@PathVariable Long
threadId) {
+ return
ResponseEntity.success(chatbotService.deleteChatThread(threadId));
}
@Operation(summary = "get threads", description = "Get all threads of a
auth platform")
- @GetMapping("/auth-platforms/{authId}/threads")
- public ResponseEntity<List<ChatThreadVO>> getAllChatThreads(@PathVariable
Long authId) {
- return ResponseEntity.success(chatbotService.getAllChatThreads(authId,
""));
+ @GetMapping("/threads")
+ public ResponseEntity<List<ChatThreadVO>> getAllChatThreads() {
+ return ResponseEntity.success(chatbotService.getAllChatThreads());
}
@Operation(summary = "talk", description = "Talk with Chatbot")
- @PostMapping("/auth-platforms/{authId}/threads/{threadId}/talk")
- public SseEmitter talk(
- @PathVariable Long authId, @PathVariable Long threadId,
@RequestBody ChatbotMessageReq messageReq) {
- return chatbotService.talk(authId, threadId, messageReq.getMessage());
+ @PostMapping("/threads/{threadId}/talk")
+ public SseEmitter talk(@PathVariable Long threadId, @RequestBody
ChatbotMessageReq messageReq) {
+ return chatbotService.talk(threadId, messageReq.getMessage());
}
@Operation(summary = "history", description = "Get chat records")
- @GetMapping("/auth-platforms/{authId}/threads/{threadId}/history")
- public ResponseEntity<List<ChatMessageVO>> history(@PathVariable Long
authId, @PathVariable Long threadId) {
- return ResponseEntity.success(chatbotService.history(authId,
threadId));
+ @GetMapping("/threads/{threadId}/history")
+ public ResponseEntity<List<ChatMessageVO>> history(@PathVariable Long
threadId) {
+ return ResponseEntity.success(chatbotService.history(threadId));
}
}
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 ce16778..7b4cf54 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
@@ -62,13 +62,16 @@ public enum ApiExceptionEnum {
COMMAND_NOT_FOUND(18000, LocaleKeys.COMMAND_NOT_FOUND),
COMMAND_NOT_SUPPORTED(18000, LocaleKeys.COMMAND_NOT_SUPPORTED),
- // Chatbot Exceptions -- 19000 ~ 19999
+ // LLM 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),
+ NO_PLATFORM_IN_USE(19006, LocaleKeys.NO_PLATFORM_IN_USE),
+ PLATFORM_NOT_IN_USE(19007, LocaleKeys.PLATFORM_NOT_IN_USE),
+ PLATFORM_IS_ACTIVE(19008, LocaleKeys.PLATFORM_IS_ACTIVE),
// File Exceptions -- 30000 ~ 30999
FILE_UPLOAD_FAILED(30000, LocaleKeys.FILE_UPLOAD_FAILED),
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 87de8d5..2589290 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
@@ -64,6 +64,9 @@ public enum LocaleKeys {
CREDIT_INCORRECT("credit.incorrect"),
MODEL_NOT_SUPPORTED("model.not.supported"),
CHAT_THREAD_NOT_FOUND("chat.thread.not.found"),
+ NO_PLATFORM_IN_USE("no.platform.in.use"),
+ PLATFORM_NOT_IN_USE("platform.not.in.use"),
+ PLATFORM_IS_ACTIVE("platform.is.active"),
FILE_UPLOAD_FAILED("file.upload.failed"),
;
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatThreadConverter.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatThreadConverter.java
index 5da0b64..d22b346 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatThreadConverter.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatThreadConverter.java
@@ -21,6 +21,7 @@ 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.ChatThreadDTO;
+import org.apache.bigtop.manager.server.model.req.ChatbotThreadReq;
import org.apache.bigtop.manager.server.model.vo.ChatThreadVO;
import org.mapstruct.Mapper;
@@ -41,4 +42,6 @@ public interface ChatThreadConverter {
@Mapping(source = "threadInfo", target = "threadInfo", qualifiedByName =
"jsonString2Map")
ChatThreadDTO fromPO2DTO(ChatThreadPO chatThreadPO);
+
+ ChatThreadDTO fromReq2DTO(ChatbotThreadReq chatbotThreadReq);
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ChatThreadDTO.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ChatThreadDTO.java
index dfb8943..bd847b0 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ChatThreadDTO.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ChatThreadDTO.java
@@ -30,6 +30,8 @@ public class ChatThreadDTO {
private Long authId;
+ private String name;
+
private Map<String, String> authCredentials;
private Map<String, String> threadInfo;
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 9232b01..ce49396 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
@@ -28,19 +28,11 @@ public class ChatThreadVO {
private Long platformId;
- private String model;
+ private String name;
private String createTime;
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;
- }
-
public ChatThreadVO() {}
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/ChatbotService.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/ChatbotService.java
index 360f7e3..b3c2d61 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/ChatbotService.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/ChatbotService.java
@@ -18,6 +18,7 @@
*/
package org.apache.bigtop.manager.server.service;
+import org.apache.bigtop.manager.server.model.dto.ChatThreadDTO;
import org.apache.bigtop.manager.server.model.vo.ChatMessageVO;
import org.apache.bigtop.manager.server.model.vo.ChatThreadVO;
@@ -27,13 +28,15 @@ import java.util.List;
public interface ChatbotService {
- ChatThreadVO createChatThreads(Long authId, String model);
+ ChatThreadVO createChatThread(ChatThreadDTO chatThreadDTO);
- boolean deleteChatThreads(Long authId, Long threadId);
+ boolean deleteChatThread(Long threadId);
- List<ChatThreadVO> getAllChatThreads(Long platformId, String model);
+ List<ChatThreadVO> getAllChatThreads();
- SseEmitter talk(Long authId, Long threadId, String message);
+ SseEmitter talk(Long threadId, String message);
- List<ChatMessageVO> history(Long platformId, Long threadId);
+ List<ChatMessageVO> history(Long threadId);
+
+ ChatThreadVO updateChatThread(ChatThreadDTO chatThreadDTO);
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
index 962367b..7a58422 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
@@ -34,6 +34,7 @@ import
org.apache.bigtop.manager.dao.repository.ChatMessageDao;
import org.apache.bigtop.manager.dao.repository.ChatThreadDao;
import org.apache.bigtop.manager.dao.repository.PlatformDao;
import org.apache.bigtop.manager.server.enums.ApiExceptionEnum;
+import org.apache.bigtop.manager.server.enums.AuthPlatformStatus;
import org.apache.bigtop.manager.server.exception.ApiException;
import org.apache.bigtop.manager.server.holder.SessionUserHolder;
import org.apache.bigtop.manager.server.model.converter.AuthPlatformConverter;
@@ -75,6 +76,16 @@ public class ChatbotServiceImpl implements ChatbotService {
private AIAssistantFactory aiAssistantFactory;
+ private static final int CHAT_THREAD_NAME_LENGTH = 100;
+
+ public static String getNameFromMessage(String input) {
+ if (input == null || input.length() <= CHAT_THREAD_NAME_LENGTH) {
+ return input;
+ } else {
+ return input.substring(0, CHAT_THREAD_NAME_LENGTH);
+ }
+ }
+
public AIAssistantFactory getAIAssistantFactory() {
if (aiAssistantFactory == null) {
aiAssistantFactory =
@@ -83,6 +94,16 @@ public class ChatbotServiceImpl implements ChatbotService {
return aiAssistantFactory;
}
+ private AuthPlatformPO getActiveAuthPlatform() {
+ List<AuthPlatformPO> authPlatformPOS = authPlatformDao.findAll();
+ for (AuthPlatformPO authPlatformPO : authPlatformPOS) {
+ if (AuthPlatformStatus.isActive(authPlatformPO.getStatus())) {
+ return authPlatformPO;
+ }
+ }
+ return null;
+ }
+
private AIAssistantConfig getAIAssistantConfig(
String model, Map<String, String> credentials, Map<String, String>
configs) {
return AIAssistantConfig.builder()
@@ -108,35 +129,30 @@ public class ChatbotServiceImpl implements ChatbotService
{
}
@Override
- public ChatThreadVO createChatThreads(Long authId, String model) {
- AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
+ public ChatThreadVO createChatThread(ChatThreadDTO chatThreadDTO) {
+ AuthPlatformPO authPlatformPO = getActiveAuthPlatform();
if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
- throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
+ throw new ApiException(ApiExceptionEnum.NO_PLATFORM_IN_USE);
}
AuthPlatformDTO authPlatformDTO =
AuthPlatformConverter.INSTANCE.fromPO2DTO(authPlatformPO);
Long userId = SessionUserHolder.getUserId();
PlatformPO platformPO =
platformDao.findById(authPlatformPO.getPlatformId());
- List<String> supportModels =
List.of(platformPO.getSupportModels().split(","));
- if (!supportModels.contains(model)) {
- throw new ApiException(ApiExceptionEnum.MODEL_NOT_SUPPORTED);
- }
- ChatThreadDTO chatThreadDTO = new ChatThreadDTO();
+
chatThreadDTO.setPlatformId(platformPO.getId());
chatThreadDTO.setAuthId(authPlatformPO.getId());
- AIAssistant aiAssistant =
- buildAIAssistant(platformPO.getName(), model,
authPlatformDTO.getAuthCredentials(), null, null);
+ AIAssistant aiAssistant = buildAIAssistant(
+ platformPO.getName(), authPlatformDTO.getModel(),
authPlatformDTO.getAuthCredentials(), null, null);
Map<String, String> threadInfo = aiAssistant.createThread();
chatThreadDTO.setThreadInfo(threadInfo);
ChatThreadPO chatThreadPO =
ChatThreadConverter.INSTANCE.fromDTO2PO(chatThreadDTO);
chatThreadPO.setUserId(userId);
- chatThreadPO.setModel(model);
chatThreadDao.save(chatThreadPO);
return ChatThreadConverter.INSTANCE.fromPO2VO(chatThreadPO);
}
@Override
- public boolean deleteChatThreads(Long authId, Long threadId) {
+ public boolean deleteChatThread(Long threadId) {
ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
if (chatThreadPO == null || chatThreadPO.getIsDeleted()) {
throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
@@ -145,45 +161,57 @@ public class ChatbotServiceImpl implements ChatbotService
{
chatThreadPO.setIsDeleted(true);
chatThreadDao.partialUpdateById(chatThreadPO);
List<ChatMessagePO> chatMessagePOS =
chatMessageDao.findAllByThreadId(threadId);
- for (ChatMessagePO chatMessagePO : chatMessagePOS) {
- chatMessagePO.setIsDeleted(true);
- chatMessageDao.partialUpdateById(chatMessagePO);
- }
+ chatMessagePOS.forEach(chatMessagePO ->
chatMessagePO.setIsDeleted(true));
+ chatMessageDao.partialUpdateByIds(chatMessagePOS);
return true;
}
@Override
- public List<ChatThreadVO> getAllChatThreads(Long authId, String model) {
+ public List<ChatThreadVO> getAllChatThreads() {
+ AuthPlatformPO authPlatformPO = getActiveAuthPlatform();
+ if (authPlatformPO == null) {
+ throw new ApiException(ApiExceptionEnum.NO_PLATFORM_IN_USE);
+ }
+ Long authId = authPlatformPO.getId();
Long userId = SessionUserHolder.getUserId();
List<ChatThreadPO> chatThreadPOS =
chatThreadDao.findAllByAuthIdAndUserId(authId, userId);
List<ChatThreadVO> chatThreads = new ArrayList<>();
for (ChatThreadPO chatThreadPO : chatThreadPOS) {
- ChatThreadVO chatThreadVO =
ChatThreadConverter.INSTANCE.fromPO2VO(chatThreadPO);
- if (chatThreadVO.getModel().equals(model)) {
- chatThreads.add(chatThreadVO);
+ if (chatThreadPO.getIsDeleted()) {
+ continue;
}
+ ChatThreadVO chatThreadVO =
ChatThreadConverter.INSTANCE.fromPO2VO(chatThreadPO);
+ chatThreads.add(chatThreadVO);
}
return chatThreads;
}
@Override
- public SseEmitter talk(Long authId, Long threadId, String message) {
+ public SseEmitter talk(Long threadId, String message) {
ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
Long userId = SessionUserHolder.getUserId();
if (!Objects.equals(userId, chatThreadPO.getUserId()) ||
chatThreadPO.getIsDeleted()) {
throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
}
- AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
- if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
- throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
+ AuthPlatformPO authPlatformPO = getActiveAuthPlatform();
+ if (authPlatformPO == null
+ || authPlatformPO.getIsDeleted()
+ || !authPlatformPO.getId().equals(chatThreadPO.getAuthId())) {
+ throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_IN_USE);
}
+
+ if (chatThreadPO.getName() == null) {
+ chatThreadPO.setName(getNameFromMessage(message));
+ chatThreadDao.partialUpdateById(chatThreadPO);
+ }
+
AuthPlatformDTO authPlatformDTO =
AuthPlatformConverter.INSTANCE.fromPO2DTO(authPlatformPO);
ChatThreadDTO chatThreadDTO =
ChatThreadConverter.INSTANCE.fromPO2DTO(chatThreadPO);
PlatformPO platformPO =
platformDao.findById(authPlatformPO.getPlatformId());
AIAssistant aiAssistant = buildAIAssistant(
platformPO.getName(),
- chatThreadPO.getModel(),
+ authPlatformDTO.getModel(),
authPlatformDTO.getAuthCredentials(),
chatThreadPO.getId(),
chatThreadDTO.getThreadInfo());
@@ -206,7 +234,7 @@ public class ChatbotServiceImpl implements ChatbotService {
}
@Override
- public List<ChatMessageVO> history(Long authId, Long threadId) {
+ public List<ChatMessageVO> history(Long threadId) {
List<ChatMessageVO> chatMessages = new ArrayList<>();
ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
if (chatThreadPO == null || chatThreadPO.getIsDeleted()) {
@@ -229,4 +257,21 @@ public class ChatbotServiceImpl implements ChatbotService {
}
return chatMessages;
}
+
+ @Override
+ public ChatThreadVO updateChatThread(ChatThreadDTO chatThreadDTO) {
+ ChatThreadPO chatThreadPO =
chatThreadDao.findById(chatThreadDTO.getId());
+ if (chatThreadPO == null || chatThreadPO.getIsDeleted()) {
+ throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
+ }
+ Long userId = SessionUserHolder.getUserId();
+ if (!chatThreadPO.getUserId().equals(userId)) {
+ throw new ApiException(ApiExceptionEnum.PERMISSION_DENIED);
+ }
+
+ chatThreadPO.setName(chatThreadDTO.getName());
+ chatThreadDao.partialUpdateById(chatThreadPO);
+
+ return ChatThreadConverter.INSTANCE.fromPO2VO(chatThreadPO);
+ }
}
diff --git
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/LLMConfigServiceImpl.java
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/LLMConfigServiceImpl.java
index 9e5bb78..fabbff7 100644
---
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/LLMConfigServiceImpl.java
+++
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/LLMConfigServiceImpl.java
@@ -207,6 +207,10 @@ public class LLMConfigServiceImpl implements
LLMConfigService {
throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
}
+ if (AuthPlatformStatus.isActive(authPlatformPO.getStatus())) {
+ throw new ApiException(ApiExceptionEnum.PLATFORM_IS_ACTIVE);
+ }
+
authPlatformPO.setIsDeleted(true);
authPlatformDao.partialUpdateById(authPlatformPO);
@@ -274,10 +278,7 @@ public class LLMConfigServiceImpl implements
LLMConfigService {
authPlatformPO.setName(authPlatformDTO.getName());
authPlatformPO.setDesc(authPlatformDTO.getDesc());
- if (!authPlatformPO.getModel().equals(authPlatformDTO.getModel())) {
- authPlatformPO.setStatus(AuthPlatformStatus.UNAVAILABLE.getCode());
- }
- authPlatformPO.setModel(authPlatformDTO.getModel());
+
authPlatformDao.partialUpdateById(authPlatformPO);
return AuthPlatformConverter.INSTANCE.fromPO2VO(
@@ -311,9 +312,9 @@ public class LLMConfigServiceImpl implements
LLMConfigService {
AuthPlatformStatus authPlatformStatus =
AuthPlatformStatus.fromCode(authPlatformPO.getStatus());
if (authPlatformStatus.equals(AuthPlatformStatus.ACTIVE)) {
authPlatformPO.setStatus(AuthPlatformStatus.AVAILABLE.getCode());
+ authPlatformDao.partialUpdateById(authPlatformPO);
return true;
}
- authPlatformPO.setStatus(authPlatformStatus.getCode());
return true;
}
}
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 20d1bb0..aee5d2a 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
@@ -353,18 +353,16 @@ CREATE TABLE `llm_chat_thread`
(
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`auth_id` BIGINT(20) UNSIGNED NOT NULL,
- `platform_id` BIGINT(20) UNSIGNED NOT NULL,
`user_id` BIGINT(20) UNSIGNED NOT NULL,
- `model` VARCHAR(255) NOT NULL,
`is_deleted` TINYINT(1) DEFAULT 0 NULL,
`thread_info` TEXT DEFAULT NULL,
+ `name` 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`),
KEY `idx_auth_id` (`auth_id`),
- KEY `idx_platform_id` (`platform_id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
diff --git
a/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
b/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
index ab05807..4ed54fd 100644
--- a/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
+++ b/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
@@ -364,11 +364,10 @@ CREATE INDEX idx_authorized_platform_id ON
llm_auth_platform (platform_id);
CREATE TABLE llm_chat_thread
(
id BIGINT CHECK (id > 0) NOT NULL GENERATED ALWAYS AS
IDENTITY,
- auth_id BIGINT CHECK (auth_id > 0) NOT NULL,
- platform_id BIGINT CHECK (platform_id > 0) NOT NULL,
+ auth_id BIGINT CHECK (auth_id > 0) NOT NULL,
user_id BIGINT CHECK (user_id > 0) NOT NULL,
- model VARCHAR(255) NOT NULL,
thread_info TEXT DEFAULT NULL,
+ name VARCHAR(255) DEFAULT NULL,
is_deleted BOOLEAN DEFAULT FALSE,
create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP /* ON UPDATE
CURRENT_TIMESTAMP */,
@@ -378,7 +377,6 @@ CREATE TABLE llm_chat_thread
);
CREATE INDEX idx_chatthread_auth_id ON llm_chat_thread (auth_id);
-CREATE INDEX idx_chatthread_platform_id ON llm_chat_thread (platform_id);
CREATE INDEX idx_chatthread_user_id ON llm_chat_thread (user_id);
CREATE TABLE llm_chat_message
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 b52003b..df9389a 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
@@ -52,11 +52,14 @@ 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
+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
+no.platform.in.use=No platform currently in use
+platform.not.in.use=Corresponding platform not use
+platform.is.active=The platform is active
file.upload.failed=File upload failed, please check server log
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 d7f6343..9ca147d 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
@@ -58,5 +58,8 @@ permission.denied=权限被拒绝
credit.incorrect=凭证不正确
model.not.supported=模型不支持
chat.thread.not.found=线程不存在
+no.platform.in.use=没有正在使用的平台
+platform.not.in.use=对应的平台未使用
+platform.is.active=平台正在使用
file.upload.failed=文件上传失败,请查看服务器日志
diff --git
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/ChatbotControllerTest.java
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/ChatbotControllerTest.java
index 18936d5..71082b7 100644
---
a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/ChatbotControllerTest.java
+++
b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/controller/ChatbotControllerTest.java
@@ -19,6 +19,7 @@
package org.apache.bigtop.manager.server.controller;
import org.apache.bigtop.manager.server.model.req.ChatbotMessageReq;
+import org.apache.bigtop.manager.server.model.req.ChatbotThreadReq;
import org.apache.bigtop.manager.server.model.vo.ChatMessageVO;
import org.apache.bigtop.manager.server.model.vo.ChatThreadVO;
import org.apache.bigtop.manager.server.service.ChatbotService;
@@ -68,27 +69,23 @@ class ChatbotControllerTest {
}
@Test
- void createChatThreads() {
- Long platformId = 1L;
- String model = "";
+ void createChatThread() {
ChatThreadVO chatThread = new ChatThreadVO();
+ when(chatbotService.createChatThread(any())).thenReturn(chatThread);
- when(chatbotService.createChatThreads(eq(platformId),
eq(model))).thenReturn(chatThread);
-
- ResponseEntity<ChatThreadVO> response =
chatbotController.createChatThreads(platformId);
+ ResponseEntity<ChatThreadVO> response =
chatbotController.createChatThread(new ChatbotThreadReq());
assertTrue(response.isSuccess());
assertEquals(chatThread, response.getData());
}
@Test
- void deleteChatThreads() {
- Long platformId = 1L;
+ void deleteChatThread() {
Long threadId = 1L;
- when(chatbotService.deleteChatThreads(platformId,
threadId)).thenReturn(true);
+ when(chatbotService.deleteChatThread(threadId)).thenReturn(true);
- ResponseEntity<Boolean> response =
chatbotController.deleteChatThreads(platformId, threadId);
+ ResponseEntity<Boolean> response =
chatbotController.deleteChatThread(threadId);
assertTrue(response.isSuccess());
assertEquals(true, response.getData());
@@ -96,13 +93,11 @@ class ChatbotControllerTest {
@Test
void getAllChatThreads() {
- Long platformId = 1L;
- String model = "";
List<ChatThreadVO> chatThreads = new ArrayList<>();
- when(chatbotService.getAllChatThreads(eq(platformId),
eq(model))).thenReturn(chatThreads);
+ when(chatbotService.getAllChatThreads()).thenReturn(chatThreads);
- ResponseEntity<List<ChatThreadVO>> response =
chatbotController.getAllChatThreads(platformId);
+ ResponseEntity<List<ChatThreadVO>> response =
chatbotController.getAllChatThreads();
assertTrue(response.isSuccess());
assertEquals(chatThreads, response.getData());
@@ -110,29 +105,26 @@ class ChatbotControllerTest {
@Test
void talk() {
- Long platformId = 1L;
Long threadId = 1L;
ChatbotMessageReq messageReq = new ChatbotMessageReq();
messageReq.setMessage("Hello");
SseEmitter emitter = new SseEmitter();
- when(chatbotService.talk(eq(platformId), eq(threadId),
eq(messageReq.getMessage())))
- .thenReturn(emitter);
+ when(chatbotService.talk(eq(threadId),
eq(messageReq.getMessage()))).thenReturn(emitter);
- SseEmitter result = chatbotController.talk(platformId, threadId,
messageReq);
+ SseEmitter result = chatbotController.talk(threadId, messageReq);
assertEquals(emitter, result);
}
@Test
void history() {
- Long platformId = 1L;
Long threadId = 1L;
List<ChatMessageVO> history = new ArrayList<>();
- when(chatbotService.history(platformId, threadId)).thenReturn(history);
+ when(chatbotService.history(threadId)).thenReturn(history);
- ResponseEntity<List<ChatMessageVO>> response =
chatbotController.history(platformId, threadId);
+ ResponseEntity<List<ChatMessageVO>> response =
chatbotController.history(threadId);
assertTrue(response.isSuccess());
assertEquals(history, response.getData());