1 package org.onap.usecaseui.llmadaptation.service.impl;
3 import com.alibaba.fastjson2.JSONArray;
4 import com.alibaba.fastjson2.JSONObject;
5 import lombok.extern.slf4j.Slf4j;
6 import org.onap.usecaseui.llmadaptation.bean.*;
7 import org.onap.usecaseui.llmadaptation.bean.bisheng.BiShengCreateDatasetResponse;
8 import org.onap.usecaseui.llmadaptation.bean.bisheng.ProcessFileResponse;
9 import org.onap.usecaseui.llmadaptation.constant.BiShengConstant;
10 import org.onap.usecaseui.llmadaptation.constant.CommonConstant;
11 import org.onap.usecaseui.llmadaptation.mapper.DatasetMapper;
12 import org.onap.usecaseui.llmadaptation.service.BiShengDatasetService;
13 import org.onap.usecaseui.llmadaptation.util.TimeUtil;
14 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.core.io.buffer.DataBuffer;
16 import org.springframework.http.ContentDisposition;
17 import org.springframework.http.MediaType;
18 import org.springframework.http.client.MultipartBodyBuilder;
19 import org.springframework.http.codec.multipart.FilePart;
20 import org.springframework.stereotype.Service;
21 import org.springframework.web.reactive.function.BodyInserters;
22 import org.springframework.web.reactive.function.client.WebClient;
23 import reactor.core.publisher.Flux;
24 import reactor.core.publisher.Mono;
26 import java.util.List;
28 import static org.springframework.http.MediaType.APPLICATION_JSON;
32 public class BiShengDatasetServiceImpl implements BiShengDatasetService {
35 private WebClient webClient;
38 private DatasetMapper datasetMapper;
42 public Mono<ServiceResult> createDataset(Flux<FilePart> fileParts, String metaData, MaaSPlatform maaSPlatform) {
44 KnowledgeBase knowledgeBase = JSONObject.parseObject(metaData, KnowledgeBase.class);
45 knowledgeBase.setUpdateTime(TimeUtil.getNowTime());
46 JSONObject createParam = new JSONObject();
47 createParam.put("description", knowledgeBase.getKnowledgeBaseDescription());
48 createParam.put("model", maaSPlatform.getVectorModel());
49 createParam.put("name", knowledgeBase.getKnowledgeBaseName());
50 return webClient.post()
51 .uri(maaSPlatform.getServerIp() + BiShengConstant.CREATE_DATASET_URL)
52 .contentType(APPLICATION_JSON)
53 .header(CommonConstant.COOKIE, BiShengConstant.COOKIE_VALUE)
54 .bodyValue(createParam)
56 .bodyToMono(BiShengCreateDatasetResponse.class)
57 .flatMap(response -> {
58 if (response.getStatus_code() != 200) {
59 return Mono.just(new ServiceResult(new ResultHeader(500, response.getStatus_message())));
61 int knowledgeBaseId = response.getData().getIntValue("id");
62 return fileParts.flatMap(filePart -> processFile(filePart, knowledgeBaseId, maaSPlatform.getServerIp()))
63 .then(Mono.defer(() -> {
64 knowledgeBase.setKnowledgeBaseId(String.valueOf(knowledgeBaseId));
65 datasetMapper.insertKnowledgeBaseRecord(knowledgeBase);
66 return Mono.just(new ServiceResult(new ResultHeader(200, "create success")));
67 })).onErrorResume(e -> {
68 log.error("Error occurred during file upload: {}", e.getMessage());
69 return Mono.just(new ServiceResult(new ResultHeader(500, "file upload failed")));
71 }).onErrorResume(e -> {
72 log.error("Error occurred while creating dataset: {}", e.getMessage());
73 return Mono.just(new ServiceResult(new ResultHeader(500, "create failed")));
77 private Mono<Void> processFile(FilePart filePart, int knowledgeBaseId, String serverIp) {
78 String filename = filePart.filename();
79 Flux<DataBuffer> content = filePart.content();
80 MultipartBodyBuilder builder = new MultipartBodyBuilder();
81 builder.asyncPart("file", content, DataBuffer.class)
83 ContentDisposition contentDisposition = ContentDisposition
88 headers.setContentDisposition(contentDisposition);
89 headers.setContentType(MediaType.TEXT_PLAIN);
91 return webClient.post()
92 .uri(serverIp + BiShengConstant.UPLOAD_FILE_URL)
93 .contentType(MediaType.MULTIPART_FORM_DATA)
94 .header(CommonConstant.COOKIE, BiShengConstant.COOKIE_VALUE)
95 .body(BodyInserters.fromMultipartData(builder.build()))
97 .bodyToMono(BiShengCreateDatasetResponse.class)
98 .flatMap(response -> {
99 if (response.getStatus_code() != 200) {
100 log.error("response is {}", response);
103 String filePath = response.getData().getString("file_path");
104 JSONObject processParam = new JSONObject();
105 processParam.put("knowledge_id", knowledgeBaseId);
106 JSONArray jsonArray = new JSONArray();
107 JSONObject jsonObject = new JSONObject();
108 jsonObject.put("file_path", filePath);
109 jsonArray.add(jsonObject);
110 processParam.put("file_list", jsonArray);
111 return webClient.post()
112 .uri(serverIp + BiShengConstant.PROCESS_FILE_URL)
113 .contentType(APPLICATION_JSON)
114 .header(CommonConstant.COOKIE, BiShengConstant.COOKIE_VALUE)
115 .bodyValue(processParam)
117 .bodyToMono(ProcessFileResponse.class).flatMap(lastResponse -> {
118 if (lastResponse.getStatus_code() == 200) {
119 JSONObject data = lastResponse.getData().get(0);
120 int fileId = data.getIntValue("id");
121 File file = new File(String.valueOf(fileId), filename);
122 datasetMapper.insertFileName(List.of(file), String.valueOf(knowledgeBaseId));
130 public Mono<ServiceResult> removeDataset(String knowledgeBaseId, String serverIp) {
131 return webClient.delete()
132 .uri(serverIp + BiShengConstant.DATASET_V2_URL + knowledgeBaseId)
133 .header(CommonConstant.COOKIE, BiShengConstant.COOKIE_VALUE)
135 .bodyToMono(BiShengCreateDatasetResponse.class)
136 .flatMap(response -> {
137 if (response.getStatus_code() == 200) {
138 return Mono.fromRunnable(() -> {
140 datasetMapper.deleteKnowledgeBaseByUuid(knowledgeBaseId);
141 datasetMapper.deleteFileById(knowledgeBaseId);
142 } catch (Exception dbException) {
143 throw new RuntimeException("Database operation failed", dbException);
145 }).then(Mono.just(new ServiceResult(new ResultHeader(200, "delete success"))));
147 return Mono.just(new ServiceResult(new ResultHeader(500, response.getStatus_message())));
150 .onErrorResume(e -> {
151 log.error("Error occurred while delete dataset: {}", e.getMessage());
152 return Mono.just(new ServiceResult(new ResultHeader(500, "delete failed")));
157 public Mono<ServiceResult> editDataset(KnowledgeBase knowledgeBase, MaaSPlatform maaSPlatform) {
158 KnowledgeBase knowledgeBaseRecordById = datasetMapper.getKnowledgeBaseRecordById(knowledgeBase.getKnowledgeBaseId());
159 if (knowledgeBaseRecordById == null) {
160 return Mono.just(new ServiceResult(new ResultHeader(500, "dataset is not exist")));
162 JSONObject updateParam = new JSONObject();
163 updateParam.put("knowledge_id", knowledgeBase.getKnowledgeBaseId());
164 updateParam.put("name", knowledgeBase.getKnowledgeBaseName());
165 updateParam.put("description", knowledgeBase.getKnowledgeBaseDescription());
166 updateParam.put("model", maaSPlatform.getVectorModel());
168 return webClient.put()
169 .uri(maaSPlatform.getServerIp() + BiShengConstant.DATASET_V2_URL)
170 .contentType(APPLICATION_JSON)
171 .bodyValue(updateParam)
173 .bodyToMono(BiShengCreateDatasetResponse.class)
174 .flatMap(response -> {
175 if (response.getStatus_code() == 200) {
176 return Mono.fromRunnable(() -> {
177 knowledgeBase.setUpdateTime(TimeUtil.getNowTime());
178 datasetMapper.updateKnowledgeBase(knowledgeBase);
179 }).then(Mono.just(new ServiceResult(new ResultHeader(200, "update success"))));
181 return Mono.just(new ServiceResult(new ResultHeader(500, response.getStatus_message())));
184 .onErrorResume(e -> {
185 log.error("Error occurred while delete dataset: {}", e.getMessage());
186 return Mono.just(new ServiceResult(new ResultHeader(500, "update failed")));
191 public Mono<ServiceResult> uploadFiles(Flux<FilePart> fileParts, String knowledgeBaseId, String serverIp) {
192 return fileParts.flatMap(filePart -> processFile(filePart, Integer.parseInt(knowledgeBaseId), serverIp))
193 .then(Mono.just(new ServiceResult(new ResultHeader(200, "upload success"))))
194 .onErrorResume(e -> {
195 log.error("Error occurred during file upload: {}", e.getMessage());
196 return Mono.just(new ServiceResult(new ResultHeader(500, "file upload failed")));
201 public Mono<ServiceResult> deleteFile(String fileId, String serverIp) {
202 return webClient.delete()
203 .uri(serverIp + BiShengConstant.DELETE_FILE_URL + fileId)
204 .header(CommonConstant.COOKIE, BiShengConstant.COOKIE_VALUE)
206 .bodyToMono(BiShengCreateDatasetResponse.class)
207 .flatMap(response -> {
208 if (response.getStatus_code() == 200) {
209 return Mono.fromRunnable(() -> datasetMapper.deleteFileByFileId(fileId)).then(Mono.just(new ServiceResult(new ResultHeader(200, "delete file success"))));
211 return Mono.just(new ServiceResult(new ResultHeader(response.getStatus_code(), response.getStatus_message())));
214 .onErrorResume(e -> {
215 log.error("Error occurred while delete dataset: {}", e.getMessage());
216 return Mono.just(new ServiceResult(new ResultHeader(500, "delete file failed")));