--- /dev/null
+package org.onap.usecaseui.llmadaptation.bean;
+
+import lombok.Data;
+
+@Data
+public class ChatResponse {
+ private ResultHeader result_header;
+
+ private String finished;
+
+ private String answer;
+
+ private String reference;
+}
public WebClient getWebClient() {
HttpClient httpClient = HttpClient.create()
.tcpConfiguration(tcpClient -> tcpClient
- .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 50000))
- .responseTimeout(Duration.ofSeconds(50));
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 60000))
+ .responseTimeout(Duration.ofSeconds(60));
return WebClient.builder().clientConnector(new ReactorClientHttpConnector(httpClient)).build();
}
}
}
@PostMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
- public Flux<String> streamData(@RequestBody JSONObject question) {
+ public Flux<ChatResponse> streamData(@RequestBody JSONObject question) {
return applicationService.chat(question);
}
import com.alibaba.fastjson2.JSONObject;
import org.onap.usecaseui.llmadaptation.bean.Application;
+import org.onap.usecaseui.llmadaptation.bean.ChatResponse;
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);
+ Flux<ChatResponse> chat(JSONObject question);
Mono<ServiceResult> removeApplication(String applicationId);
import com.alibaba.fastjson2.JSONObject;
import org.onap.usecaseui.llmadaptation.bean.Application;
+import org.onap.usecaseui.llmadaptation.bean.ChatResponse;
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, String serverIp);
- Flux<String> chat(JSONObject question, String serverIp);
+ Flux<ChatResponse> chat(JSONObject question, String serverIp);
Mono<ServiceResult> removeApplication(String applicationId, String serverIp);
import com.alibaba.fastjson2.JSONObject;
import org.onap.usecaseui.llmadaptation.bean.Application;
+import org.onap.usecaseui.llmadaptation.bean.ChatResponse;
import org.onap.usecaseui.llmadaptation.bean.ServiceResult;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface FastGptApplicationService {
Mono<ServiceResult> createApplication(Application application, String serverIp);
- Flux<String> chat(JSONObject question, String serverIp);
+ Flux<ChatResponse> chat(JSONObject question, String serverIp);
Mono<ServiceResult> removeApplication(String applicationId, String serverIp);
}
@Override
- public Flux<String> chat(JSONObject question) {
+ public Flux<ChatResponse> chat(JSONObject question) {
String applicationId = question.getString("applicationId");
MaaSPlatform maaSPlatform = getMaaSPlatFormByAppId(applicationId);
if (FastGptConstant.FAST_GPT.equals(maaSPlatform.getMaaSType())) {
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.onap.usecaseui.llmadaptation.bean.Application;
+import org.onap.usecaseui.llmadaptation.bean.ChatResponse;
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.CommonConstant;
import org.onap.usecaseui.llmadaptation.mapper.ApplicationMapper;
import org.onap.usecaseui.llmadaptation.service.BiShengApplicationService;
+import org.onap.usecaseui.llmadaptation.util.CommonUtil;
import org.onap.usecaseui.llmadaptation.util.TimeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
}
@Override
- public Flux<String> chat(JSONObject question, String serverIp) {
+ public Flux<ChatResponse> chat(JSONObject question, String serverIp) {
JSONObject param = new JSONObject();
param.put("model", question.getString("applicationId"));
param.put("temperature", 0);
.retrieve()
.bodyToFlux(String.class)
.flatMap(response -> {
+ ChatResponse result = new ChatResponse();
+ result.setReference("");
+ result.setFinished("stop");
+ ResultHeader resultHeader = new ResultHeader(200,"success");
+ result.setResult_header(resultHeader);
if ("[DONE]".equals(response)) {
- return Flux.just(response);
+ result.setAnswer("[DONE]");
+ return Flux.just(result);
}
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);
+ result.setAnswer(string);
+ return Flux.just(result);
})
.onErrorResume(e -> {
log.error("An error occurred {}", e.getMessage());
- return Flux.just("Network Error");
+ return CommonUtil.chatFailed();
});
}
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.onap.usecaseui.llmadaptation.bean.Application;
+import org.onap.usecaseui.llmadaptation.bean.ChatResponse;
import org.onap.usecaseui.llmadaptation.bean.ResultHeader;
import org.onap.usecaseui.llmadaptation.bean.ServiceResult;
import org.onap.usecaseui.llmadaptation.bean.fastgpt.dataset.CreateDataSetResponse;
import org.onap.usecaseui.llmadaptation.constant.FastGptConstant;
import org.onap.usecaseui.llmadaptation.mapper.ApplicationMapper;
import org.onap.usecaseui.llmadaptation.service.FastGptApplicationService;
+import org.onap.usecaseui.llmadaptation.util.CommonUtil;
import org.onap.usecaseui.llmadaptation.util.TimeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ResourceLoader;
});
}
- @Override
- public Flux<String> chat(JSONObject question, String serverIp) {
+ public Flux<ChatResponse> chat(JSONObject question, String serverIp) {
ChatParam chatParam = new ChatParam();
chatParam.setAppId(question.getString("applicationId"));
chatParam.setStream(true);
.bodyToFlux(String.class).flatMap(response -> parseAndTransform(response, isDone))
.onErrorResume(throwable -> {
log.error("An error occurred {}", throwable.getMessage());
- return Flux.just("Network Error");
+ return CommonUtil.chatFailed();
});
}
- private Flux<String> parseAndTransform(String param, AtomicBoolean isDone) {
+ private Flux<ChatResponse> parseAndTransform(String param, AtomicBoolean isDone) {
if (isDone.get()) {
return Flux.empty();
}
}
JSONArray choices = jsonObject.getJSONArray("choices");
JSONObject choice = choices.getJSONObject(0);
+ ChatResponse response = new ChatResponse();
+ response.setReference("");
+ response.setFinished("stop");
+ ResultHeader resultHeader = new ResultHeader(200,"success");
+ response.setResult_header(resultHeader);
if ("stop".equals(choice.getString("finish_reason"))) {
isDone.set(true);
- return Flux.just("[DONE]");
+ response.setAnswer("[DONE]");
+ return Flux.just(response);
}
String string = choice.getJSONObject("delta").getString("content");
isDone.set(false);
string = string.replace(" ", "__SPACE__");
- return Flux.just(string);
+ response.setAnswer(string);
+ return Flux.just(response);
}
@Override
--- /dev/null
+package org.onap.usecaseui.llmadaptation.util;
+
+import org.onap.usecaseui.llmadaptation.bean.ChatResponse;
+import org.onap.usecaseui.llmadaptation.bean.ResultHeader;
+import reactor.core.publisher.Flux;
+
+public class CommonUtil {
+
+ public static Flux<ChatResponse> chatFailed() {
+ ChatResponse result = new ChatResponse();
+ result.setReference("");
+ result.setFinished("error");
+ ResultHeader resultHeader = new ResultHeader(500, "failure");
+ result.setResult_header(resultHeader);
+ result.setAnswer("Network Error");
+ return Flux.just(result);
+ }
+}