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());

Reply via email to