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 02ca841  BIGTOP-4244: Separate LLM Config and refactor APIs (#85)
02ca841 is described below

commit 02ca841eab48c802a3a2e6b19ca5f2e581dba87e
Author: haopeng <[email protected]>
AuthorDate: Sun Oct 20 17:11:50 2024 +0800

    BIGTOP-4244: Separate LLM Config and refactor APIs (#85)
---
 .../bigtop/manager/dao/po/AuthPlatformPO.java      |  12 ++
 .../server/controller/ChatbotController.java       |  57 ++----
 ...botController.java => LLMConfigController.java} |  79 ++++---
 .../manager/server/enums/AuthPlatformStatus.java   |  56 +++++
 .../model/converter/AuthPlatformConverter.java     |   1 -
 .../manager/server/model/dto/AuthPlatformDTO.java  |   8 +
 .../manager/server/model/req/AuthPlatformReq.java  |   8 +
 .../ChatbotThreadReq.java}                         |  10 +-
 .../manager/server/model/vo/AuthPlatformVO.java    |  12 +-
 .../manager/server/service/ChatbotService.java     |  14 --
 .../{ChatbotService.java => LLMConfigService.java} |  16 +-
 .../server/service/impl/ChatbotServiceImpl.java    | 121 -----------
 ...tServiceImpl.java => LLMConfigServiceImpl.java} | 226 +++++++++------------
 .../src/main/resources/ddl/MySQL-DDL-CREATE.sql    |   4 +
 .../main/resources/ddl/PostgreSQL-DDL-CREATE.sql   |   8 +-
 .../server/controller/ChatbotControllerTest.java   |  71 +------
 16 files changed, 258 insertions(+), 445 deletions(-)

diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/AuthPlatformPO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/AuthPlatformPO.java
index 8f22e4a..36432c2 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/AuthPlatformPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/AuthPlatformPO.java
@@ -43,4 +43,16 @@ public class AuthPlatformPO extends BasePO implements 
Serializable {
 
     @Column(name = "is_deleted")
     private Boolean isDeleted;
+
+    @Column(name = "status")
+    private Integer status;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "model")
+    private String model;
+
+    @Column(name = "desc")
+    private String desc;
 }
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 6d42d7e..999e528 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,15 +18,10 @@
  */
 package org.apache.bigtop.manager.server.controller;
 
-import org.apache.bigtop.manager.server.model.converter.AuthPlatformConverter;
-import org.apache.bigtop.manager.server.model.dto.AuthPlatformDTO;
-import org.apache.bigtop.manager.server.model.req.AuthPlatformReq;
 import org.apache.bigtop.manager.server.model.req.ChatbotMessageReq;
-import org.apache.bigtop.manager.server.model.vo.AuthPlatformVO;
+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.model.vo.PlatformAuthCredentialVO;
-import org.apache.bigtop.manager.server.model.vo.PlatformVO;
 import org.apache.bigtop.manager.server.service.ChatbotService;
 import org.apache.bigtop.manager.server.utils.ResponseEntity;
 
@@ -34,9 +29,9 @@ import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
@@ -48,47 +43,23 @@ import java.util.List;
 
 @Tag(name = "Chatbot Controller")
 @RestController
-@RequestMapping("/chatbot/")
+@RequestMapping("/llm/chatbot/")
 public class ChatbotController {
 
     @Resource
     private ChatbotService chatbotService;
 
-    @Operation(summary = "get platforms", description = "Get all platforms")
-    @GetMapping("/platforms")
-    public ResponseEntity<List<PlatformVO>> platforms() {
-        return ResponseEntity.success(chatbotService.platforms());
-    }
-
-    @Operation(summary = "platform credentials", description = "Get platform 
auth credentials")
-    @GetMapping("/platforms/{platformId}/auth-credentials")
-    public ResponseEntity<List<PlatformAuthCredentialVO>> 
platformsAuthCredential(@PathVariable Long platformId) {
-        return 
ResponseEntity.success(chatbotService.platformsAuthCredentials(platformId));
-    }
-
-    @Operation(summary = "get auth platforms", description = "Get authorized 
platforms")
-    @GetMapping("/auth-platforms")
-    public ResponseEntity<List<AuthPlatformVO>> authorizedPlatforms() {
-        return ResponseEntity.success(chatbotService.authorizedPlatforms());
-    }
-
-    @Operation(summary = "auth platform", description = "Add authorized 
platforms")
-    @PostMapping("/auth-platforms")
-    public ResponseEntity<AuthPlatformVO> addAuthorizedPlatform(@RequestBody 
AuthPlatformReq authPlatformReq) {
-        AuthPlatformDTO authPlatformDTO = 
AuthPlatformConverter.INSTANCE.fromReq2DTO(authPlatformReq);
-        return 
ResponseEntity.success(chatbotService.addAuthorizedPlatform(authPlatformDTO));
-    }
-
-    @Operation(summary = "delete auth platform", description = "Delete 
authorized platforms")
-    @DeleteMapping("/auth-platforms/{authId}")
-    public ResponseEntity<Boolean> deleteAuthorizedPlatform(@PathVariable Long 
authId) {
-        return 
ResponseEntity.success(chatbotService.deleteAuthorizedPlatform(authId));
-    }
-
     @Operation(summary = "new thread", description = "Create a chat threads")
     @PostMapping("/auth-platforms/{authId}/threads")
-    public ResponseEntity<ChatThreadVO> createChatThreads(@PathVariable Long 
authId, @RequestParam String model) {
-        return ResponseEntity.success(chatbotService.createChatThreads(authId, 
model));
+    public ResponseEntity<ChatThreadVO> createChatThreads(@PathVariable Long 
authId) {
+        return ResponseEntity.success(chatbotService.createChatThreads(authId, 
""));
+    }
+
+    @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, 
""));
     }
 
     @Operation(summary = "delete thread", description = "Delete a chat 
threads")
@@ -99,8 +70,8 @@ public class ChatbotController {
 
     @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, @RequestParam String model) {
-        return ResponseEntity.success(chatbotService.getAllChatThreads(authId, 
model));
+    public ResponseEntity<List<ChatThreadVO>> getAllChatThreads(@PathVariable 
Long authId) {
+        return ResponseEntity.success(chatbotService.getAllChatThreads(authId, 
""));
     }
 
     @Operation(summary = "talk", description = "Talk with Chatbot")
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/LLMConfigController.java
similarity index 53%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/ChatbotController.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/LLMConfigController.java
index 6d42d7e..b6e41e2 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/LLMConfigController.java
@@ -21,24 +21,20 @@ package org.apache.bigtop.manager.server.controller;
 import org.apache.bigtop.manager.server.model.converter.AuthPlatformConverter;
 import org.apache.bigtop.manager.server.model.dto.AuthPlatformDTO;
 import org.apache.bigtop.manager.server.model.req.AuthPlatformReq;
-import org.apache.bigtop.manager.server.model.req.ChatbotMessageReq;
 import org.apache.bigtop.manager.server.model.vo.AuthPlatformVO;
-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.PlatformVO;
-import org.apache.bigtop.manager.server.service.ChatbotService;
+import org.apache.bigtop.manager.server.service.LLMConfigService;
 import org.apache.bigtop.manager.server.utils.ResponseEntity;
 
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -46,73 +42,70 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.annotation.Resource;
 import java.util.List;
 
-@Tag(name = "Chatbot Controller")
+@Tag(name = "LLM Config Controller")
 @RestController
-@RequestMapping("/chatbot/")
-public class ChatbotController {
+@RequestMapping("/llm/config/")
+public class LLMConfigController {
 
     @Resource
-    private ChatbotService chatbotService;
+    private LLMConfigService llmConfigService;
 
     @Operation(summary = "get platforms", description = "Get all platforms")
     @GetMapping("/platforms")
     public ResponseEntity<List<PlatformVO>> platforms() {
-        return ResponseEntity.success(chatbotService.platforms());
+        return ResponseEntity.success(llmConfigService.platforms());
     }
 
     @Operation(summary = "platform credentials", description = "Get platform 
auth credentials")
     @GetMapping("/platforms/{platformId}/auth-credentials")
     public ResponseEntity<List<PlatformAuthCredentialVO>> 
platformsAuthCredential(@PathVariable Long platformId) {
-        return 
ResponseEntity.success(chatbotService.platformsAuthCredentials(platformId));
+        return 
ResponseEntity.success(llmConfigService.platformsAuthCredentials(platformId));
     }
 
     @Operation(summary = "get auth platforms", description = "Get authorized 
platforms")
     @GetMapping("/auth-platforms")
     public ResponseEntity<List<AuthPlatformVO>> authorizedPlatforms() {
-        return ResponseEntity.success(chatbotService.authorizedPlatforms());
+        return ResponseEntity.success(llmConfigService.authorizedPlatforms());
     }
 
-    @Operation(summary = "auth platform", description = "Add authorized 
platforms")
+    @Operation(summary = "test auth platform", description = "Test authorized 
platforms")
+    @PostMapping("/auth-platforms/test")
+    public ResponseEntity<Boolean> testAuthorizedPlatform(@RequestBody 
AuthPlatformReq authPlatformReq) {
+        AuthPlatformDTO authPlatformDTO = 
AuthPlatformConverter.INSTANCE.fromReq2DTO(authPlatformReq);
+        return 
ResponseEntity.success(llmConfigService.testAuthorizedPlatform(authPlatformDTO));
+    }
+
+    @Operation(summary = "add auth platform", description = "Add authorized 
platforms")
     @PostMapping("/auth-platforms")
     public ResponseEntity<AuthPlatformVO> addAuthorizedPlatform(@RequestBody 
AuthPlatformReq authPlatformReq) {
         AuthPlatformDTO authPlatformDTO = 
AuthPlatformConverter.INSTANCE.fromReq2DTO(authPlatformReq);
-        return 
ResponseEntity.success(chatbotService.addAuthorizedPlatform(authPlatformDTO));
+        return 
ResponseEntity.success(llmConfigService.addAuthorizedPlatform(authPlatformDTO));
+    }
+
+    @Operation(summary = "update auth platform", description = "Update 
authorized platforms")
+    @PutMapping("/auth-platforms/{authId}")
+    public ResponseEntity<AuthPlatformVO> updateAuthorizedPlatform(
+            @PathVariable Long authId, @RequestBody AuthPlatformReq 
authPlatformReq) {
+        AuthPlatformDTO authPlatformDTO = 
AuthPlatformConverter.INSTANCE.fromReq2DTO(authPlatformReq);
+        authPlatformDTO.setId(authId);
+        return 
ResponseEntity.success(llmConfigService.updateAuthorizedPlatform(authPlatformDTO));
     }
 
     @Operation(summary = "delete auth platform", description = "Delete 
authorized platforms")
     @DeleteMapping("/auth-platforms/{authId}")
     public ResponseEntity<Boolean> deleteAuthorizedPlatform(@PathVariable Long 
authId) {
-        return 
ResponseEntity.success(chatbotService.deleteAuthorizedPlatform(authId));
-    }
-
-    @Operation(summary = "new thread", description = "Create a chat threads")
-    @PostMapping("/auth-platforms/{authId}/threads")
-    public ResponseEntity<ChatThreadVO> createChatThreads(@PathVariable Long 
authId, @RequestParam String model) {
-        return ResponseEntity.success(chatbotService.createChatThreads(authId, 
model));
-    }
-
-    @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));
-    }
-
-    @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, @RequestParam String model) {
-        return ResponseEntity.success(chatbotService.getAllChatThreads(authId, 
model));
+        return 
ResponseEntity.success(llmConfigService.deleteAuthorizedPlatform(authId));
     }
 
-    @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());
+    @Operation(summary = "activate auth platform", description = "Activate 
authorized platforms")
+    @PostMapping("/auth-platforms/{authId}/activate")
+    public ResponseEntity<Boolean> activateAuthorizedPlatform(@PathVariable 
Long authId) {
+        return 
ResponseEntity.success(llmConfigService.activateAuthorizedPlatform(authId));
     }
 
-    @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));
+    @Operation(summary = "deactivate auth platform", description = "Deactivate 
authorized platforms")
+    @PostMapping("/auth-platforms/{authId}/deactivate")
+    public ResponseEntity<Boolean> deactivateAuthorizedPlatform(@PathVariable 
Long authId) {
+        return 
ResponseEntity.success(llmConfigService.deactivateAuthorizedPlatform(authId));
     }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/AuthPlatformStatus.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/AuthPlatformStatus.java
new file mode 100644
index 0000000..58f8c5e
--- /dev/null
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/AuthPlatformStatus.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.bigtop.manager.server.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum AuthPlatformStatus {
+    ACTIVE(1),
+    AVAILABLE(2),
+    UNAVAILABLE(3),
+    ;
+
+    private final Integer code;
+
+    AuthPlatformStatus(Integer code) {
+        this.code = code;
+    }
+
+    public static AuthPlatformStatus fromCode(Integer code) {
+        for (AuthPlatformStatus status : AuthPlatformStatus.values()) {
+            if (status.code.equals(code)) {
+                return status;
+            }
+        }
+        return UNAVAILABLE;
+    }
+
+    public static boolean isAvailable(int code) {
+        return AVAILABLE.code.equals(code);
+    }
+
+    public static boolean isActive(int code) {
+        return ACTIVE.code.equals(code);
+    }
+
+    public static boolean available(int code) {
+        return isAvailable(code) || isActive(code);
+    }
+}
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/AuthPlatformConverter.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/AuthPlatformConverter.java
index 7fb9ff4..e3e991c 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/AuthPlatformConverter.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/AuthPlatformConverter.java
@@ -43,7 +43,6 @@ import java.util.stream.Collectors;
 public interface AuthPlatformConverter {
     AuthPlatformConverter INSTANCE = 
Mappers.getMapper(AuthPlatformConverter.class);
 
-    @Mapping(target = "supportModels", expression = 
"java(platformPO.getSupportModels())")
     @Mapping(target = "platformName", expression = 
"java(platformPO.getName())")
     AuthPlatformVO fromPO2VO(AuthPlatformPO authPlatformPO, @Context 
PlatformPO platformPO);
 
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/AuthPlatformDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/AuthPlatformDTO.java
index 4706385..aa61003 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/AuthPlatformDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/AuthPlatformDTO.java
@@ -29,4 +29,12 @@ public class AuthPlatformDTO {
     private Long platformId;
 
     private Map<String, String> authCredentials;
+
+    private String name;
+
+    private String model;
+
+    private String desc;
+
+    private Boolean testPassed;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/AuthPlatformReq.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/AuthPlatformReq.java
index 77047bf..699d0c9 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/AuthPlatformReq.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/AuthPlatformReq.java
@@ -32,4 +32,12 @@ public class AuthPlatformReq {
 
     @NotEmpty
     private List<AuthCredentialReq> authCredentials;
+
+    private String name;
+
+    private String model;
+
+    private String desc;
+
+    private boolean testPassed;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/AuthPlatformDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/ChatbotThreadReq.java
similarity index 82%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/AuthPlatformDTO.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/ChatbotThreadReq.java
index 4706385..c45bee4 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/AuthPlatformDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/ChatbotThreadReq.java
@@ -16,17 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.model.dto;
+package org.apache.bigtop.manager.server.model.req;
 
 import lombok.Data;
 
-import java.util.Map;
-
 @Data
-public class AuthPlatformDTO {
+public class ChatbotThreadReq {
     private Long id;
 
-    private Long platformId;
-
-    private Map<String, String> authCredentials;
+    private String name;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/AuthPlatformVO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/AuthPlatformVO.java
index a1a4c36..eee6981 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/AuthPlatformVO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/AuthPlatformVO.java
@@ -28,13 +28,13 @@ public class AuthPlatformVO {
 
     private String platformName;
 
-    private String supportModels;
+    private String name;
 
-    public AuthPlatformVO(long platformId, String name, String models) {
-        this.platformId = platformId;
-        this.platformName = name;
-        this.supportModels = models;
-    }
+    private String model;
+
+    private String desc;
+
+    private Integer status;
 
     public AuthPlatformVO() {}
 }
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 8d65c97..360f7e3 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,12 +18,8 @@
  */
 package org.apache.bigtop.manager.server.service;
 
-import org.apache.bigtop.manager.server.model.dto.AuthPlatformDTO;
-import org.apache.bigtop.manager.server.model.vo.AuthPlatformVO;
 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.PlatformVO;
 
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
@@ -31,16 +27,6 @@ import java.util.List;
 
 public interface ChatbotService {
 
-    List<PlatformVO> platforms();
-
-    List<PlatformAuthCredentialVO> platformsAuthCredentials(Long platformId);
-
-    List<AuthPlatformVO> authorizedPlatforms();
-
-    AuthPlatformVO addAuthorizedPlatform(AuthPlatformDTO authPlatformDTO);
-
-    boolean deleteAuthorizedPlatform(Long authId);
-
     ChatThreadVO createChatThreads(Long authId, String model);
 
     boolean deleteChatThreads(Long authId, Long threadId);
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/LLMConfigService.java
similarity index 72%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/ChatbotService.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/LLMConfigService.java
index 8d65c97..96ca25c 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/LLMConfigService.java
@@ -20,16 +20,12 @@ package org.apache.bigtop.manager.server.service;
 
 import org.apache.bigtop.manager.server.model.dto.AuthPlatformDTO;
 import org.apache.bigtop.manager.server.model.vo.AuthPlatformVO;
-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.PlatformVO;
 
-import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-
 import java.util.List;
 
-public interface ChatbotService {
+public interface LLMConfigService {
 
     List<PlatformVO> platforms();
 
@@ -41,13 +37,11 @@ public interface ChatbotService {
 
     boolean deleteAuthorizedPlatform(Long authId);
 
-    ChatThreadVO createChatThreads(Long authId, String model);
-
-    boolean deleteChatThreads(Long authId, Long threadId);
+    boolean testAuthorizedPlatform(AuthPlatformDTO authPlatformDTO);
 
-    List<ChatThreadVO> getAllChatThreads(Long platformId, String model);
+    AuthPlatformVO updateAuthorizedPlatform(AuthPlatformDTO authPlatformDTO);
 
-    SseEmitter talk(Long authId, Long threadId, String message);
+    boolean activateAuthorizedPlatform(Long authId);
 
-    List<ChatMessageVO> history(Long platformId, Long threadId);
+    boolean deactivateAuthorizedPlatform(Long authId);
 }
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 7cbbbc1..962367b 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
@@ -39,18 +39,12 @@ import 
org.apache.bigtop.manager.server.holder.SessionUserHolder;
 import org.apache.bigtop.manager.server.model.converter.AuthPlatformConverter;
 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.PlatformConverter;
 import org.apache.bigtop.manager.server.model.dto.AuthPlatformDTO;
 import org.apache.bigtop.manager.server.model.dto.ChatThreadDTO;
-import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
-import org.apache.bigtop.manager.server.model.vo.AuthPlatformVO;
 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.PlatformVO;
 import org.apache.bigtop.manager.server.service.ChatbotService;
 
-import org.jetbrains.annotations.NotNull;
 import org.springframework.context.i18n.LocaleContextHolder;
 import org.springframework.stereotype.Service;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
@@ -60,7 +54,6 @@ import reactor.core.publisher.Flux;
 
 import jakarta.annotation.Resource;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -114,120 +107,6 @@ public class ChatbotServiceImpl implements ChatbotService 
{
                 .create(getPlatformType(platformName), 
getAIAssistantConfig(model, credentials, configs), threadId);
     }
 
-    private Boolean testAuthorization(String platformName, String model, 
Map<String, String> credentials) {
-        AIAssistant aiAssistant = getAIAssistantFactory()
-                .create(getPlatformType(platformName), 
getAIAssistantConfig(model, credentials, null));
-        try {
-            return aiAssistant.test();
-        } catch (Exception e) {
-            throw new ApiException(ApiExceptionEnum.CREDIT_INCORRECT, 
e.getMessage());
-        }
-    }
-
-    @Override
-    public List<PlatformVO> platforms() {
-        List<PlatformPO> platformPOs = platformDao.findAll();
-        return PlatformConverter.INSTANCE.fromPO2VO(platformPOs);
-    }
-
-    @Override
-    public List<PlatformAuthCredentialVO> platformsAuthCredentials(Long 
platformId) {
-        PlatformPO platformPO = platformDao.findById(platformId);
-        if (platformPO == null) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
-        }
-        List<PlatformAuthCredentialVO> platformAuthCredentialVOs = new 
ArrayList<>();
-        PlatformDTO platformDTO = 
PlatformConverter.INSTANCE.fromPO2DTO(platformPO);
-        for (String key : platformDTO.getAuthCredentials().keySet()) {
-            PlatformAuthCredentialVO platformAuthCredentialVO = new 
PlatformAuthCredentialVO(
-                    key, platformDTO.getAuthCredentials().get(key));
-            platformAuthCredentialVOs.add(platformAuthCredentialVO);
-        }
-        return platformAuthCredentialVOs;
-    }
-
-    @Override
-    public List<AuthPlatformVO> authorizedPlatforms() {
-        List<AuthPlatformVO> authorizedPlatforms = new ArrayList<>();
-        List<AuthPlatformPO> authPlatformPOList = authPlatformDao.findAll();
-        for (AuthPlatformPO authPlatformPO : authPlatformPOList) {
-            if (authPlatformPO.getIsDeleted()) {
-                continue;
-            }
-
-            PlatformPO platformPO = 
platformDao.findById(authPlatformPO.getPlatformId());
-            
authorizedPlatforms.add(AuthPlatformConverter.INSTANCE.fromPO2VO(authPlatformPO,
 platformPO));
-        }
-
-        return authorizedPlatforms;
-    }
-
-    @Override
-    public AuthPlatformVO addAuthorizedPlatform(AuthPlatformDTO 
authPlatformDTO) {
-        PlatformPO platformPO = 
platformDao.findById(authPlatformDTO.getPlatformId());
-        if (platformPO == null) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
-        }
-        Map<String, String> credentialSet =
-                getStringMap(authPlatformDTO, 
PlatformConverter.INSTANCE.fromPO2DTO(platformPO));
-        List<String> models = 
List.of(platformPO.getSupportModels().split(","));
-        if (models.isEmpty()) {
-            throw new ApiException(ApiExceptionEnum.MODEL_NOT_SUPPORTED);
-        }
-
-        if (!testAuthorization(platformPO.getName(), models.get(0), 
credentialSet)) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
-        }
-
-        authPlatformDTO.setAuthCredentials(credentialSet);
-        AuthPlatformPO authPlatformPO = 
AuthPlatformConverter.INSTANCE.fromDTO2PO(authPlatformDTO);
-        authPlatformDao.save(authPlatformPO);
-        AuthPlatformVO authPlatformVO = 
AuthPlatformConverter.INSTANCE.fromPO2VO(authPlatformPO, platformPO);
-        authPlatformVO.setSupportModels(platformPO.getSupportModels());
-        authPlatformVO.setPlatformName(platformPO.getName());
-        return authPlatformVO;
-    }
-
-    private static @NotNull Map<String, String> getStringMap(AuthPlatformDTO 
authPlatformDTO, PlatformDTO platformDTO) {
-        if (platformDTO == null) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
-        }
-        Map<String, String> credentialNeed = platformDTO.getAuthCredentials();
-        Map<String, String> credentialGet = 
authPlatformDTO.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 boolean deleteAuthorizedPlatform(Long authId) {
-        AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
-        if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
-        }
-
-        authPlatformPO.setIsDeleted(true);
-        authPlatformDao.partialUpdateById(authPlatformPO);
-
-        List<ChatThreadPO> chatThreadPOS = 
chatThreadDao.findAllByAuthId(authPlatformPO.getId());
-        for (ChatThreadPO chatThreadPO : chatThreadPOS) {
-            chatThreadPO.setIsDeleted(true);
-            chatThreadDao.partialUpdateById(chatThreadPO);
-            List<ChatMessagePO> chatMessagePOS = 
chatMessageDao.findAllByThreadId(chatThreadPO.getId());
-            for (ChatMessagePO chatMessagePO : chatMessagePOS) {
-                chatMessagePO.setIsDeleted(true);
-                chatMessageDao.partialUpdateById(chatMessagePO);
-            }
-        }
-
-        return true;
-    }
-
     @Override
     public ChatThreadVO createChatThreads(Long authId, String model) {
         AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
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/LLMConfigServiceImpl.java
similarity index 58%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/LLMConfigServiceImpl.java
index 7cbbbc1..9e5bb78 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/LLMConfigServiceImpl.java
@@ -21,7 +21,6 @@ package org.apache.bigtop.manager.server.service.impl;
 import org.apache.bigtop.manager.ai.assistant.GeneralAssistantFactory;
 import org.apache.bigtop.manager.ai.assistant.provider.AIAssistantConfig;
 import org.apache.bigtop.manager.ai.assistant.store.PersistentChatMemoryStore;
-import org.apache.bigtop.manager.ai.core.enums.MessageType;
 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;
@@ -34,40 +33,32 @@ 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;
-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.PlatformConverter;
 import org.apache.bigtop.manager.server.model.dto.AuthPlatformDTO;
-import org.apache.bigtop.manager.server.model.dto.ChatThreadDTO;
 import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
 import org.apache.bigtop.manager.server.model.vo.AuthPlatformVO;
-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.PlatformVO;
-import org.apache.bigtop.manager.server.service.ChatbotService;
+import org.apache.bigtop.manager.server.service.LLMConfigService;
 
 import org.jetbrains.annotations.NotNull;
 import org.springframework.context.i18n.LocaleContextHolder;
 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 jakarta.annotation.Resource;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 
 @Service
 @Slf4j
-public class ChatbotServiceImpl implements ChatbotService {
+public class LLMConfigServiceImpl implements LLMConfigService {
     @Resource
     private PlatformDao platformDao;
 
@@ -104,19 +95,13 @@ public class ChatbotServiceImpl implements ChatbotService {
         return PlatformType.getPlatformType(platformName.toLowerCase());
     }
 
-    private AIAssistant buildAIAssistant(
-            String platformName,
-            String model,
-            Map<String, String> credentials,
-            Long threadId,
-            Map<String, String> configs) {
-        return getAIAssistantFactory()
-                .create(getPlatformType(platformName), 
getAIAssistantConfig(model, credentials, configs), threadId);
-    }
-
     private Boolean testAuthorization(String platformName, String model, 
Map<String, String> credentials) {
-        AIAssistant aiAssistant = getAIAssistantFactory()
-                .create(getPlatformType(platformName), 
getAIAssistantConfig(model, credentials, null));
+        AIAssistantConfig aiAssistantConfig = AIAssistantConfig.builder()
+                .setModel(model)
+                .setLanguage(LocaleContextHolder.getLocale().toString())
+                .addCredentials(credentials)
+                .build();
+        AIAssistant aiAssistant = 
getAIAssistantFactory().create(getPlatformType(platformName), 
aiAssistantConfig);
         try {
             return aiAssistant.test();
         } catch (Exception e) {
@@ -124,6 +109,21 @@ public class ChatbotServiceImpl implements ChatbotService {
         }
     }
 
+    private void switchActivePlatform(Long id) {
+        List<AuthPlatformPO> authPlatformPOS = authPlatformDao.findAll();
+        for (AuthPlatformPO authPlatformPO : authPlatformPOS) {
+            if (!AuthPlatformStatus.available(authPlatformPO.getStatus())) {
+                continue;
+            }
+            if (authPlatformPO.getId().equals(id)) {
+                authPlatformPO.setStatus(AuthPlatformStatus.ACTIVE.getCode());
+            } else {
+                
authPlatformPO.setStatus(AuthPlatformStatus.AVAILABLE.getCode());
+            }
+        }
+        authPlatformDao.partialUpdateByIds(authPlatformPOS);
+    }
+
     @Override
     public List<PlatformVO> platforms() {
         List<PlatformPO> platformPOs = platformDao.findAll();
@@ -168,24 +168,20 @@ public class ChatbotServiceImpl implements ChatbotService 
{
         if (platformPO == null) {
             throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
         }
+
         Map<String, String> credentialSet =
                 getStringMap(authPlatformDTO, 
PlatformConverter.INSTANCE.fromPO2DTO(platformPO));
-        List<String> models = 
List.of(platformPO.getSupportModels().split(","));
-        if (models.isEmpty()) {
-            throw new ApiException(ApiExceptionEnum.MODEL_NOT_SUPPORTED);
-        }
-
-        if (!testAuthorization(platformPO.getName(), models.get(0), 
credentialSet)) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
-        }
 
         authPlatformDTO.setAuthCredentials(credentialSet);
         AuthPlatformPO authPlatformPO = 
AuthPlatformConverter.INSTANCE.fromDTO2PO(authPlatformDTO);
+        if (authPlatformDTO.getTestPassed()) {
+            authPlatformPO.setStatus(AuthPlatformStatus.AVAILABLE.getCode());
+        } else {
+            authPlatformPO.setStatus(AuthPlatformStatus.UNAVAILABLE.getCode());
+        }
+
         authPlatformDao.save(authPlatformPO);
-        AuthPlatformVO authPlatformVO = 
AuthPlatformConverter.INSTANCE.fromPO2VO(authPlatformPO, platformPO);
-        authPlatformVO.setSupportModels(platformPO.getSupportModels());
-        authPlatformVO.setPlatformName(platformPO.getName());
-        return authPlatformVO;
+        return AuthPlatformConverter.INSTANCE.fromPO2VO(authPlatformPO, 
platformPO);
     }
 
     private static @NotNull Map<String, String> getStringMap(AuthPlatformDTO 
authPlatformDTO, PlatformDTO platformDTO) {
@@ -229,125 +225,95 @@ public class ChatbotServiceImpl implements 
ChatbotService {
     }
 
     @Override
-    public ChatThreadVO createChatThreads(Long authId, String model) {
-        AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
-        if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
-            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
+    public boolean testAuthorizedPlatform(AuthPlatformDTO authPlatformDTO) {
+        if (authPlatformDTO.getId() != null) {
+            authPlatformDTO =
+                    
AuthPlatformConverter.INSTANCE.fromPO2DTO(authPlatformDao.findById(authPlatformDTO.getId()));
+        }
+
+        PlatformPO platformPO = 
platformDao.findById(authPlatformDTO.getPlatformId());
+        if (platformPO == null) {
+            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
         }
-        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)) {
+        if (supportModels.isEmpty() || 
!supportModels.contains(authPlatformDTO.getModel())) {
             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);
-        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) {
-        ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
-        if (chatThreadPO == null || chatThreadPO.getIsDeleted()) {
-            throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
+        if (authPlatformDTO.getId() != null) {
+            AuthPlatformPO authPlatformPO = 
authPlatformDao.findById(authPlatformDTO.getId());
+            if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
+                throw new 
ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
+            }
+            AuthPlatformDTO existAuthPlatformDTO = 
AuthPlatformConverter.INSTANCE.fromPO2DTO(authPlatformPO);
+            
authPlatformDTO.setAuthCredentials(existAuthPlatformDTO.getAuthCredentials());
+            authPlatformDTO.setModel(existAuthPlatformDTO.getModel());
         }
 
-        chatThreadPO.setIsDeleted(true);
-        chatThreadDao.partialUpdateById(chatThreadPO);
-        List<ChatMessagePO> chatMessagePOS = 
chatMessageDao.findAllByThreadId(threadId);
-        for (ChatMessagePO chatMessagePO : chatMessagePOS) {
-            chatMessagePO.setIsDeleted(true);
-            chatMessageDao.partialUpdateById(chatMessagePO);
+        Map<String, String> credentialSet =
+                getStringMap(authPlatformDTO, 
PlatformConverter.INSTANCE.fromPO2DTO(platformPO));
+        if (!testAuthorization(platformPO.getName(), 
authPlatformDTO.getModel(), credentialSet)) {
+            throw new ApiException(ApiExceptionEnum.CREDIT_INCORRECT);
+        }
+
+        if (authPlatformDTO.getId() != null) {
+            AuthPlatformPO authPlatformPO = 
AuthPlatformConverter.INSTANCE.fromDTO2PO(authPlatformDTO);
+            authPlatformPO.setStatus(AuthPlatformStatus.AVAILABLE.getCode());
+            authPlatformDao.partialUpdateById(authPlatformPO);
         }
 
         return true;
     }
 
     @Override
-    public List<ChatThreadVO> getAllChatThreads(Long authId, String model) {
-        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);
-            }
+    public AuthPlatformVO updateAuthorizedPlatform(AuthPlatformDTO 
authPlatformDTO) {
+        AuthPlatformPO authPlatformPO = 
authPlatformDao.findById(authPlatformDTO.getId());
+        if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
+            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
         }
-        return chatThreads;
+
+        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(
+                authPlatformPO, 
platformDao.findById(authPlatformPO.getPlatformId()));
     }
 
     @Override
-    public SseEmitter talk(Long authId, 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);
-        }
+    public boolean activateAuthorizedPlatform(Long authId) {
         AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
         if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
             throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
         }
-        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.getAuthCredentials(),
-                chatThreadPO.getId(),
-                chatThreadDTO.getThreadInfo());
-        Flux<String> stringFlux = aiAssistant.streamAsk(message);
-
-        SseEmitter emitter = new SseEmitter();
-        stringFlux.subscribe(
-                s -> {
-                    try {
-                        emitter.send(s);
-                    } catch (Exception e) {
-                        emitter.completeWithError(e);
-                    }
-                },
-                Throwable::printStackTrace,
-                emitter::complete);
-
-        emitter.onTimeout(emitter::complete);
-        return emitter;
+
+        if (!AuthPlatformStatus.available(authPlatformPO.getStatus())) {
+            return false;
+        }
+
+        if (AuthPlatformStatus.isActive(authPlatformPO.getStatus())) {
+            return true;
+        }
+        switchActivePlatform(authPlatformPO.getId());
+        return true;
     }
 
     @Override
-    public List<ChatMessageVO> history(Long authId, Long threadId) {
-        List<ChatMessageVO> chatMessages = new ArrayList<>();
-        ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
-        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);
+    public boolean deactivateAuthorizedPlatform(Long authId) {
+        AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
+        if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
+            throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
         }
-        List<ChatMessagePO> chatMessagePOs = 
chatMessageDao.findAllByThreadId(threadId);
-        for (ChatMessagePO chatMessagePO : chatMessagePOs) {
-            ChatMessageVO chatMessageVO = 
ChatMessageConverter.INSTANCE.fromPO2VO(chatMessagePO);
-            MessageType sender = chatMessageVO.getSender();
-            if (sender == null) {
-                continue;
-            }
-            if (sender.equals(MessageType.USER) || 
sender.equals(MessageType.AI)) {
-                chatMessages.add(chatMessageVO);
-            }
+        AuthPlatformStatus authPlatformStatus = 
AuthPlatformStatus.fromCode(authPlatformPO.getStatus());
+        if (authPlatformStatus.equals(AuthPlatformStatus.ACTIVE)) {
+            authPlatformPO.setStatus(AuthPlatformStatus.AVAILABLE.getCode());
+            return true;
         }
-        return chatMessages;
+        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 1937ae4..4928062 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
@@ -329,6 +329,10 @@ CREATE TABLE `llm_auth_platform`
     `platform_id` BIGINT(20) UNSIGNED NOT NULL,
     `credentials` TEXT                NOT NULL,
     `is_deleted`  TINYINT(1)          DEFAULT 0 NULL,
+    `status`      SMALLINT            DEFAULT 0 COMMENT '1-Active, 
2-Available, 3-Unavailable',
+    `model`       VARCHAR(255)        NOT NULL,
+    `name`        VARCHAR(255)        NOT NULL,
+    `desc`        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,
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 2493c85..206f269 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
@@ -338,14 +338,18 @@ CREATE TABLE llm_auth_platform
     id          BIGINT CHECK (id > 0)          NOT NULL GENERATED ALWAYS AS 
IDENTITY,
     platform_id BIGINT CHECK (platform_id > 0) NOT NULL,
     credentials TEXT                           NOT NULL,
-    is_deleted  BOOLEAN      DEFAULT FALSE,
+    is_deleted  BOOLEAN             DEFAULT FALSE,
+    status      SMALLINT            DEFAULT 0,
+    model       VARCHAR(255)        NOT NULL,
+    name        VARCHAR(255)        NOT NULL,
+    "desc"      VARCHAR(255)        NOT NULL,
     create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
     update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP /* ON UPDATE 
CURRENT_TIMESTAMP */,
     create_by   BIGINT       DEFAULT NULL,
     update_by   BIGINT       DEFAULT NULL,
     PRIMARY KEY (id)
 );
-
+COMMENT ON COLUMN "llm_auth_platform".status IS '1-Active, 2-Available, 
3-Unavailable';
 CREATE INDEX idx_authorized_platform_id ON llm_auth_platform (platform_id);
 
 CREATE TABLE llm_chat_thread
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 766053f..18936d5 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
@@ -18,14 +18,9 @@
  */
 package org.apache.bigtop.manager.server.controller;
 
-import org.apache.bigtop.manager.server.model.dto.AuthPlatformDTO;
-import org.apache.bigtop.manager.server.model.req.AuthPlatformReq;
 import org.apache.bigtop.manager.server.model.req.ChatbotMessageReq;
-import org.apache.bigtop.manager.server.model.vo.AuthPlatformVO;
 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.PlatformVO;
 import org.apache.bigtop.manager.server.service.ChatbotService;
 import org.apache.bigtop.manager.server.utils.MessageSourceUtils;
 import org.apache.bigtop.manager.server.utils.ResponseEntity;
@@ -72,73 +67,15 @@ class ChatbotControllerTest {
         mockedMessageSourceUtils.close();
     }
 
-    @Test
-    void getAllPlatforms() {
-        List<PlatformVO> platforms = new ArrayList<>();
-        when(chatbotService.platforms()).thenReturn(platforms);
-
-        ResponseEntity<List<PlatformVO>> response = 
chatbotController.platforms();
-
-        assertTrue(response.isSuccess());
-        assertEquals(platforms, response.getData());
-    }
-
-    @Test
-    void getAuthorizedPlatforms() {
-        List<AuthPlatformVO> authorizedPlatforms = new ArrayList<>();
-        
when(chatbotService.authorizedPlatforms()).thenReturn(authorizedPlatforms);
-
-        ResponseEntity<List<AuthPlatformVO>> response = 
chatbotController.authorizedPlatforms();
-
-        assertTrue(response.isSuccess());
-        assertEquals(authorizedPlatforms, response.getData());
-    }
-
-    @Test
-    void platformsAuthCredential() {
-        Long platformId = 1L;
-        List<PlatformAuthCredentialVO> credentials = new ArrayList<>();
-        
when(chatbotService.platformsAuthCredentials(platformId)).thenReturn(credentials);
-
-        ResponseEntity<List<PlatformAuthCredentialVO>> response = 
chatbotController.platformsAuthCredential(platformId);
-
-        assertTrue(response.isSuccess());
-        assertEquals(credentials, response.getData());
-    }
-
-    @Test
-    void addAuthorizedPlatform() {
-        AuthPlatformReq authPlatformReq = new AuthPlatformReq();
-        AuthPlatformVO authorizedVO = new AuthPlatformVO();
-
-        
when(chatbotService.addAuthorizedPlatform(any(AuthPlatformDTO.class))).thenReturn(authorizedVO);
-
-        ResponseEntity<AuthPlatformVO> response = 
chatbotController.addAuthorizedPlatform(authPlatformReq);
-
-        assertTrue(response.isSuccess());
-        assertEquals(authorizedVO, response.getData());
-    }
-
-    @Test
-    void deleteAuthorizedPlatform() {
-        Long platformId = 1L;
-        
when(chatbotService.deleteAuthorizedPlatform(platformId)).thenReturn(true);
-
-        ResponseEntity<Boolean> response = 
chatbotController.deleteAuthorizedPlatform(platformId);
-
-        assertTrue(response.isSuccess());
-        assertEquals(true, response.getData());
-    }
-
     @Test
     void createChatThreads() {
         Long platformId = 1L;
-        String model = "model1";
+        String model = "";
         ChatThreadVO chatThread = new ChatThreadVO();
 
         when(chatbotService.createChatThreads(eq(platformId), 
eq(model))).thenReturn(chatThread);
 
-        ResponseEntity<ChatThreadVO> response = 
chatbotController.createChatThreads(platformId, model);
+        ResponseEntity<ChatThreadVO> response = 
chatbotController.createChatThreads(platformId);
 
         assertTrue(response.isSuccess());
         assertEquals(chatThread, response.getData());
@@ -160,12 +97,12 @@ class ChatbotControllerTest {
     @Test
     void getAllChatThreads() {
         Long platformId = 1L;
-        String model = "model1";
+        String model = "";
         List<ChatThreadVO> chatThreads = new ArrayList<>();
 
         when(chatbotService.getAllChatThreads(eq(platformId), 
eq(model))).thenReturn(chatThreads);
 
-        ResponseEntity<List<ChatThreadVO>> response = 
chatbotController.getAllChatThreads(platformId, model);
+        ResponseEntity<List<ChatThreadVO>> response = 
chatbotController.getAllChatThreads(platformId);
 
         assertTrue(response.isSuccess());
         assertEquals(chatThreads, response.getData());

Reply via email to