diff options
37 files changed, 1023 insertions, 168 deletions
diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/MaaSPlatform.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/MaaSPlatform.java index 20443e9..156aa76 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/MaaSPlatform.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/MaaSPlatform.java @@ -16,6 +16,8 @@ public class MaaSPlatform { private String operatorName; + private String maaSType; + private List<ModelInformation> modelList; } diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/bisheng/BiShengCreateDatasetResponse.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/bisheng/BiShengCreateDatasetResponse.java new file mode 100644 index 0000000..3047376 --- /dev/null +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/bisheng/BiShengCreateDatasetResponse.java @@ -0,0 +1,9 @@ +package org.onap.usecaseui.llmadaptation.bean.bisheng; + +import com.alibaba.fastjson2.JSONObject; +import lombok.Data; + +@Data +public class BiShengCreateDatasetResponse extends ResponseStatus { + private JSONObject data; +} diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/bisheng/ProcessFileResponse.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/bisheng/ProcessFileResponse.java new file mode 100644 index 0000000..829f8cd --- /dev/null +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/bisheng/ProcessFileResponse.java @@ -0,0 +1,12 @@ +package org.onap.usecaseui.llmadaptation.bean.bisheng; + +import com.alibaba.fastjson2.JSONObject; +import lombok.Data; + +import java.util.List; + + +@Data +public class ProcessFileResponse extends ResponseStatus{ + private List<JSONObject> data; +} diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/bisheng/ResponseStatus.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/bisheng/ResponseStatus.java new file mode 100644 index 0000000..90c64b6 --- /dev/null +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/bisheng/ResponseStatus.java @@ -0,0 +1,12 @@ +package org.onap.usecaseui.llmadaptation.bean.bisheng; + +import lombok.Data; + +@Data +public class ResponseStatus { + private int status_code; + + private String status_message; + + private String detail; +} diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/fastgpt/CreateCollectionParam.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/fastgpt/dataset/CreateCollectionParam.java index 33b40b2..12b5277 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/fastgpt/CreateCollectionParam.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/fastgpt/dataset/CreateCollectionParam.java @@ -1,4 +1,4 @@ -package org.onap.usecaseui.llmadaptation.bean.fastgpt; +package org.onap.usecaseui.llmadaptation.bean.fastgpt.dataset; import lombok.Data; diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/fastgpt/CreateDataSetParam.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/fastgpt/dataset/CreateDataSetParam.java index 481773c..b22b90a 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/fastgpt/CreateDataSetParam.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/fastgpt/dataset/CreateDataSetParam.java @@ -1,4 +1,4 @@ -package org.onap.usecaseui.llmadaptation.bean.fastgpt; +package org.onap.usecaseui.llmadaptation.bean.fastgpt.dataset; import lombok.Data; diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/fastgpt/CreateDataSetResponse.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/fastgpt/dataset/CreateDataSetResponse.java index 444c81a..eaff56f 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/fastgpt/CreateDataSetResponse.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/bean/fastgpt/dataset/CreateDataSetResponse.java @@ -1,4 +1,4 @@ -package org.onap.usecaseui.llmadaptation.bean.fastgpt; +package org.onap.usecaseui.llmadaptation.bean.fastgpt.dataset; import lombok.Data; diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/config/WebClientConfig.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/config/WebClientConfig.java index d0a6926..8434b6b 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/config/WebClientConfig.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/config/WebClientConfig.java @@ -31,8 +31,8 @@ public class WebClientConfig { public WebClient getWebClient() { HttpClient httpClient = HttpClient.create() .tcpConfiguration(tcpClient -> tcpClient - .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)) - .responseTimeout(Duration.ofSeconds(10)); + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 50000)) + .responseTimeout(Duration.ofSeconds(50)); return WebClient.builder().clientConnector(new ReactorClientHttpConnector(httpClient)).build(); } } diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/constant/BiShengConstant.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/constant/BiShengConstant.java new file mode 100644 index 0000000..3a9a3bc --- /dev/null +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/constant/BiShengConstant.java @@ -0,0 +1,21 @@ +package org.onap.usecaseui.llmadaptation.constant; + +public class BiShengConstant { + public static final String COOKIE_VALUE = "access_token_cookie=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ7XCJ1c2VyX25hbWVcIjogXCJyb290XCIsIFwidXNlcl9pZFwiOiAxLCBcInJvbGVcIjogXCJhZG1pblwifSIsImlhdCI6MTczMzEyMjYwMSwibmJmIjoxNzMzMTIyNjAxLCJqdGkiOiI3YzAwNTMyYy1hOGI2LTQwM2YtYmVjMi1mZjAyODU1NjNhMGUiLCJleHAiOjIwNDg0ODI2MDEsInR5cGUiOiJhY2Nlc3MiLCJmcmVzaCI6ZmFsc2V9.K7H2Yoc8h5qv55ciOtfiQZhInWkt7VH5Uq7OGdsxhek"; + + public static final String CREATE_DATASET_URL = "/api/v1/knowledge/create"; + + public static final String UPLOAD_FILE_URL = "/api/v1/knowledge/upload"; + + public static final String PROCESS_FILE_URL = "/api/v1/knowledge/process"; + + public static final String DATASET_V2_URL = "/api/v2/filelib/"; + + public static final String APPLICATION_URL = "/api/v1/assistant"; + + public static final String APPLICATION_CHAT_URL = "/api/v2/assistant/chat/completions"; + + public static final String DELETE_APPLICATION = "/api/v1/assistant/delete?assistant_id="; + + public static final String GET_APPLICATION_URL = "/api/v1/assistant/info/"; +} diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/constant/CommonConstant.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/constant/CommonConstant.java new file mode 100644 index 0000000..a61484a --- /dev/null +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/constant/CommonConstant.java @@ -0,0 +1,5 @@ +package org.onap.usecaseui.llmadaptation.constant; + +public class CommonConstant { + public static final String COOKIE = "Cookie"; +} diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/constant/FastGptConstant.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/constant/FastGptConstant.java index 7aefa8f..a4fb335 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/constant/FastGptConstant.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/constant/FastGptConstant.java @@ -1,29 +1,29 @@ package org.onap.usecaseui.llmadaptation.constant; public class FastGptConstant { - public static final String COOKIE = "Cookie"; + public static final String COOKIE_VALUE = "fastgpt_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NzFmNTQ2MGM4Zjc3YTFjMGYzZTUyYmEiLCJ0ZWFtSWQiOiI2NzFmNTQ2MGM4Zjc3YTFjMGYzZTUyYzAiLCJ0bWJJZCI6IjY3MWY1NDYwYzhmNzdhMWMwZjNlNTJjMiIsImlzUm9vdCI6dHJ1ZSwiZXhwIjoxNzM1NTIzMzY0LCJpYXQiOjE3MzQ5MTg1NjR9.GPomC4qSnz3ADnEIo4sgl8jROaCsomEh9J6kfVAZuBQ"; - public static final String COOKIE_VALUE = "fastgpt_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NzFmNTQ2MGM4Zjc3YTFjMGYzZTUyYmEiLCJ0ZWFtSWQiOiI2NzFmNTQ2MGM4Zjc3YTFjMGYzZTUyYzAiLCJ0bWJJZCI6IjY3MWY1NDYwYzhmNzdhMWMwZjNlNTJjMiIsImlzUm9vdCI6dHJ1ZSwiZXhwIjoxNzMzMjc0Mzc2LCJpYXQiOjE3MzI2Njk1NzZ9.NdJ_ShISQOa1f5AvGsfq8Zrh4g4e2JwtX1TZ2iCLN6I"; + public static final String CREATE_DATASET_URL = "/api/core/dataset/create"; - public static final String CREATE_DATASET_URL = "http://172.22.16.126:3000/api/core/dataset/create"; + public static final String UPLOAD_FILE_URL = "/api/common/file/upload"; - public static final String UPLOAD_FILE_URL = "http://172.22.16.126:3000/api/common/file/upload"; + public static final String CRATE_COLLECTION_URL = "/api/core/dataset/collection/create/fileId"; - public static final String CRATE_COLLECTION_URL = "http://172.22.16.126:3000/api/core/dataset/collection/create/fileId"; + public static final String UPDATE_DATASET_URL = "/api/core/dataset/update"; - public static final String DELETE_DATASET_URL = "http://172.22.16.126:3000/api/core/dataset/delete?id="; + public static final String DELETE_DATASET_URL = "/api/core/dataset/delete?id="; - public static final String CREATE_APPLICATION = "http://172.22.16.126:3000/api/core/app/create"; + public static final String CREATE_APPLICATION = "/api/core/app/create"; - public static final String UPDATE_APPLICATION = "http://172.22.16.126:3000/api/core/app/update?appId="; + public static final String UPDATE_APPLICATION = "/api/core/app/update?appId="; - public static final String PUBLISH_APPLICATION = "http://172.22.16.126:3000/api/core/app/version/publish?appId="; + public static final String PUBLISH_APPLICATION = "/api/core/app/version/publish?appId="; public static final String CREATE_APP_PARAM_FILE_URL = "classpath:Param/createApplication.json"; public static final String PUBLISH_APP_PARAM_FILE_URL = "classpath:Param/publishApplication.json"; - public static final String APPLICATION_CHAT_URL = "http://172.22.16.126:3000/api/v1/chat/completions"; + public static final String APPLICATION_CHAT_URL = "/api/v1/chat/completions"; - public static final String DELETE_APPLICATION = "http://172.22.16.126:3000/api/core/app/del?appId="; + public static final String DELETE_APPLICATION = "/api/core/app/del?appId="; } diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/constant/ServerConstant.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/constant/ServerConstant.java new file mode 100644 index 0000000..efc6012 --- /dev/null +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/constant/ServerConstant.java @@ -0,0 +1,28 @@ +package org.onap.usecaseui.llmadaptation.constant; + +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Component +@Getter +public class ServerConstant { + + @Value("${fastGpt.server}") + private String fastGptServer; + + @Value("${biSheng.server}") + private String biShengServer; + + @Value("${fastGpt.model}") + private String fastGptModel; + + @Value("${biSheng.model}") + private int biShengModel; + + @Value("${fastGpt.maaSType}") + private String fastGptType; + + @Value("${biSheng.maaSType}") + private String biShengType; +} diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/controller/ApplicationController.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/controller/ApplicationController.java index f10495e..a6493de 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/controller/ApplicationController.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/controller/ApplicationController.java @@ -2,9 +2,8 @@ package org.onap.usecaseui.llmadaptation.controller; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; -import org.onap.usecaseui.llmadaptation.bean.Application; -import org.onap.usecaseui.llmadaptation.bean.ServiceResult; -import org.onap.usecaseui.llmadaptation.service.FastGptApplicationService; +import org.onap.usecaseui.llmadaptation.bean.*; +import org.onap.usecaseui.llmadaptation.service.ApplicationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; @@ -15,32 +14,37 @@ import reactor.core.publisher.Mono; @RestController @RequestMapping("/api/usecaseui-llm-adaptation/v1/application") public class ApplicationController { - @Autowired - private FastGptApplicationService fastGptApplicationService; + private ApplicationService applicationService; @PostMapping(value = "/create", produces = MediaType.APPLICATION_JSON_VALUE) public Mono<ServiceResult> createApplication(@RequestBody Application application) { - return fastGptApplicationService.createApplication(application); + return applicationService.createApplication(application); + } @DeleteMapping(value = "/delete/{applicationId}", produces = MediaType.APPLICATION_JSON_VALUE) public Mono<ServiceResult> removeKnowledgeBase(@PathVariable("applicationId") String applicationId) { - return fastGptApplicationService.removeApplication(applicationId); + return applicationService.removeApplication(applicationId); } @PostMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> streamData(@RequestBody JSONObject question) { - return fastGptApplicationService.chat(question); + return applicationService.chat(question); } @GetMapping(value = {"/query"}, produces = MediaType.APPLICATION_JSON_VALUE) public ServiceResult getApplications() { - return fastGptApplicationService.getApplications(); + return applicationService.getApplications(); } @GetMapping(value = {"/queryById/{applicationId}"}, produces = MediaType.APPLICATION_JSON_VALUE) public ServiceResult getApplications(@PathVariable("applicationId") String applicationId) { - return fastGptApplicationService.getApplicationById(applicationId); + return applicationService.getApplicationById(applicationId); + } + + @PostMapping(value = "/edit", produces = MediaType.APPLICATION_JSON_VALUE) + public Mono<ServiceResult> editDataset(@RequestBody Application application) { + return applicationService.editApplication(application); } } diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/controller/DatasetController.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/controller/DatasetController.java index 5425cd6..af2a672 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/controller/DatasetController.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/controller/DatasetController.java @@ -4,8 +4,8 @@ import lombok.extern.slf4j.Slf4j; import org.onap.usecaseui.llmadaptation.bean.KnowledgeBase; import org.onap.usecaseui.llmadaptation.bean.ResultHeader; import org.onap.usecaseui.llmadaptation.bean.ServiceResult; -import org.onap.usecaseui.llmadaptation.mapper.FastGptDatasetMapper; -import org.onap.usecaseui.llmadaptation.service.FastGptDatasetService; +import org.onap.usecaseui.llmadaptation.mapper.DatasetMapper; +import org.onap.usecaseui.llmadaptation.service.DatasetService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.codec.multipart.FilePart; @@ -19,36 +19,43 @@ import java.util.List; @RestController @RequestMapping("/api/usecaseui-llm-adaptation/v1/knowledgeBase") public class DatasetController { + @Autowired - private FastGptDatasetService fastGptDatasetService; + private DatasetMapper datasetMapper; @Autowired - private FastGptDatasetMapper fastGptDatasetMapper; + private DatasetService datasetService; + @PostMapping(value = "/create", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public Mono<ServiceResult> handleFileUpload(@RequestPart("files") Flux<FilePart> fileParts, @RequestPart("metaData") String metaData) { - return fastGptDatasetService.createDataset(fileParts, metaData); + return datasetService.createDataset(fileParts, metaData); } @DeleteMapping(value = "/delete/{knowledgeBaseId}", produces = MediaType.APPLICATION_JSON_VALUE) public Mono<ServiceResult> removeKnowledgeBase(@PathVariable("knowledgeBaseId") String knowledgeBaseId) { - return fastGptDatasetService.removeDataset(knowledgeBaseId); + return datasetService.removeDataset(knowledgeBaseId); } @GetMapping(value = {"/query"}, produces = MediaType.APPLICATION_JSON_VALUE) public ServiceResult getKnowledgeBaseRecord() { - return fastGptDatasetService.getDataSetRecord(); + return datasetService.getDataSetRecord(); } @GetMapping(value = {"/queryById/{knowledgeBaseId}"}, produces = MediaType.APPLICATION_JSON_VALUE) public ServiceResult getKnowledgeBaseRecordById(@PathVariable("knowledgeBaseId") String knowledgeBaseId) { - return fastGptDatasetService.geDatasetById(knowledgeBaseId); + return datasetService.geDatasetById(knowledgeBaseId); } @GetMapping(value = {"/queryByMaaSId/{maaSPlatformId}"}, produces = MediaType.APPLICATION_JSON_VALUE) public ServiceResult getKnowledgeBaseRecordByMaaSId(@PathVariable("maaSPlatformId") String maaSPlatformId) { - List<KnowledgeBase> knowledgeBaseByMaaSId = fastGptDatasetMapper.getKnowledgeBaseByMaaSId(maaSPlatformId); + List<KnowledgeBase> knowledgeBaseByMaaSId = datasetMapper.getKnowledgeBaseByMaaSId(maaSPlatformId); return new ServiceResult(new ResultHeader(200, "success"), knowledgeBaseByMaaSId); } + + @PostMapping(value = "/edit", produces = MediaType.APPLICATION_JSON_VALUE) + public Mono<ServiceResult> editDataset(@RequestBody KnowledgeBase knowledgeBase) { + return datasetService.editDataset(knowledgeBase); + } } diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/controller/MaaSController.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/controller/MaaSController.java index 4418287..2884f7b 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/controller/MaaSController.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/controller/MaaSController.java @@ -2,12 +2,10 @@ package org.onap.usecaseui.llmadaptation.controller; import lombok.extern.slf4j.Slf4j; import org.onap.usecaseui.llmadaptation.bean.*; -import org.onap.usecaseui.llmadaptation.mapper.MaaSPlatformMapper; import org.onap.usecaseui.llmadaptation.service.MaaSService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; -import reactor.core.publisher.Mono; import java.util.List; @@ -17,9 +15,6 @@ import java.util.List; public class MaaSController { @Autowired - private MaaSPlatformMapper maaSPlatformMapper; - - @Autowired private MaaSService maaSService; @GetMapping(value = {"/operator/maas/getAll"}, produces = MediaType.APPLICATION_JSON_VALUE) @@ -30,9 +25,6 @@ public class MaaSController { @PostMapping(value = "/maas/register", produces = MediaType.APPLICATION_JSON_VALUE) public ServiceResult registerMaaSPlatform(@RequestBody MaaSPlatform maaSPlatform) { - maaSPlatformMapper.insertMaaSPlatform(maaSPlatform); - maaSPlatformMapper.insertModel(maaSPlatform.getMaaSPlatformId(), maaSPlatform.getModelList()); - return new ServiceResult(new ResultHeader(200, "success")); + return maaSService.registerMaaSPlatform(maaSPlatform); } - } diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/mapper/FastGptApplicationMapper.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/mapper/ApplicationMapper.java index f3b6506..0937eed 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/mapper/FastGptApplicationMapper.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/mapper/ApplicationMapper.java @@ -7,7 +7,7 @@ import org.onap.usecaseui.llmadaptation.bean.Application; import java.util.List; @Mapper -public interface FastGptApplicationMapper { +public interface ApplicationMapper { List<Application> getAllApplication(); int insertApplication(@Param(value = "application") Application application); @@ -15,4 +15,6 @@ public interface FastGptApplicationMapper { int deleteApplicationById(@Param(value = "applicationId") String applicationId); Application getApplicationById(@Param(value = "applicationId") String applicationId); + + int updateApplication(@Param(value = "application") Application application); } diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/mapper/FastGptDatasetMapper.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/mapper/DatasetMapper.java index 4114f1a..5882061 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/mapper/FastGptDatasetMapper.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/mapper/DatasetMapper.java @@ -7,7 +7,7 @@ import org.onap.usecaseui.llmadaptation.bean.KnowledgeBase; import java.util.List; @Mapper -public interface FastGptDatasetMapper { +public interface DatasetMapper { int insertKnowledgeBaseRecord(@Param(value = "knowledgeBase") KnowledgeBase knowledgeBase); int insertFileName(@Param(value = "fileId") String fileId,@Param(value = "fileName") String fileName,@Param(value = "knowledgeBaseId") String knowledgeBaseId); @@ -23,4 +23,6 @@ public interface FastGptDatasetMapper { List<KnowledgeBase> getKnowledgeBaseByMaaSId(@Param(value = "maaSPlatformId") String maaSPlatformId); int deleteFileById(@Param(value = "knowledgeBaseId") String knowledgeBaseId); + + int updateKnowledgeBase(@Param(value = "knowledgeBase") KnowledgeBase knowledgeBase); } diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/mapper/MaaSPlatformMapper.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/mapper/MaaSPlatformMapper.java index bfe4089..d4eb21b 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/mapper/MaaSPlatformMapper.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/mapper/MaaSPlatformMapper.java @@ -18,4 +18,8 @@ public interface MaaSPlatformMapper { List<MaaSPlatform> getMaaSPlatforms(); List<ModelInformation> getModelList(@Param(value = "maaSPlatformId") String maaSPlatformId); + + MaaSPlatform getMaaSPlatformById(@Param(value = "maaSPlatformId") String maaSPlatformId); + + ModelInformation getModelById(@Param(value = "modelId") String modelId); } diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/ApplicationService.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/ApplicationService.java new file mode 100644 index 0000000..636832e --- /dev/null +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/ApplicationService.java @@ -0,0 +1,21 @@ +package org.onap.usecaseui.llmadaptation.service; + +import com.alibaba.fastjson2.JSONObject; +import org.onap.usecaseui.llmadaptation.bean.Application; +import org.onap.usecaseui.llmadaptation.bean.ServiceResult; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public interface ApplicationService { + Mono<ServiceResult> createApplication(Application application); + + Flux<String> chat(JSONObject question); + + Mono<ServiceResult> removeApplication(String applicationId); + + ServiceResult getApplications(); + + ServiceResult getApplicationById(String applicationId); + + Mono<ServiceResult> editApplication(Application application); +} diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/BiShengApplicationService.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/BiShengApplicationService.java new file mode 100644 index 0000000..8f600c4 --- /dev/null +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/BiShengApplicationService.java @@ -0,0 +1,17 @@ +package org.onap.usecaseui.llmadaptation.service; + +import com.alibaba.fastjson2.JSONObject; +import org.onap.usecaseui.llmadaptation.bean.Application; +import org.onap.usecaseui.llmadaptation.bean.ServiceResult; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public interface BiShengApplicationService { + Mono<ServiceResult> createApplication(Application application); + + Flux<String> chat(JSONObject question); + + Mono<ServiceResult> removeApplication(String applicationId); + + Mono<ServiceResult> editApplication(Application application); +} diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/BiShengDatasetService.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/BiShengDatasetService.java new file mode 100644 index 0000000..27716d7 --- /dev/null +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/BiShengDatasetService.java @@ -0,0 +1,15 @@ +package org.onap.usecaseui.llmadaptation.service; + +import org.onap.usecaseui.llmadaptation.bean.KnowledgeBase; +import org.onap.usecaseui.llmadaptation.bean.ServiceResult; +import org.springframework.http.codec.multipart.FilePart; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public interface BiShengDatasetService { + Mono<ServiceResult> createDataset(Flux<FilePart> fileParts, String metaData); + + Mono<ServiceResult> removeDataset(String knowledgeBaseId); + + Mono<ServiceResult> editDataset(KnowledgeBase knowledgeBase); +} diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/DatasetService.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/DatasetService.java new file mode 100644 index 0000000..f213362 --- /dev/null +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/DatasetService.java @@ -0,0 +1,19 @@ +package org.onap.usecaseui.llmadaptation.service; + +import org.onap.usecaseui.llmadaptation.bean.KnowledgeBase; +import org.onap.usecaseui.llmadaptation.bean.ServiceResult; +import org.springframework.http.codec.multipart.FilePart; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public interface DatasetService { + Mono<ServiceResult> createDataset(Flux<FilePart> fileParts, String metaData); + + Mono<ServiceResult> removeDataset(String knowledgeBaseId); + + ServiceResult getDataSetRecord(); + + ServiceResult geDatasetById(String knowledgeBaseId); + + Mono<ServiceResult> editDataset(KnowledgeBase knowledgeBase); +} diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/FastGptApplicationService.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/FastGptApplicationService.java index 19e6c11..6d09e6f 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/FastGptApplicationService.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/FastGptApplicationService.java @@ -13,7 +13,5 @@ public interface FastGptApplicationService { Mono<ServiceResult> removeApplication(String applicationId); - ServiceResult getApplications(); - - ServiceResult getApplicationById(String applicationId); + Mono<ServiceResult> editApplication(Application application); } diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/FastGptDatasetService.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/FastGptDatasetService.java index 901b1e0..47356b8 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/FastGptDatasetService.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/FastGptDatasetService.java @@ -1,5 +1,6 @@ package org.onap.usecaseui.llmadaptation.service; +import org.onap.usecaseui.llmadaptation.bean.KnowledgeBase; import org.onap.usecaseui.llmadaptation.bean.ServiceResult; import org.springframework.http.codec.multipart.FilePart; import reactor.core.publisher.Flux; @@ -10,7 +11,5 @@ public interface FastGptDatasetService { Mono<ServiceResult> removeDataset(String knowledgeBaseId); - ServiceResult getDataSetRecord(); - - ServiceResult geDatasetById(String knowledgeBaseId); + Mono<ServiceResult> editDataset(KnowledgeBase knowledgeBase); } diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/MaaSService.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/MaaSService.java index 0517887..026666a 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/MaaSService.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/MaaSService.java @@ -1,10 +1,13 @@ package org.onap.usecaseui.llmadaptation.service; +import org.onap.usecaseui.llmadaptation.bean.MaaSPlatform; import org.onap.usecaseui.llmadaptation.bean.Operator; -import reactor.core.publisher.Mono; +import org.onap.usecaseui.llmadaptation.bean.ServiceResult; import java.util.List; public interface MaaSService { List<Operator> getAllMaaSPlatform(); + + ServiceResult registerMaaSPlatform(MaaSPlatform maaSPlatform); } diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/ApplicationServiceImpl.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/ApplicationServiceImpl.java new file mode 100644 index 0000000..ae9a515 --- /dev/null +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/ApplicationServiceImpl.java @@ -0,0 +1,138 @@ +package org.onap.usecaseui.llmadaptation.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.onap.usecaseui.llmadaptation.bean.*; +import org.onap.usecaseui.llmadaptation.constant.ServerConstant; +import org.onap.usecaseui.llmadaptation.mapper.ApplicationMapper; +import org.onap.usecaseui.llmadaptation.mapper.DatasetMapper; +import org.onap.usecaseui.llmadaptation.mapper.MaaSPlatformMapper; +import org.onap.usecaseui.llmadaptation.service.ApplicationService; +import org.onap.usecaseui.llmadaptation.service.BiShengApplicationService; +import org.onap.usecaseui.llmadaptation.service.FastGptApplicationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; + +@Slf4j +@Service +public class ApplicationServiceImpl implements ApplicationService { + @Autowired + private ApplicationMapper applicationMapper; + + @Autowired + private DatasetMapper datasetMapper; + + @Autowired + private FastGptApplicationService fastGptApplicationService; + + @Autowired + private BiShengApplicationService biShengApplicationService; + + @Autowired + private MaaSPlatformMapper maaSPlatformMapper; + + @Autowired + private ServerConstant serverConstant; + + @Override + public Mono<ServiceResult> createApplication(Application application) { + List<Application> applications = applicationMapper.getAllApplication(); + if (!CollectionUtils.isEmpty(applications)) { + List<Application> collect = applications.stream().filter(app -> app.getApplicationName().equals(application.getApplicationName())).toList(); + if (!collect.isEmpty()) { + return Mono.just(new ServiceResult(new ResultHeader(500, "name exists"), applications)); + } + } + MaaSPlatform maaSPlatformById = maaSPlatformMapper.getMaaSPlatformById(application.getMaaSPlatformId()); + if (maaSPlatformById == null) { + return Mono.just(new ServiceResult(new ResultHeader(500, "maas is not exist"))); + } + String maaSType = maaSPlatformById.getMaaSType(); + String fastGptType = serverConstant.getFastGptType(); + if (fastGptType.equals(maaSType)) { + return fastGptApplicationService.createApplication(application); + } + return biShengApplicationService.createApplication(application); + } + + @Override + public Mono<ServiceResult> removeApplication(String applicationId) { + String maaSType = getMaaSType(applicationId); + String fastGptType = serverConstant.getFastGptType(); + if (fastGptType.equals(maaSType)) { + return fastGptApplicationService.removeApplication(applicationId); + } + return biShengApplicationService.removeApplication(applicationId); + } + + @Override + public Flux<String> chat(JSONObject question) { + String applicationId = question.getString("applicationId"); + String maaSType = getMaaSType(applicationId); + String fastGptType = serverConstant.getFastGptType(); + if (fastGptType.equals(maaSType)) { + return fastGptApplicationService.chat(question); + } + return biShengApplicationService.chat(question); + } + + @Override + public ServiceResult getApplications() { + List<Application> allApplication = applicationMapper.getAllApplication(); + if (CollectionUtils.isEmpty(allApplication)) { + return new ServiceResult(new ResultHeader(500, "no application"), allApplication); + } + allApplication.forEach(application -> { + KnowledgeBase knowledgeBaseRecordById = datasetMapper.getKnowledgeBaseRecordById(application.getKnowledgeBaseId()); + if (knowledgeBaseRecordById != null) { + application.setOperatorId(knowledgeBaseRecordById.getOperatorId()); + application.setOperatorName(knowledgeBaseRecordById.getOperatorName()); + application.setMaaSPlatformId(knowledgeBaseRecordById.getMaaSPlatformId()); + application.setMaaSPlatformName(knowledgeBaseRecordById.getMaaSPlatformName()); + application.setKnowledgeBaseName(knowledgeBaseRecordById.getKnowledgeBaseName()); + } + }); + return new ServiceResult(new ResultHeader(200, "success"), allApplication); + } + + @Override + public ServiceResult getApplicationById(String applicationId) { + Application application = applicationMapper.getApplicationById(applicationId); + if (application == null) { + return new ServiceResult(new ResultHeader(500, "no application"), application); + } + KnowledgeBase knowledgeBaseRecordById = datasetMapper.getKnowledgeBaseRecordById(application.getKnowledgeBaseId()); + application.setOperatorId(knowledgeBaseRecordById.getOperatorId()); + application.setOperatorName(knowledgeBaseRecordById.getOperatorName()); + application.setMaaSPlatformId(knowledgeBaseRecordById.getMaaSPlatformId()); + application.setMaaSPlatformName(knowledgeBaseRecordById.getMaaSPlatformName()); + application.setKnowledgeBaseName(knowledgeBaseRecordById.getKnowledgeBaseName()); + return new ServiceResult(new ResultHeader(200, "success"), application); + } + + @Override + public Mono<ServiceResult> editApplication(Application application) { + MaaSPlatform maaSPlatformById = maaSPlatformMapper.getMaaSPlatformById(application.getMaaSPlatformId()); + if (maaSPlatformById == null) { + return Mono.just(new ServiceResult(new ResultHeader(500, "maas is not exist"))); + } + String maaSType = maaSPlatformById.getMaaSType(); + String fastGptType = serverConstant.getFastGptType(); + if (fastGptType.equals(maaSType)) { + return fastGptApplicationService.editApplication(application); + } + return biShengApplicationService.editApplication(application); + } + + private String getMaaSType(String applicationId) { + Application applicationById = applicationMapper.getApplicationById(applicationId); + KnowledgeBase knowledgeBaseRecordById = datasetMapper.getKnowledgeBaseRecordById(applicationById.getKnowledgeBaseId()); + MaaSPlatform maaSPlatformById = maaSPlatformMapper.getMaaSPlatformById(knowledgeBaseRecordById.getMaaSPlatformId()); + return maaSPlatformById.getMaaSType(); + } +} diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/BiShengApplicationServiceImpl.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/BiShengApplicationServiceImpl.java new file mode 100644 index 0000000..737fc66 --- /dev/null +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/BiShengApplicationServiceImpl.java @@ -0,0 +1,178 @@ +package org.onap.usecaseui.llmadaptation.service.impl; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.onap.usecaseui.llmadaptation.bean.Application; +import org.onap.usecaseui.llmadaptation.bean.ResultHeader; +import org.onap.usecaseui.llmadaptation.bean.ServiceResult; +import org.onap.usecaseui.llmadaptation.bean.bisheng.BiShengCreateDatasetResponse; +import org.onap.usecaseui.llmadaptation.constant.BiShengConstant; +import org.onap.usecaseui.llmadaptation.constant.CommonConstant; +import org.onap.usecaseui.llmadaptation.constant.ServerConstant; +import org.onap.usecaseui.llmadaptation.mapper.ApplicationMapper; +import org.onap.usecaseui.llmadaptation.service.BiShengApplicationService; +import org.onap.usecaseui.llmadaptation.util.TimeUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.ArrayList; +import java.util.List; + +import static org.springframework.http.MediaType.APPLICATION_JSON; + +@Slf4j +@Service +public class BiShengApplicationServiceImpl implements BiShengApplicationService { + @Autowired + private ApplicationMapper applicationMapper; + + @Autowired + private WebClient webClient; + + @Autowired + private ServerConstant serverConstant; + + @Override + public Mono<ServiceResult> createApplication(Application application) { + JSONObject createParam = new JSONObject(); + createParam.put("logo", ""); + createParam.put("name", application.getApplicationName()); + createParam.put("prompt", application.getPrompt()); + return webClient.post() + .uri(serverConstant.getBiShengServer() + BiShengConstant.APPLICATION_URL) + .contentType(APPLICATION_JSON) + .header(CommonConstant.COOKIE, BiShengConstant.COOKIE_VALUE) + .bodyValue(createParam) + .retrieve() + .bodyToMono(BiShengCreateDatasetResponse.class) + .flatMap(createResponse -> { + JSONObject data = createResponse.getData(); + if (data == null) { + return Mono.just(new ServiceResult(new ResultHeader(createResponse.getStatus_code(), createResponse.getStatus_message()))); + } + String applicationId = data.getString("id"); + data.put("model_name", application.getLargeModelId()); + data.put("temperature", application.getTemperature() / 10); + List<Integer> list = new ArrayList<>(); + list.add(Integer.valueOf(application.getKnowledgeBaseId())); + data.put("knowledge_list", list); + data.put("guide_word", application.getOpeningRemarks()); + data.put("update_time", TimeUtil.getNowTime()); + return webClient.put() + .uri(serverConstant.getBiShengServer() + BiShengConstant.APPLICATION_URL) + .contentType(APPLICATION_JSON) + .header(CommonConstant.COOKIE, BiShengConstant.COOKIE_VALUE) + .bodyValue(data) + .retrieve() + .bodyToMono(BiShengCreateDatasetResponse.class) + .flatMap(updateResponse -> { + application.setApplicationId(applicationId); + applicationMapper.insertApplication(application); + return Mono.just(new ServiceResult(new ResultHeader(200, "Application created successfully"))); + }); + }).onErrorResume(e -> { + log.error("Error occurred while creating application: {}", e.getMessage()); + return Mono.just(new ServiceResult(new ResultHeader(500, "Application creation failed"))); + }); + } + + @Override + public Flux<String> chat(JSONObject question) { + JSONObject param = new JSONObject(); + param.put("model", question.getString("applicationId")); + param.put("temperature", 0); + param.put("stream", true); + JSONObject message = new JSONObject(); + message.put("role", "user"); + message.put("content", question.getString("question")); + JSONArray jsonArray = new JSONArray(); + jsonArray.add(message); + param.put("messages", jsonArray); + return webClient.post() + .uri(serverConstant.getBiShengServer() + BiShengConstant.APPLICATION_CHAT_URL) + .bodyValue(param) + .retrieve() + .bodyToFlux(String.class) + .flatMap(response -> { + if("[DONE]".equals(response)){ + return Flux.just(response); + } + JSONArray choices = JSONObject.parseObject(response).getJSONArray("choices"); + String jsonString = JSONObject.toJSONString(choices.get(0)); + JSONObject jsonObject = JSONObject.parseObject(jsonString); + String string = jsonObject.getJSONObject("delta").getString("content"); + return Flux.just(string); + }) + .onErrorResume(e -> { + log.error("An error occurred {}", e.getMessage()); + return Flux.just("Network Error"); + }); + } + + @Override + public Mono<ServiceResult> removeApplication(String applicationId) { + String url = serverConstant.getBiShengServer() + BiShengConstant.DELETE_APPLICATION + applicationId; + return webClient.post() + .uri(url) + .header(CommonConstant.COOKIE, BiShengConstant.COOKIE_VALUE) + .retrieve() + .bodyToMono(BiShengCreateDatasetResponse.class) + .flatMap(response -> { + if (response.getStatus_code() == 200) { + return Mono.fromRunnable(() -> { + try { + applicationMapper.deleteApplicationById(applicationId); + } catch (Exception dbException) { + throw new RuntimeException("Database operation failed", dbException); + } + }).then(Mono.just(new ServiceResult(new ResultHeader(200, "delete success")))); + } else { + return Mono.just(new ServiceResult(new ResultHeader(500, response.getStatus_message()))); + } + }) + .onErrorResume(e -> { + log.error("Error occurred while delete dataset: {}", e.getMessage()); + return Mono.just(new ServiceResult(new ResultHeader(500, "delete failed"))); + }); + } + + @Override + public Mono<ServiceResult> editApplication(Application application) { + String url = serverConstant.getBiShengServer() + BiShengConstant.GET_APPLICATION_URL + application.getApplicationId(); + return webClient.get() + .uri(url) + .header(CommonConstant.COOKIE, BiShengConstant.COOKIE_VALUE) + .retrieve() + .bodyToMono(BiShengCreateDatasetResponse.class) + .flatMap(createResponse -> { + JSONObject data = createResponse.getData(); + if (data == null) { + return Mono.just(new ServiceResult(new ResultHeader(createResponse.getStatus_code(), createResponse.getStatus_message()))); + } + data.put("desc", application.getApplicationDescription()); + data.put("name", application.getApplicationName()); + data.put("update_time", TimeUtil.getNowTime()); + List<Integer> list = new ArrayList<>(); + list.add(Integer.valueOf(application.getKnowledgeBaseId())); + data.put("knowledge_list", list); + return webClient.put() + .uri(serverConstant.getBiShengServer() + BiShengConstant.APPLICATION_URL) + .contentType(APPLICATION_JSON) + .header(CommonConstant.COOKIE, BiShengConstant.COOKIE_VALUE) + .bodyValue(data) + .retrieve() + .bodyToMono(BiShengCreateDatasetResponse.class) + .flatMap(updateResponse -> { + applicationMapper.updateApplication(application); + return Mono.just(new ServiceResult(new ResultHeader(200, "Application update successfully"))); + }); + }).onErrorResume(e -> { + log.error("Error occurred while update application: {}", e.getMessage()); + return Mono.just(new ServiceResult(new ResultHeader(500, "Application update failed"))); + }); + } +} diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/BiShengDatasetServiceImpl.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/BiShengDatasetServiceImpl.java new file mode 100644 index 0000000..bc1cec0 --- /dev/null +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/BiShengDatasetServiceImpl.java @@ -0,0 +1,191 @@ +package org.onap.usecaseui.llmadaptation.service.impl; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.onap.usecaseui.llmadaptation.bean.KnowledgeBase; +import org.onap.usecaseui.llmadaptation.bean.ResultHeader; +import org.onap.usecaseui.llmadaptation.bean.ServiceResult; +import org.onap.usecaseui.llmadaptation.bean.bisheng.BiShengCreateDatasetResponse; +import org.onap.usecaseui.llmadaptation.bean.bisheng.ProcessFileResponse; +import org.onap.usecaseui.llmadaptation.constant.BiShengConstant; +import org.onap.usecaseui.llmadaptation.constant.CommonConstant; +import org.onap.usecaseui.llmadaptation.constant.ServerConstant; +import org.onap.usecaseui.llmadaptation.mapper.DatasetMapper; +import org.onap.usecaseui.llmadaptation.service.BiShengDatasetService; +import org.onap.usecaseui.llmadaptation.util.TimeUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.ContentDisposition; +import org.springframework.http.MediaType; +import org.springframework.http.client.MultipartBodyBuilder; +import org.springframework.http.codec.multipart.FilePart; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.UUID; + +import static org.springframework.http.MediaType.APPLICATION_JSON; + +@Slf4j +@Service +public class BiShengDatasetServiceImpl implements BiShengDatasetService { + + @Autowired + private WebClient webClient; + + @Autowired + private DatasetMapper datasetMapper; + + @Autowired + private ServerConstant serverConstant; + + @Override + public Mono<ServiceResult> createDataset(Flux<FilePart> fileParts, String metaData) { + KnowledgeBase knowledgeBase = JSONObject.parseObject(metaData, KnowledgeBase.class); + knowledgeBase.setUpdateTime(TimeUtil.getNowTime()); + JSONObject createParam = new JSONObject(); + createParam.put("description", knowledgeBase.getKnowledgeBaseDescription()); + createParam.put("model", serverConstant.getBiShengModel()); + createParam.put("name", knowledgeBase.getKnowledgeBaseName()); + return webClient.post() + .uri(serverConstant.getBiShengServer() + BiShengConstant.CREATE_DATASET_URL) + .contentType(APPLICATION_JSON) + .header(CommonConstant.COOKIE, BiShengConstant.COOKIE_VALUE) + .bodyValue(createParam) + .retrieve() + .bodyToMono(BiShengCreateDatasetResponse.class) + .flatMap(response -> { + if (response.getStatus_code() != 200) { + return Mono.just(new ServiceResult(new ResultHeader(500, response.getStatus_message()))); + } + int knowledgeBaseId = response.getData().getIntValue("id"); + return fileParts.flatMap(filePart -> processFile(filePart, knowledgeBaseId)) + .then(Mono.defer(() -> { + knowledgeBase.setKnowledgeBaseId(String.valueOf(knowledgeBaseId)); + datasetMapper.insertKnowledgeBaseRecord(knowledgeBase); + return Mono.just(new ServiceResult(new ResultHeader(200, "create success"))); + })).onErrorResume(e -> { + log.error("Error occurred during file upload: {}", e.getMessage()); + return Mono.just(new ServiceResult(new ResultHeader(500, "file upload failed"))); + }); + }).onErrorResume(e -> { + log.error("Error occurred while creating dataset: {}", e.getMessage()); + return Mono.just(new ServiceResult(new ResultHeader(500, "create failed"))); + }); + } + + private Mono<Void> processFile(FilePart filePart, int knowledgeBaseId) { + String filename = filePart.filename(); + Flux<DataBuffer> content = filePart.content(); + MultipartBodyBuilder builder = new MultipartBodyBuilder(); + builder.asyncPart("file", content, DataBuffer.class) + .headers(headers -> { + ContentDisposition contentDisposition = ContentDisposition + .builder("form-data") + .name("file") + .filename(filename) + .build(); + headers.setContentDisposition(contentDisposition); + headers.setContentType(MediaType.TEXT_PLAIN); + }); + return webClient.post() + .uri(serverConstant.getBiShengServer() + BiShengConstant.UPLOAD_FILE_URL) + .contentType(MediaType.MULTIPART_FORM_DATA) + .header(CommonConstant.COOKIE, BiShengConstant.COOKIE_VALUE) + .body(BodyInserters.fromMultipartData(builder.build())) + .retrieve() + .bodyToMono(BiShengCreateDatasetResponse.class) + .flatMap(response -> { + if (response.getStatus_code() != 200) { + log.error("response is {}", response); + return Mono.empty(); + } + String filePath = response.getData().getString("file_path"); + JSONObject processParam = new JSONObject(); + processParam.put("knowledge_id", knowledgeBaseId); + JSONArray jsonArray = new JSONArray(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("file_path", filePath); + jsonArray.add(jsonObject); + processParam.put("file_list", jsonArray); + return webClient.post() + .uri(serverConstant.getBiShengServer() + BiShengConstant.PROCESS_FILE_URL) + .contentType(APPLICATION_JSON) + .header(CommonConstant.COOKIE, BiShengConstant.COOKIE_VALUE) + .bodyValue(processParam) + .retrieve() + .bodyToMono(ProcessFileResponse.class).flatMap(lastResponse -> { + if (lastResponse.getStatus_code() == 200) { + String fileId = UUID.randomUUID().toString(); + datasetMapper.insertFileName(fileId, filename, String.valueOf(knowledgeBaseId)); + } + return Mono.empty(); + }); + }); + } + + @Override + public Mono<ServiceResult> removeDataset(String knowledgeBaseId) { + return webClient.delete() + .uri(serverConstant.getBiShengServer() + BiShengConstant.DATASET_V2_URL + knowledgeBaseId) + .header(CommonConstant.COOKIE, BiShengConstant.COOKIE_VALUE) + .retrieve() + .bodyToMono(BiShengCreateDatasetResponse.class) + .flatMap(response -> { + if (response.getStatus_code() == 200) { + return Mono.fromRunnable(() -> { + try { + datasetMapper.deleteKnowledgeBaseByUuid(knowledgeBaseId); + datasetMapper.deleteFileById(knowledgeBaseId); + } catch (Exception dbException) { + throw new RuntimeException("Database operation failed", dbException); + } + }).then(Mono.just(new ServiceResult(new ResultHeader(200, "delete success")))); + } else { + return Mono.just(new ServiceResult(new ResultHeader(500, response.getStatus_message()))); + } + }) + .onErrorResume(e -> { + log.error("Error occurred while delete dataset: {}", e.getMessage()); + return Mono.just(new ServiceResult(new ResultHeader(500, "delete failed"))); + }); + } + + @Override + public Mono<ServiceResult> editDataset(KnowledgeBase knowledgeBase) { + KnowledgeBase knowledgeBaseRecordById = datasetMapper.getKnowledgeBaseRecordById(knowledgeBase.getKnowledgeBaseId()); + if (knowledgeBaseRecordById == null) { + return Mono.just(new ServiceResult(new ResultHeader(500, "dataset is not exist"))); + } + JSONObject updateParam = new JSONObject(); + updateParam.put("knowledge_id", knowledgeBase.getKnowledgeBaseId()); + updateParam.put("name", knowledgeBase.getKnowledgeBaseName()); + updateParam.put("description", knowledgeBase.getKnowledgeBaseDescription()); + updateParam.put("model", serverConstant.getBiShengModel()); + + return webClient.put() + .uri(serverConstant.getBiShengServer() + BiShengConstant.DATASET_V2_URL) + .contentType(APPLICATION_JSON) + .bodyValue(updateParam) + .retrieve() + .bodyToMono(BiShengCreateDatasetResponse.class) + .flatMap(response -> { + if (response.getStatus_code() == 200) { + return Mono.fromRunnable(() -> { + knowledgeBase.setUpdateTime(TimeUtil.getNowTime()); + datasetMapper.updateKnowledgeBase(knowledgeBase); + }).then(Mono.just(new ServiceResult(new ResultHeader(200, "update success")))); + } else { + return Mono.just(new ServiceResult(new ResultHeader(500, response.getStatus_message()))); + } + }) + .onErrorResume(e -> { + log.error("Error occurred while delete dataset: {}", e.getMessage()); + return Mono.just(new ServiceResult(new ResultHeader(500, "update failed"))); + }); + } +} diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/DatasetServiceImpl.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/DatasetServiceImpl.java new file mode 100644 index 0000000..0a6feb5 --- /dev/null +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/DatasetServiceImpl.java @@ -0,0 +1,111 @@ +package org.onap.usecaseui.llmadaptation.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.onap.usecaseui.llmadaptation.bean.KnowledgeBase; +import org.onap.usecaseui.llmadaptation.bean.MaaSPlatform; +import org.onap.usecaseui.llmadaptation.bean.ResultHeader; +import org.onap.usecaseui.llmadaptation.bean.ServiceResult; +import org.onap.usecaseui.llmadaptation.constant.ServerConstant; +import org.onap.usecaseui.llmadaptation.mapper.DatasetMapper; +import org.onap.usecaseui.llmadaptation.mapper.MaaSPlatformMapper; +import org.onap.usecaseui.llmadaptation.service.BiShengDatasetService; +import org.onap.usecaseui.llmadaptation.service.DatasetService; +import org.onap.usecaseui.llmadaptation.service.FastGptDatasetService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.codec.multipart.FilePart; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; + +@Slf4j +@Service +public class DatasetServiceImpl implements DatasetService { + + @Autowired + private DatasetMapper datasetMapper; + + @Autowired + private FastGptDatasetService fastGptDatasetService; + + @Autowired + private BiShengDatasetService biShengDatasetService; + + @Autowired + private MaaSPlatformMapper maaSPlatformMapper; + + @Autowired + private ServerConstant serverConstant; + + @Override + public Mono<ServiceResult> createDataset(Flux<FilePart> fileParts, String metaData) { + KnowledgeBase knowledgeBase = JSONObject.parseObject(metaData, KnowledgeBase.class); + List<KnowledgeBase> knowledgeBaseRecords = datasetMapper.getKnowledgeBaseRecords(); + if (!CollectionUtils.isEmpty(knowledgeBaseRecords)) { + List<KnowledgeBase> collect = knowledgeBaseRecords.stream().filter(base -> base.getKnowledgeBaseName().equals(knowledgeBase.getKnowledgeBaseName())).toList(); + if (!collect.isEmpty()) { + return Mono.just(new ServiceResult(new ResultHeader(200, "name exists"), knowledgeBaseRecords)); + } + } + MaaSPlatform maaSPlatformById = maaSPlatformMapper.getMaaSPlatformById(knowledgeBase.getMaaSPlatformId()); + String maaSType = maaSPlatformById.getMaaSType(); + String fastGptType = serverConstant.getFastGptType(); + if (fastGptType.equals(maaSType)) { + return fastGptDatasetService.createDataset(fileParts, metaData); + } + return biShengDatasetService.createDataset(fileParts, metaData); + } + + @Override + public Mono<ServiceResult> removeDataset(String knowledgeBaseId) { + KnowledgeBase knowledgeBaseRecordById = datasetMapper.getKnowledgeBaseRecordById(knowledgeBaseId); + MaaSPlatform maaSPlatformById = maaSPlatformMapper.getMaaSPlatformById(knowledgeBaseRecordById.getMaaSPlatformId()); + String maaSType = maaSPlatformById.getMaaSType(); + String fastGptType = serverConstant.getFastGptType(); + if (fastGptType.equals(maaSType)) { + return fastGptDatasetService.removeDataset(knowledgeBaseId); + } + return biShengDatasetService.removeDataset(knowledgeBaseId); + } + + @Override + public ServiceResult getDataSetRecord() { + List<KnowledgeBase> knowledgeBaseRecords = datasetMapper.getKnowledgeBaseRecords(); + if (CollectionUtils.isEmpty(knowledgeBaseRecords)) { + return new ServiceResult(new ResultHeader(500, "get datasets failed"), knowledgeBaseRecords); + } + + knowledgeBaseRecords.forEach(knowledgeBase -> { + List<String> fileNamesByKnowledgeBaseId = datasetMapper.getFileNamesByKnowledgeBaseId(knowledgeBase.getKnowledgeBaseId()); + knowledgeBase.setFilesName(fileNamesByKnowledgeBaseId); + }); + return new ServiceResult(new ResultHeader(200, "success"), knowledgeBaseRecords); + } + + @Override + public ServiceResult geDatasetById(String knowledgeBaseId) { + KnowledgeBase knowledgeBase = datasetMapper.getKnowledgeBaseRecordById(knowledgeBaseId); + if (knowledgeBase == null) { + return new ServiceResult(new ResultHeader(500, "get dataset failed")); + } + List<String> fileNamesByKnowledgeBaseId = datasetMapper.getFileNamesByKnowledgeBaseId(knowledgeBase.getKnowledgeBaseId()); + knowledgeBase.setFilesName(fileNamesByKnowledgeBaseId); + + return new ServiceResult(new ResultHeader(200, "success"), knowledgeBase); + } + + @Override + public Mono<ServiceResult> editDataset(KnowledgeBase knowledgeBase) { + KnowledgeBase knowledgeBaseRecordById = datasetMapper.getKnowledgeBaseRecordById(knowledgeBase.getKnowledgeBaseId()); + MaaSPlatform maaSPlatformById = maaSPlatformMapper.getMaaSPlatformById(knowledgeBaseRecordById.getMaaSPlatformId()); + String maaSType = maaSPlatformById.getMaaSType(); + String fastGptType = serverConstant.getFastGptType(); + if (fastGptType.equals(maaSType)) { + return fastGptDatasetService.editDataset(knowledgeBase); + } + return biShengDatasetService.editDataset(knowledgeBase); + } +} diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/FastGptApplicationServiceImpl.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/FastGptApplicationServiceImpl.java index d8f68ad..14f30ad 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/FastGptApplicationServiceImpl.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/FastGptApplicationServiceImpl.java @@ -5,20 +5,19 @@ import com.alibaba.fastjson2.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.onap.usecaseui.llmadaptation.bean.Application; -import org.onap.usecaseui.llmadaptation.bean.KnowledgeBase; import org.onap.usecaseui.llmadaptation.bean.ResultHeader; import org.onap.usecaseui.llmadaptation.bean.ServiceResult; -import org.onap.usecaseui.llmadaptation.bean.fastgpt.CreateDataSetResponse; +import org.onap.usecaseui.llmadaptation.bean.fastgpt.dataset.CreateDataSetResponse; import org.onap.usecaseui.llmadaptation.bean.fastgpt.application.*; +import org.onap.usecaseui.llmadaptation.constant.CommonConstant; import org.onap.usecaseui.llmadaptation.constant.FastGptConstant; -import org.onap.usecaseui.llmadaptation.mapper.FastGptApplicationMapper; -import org.onap.usecaseui.llmadaptation.mapper.FastGptDatasetMapper; +import org.onap.usecaseui.llmadaptation.constant.ServerConstant; +import org.onap.usecaseui.llmadaptation.mapper.ApplicationMapper; import org.onap.usecaseui.llmadaptation.service.FastGptApplicationService; import org.onap.usecaseui.llmadaptation.util.TimeUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ResourceLoader; import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -39,16 +38,17 @@ public class FastGptApplicationServiceImpl implements FastGptApplicationService private ResourceLoader resourceLoader; @Autowired - private FastGptApplicationMapper fastGptApplicationMapper; + private ApplicationMapper applicationMapper; @Autowired private WebClient webClient; @Autowired - private FastGptDatasetMapper fastGptDatasetMapper; + private ServerConstant serverConstant; private final ObjectMapper objectMapper = new ObjectMapper(); + @Override public Mono<ServiceResult> createApplication(Application application) { try (InputStream inputStream = resourceLoader.getResource(FastGptConstant.CREATE_APP_PARAM_FILE_URL).getInputStream()) { CreateApplicationParam createApplicationParam = objectMapper.readValue(inputStream, CreateApplicationParam.class); @@ -68,9 +68,9 @@ public class FastGptApplicationServiceImpl implements FastGptApplicationService private Mono<ServiceResult> createApplication(CreateApplicationParam createApplicationParam, Application application) { return webClient.post() - .uri(FastGptConstant.CREATE_APPLICATION) + .uri(serverConstant.getFastGptServer() + FastGptConstant.CREATE_APPLICATION) .contentType(APPLICATION_JSON) - .header(FastGptConstant.COOKIE, FastGptConstant.COOKIE_VALUE) + .header(CommonConstant.COOKIE, FastGptConstant.COOKIE_VALUE) .bodyValue(createApplicationParam) .retrieve() .bodyToMono(CreateDataSetResponse.class) @@ -85,7 +85,7 @@ public class FastGptApplicationServiceImpl implements FastGptApplicationService private Mono<ServiceResult> handleApplicationResponse(CreateDataSetResponse createDataSetResponse, Application application) { String data = String.valueOf(createDataSetResponse.getData()); application.setApplicationId(data); - String url = FastGptConstant.UPDATE_APPLICATION + data; + String url = serverConstant.getFastGptServer() + FastGptConstant.UPDATE_APPLICATION + data; UpdateApplicationParam updateApplicationParam = new UpdateApplicationParam(); updateApplicationParam.setAvatar("/imgs/app/avatar/simple.svg"); updateApplicationParam.setDefaultPermission(0); @@ -95,7 +95,7 @@ public class FastGptApplicationServiceImpl implements FastGptApplicationService return webClient.put() .uri(url) .contentType(APPLICATION_JSON) - .header(FastGptConstant.COOKIE, FastGptConstant.COOKIE_VALUE) + .header(CommonConstant.COOKIE, FastGptConstant.COOKIE_VALUE) .bodyValue(updateApplicationParam) .retrieve() .bodyToMono(CreateDataSetResponse.class) @@ -113,18 +113,18 @@ public class FastGptApplicationServiceImpl implements FastGptApplicationService publishApplicationParam.setVersionName(TimeUtil.getNowTime()); publishApplicationParam.getChatConfig().setWelcomeText(application.getOpeningRemarks()); setApplicationParameters(application, publishApplicationParam); - String publishUrl = FastGptConstant.PUBLISH_APPLICATION + data; + String publishUrl = serverConstant.getFastGptServer() + FastGptConstant.PUBLISH_APPLICATION + data; return webClient.post() .uri(publishUrl) .contentType(APPLICATION_JSON) - .header(FastGptConstant.COOKIE, FastGptConstant.COOKIE_VALUE) + .header(CommonConstant.COOKIE, FastGptConstant.COOKIE_VALUE) .bodyValue(publishApplicationParam) .retrieve() .bodyToMono(CreateDataSetResponse.class) .flatMap(response -> { if (response.getCode() == 200) { - fastGptApplicationMapper.insertApplication(application); + applicationMapper.insertApplication(application); return Mono.just(new ServiceResult(new ResultHeader(200, "Application created successfully"))); } return Mono.just(new ServiceResult(new ResultHeader(500, response.getStatusText()))); @@ -166,8 +166,8 @@ public class FastGptApplicationServiceImpl implements FastGptApplicationService }); } + @Override public Flux<String> chat(JSONObject question) { - log.info(JSONObject.toJSONString(question)); ChatParam chatParam = new ChatParam(); chatParam.setAppId(question.getString("applicationId")); chatParam.setStream(true); @@ -186,9 +186,9 @@ public class FastGptApplicationServiceImpl implements FastGptApplicationService chatParam.setMessages(messages); AtomicBoolean isDone = new AtomicBoolean(false); return webClient.post() - .uri(FastGptConstant.APPLICATION_CHAT_URL) + .uri(serverConstant.getFastGptServer() + FastGptConstant.APPLICATION_CHAT_URL) .contentType(APPLICATION_JSON) - .header(FastGptConstant.COOKIE, FastGptConstant.COOKIE_VALUE) + .header(CommonConstant.COOKIE, FastGptConstant.COOKIE_VALUE) .bodyValue(chatParam) .retrieve() .bodyToFlux(String.class).flatMap(response -> parseAndTransform(response, isDone)) @@ -210,7 +210,7 @@ public class FastGptApplicationServiceImpl implements FastGptApplicationService JSONObject choice = choices.getJSONObject(0); if ("stop".equals(choice.getString("finish_reason"))) { isDone.set(true); - return Flux.empty(); + return Flux.just("[DONE]"); } String string = choice.getJSONObject("delta").getString("content"); isDone.set(false); @@ -218,21 +218,21 @@ public class FastGptApplicationServiceImpl implements FastGptApplicationService return Flux.just(string); } + @Override public Mono<ServiceResult> removeApplication(String applicationId) { - String url = FastGptConstant.DELETE_APPLICATION + applicationId; - + String url = serverConstant.getFastGptServer() + FastGptConstant.DELETE_APPLICATION + applicationId; return webClient.delete() .uri(url) - .header(FastGptConstant.COOKIE, FastGptConstant.COOKIE_VALUE) + .header(CommonConstant.COOKIE, FastGptConstant.COOKIE_VALUE) .retrieve() .bodyToMono(CreateDataSetResponse.class) .flatMap(response -> { if (response.getCode() == 200) { return Mono.fromRunnable(() -> { try { - fastGptApplicationMapper.deleteApplicationById(applicationId); + applicationMapper.deleteApplicationById(applicationId); } catch (Exception dbException) { - throw new RuntimeException("Database operation failed", dbException); // 抛出新异常 + throw new RuntimeException("Database operation failed", dbException); } }).then(Mono.just(new ServiceResult(new ResultHeader(200, "delete success")))); } else { @@ -245,35 +245,34 @@ public class FastGptApplicationServiceImpl implements FastGptApplicationService }); } - public ServiceResult getApplications() { - List<Application> allApplication = fastGptApplicationMapper.getAllApplication(); - if (CollectionUtils.isEmpty(allApplication)) { - return new ServiceResult(new ResultHeader(200, "no application"), allApplication); - } - allApplication.forEach(application -> { - KnowledgeBase knowledgeBaseRecordById = fastGptDatasetMapper.getKnowledgeBaseRecordById(application.getKnowledgeBaseId()); - if (knowledgeBaseRecordById != null) { - application.setOperatorId(knowledgeBaseRecordById.getOperatorId()); - application.setOperatorName(knowledgeBaseRecordById.getOperatorName()); - application.setMaaSPlatformId(knowledgeBaseRecordById.getMaaSPlatformId()); - application.setMaaSPlatformName(knowledgeBaseRecordById.getMaaSPlatformName()); - application.setKnowledgeBaseName(knowledgeBaseRecordById.getKnowledgeBaseName()); - } - }); - return new ServiceResult(new ResultHeader(200, "success"), allApplication); - } + @Override + public Mono<ServiceResult> editApplication(Application application) { + String url = serverConstant.getFastGptServer() + FastGptConstant.UPDATE_APPLICATION + application.getApplicationId(); + UpdateApplicationParam updateApplicationParam = new UpdateApplicationParam(); + updateApplicationParam.setAvatar("/imgs/app/avatar/simple.svg"); + updateApplicationParam.setName(application.getApplicationName()); + updateApplicationParam.setIntro(application.getApplicationDescription()); - public ServiceResult getApplicationById(String applicationId) { - Application application = fastGptApplicationMapper.getApplicationById(applicationId); - if (application == null) { - return new ServiceResult(new ResultHeader(200, "no application"), application); - } - KnowledgeBase knowledgeBaseRecordById = fastGptDatasetMapper.getKnowledgeBaseRecordById(application.getKnowledgeBaseId()); - application.setOperatorId(knowledgeBaseRecordById.getOperatorId()); - application.setOperatorName(knowledgeBaseRecordById.getOperatorName()); - application.setMaaSPlatformId(knowledgeBaseRecordById.getMaaSPlatformId()); - application.setMaaSPlatformName(knowledgeBaseRecordById.getMaaSPlatformName()); - application.setKnowledgeBaseName(knowledgeBaseRecordById.getKnowledgeBaseName()); - return new ServiceResult(new ResultHeader(200, "success"), application); + return webClient.put() + .uri(url) + .contentType(APPLICATION_JSON) + .header(CommonConstant.COOKIE, FastGptConstant.COOKIE_VALUE) + .bodyValue(updateApplicationParam) + .retrieve() + .bodyToMono(CreateDataSetResponse.class) + .flatMap(response -> { + if (response.getCode() == 200) { + return Mono.fromRunnable(() -> { + applicationMapper.updateApplication(application); + }).then(Mono.just(new ServiceResult(new ResultHeader(200, "edit success")))); + } else { + return Mono.just(new ServiceResult(new ResultHeader(500, response.getStatusText()))); + } + }) + .onErrorResume(e -> { + log.error("Error occurred while delete dataset: {}", e.getMessage()); + return Mono.just(new ServiceResult(new ResultHeader(500, "edit failed"))); + }); } + } diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/FastGptDatasetServiceImpl.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/FastGptDatasetServiceImpl.java index 0cc1528..df8787d 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/FastGptDatasetServiceImpl.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/FastGptDatasetServiceImpl.java @@ -7,11 +7,13 @@ import org.jetbrains.annotations.NotNull; import org.onap.usecaseui.llmadaptation.bean.KnowledgeBase; import org.onap.usecaseui.llmadaptation.bean.ResultHeader; import org.onap.usecaseui.llmadaptation.bean.ServiceResult; -import org.onap.usecaseui.llmadaptation.bean.fastgpt.CreateCollectionParam; -import org.onap.usecaseui.llmadaptation.bean.fastgpt.CreateDataSetParam; -import org.onap.usecaseui.llmadaptation.bean.fastgpt.CreateDataSetResponse; +import org.onap.usecaseui.llmadaptation.bean.fastgpt.dataset.CreateCollectionParam; +import org.onap.usecaseui.llmadaptation.bean.fastgpt.dataset.CreateDataSetParam; +import org.onap.usecaseui.llmadaptation.bean.fastgpt.dataset.CreateDataSetResponse; +import org.onap.usecaseui.llmadaptation.constant.CommonConstant; import org.onap.usecaseui.llmadaptation.constant.FastGptConstant; -import org.onap.usecaseui.llmadaptation.mapper.FastGptDatasetMapper; +import org.onap.usecaseui.llmadaptation.constant.ServerConstant; +import org.onap.usecaseui.llmadaptation.mapper.DatasetMapper; import org.onap.usecaseui.llmadaptation.service.FastGptDatasetService; import org.onap.usecaseui.llmadaptation.util.TimeUtil; import org.springframework.beans.factory.annotation.Autowired; @@ -21,13 +23,11 @@ import org.springframework.http.MediaType; import org.springframework.http.client.MultipartBodyBuilder; import org.springframework.http.codec.multipart.FilePart; import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.util.List; import static org.springframework.http.MediaType.APPLICATION_JSON; @@ -35,25 +35,29 @@ import static org.springframework.http.MediaType.APPLICATION_JSON; @Service public class FastGptDatasetServiceImpl implements FastGptDatasetService { @Autowired - private FastGptDatasetMapper fastGptDatasetMapper; + private DatasetMapper datasetMapper; @Autowired private WebClient webClient; + @Autowired + private ServerConstant serverConstant; + + @Override public Mono<ServiceResult> createDataset(Flux<FilePart> fileParts, String metaData) { KnowledgeBase knowledgeBase = JSONObject.parseObject(metaData, KnowledgeBase.class); knowledgeBase.setUpdateTime(TimeUtil.getNowTime()); CreateDataSetParam dataSetParam = new CreateDataSetParam(); - dataSetParam.setAgentModel("qwen2:7b"); + dataSetParam.setAgentModel(serverConstant.getFastGptModel()); dataSetParam.setType("dataset"); dataSetParam.setAvatar("core/dataset/commonDatasetColor"); dataSetParam.setVectorModel("m3e"); dataSetParam.setIntro(knowledgeBase.getKnowledgeBaseDescription()); dataSetParam.setName(knowledgeBase.getKnowledgeBaseName()); return webClient.post() - .uri(FastGptConstant.CREATE_DATASET_URL) + .uri(serverConstant.getFastGptServer() + FastGptConstant.CREATE_DATASET_URL) .contentType(APPLICATION_JSON) - .header(FastGptConstant.COOKIE, FastGptConstant.COOKIE_VALUE) + .header(CommonConstant.COOKIE, FastGptConstant.COOKIE_VALUE) .bodyValue(dataSetParam) .retrieve() .bodyToMono(CreateDataSetResponse.class) @@ -63,7 +67,7 @@ public class FastGptDatasetServiceImpl implements FastGptDatasetService { return fileParts.flatMap(filePart -> uploadFile(filePart, knowledgeBaseId)) .then(Mono.defer(() -> { knowledgeBase.setKnowledgeBaseId(knowledgeBaseId); - fastGptDatasetMapper.insertKnowledgeBaseRecord(knowledgeBase); + datasetMapper.insertKnowledgeBaseRecord(knowledgeBase); return Mono.just(new ServiceResult(new ResultHeader(200, "create success"))); })) .onErrorResume(e -> { @@ -99,9 +103,9 @@ public class FastGptDatasetServiceImpl implements FastGptDatasetService { }); return webClient.post() - .uri(FastGptConstant.UPLOAD_FILE_URL) + .uri(serverConstant.getFastGptServer() + FastGptConstant.UPLOAD_FILE_URL) .contentType(MediaType.MULTIPART_FORM_DATA) - .header(FastGptConstant.COOKIE, FastGptConstant.COOKIE_VALUE) + .header(CommonConstant.COOKIE, FastGptConstant.COOKIE_VALUE) .body(BodyInserters.fromMultipartData(builder.build())) .retrieve() .bodyToMono(CreateDataSetResponse.class) @@ -116,15 +120,15 @@ public class FastGptDatasetServiceImpl implements FastGptDatasetService { CreateCollectionParam createCollectionParam = getCreateCollectionParam(knowledgeBaseId, fileId); return webClient.post() - .uri(FastGptConstant.CRATE_COLLECTION_URL) + .uri(serverConstant.getFastGptServer() + FastGptConstant.CRATE_COLLECTION_URL) .contentType(APPLICATION_JSON) - .header(FastGptConstant.COOKIE, FastGptConstant.COOKIE_VALUE) + .header(CommonConstant.COOKIE, FastGptConstant.COOKIE_VALUE) .bodyValue(createCollectionParam) .retrieve() .bodyToMono(CreateDataSetResponse.class) .flatMap(responseData -> { if (responseData.getCode() == 200) { - fastGptDatasetMapper.insertFileName(fileId, filename, knowledgeBaseId); + datasetMapper.insertFileName(fileId, filename, knowledgeBaseId); } return Mono.empty(); }); @@ -144,21 +148,22 @@ public class FastGptDatasetServiceImpl implements FastGptDatasetService { return createCollectionParam; } + @Override public Mono<ServiceResult> removeDataset(String knowledgeBaseId) { - String url = FastGptConstant.DELETE_DATASET_URL + knowledgeBaseId; + String url = serverConstant.getFastGptServer() + FastGptConstant.DELETE_DATASET_URL + knowledgeBaseId; return webClient.delete() .uri(url) - .header(FastGptConstant.COOKIE, FastGptConstant.COOKIE_VALUE) + .header(CommonConstant.COOKIE, FastGptConstant.COOKIE_VALUE) .retrieve() .bodyToMono(CreateDataSetResponse.class) .flatMap(response -> { if (response.getCode() == 200) { return Mono.fromRunnable(() -> { try { - fastGptDatasetMapper.deleteKnowledgeBaseByUuid(knowledgeBaseId); - fastGptDatasetMapper.deleteFileById(knowledgeBaseId); + datasetMapper.deleteKnowledgeBaseByUuid(knowledgeBaseId); + datasetMapper.deleteFileById(knowledgeBaseId); } catch (Exception dbException) { - throw new RuntimeException("Database operation failed", dbException); // 抛出新异常 + throw new RuntimeException("Database operation failed", dbException); } }).then(Mono.just(new ServiceResult(new ResultHeader(200, "delete success")))); } else { @@ -171,28 +176,38 @@ public class FastGptDatasetServiceImpl implements FastGptDatasetService { }); } - public ServiceResult getDataSetRecord() { - List<KnowledgeBase> knowledgeBaseRecords = fastGptDatasetMapper.getKnowledgeBaseRecords(); - if (CollectionUtils.isEmpty(knowledgeBaseRecords)) { - return new ServiceResult(new ResultHeader(200, "get datasets failed"), knowledgeBaseRecords); - } - - knowledgeBaseRecords.forEach(knowledgeBase -> { - List<String> fileNamesByKnowledgeBaseId = fastGptDatasetMapper.getFileNamesByKnowledgeBaseId(knowledgeBase.getKnowledgeBaseId()); - knowledgeBase.setFilesName(fileNamesByKnowledgeBaseId); - }); - return new ServiceResult(new ResultHeader(200, "success"), knowledgeBaseRecords); - } - - public ServiceResult geDatasetById(String knowledgeBaseId) { - KnowledgeBase knowledgeBase = fastGptDatasetMapper.getKnowledgeBaseRecordById(knowledgeBaseId); - if (knowledgeBase == null) { - return new ServiceResult(new ResultHeader(200, "get dataset failed")); + @Override + public Mono<ServiceResult> editDataset(KnowledgeBase knowledgeBase) { + KnowledgeBase knowledgeBaseRecordById = datasetMapper.getKnowledgeBaseRecordById(knowledgeBase.getKnowledgeBaseId()); + if (knowledgeBaseRecordById == null) { + return Mono.just(new ServiceResult(new ResultHeader(500, "dataset is not exist"))); } - List<String> fileNamesByKnowledgeBaseId = fastGptDatasetMapper.getFileNamesByKnowledgeBaseId(knowledgeBase.getKnowledgeBaseId()); - knowledgeBase.setFilesName(fileNamesByKnowledgeBaseId); - - return new ServiceResult(new ResultHeader(200, "success"), knowledgeBase); + JSONObject updateParam = new JSONObject(); + updateParam.put("id", knowledgeBase.getKnowledgeBaseId()); + updateParam.put("name", knowledgeBase.getKnowledgeBaseName()); + updateParam.put("intro", knowledgeBase.getKnowledgeBaseDescription()); + updateParam.put("avatar", "core/dataset/commonDatasetColor"); + + return webClient.put() + .uri(serverConstant.getFastGptServer() + FastGptConstant.UPDATE_DATASET_URL) + .contentType(APPLICATION_JSON) + .header(CommonConstant.COOKIE, FastGptConstant.COOKIE_VALUE) + .bodyValue(updateParam) + .retrieve() + .bodyToMono(CreateDataSetResponse.class) + .flatMap(response -> { + if (response.getCode() == 200) { + return Mono.fromRunnable(() -> { + knowledgeBase.setUpdateTime(TimeUtil.getNowTime()); + datasetMapper.updateKnowledgeBase(knowledgeBase); + }).then(Mono.just(new ServiceResult(new ResultHeader(200, "update success")))); + } else { + return Mono.just(new ServiceResult(new ResultHeader(500, response.getStatusText()))); + } + }) + .onErrorResume(e -> { + log.error("Error occurred while delete dataset: {}", e.getMessage()); + return Mono.just(new ServiceResult(new ResultHeader(500, "update failed"))); + }); } - } diff --git a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/MaaSServiceImpl.java b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/MaaSServiceImpl.java index 10ee028..6823e1a 100644 --- a/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/MaaSServiceImpl.java +++ b/llm-adaptation/src/main/java/org/onap/usecaseui/llmadaptation/service/impl/MaaSServiceImpl.java @@ -1,21 +1,13 @@ package org.onap.usecaseui.llmadaptation.service.impl; -import com.alibaba.fastjson2.JSONObject; -import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; -import org.onap.usecaseui.llmadaptation.bean.MaaSPlatform; -import org.onap.usecaseui.llmadaptation.bean.ModelInformation; -import org.onap.usecaseui.llmadaptation.bean.Operator; -import org.onap.usecaseui.llmadaptation.bean.fastgpt.CreateDataSetResponse; +import org.onap.usecaseui.llmadaptation.bean.*; import org.onap.usecaseui.llmadaptation.mapper.MaaSPlatformMapper; import org.onap.usecaseui.llmadaptation.service.MaaSService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -49,4 +41,22 @@ public class MaaSServiceImpl implements MaaSService { }); return operatorList; } + + @Override + public ServiceResult registerMaaSPlatform(MaaSPlatform maaSPlatform) { + MaaSPlatform maaSPlatformById = maaSPlatformMapper.getMaaSPlatformById(maaSPlatform.getMaaSPlatformId()); + if (maaSPlatformById != null) { + return new ServiceResult(new ResultHeader(500, maaSPlatform.getMaaSPlatformName() + "already exists")); + } + List<ModelInformation> modelList = maaSPlatform.getModelList(); + for (ModelInformation model : modelList) { + ModelInformation modelById = maaSPlatformMapper.getModelById(model.getModelId()); + if (modelById != null) { + return new ServiceResult(new ResultHeader(500, model.getModelName() + " already exists")); + } + } + maaSPlatformMapper.insertMaaSPlatform(maaSPlatform); + maaSPlatformMapper.insertModel(maaSPlatform.getMaaSPlatformId(), maaSPlatform.getModelList()); + return new ServiceResult(new ResultHeader(200, "register success")); + } } diff --git a/llm-adaptation/src/main/resources/application.yaml b/llm-adaptation/src/main/resources/application.yaml index 1b19cc1..ec234d9 100644 --- a/llm-adaptation/src/main/resources/application.yaml +++ b/llm-adaptation/src/main/resources/application.yaml @@ -1,6 +1,13 @@ server: port: 8084 - +fastGpt: + server: http://172.22.16.126:3000 + model: qwen2:7b + maaSType: fastGpt +biSheng: + server: http://172.22.16.127:3001 + model: 3 + maaSType: biSheng spring: main: allow-circular-references: true @@ -20,5 +27,4 @@ mybatis: logging: level: - org.springframework.web: DEBUG - com.yourpackage: TRACE
\ No newline at end of file + org.springframework.web: DEBUG
\ No newline at end of file diff --git a/llm-adaptation/src/main/resources/llm-adaptation-init.sql b/llm-adaptation/src/main/resources/llm-adaptation-init.sql index b8a56e4..f46a9eb 100644 --- a/llm-adaptation/src/main/resources/llm-adaptation-init.sql +++ b/llm-adaptation/src/main/resources/llm-adaptation-init.sql @@ -4,7 +4,8 @@ create table if not exists maas_platform( maas_platform_id varchar(255) primary key, maas_platform_name varchar(255), operator_id varchar(255), - operator_name varchar(255) + operator_name varchar(255), + maas_type varchar(255) ); create table if not exists model_information( diff --git a/llm-adaptation/src/main/resources/mapper/FastGptApplicationMapper.xml b/llm-adaptation/src/main/resources/mapper/ApplicationMapper.xml index 31ed447..ce0fcc4 100644 --- a/llm-adaptation/src/main/resources/mapper/FastGptApplicationMapper.xml +++ b/llm-adaptation/src/main/resources/mapper/ApplicationMapper.xml @@ -2,7 +2,7 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> -<mapper namespace="org.onap.usecaseui.llmadaptation.mapper.FastGptApplicationMapper"> +<mapper namespace="org.onap.usecaseui.llmadaptation.mapper.ApplicationMapper"> <insert id="insertApplication"> insert into application(application_id, application_name, @@ -63,4 +63,13 @@ opening_remarks as openingRemarks from application where application_id = #{applicationId} </select> + + <update id="updateApplication"> + update application + <trim prefix="set" suffixOverrides=","> + <if test="application.applicationName != null">application_name = #{application.applicationName},</if> + <if test="application.applicationDescription != null">application_description = #{application.applicationDescription},</if> + </trim> + where application_id = #{application.applicationId} + </update> </mapper>
\ No newline at end of file diff --git a/llm-adaptation/src/main/resources/mapper/FastGptDatasetMapper.xml b/llm-adaptation/src/main/resources/mapper/DatasetMapper.xml index 836ced9..d6a89cd 100644 --- a/llm-adaptation/src/main/resources/mapper/FastGptDatasetMapper.xml +++ b/llm-adaptation/src/main/resources/mapper/DatasetMapper.xml @@ -2,7 +2,7 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> -<mapper namespace="org.onap.usecaseui.llmadaptation.mapper.FastGptDatasetMapper"> +<mapper namespace="org.onap.usecaseui.llmadaptation.mapper.DatasetMapper"> <insert id="insertKnowledgeBaseRecord"> insert into knowledge_base(knowledge_base_id, knowledge_base_name, @@ -65,4 +65,13 @@ delete from file where knowledge_base_id = #{knowledgeBaseId} </delete> + <update id="updateKnowledgeBase"> + update knowledge_base + <trim prefix="set" suffixOverrides=","> + <if test="knowledgeBase.knowledgeBaseDescription != null">knowledge_base_description = #{knowledgeBase.knowledgeBaseDescription},</if> + <if test="knowledgeBase.knowledgeBaseName != null">knowledge_base_name = #{knowledgeBase.knowledgeBaseName},</if> + <if test="knowledgeBase.updateTime != null">update_time = to_timestamp(#{knowledgeBase.updateTime},'yyyy-MM-dd HH24:mi:ss'),</if> + </trim> + where knowledge_base_id = #{knowledgeBase.knowledgeBaseId} + </update> </mapper>
\ No newline at end of file diff --git a/llm-adaptation/src/main/resources/mapper/MaaSPlatformMapper.xml b/llm-adaptation/src/main/resources/mapper/MaaSPlatformMapper.xml index b8d8354..69ce9e6 100644 --- a/llm-adaptation/src/main/resources/mapper/MaaSPlatformMapper.xml +++ b/llm-adaptation/src/main/resources/mapper/MaaSPlatformMapper.xml @@ -4,26 +4,28 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.onap.usecaseui.llmadaptation.mapper.MaaSPlatformMapper"> <insert id="insertMaaSPlatform"> - insert into maas_platform(maas_platform_id,maas_platform_name,operator_id,operator_name) + insert into maas_platform(maas_platform_id,maas_platform_name,operator_id,operator_name,maas_type) values (#{maaSPlatform.maaSPlatformId}, #{maaSPlatform.maaSPlatformName}, #{maaSPlatform.operatorId}, - #{maaSPlatform.operatorName}) + #{maaSPlatform.operatorName}, + #{maaSPlatform.maaSType}) </insert> <insert id="insertModel"> insert into model_information(model_id,model_name,maas_platform_id) values <foreach collection="modelInformationList" index="index" item="item" separator=","> (#{item.modelId}, - #{item.modelName}, - #{maaSPlatformId}) + #{item.modelName}, + #{maaSPlatformId}) </foreach> </insert> <select id="getMaaSPlatforms" resultType="org.onap.usecaseui.llmadaptation.bean.MaaSPlatform"> select maas_platform_id as maaSPlatformId, maas_platform_name as maaSPlatformName, operator_id as operatorId, - operator_name as operatorName + operator_name as operatorName, + maas_type as maaSType from maas_platform </select> <select id="getModelList" resultType="org.onap.usecaseui.llmadaptation.bean.ModelInformation"> @@ -31,4 +33,18 @@ model_name as modelName from model_information where maas_platform_id = #{maaSPlatformId} </select> + <select id="getMaaSPlatformById" resultType="org.onap.usecaseui.llmadaptation.bean.MaaSPlatform"> + select maas_platform_id as maaSPlatformId, + maas_platform_name as maaSPlatformName, + operator_id as operatorId, + operator_name as operatorName, + maas_type as maaSType + from maas_platform + where maas_platform_id = #{maaSPlatformId} + </select> + <select id="getModelById" resultType="org.onap.usecaseui.llmadaptation.bean.ModelInformation"> + select model_id as modelId, + model_name as modelName + from model_information where model_id = #{modelId} + </select> </mapper>
\ No newline at end of file |