work-10.01/src/main/java/com/bwie/controller/ChatController.java

99 lines
3.1 KiB
Java

package com.bwie.controller;
import cn.hutool.core.util.StrUtil;
import com.bwie.common.MsgDTO;
import com.bwie.component.XfXhStreamClient;
import com.bwie.config.XfXhConfig;
import com.bwie.listener.XfXhWebSocketListener;
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.WebSocket;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.UUID;
/**
* @author 冯凯
* @version 1.0
* @description: TODO
* @date 2023/9/29 14:06
*/
@RestController
@RequestMapping("/test")
@Slf4j
public class ChatController {
@Resource
private XfXhStreamClient xfXhStreamClient;
@Resource
private XfXhConfig xfXhConfig;
/**
* 发送问题
*
* @param question 问题
* @return 星火大模型的回答
*/
@GetMapping("/sendQuestion")
public String sendQuestion(@RequestParam("question") String question) {
// 如果是无效字符串,则不对大模型进行请求
if (StrUtil.isBlank(question)) {
return "无效问题,请重新输入";
}
// 获取连接令牌
if (!xfXhStreamClient.operateToken(XfXhStreamClient.GET_TOKEN_STATUS)) {
return "当前大模型连接数过多,请稍后再试";
}
// 创建消息对象
MsgDTO msgDTO = MsgDTO.createUserMsg(question);
// 创建监听器
XfXhWebSocketListener listener = new XfXhWebSocketListener();
// 发送问题给大模型,生成 websocket 连接
WebSocket webSocket = xfXhStreamClient.sendMsg(UUID.randomUUID().toString().substring(0, 10), Collections.singletonList(msgDTO), listener);
if (webSocket == null) {
// 归还令牌
xfXhStreamClient.operateToken(XfXhStreamClient.BACK_TOKEN_STATUS);
return "系统内部错误,请联系管理员";
}
try {
int count = 0;
// 为了避免死循环,设置循环次数来定义超时时长
int maxCount = xfXhConfig.getMaxResponseTime() * 5;
while (count <= maxCount) {
Thread.sleep(200);
if (listener.isWsCloseFlag()) {
break;
}
count++;
}
if (count > maxCount) {
return "大模型响应超时,请联系管理员";
}
// 响应大模型的答案
System.out.println(listener.getAnswer().toString());
return listener.getAnswer().toString();
} catch (InterruptedException e) {
log.error("错误:" + e.getMessage());
return "系统内部错误,请联系管理员";
} finally {
// 关闭 websocket 连接
webSocket.close(1000, "");
// 归还令牌
xfXhStreamClient.operateToken(XfXhStreamClient.BACK_TOKEN_STATUS);
}
}
}