|
...
|
...
|
@@ -38,12 +38,11 @@ import java.util.concurrent.TimeUnit; |
|
|
|
@RequestMapping("/chatGPTStream")
|
|
|
|
public class ChatGPTStreamController extends BaseController {
|
|
|
|
private static String sessionkey = "CHAT_HISTORY_CONTEXT";//上下文关联存放地址
|
|
|
|
@Autowired
|
|
|
|
private PublicService publicService;
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
private VipServiceImpl vipService;
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
private CompleteCallback completeCallback;
|
|
|
|
@Autowired
|
|
|
|
private ScheduledExecutorService scheduledExecutorService;
|
|
|
|
private final SseService sseService;
|
|
...
|
...
|
@@ -67,23 +66,13 @@ public class ChatGPTStreamController extends BaseController { |
|
|
|
OpenAiLoginUser userInfo = (OpenAiLoginUser) SecurityUtils.getLoginUser();
|
|
|
|
|
|
|
|
Integer user_id= SecurityUtils.getUserId().intValue();
|
|
|
|
String room_id = String.valueOf(user_id);
|
|
|
|
|
|
|
|
String uid = UUID.randomUUID().toString();
|
|
|
|
SseEmitter sseEmitter = sseService.createSse(uid);
|
|
|
|
|
|
|
|
scheduledExecutorService.schedule(() -> {
|
|
|
|
try{
|
|
|
|
BigDecimal[] bs = vipService.getUnitprice();
|
|
|
|
BigDecimal openaiUnitprice = bs[0];
|
|
|
|
BigDecimal realityUnitprice = bs[1];
|
|
|
|
if(openaiUnitprice.doubleValue()==0 || realityUnitprice.doubleValue()==0)
|
|
|
|
{
|
|
|
|
throw new BaseException("系统未配置流量单价,请联系管理员");
|
|
|
|
}
|
|
|
|
|
|
|
|
OpenAiUserInfo openAiUserInfo = (OpenAiUserInfo) userInfo.getUser();
|
|
|
|
|
|
|
|
//验证余额是否充足
|
|
|
|
if(vipService.isCharging(openAiUserInfo.getVip_level()) && openAiUserInfo.getFlow_packet_remain()<=0)
|
|
|
|
{
|
|
...
|
...
|
@@ -95,56 +84,57 @@ public class ChatGPTStreamController extends BaseController { |
|
|
|
completionChoiceMessage3_5.setContent(stringBuffer.toString());
|
|
|
|
throw new BaseException("您的余额不足请联系管理员或者充值");
|
|
|
|
}
|
|
|
|
sseService.sseChat(true,user_id,uid, chatRequest, chatRequest.getModel(),completeCallback);
|
|
|
|
}catch (Exception e)
|
|
|
|
{
|
|
|
|
log.error("主业务流程异常",e);
|
|
|
|
try {
|
|
|
|
String estr = e.getMessage();
|
|
|
|
if(null == estr)
|
|
|
|
{
|
|
|
|
estr = "系统异常,请联系管理员";
|
|
|
|
}
|
|
|
|
sseEmitter.send(estr, MediaType.TEXT_EVENT_STREAM);
|
|
|
|
} catch (IOException ex) {
|
|
|
|
log.error("sse信息推送失败!");
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
sseService.closeSse(uid);
|
|
|
|
}
|
|
|
|
|
|
|
|
CompleteCallback completeCallback = (chatCompletion, openAISSEEventSourceListener) -> {
|
|
|
|
GptMessage gptMessage = new GptMessage();
|
|
|
|
gptMessage.setRoom_id(room_id);
|
|
|
|
gptMessage.setUser_id(user_id);
|
|
|
|
gptMessage.setCreate_time(DateUtils.getNowTimeMilly());
|
|
|
|
gptMessage.setSend_role("user");
|
|
|
|
|
|
|
|
StringBuffer content = new StringBuffer();
|
|
|
|
for (com.unfbx.chatgpt.entity.chat.Message messge : chatCompletion.getMessages()) {
|
|
|
|
content.append(messge.getContent());
|
|
|
|
},1, TimeUnit.SECONDS);
|
|
|
|
return sseEmitter;
|
|
|
|
}
|
|
|
|
gptMessage.setSend_content(content.toString());
|
|
|
|
gptMessage.setSend_size(gptMessage.getSend_content().length());
|
|
|
|
//统计代币
|
|
|
|
gptMessage.setCompletion_tokens(UnitPriceCountUtil.countToken(chatRequest.getModel(),openAISSEEventSourceListener.tokens(),UnitPriceCountUtil.FlowType.Completion));
|
|
|
|
gptMessage.setPrompt_tokens(UnitPriceCountUtil.countToken(chatRequest.getModel(),chatCompletion.tokens(),UnitPriceCountUtil.FlowType.Completion));
|
|
|
|
gptMessage.setTotal_tokens(gptMessage.getCompletion_tokens() + gptMessage.getPrompt_tokens());
|
|
|
|
gptMessage.setMessage_role(chatCompletion.getMessages().get(0).getRole());
|
|
|
|
// gptMessage.setMessage_content(openAISSEEventSourceListener.contents());
|
|
|
|
gptMessage.setMessage_size(Long.valueOf(openAISSEEventSourceListener.tokens()).intValue());
|
|
|
|
publicService.insertToTable(gptMessage, "`lk_openai`.`gpt_message`");
|
|
|
|
|
|
|
|
UserFlowPacketRemainLog userFlowPacketRemainLog = new UserFlowPacketRemainLog();
|
|
|
|
userFlowPacketRemainLog.setCreate_time(DateUtils.getNowTimeMilly());
|
|
|
|
userFlowPacketRemainLog.setUser_id(user_id);
|
|
|
|
userFlowPacketRemainLog.setType(2); //消费
|
|
|
|
|
|
|
|
|
|
|
|
@ApiOperation(value = "聊天接口返回data")
|
|
|
|
@Transactional
|
|
|
|
@PostMapping("/chatNotData")
|
|
|
|
@ResponseBody
|
|
|
|
public SseEmitter chatNotData(@RequestBody ChatRequest chatRequest) {
|
|
|
|
|
|
|
|
OpenAiLoginUser userInfo = (OpenAiLoginUser) SecurityUtils.getLoginUser();
|
|
|
|
|
|
|
|
Integer user_id= SecurityUtils.getUserId().intValue();
|
|
|
|
|
|
|
|
String uid = UUID.randomUUID().toString();
|
|
|
|
SseEmitter sseEmitter = sseService.createSse(uid);
|
|
|
|
|
|
|
|
scheduledExecutorService.schedule(() -> {
|
|
|
|
try{
|
|
|
|
OpenAiUserInfo openAiUserInfo = (OpenAiUserInfo) userInfo.getUser();
|
|
|
|
//验证余额是否充足
|
|
|
|
if(vipService.isCharging(openAiUserInfo.getVip_level()) && openAiUserInfo.getFlow_packet_remain()<=0)
|
|
|
|
{
|
|
|
|
CompletionChoiceMessage3_5 completionChoiceMessage3_5 = new CompletionChoiceMessage3_5();
|
|
|
|
completionChoiceMessage3_5.setRole("assistant");
|
|
|
|
StringBuffer stringBuffer = new StringBuffer();
|
|
|
|
stringBuffer.append("房间号:");
|
|
|
|
stringBuffer.append(room_id);
|
|
|
|
stringBuffer.append(";");
|
|
|
|
stringBuffer.append("发送代币:");
|
|
|
|
stringBuffer.append(gptMessage.getPrompt_tokens());
|
|
|
|
stringBuffer.append(";");
|
|
|
|
stringBuffer.append("返回代币:");
|
|
|
|
stringBuffer.append(gptMessage.getCompletion_tokens());
|
|
|
|
stringBuffer.append(";");
|
|
|
|
|
|
|
|
userFlowPacketRemainLog.setDescribe(stringBuffer.toString());
|
|
|
|
userFlowPacketRemainLog.setTotal_tokens(gptMessage.getTotal_tokens());
|
|
|
|
|
|
|
|
userFlowPacketRemainLog.setOpenai_money((openaiUnitprice.multiply(new BigDecimal(gptMessage.getTotal_tokens()))).divide(new BigDecimal(1000), 6, BigDecimal.ROUND_HALF_UP));
|
|
|
|
userFlowPacketRemainLog.setReality_money((realityUnitprice.multiply(new BigDecimal(gptMessage.getTotal_tokens()))).divide(new BigDecimal(1000), 6, BigDecimal.ROUND_HALF_UP));
|
|
|
|
publicService.insertToTable(userFlowPacketRemainLog, "`lk_openai`.`user_flow_packet_remain_log`");
|
|
|
|
|
|
|
|
publicService.updateBySql("UPDATE `lk_openai`.`user_info` SET flow_packet_remain=flow_packet_remain-" + userFlowPacketRemainLog.getTotal_tokens() + " WHERE id=" + openAiUserInfo.getId());
|
|
|
|
|
|
|
|
};
|
|
|
|
sseService.sseChat(uid, chatRequest, chatRequest.getModel(),completeCallback);
|
|
|
|
stringBuffer.append("您的余额不足请联系管理员或者点击链接充值:\\n\\n");
|
|
|
|
stringBuffer.append("https://充值链接.com");
|
|
|
|
completionChoiceMessage3_5.setContent(stringBuffer.toString());
|
|
|
|
throw new BaseException("您的余额不足请联系管理员或者充值");
|
|
|
|
}
|
|
|
|
sseService.sseChat(false,user_id,uid, chatRequest, chatRequest.getModel(),completeCallback);
|
|
|
|
}catch (Exception e)
|
|
|
|
{
|
|
|
|
log.error("主业务流程异常",e);
|
|
...
|
...
|
@@ -166,6 +156,7 @@ public class ChatGPTStreamController extends BaseController { |
|
|
|
return sseEmitter;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 关闭连接
|
|
|
|
*
|
...
|
...
|
|