|
|
@ -4,6 +4,7 @@ import cn.teammodel.ai.JsonLoader;
|
|
|
|
import cn.teammodel.ai.SparkGptClient;
|
|
|
|
import cn.teammodel.ai.SparkGptClient;
|
|
|
|
import cn.teammodel.ai.SseHelper;
|
|
|
|
import cn.teammodel.ai.SseHelper;
|
|
|
|
import cn.teammodel.ai.cache.HistoryCache;
|
|
|
|
import cn.teammodel.ai.cache.HistoryCache;
|
|
|
|
|
|
|
|
import cn.teammodel.ai.deepseek.DeepSeekClient;
|
|
|
|
import cn.teammodel.ai.domain.SparkChatRequestParam;
|
|
|
|
import cn.teammodel.ai.domain.SparkChatRequestParam;
|
|
|
|
import cn.teammodel.ai.listener.SparkGptStreamListener;
|
|
|
|
import cn.teammodel.ai.listener.SparkGptStreamListener;
|
|
|
|
import cn.teammodel.common.ErrorCode;
|
|
|
|
import cn.teammodel.common.ErrorCode;
|
|
|
@ -18,6 +19,7 @@ import cn.teammodel.model.entity.User;
|
|
|
|
import cn.teammodel.model.entity.ai.ChatSession;
|
|
|
|
import cn.teammodel.model.entity.ai.ChatSession;
|
|
|
|
import cn.teammodel.security.utils.SecurityUtil;
|
|
|
|
import cn.teammodel.security.utils.SecurityUtil;
|
|
|
|
import cn.teammodel.service.ChatMessageService;
|
|
|
|
import cn.teammodel.service.ChatMessageService;
|
|
|
|
|
|
|
|
import cn.teammodel.service.DeepSeekService;
|
|
|
|
import cn.teammodel.utils.RepositoryUtil;
|
|
|
|
import cn.teammodel.utils.RepositoryUtil;
|
|
|
|
import com.alibaba.fastjson2.JSON;
|
|
|
|
import com.alibaba.fastjson2.JSON;
|
|
|
|
import com.alibaba.fastjson2.TypeReference;
|
|
|
|
import com.alibaba.fastjson2.TypeReference;
|
|
|
@ -49,12 +51,20 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
@Resource
|
|
|
|
@Resource
|
|
|
|
private JsonLoader jsonLoader;
|
|
|
|
private JsonLoader jsonLoader;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 访问DeepSeek方法
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
|
|
|
private DeepSeekService deepSeekChatService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public SseEmitter chatCompletion(ChatCompletionReqDto chatCompletionReqDto, String userId) {
|
|
|
|
public SseEmitter chatCompletion(ChatCompletionReqDto chatCompletionReqDto, String userId) {
|
|
|
|
// 目前仅使用讯飞星火大模型
|
|
|
|
// 目前仅使用讯飞星火大模型
|
|
|
|
String appId = chatCompletionReqDto.getAppId();
|
|
|
|
String appId = chatCompletionReqDto.getAppId();
|
|
|
|
SseEmitter sseEmitter;
|
|
|
|
SseEmitter sseEmitter;
|
|
|
|
if (StringUtils.isEmpty(appId)) {
|
|
|
|
//
|
|
|
|
|
|
|
|
if (StringUtils.isEmpty(appId) || chatCompletionReqDto.getModel().equals("DeepSeek_Chat")) {
|
|
|
|
sseEmitter = completionBySession(chatCompletionReqDto, userId);
|
|
|
|
sseEmitter = completionBySession(chatCompletionReqDto, userId);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
sseEmitter = completionByApp(chatCompletionReqDto, false);
|
|
|
|
sseEmitter = completionByApp(chatCompletionReqDto, false);
|
|
|
@ -165,6 +175,11 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
|
|
|
|
|
|
|
|
String appPrompt = chatApp.getPrompt();
|
|
|
|
String appPrompt = chatApp.getPrompt();
|
|
|
|
SseEmitter sseEmitter = new SseEmitter(-1L);
|
|
|
|
SseEmitter sseEmitter = new SseEmitter(-1L);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch (chatCompletionReqDto.getModel()) {
|
|
|
|
|
|
|
|
//星火大模型
|
|
|
|
|
|
|
|
case "SparkMax":
|
|
|
|
|
|
|
|
{
|
|
|
|
SparkGptStreamListener listener = new SparkGptStreamListener(sseEmitter);
|
|
|
|
SparkGptStreamListener listener = new SparkGptStreamListener(sseEmitter);
|
|
|
|
// open 回调
|
|
|
|
// open 回调
|
|
|
|
listener.setOnOpen((s) -> {
|
|
|
|
listener.setOnOpen((s) -> {
|
|
|
@ -172,9 +187,10 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
log.info("callback: ws open event emmit");
|
|
|
|
log.info("callback: ws open event emmit");
|
|
|
|
});
|
|
|
|
});
|
|
|
|
// 对话完成的回调
|
|
|
|
// 对话完成的回调
|
|
|
|
|
|
|
|
SseEmitter finalSseEmitter = sseEmitter;
|
|
|
|
listener.setOnComplete((s) -> {
|
|
|
|
listener.setOnComplete((s) -> {
|
|
|
|
log.info("callback: ws complete event emmit");
|
|
|
|
log.info("callback: ws complete event emmit");
|
|
|
|
SseHelper.send(sseEmitter, "[DONE]");
|
|
|
|
SseHelper.send(finalSseEmitter, "[DONE]");
|
|
|
|
// 处理完成后的事件:
|
|
|
|
// 处理完成后的事件:
|
|
|
|
if (!justApi) {
|
|
|
|
if (!justApi) {
|
|
|
|
// 保存消息记录, 缓存更改
|
|
|
|
// 保存消息记录, 缓存更改
|
|
|
@ -186,8 +202,8 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
// 返还积分
|
|
|
|
// 返还积分
|
|
|
|
});
|
|
|
|
});
|
|
|
|
List<SparkChatRequestParam.Message> messageList = new ArrayList<>();
|
|
|
|
List<SparkChatRequestParam.Message> messageList = new ArrayList<>();
|
|
|
|
messageList.add(SparkChatRequestParam.Message.ofAssistant(appPrompt));
|
|
|
|
messageList.add(SparkChatRequestParam.Message.ofAssistant(appPrompt,"SparkMax"));
|
|
|
|
messageList.add(SparkChatRequestParam.Message.ofUser(userPrompt));
|
|
|
|
messageList.add(SparkChatRequestParam.Message.ofUser(userPrompt,"SparkMax"));
|
|
|
|
SparkChatRequestParam requestParam = SparkChatRequestParam
|
|
|
|
SparkChatRequestParam requestParam = SparkChatRequestParam
|
|
|
|
.builder()
|
|
|
|
.builder()
|
|
|
|
.uid(userId)
|
|
|
|
.uid(userId)
|
|
|
@ -195,8 +211,22 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
.messageList(messageList)
|
|
|
|
.messageList(messageList)
|
|
|
|
.build();
|
|
|
|
.build();
|
|
|
|
sparkGptClient.streamChatCompletion(requestParam, listener);
|
|
|
|
sparkGptClient.streamChatCompletion(requestParam, listener);
|
|
|
|
|
|
|
|
return finalSseEmitter;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// DeepSeek 模型
|
|
|
|
|
|
|
|
case "DeepSeek_Chat":
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// OKHttp 方式请求
|
|
|
|
|
|
|
|
sseEmitter = deepSeekChatService.ChatSeeEmitterAsk(chatCompletionReqDto);
|
|
|
|
|
|
|
|
//HttpClient 方式请求
|
|
|
|
|
|
|
|
//sseEmitter = DeepSeekClient.HttpClientSendRequests(chatCompletionReqDto);
|
|
|
|
|
|
|
|
|
|
|
|
return sseEmitter;
|
|
|
|
return sseEmitter;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "不支持的模型");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 会话模式
|
|
|
|
* 会话模式
|
|
|
@ -211,6 +241,9 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SseEmitter sseEmitter = new SseEmitter(-1L);
|
|
|
|
SseEmitter sseEmitter = new SseEmitter(-1L);
|
|
|
|
|
|
|
|
switch (chatCompletionReqDto.getModel()){
|
|
|
|
|
|
|
|
// 星火大模型
|
|
|
|
|
|
|
|
case "SparkMax":{
|
|
|
|
SparkGptStreamListener listener = new SparkGptStreamListener(sseEmitter);
|
|
|
|
SparkGptStreamListener listener = new SparkGptStreamListener(sseEmitter);
|
|
|
|
// open 回调
|
|
|
|
// open 回调
|
|
|
|
listener.setOnOpen((s) -> {
|
|
|
|
listener.setOnOpen((s) -> {
|
|
|
@ -218,11 +251,12 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
log.info("callback: ws open event emmit");
|
|
|
|
log.info("callback: ws open event emmit");
|
|
|
|
});
|
|
|
|
});
|
|
|
|
// 对话完成的回调
|
|
|
|
// 对话完成的回调
|
|
|
|
|
|
|
|
SseEmitter finalSseEmitter = sseEmitter;
|
|
|
|
listener.setOnComplete((s) -> {
|
|
|
|
listener.setOnComplete((s) -> {
|
|
|
|
log.info("callback: ws complete event emmit");
|
|
|
|
log.info("callback: ws complete event emmit");
|
|
|
|
SseHelper.send(sseEmitter, "[DONE]");
|
|
|
|
SseHelper.send(finalSseEmitter, "[DONE]");
|
|
|
|
// 处理完成后的事件: 保存消息记录, 缓存更改
|
|
|
|
// 处理完成后的事件: 保存消息记录, 缓存更改
|
|
|
|
ChatSession.Message message = ChatSession.Message.of(userPrompt, s);
|
|
|
|
ChatSession.Message message = ChatSession.Message.of(userPrompt, s,chatCompletionReqDto.getModel());
|
|
|
|
HistoryCache.updateContext(sessionId, message);
|
|
|
|
HistoryCache.updateContext(sessionId, message);
|
|
|
|
CosmosPatchOperations options = CosmosPatchOperations.create()
|
|
|
|
CosmosPatchOperations options = CosmosPatchOperations.create()
|
|
|
|
.replace("/updateTime", Instant.now().toEpochMilli())
|
|
|
|
.replace("/updateTime", Instant.now().toEpochMilli())
|
|
|
@ -234,7 +268,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
log.error("callback: ws error, info: " + s);
|
|
|
|
log.error("callback: ws error, info: " + s);
|
|
|
|
// 返还积分
|
|
|
|
// 返还积分
|
|
|
|
});
|
|
|
|
});
|
|
|
|
List<SparkChatRequestParam.Message> messageList = fetchContext(sessionId, userPrompt);
|
|
|
|
List<SparkChatRequestParam.Message> messageList = fetchContext(sessionId, userPrompt,chatCompletionReqDto.getModel());
|
|
|
|
SparkChatRequestParam requestParam = SparkChatRequestParam
|
|
|
|
SparkChatRequestParam requestParam = SparkChatRequestParam
|
|
|
|
.builder()
|
|
|
|
.builder()
|
|
|
|
.uid(userId)
|
|
|
|
.uid(userId)
|
|
|
@ -242,8 +276,19 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
.messageList(messageList)
|
|
|
|
.messageList(messageList)
|
|
|
|
.build();
|
|
|
|
.build();
|
|
|
|
sparkGptClient.streamChatCompletion(requestParam, listener);
|
|
|
|
sparkGptClient.streamChatCompletion(requestParam, listener);
|
|
|
|
|
|
|
|
return finalSseEmitter;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// DeepSeek 模型
|
|
|
|
|
|
|
|
case "DeepSeek_Chat":
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
sseEmitter = deepSeekChatService.ChatSeeEmitterAsk(chatCompletionReqDto );
|
|
|
|
return sseEmitter;
|
|
|
|
return sseEmitter;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
default:{
|
|
|
|
|
|
|
|
throw new ServiceException(ErrorCode.PARAMS_ERROR.getCode(), "不支持的模型");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 评语 会话模式
|
|
|
|
* 评语 会话模式
|
|
|
@ -258,7 +303,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
if (sessions.size() == 0) {
|
|
|
|
if (sessions.size() == 0) {
|
|
|
|
// 初始化欢迎语
|
|
|
|
// 初始化欢迎语
|
|
|
|
ChatSession.Message message = ChatSession.Message.of("", "你好" + userName + " ,我是你的私人 AI 助手小豆," +
|
|
|
|
ChatSession.Message message = ChatSession.Message.of("", "你好" + userName + " ,我是你的私人 AI 助手小豆," +
|
|
|
|
"你可以问我任何包括但不仅限于教育的问题,我会尽力为您解答!");
|
|
|
|
"你可以问我任何包括但不仅限于教育的问题,我会尽力为您解答!","SparkMax");
|
|
|
|
List<ChatSession.Message> history = Collections.singletonList(message);
|
|
|
|
List<ChatSession.Message> history = Collections.singletonList(message);
|
|
|
|
session = new ChatSession();
|
|
|
|
session = new ChatSession();
|
|
|
|
session.setId(sessionId);
|
|
|
|
session.setId(sessionId);
|
|
|
@ -285,7 +330,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
log.info("callback: ws complete event emmit");
|
|
|
|
log.info("callback: ws complete event emmit");
|
|
|
|
SseHelper.send(sseEmitter, "[DONE]");
|
|
|
|
SseHelper.send(sseEmitter, "[DONE]");
|
|
|
|
// 处理完成后的事件: 保存消息记录, 缓存更改
|
|
|
|
// 处理完成后的事件: 保存消息记录, 缓存更改
|
|
|
|
ChatSession.Message message = ChatSession.Message.of(userPrompt, s);
|
|
|
|
ChatSession.Message message = ChatSession.Message.of(userPrompt, s,"SparkMax");
|
|
|
|
HistoryCache.updateContext(sessionId, message);
|
|
|
|
HistoryCache.updateContext(sessionId, message);
|
|
|
|
CosmosPatchOperations options = CosmosPatchOperations.create()
|
|
|
|
CosmosPatchOperations options = CosmosPatchOperations.create()
|
|
|
|
.replace("/updateTime", Instant.now().toEpochMilli())
|
|
|
|
.replace("/updateTime", Instant.now().toEpochMilli())
|
|
|
@ -297,7 +342,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
log.error("callback: ws error, info: " + s);
|
|
|
|
log.error("callback: ws error, info: " + s);
|
|
|
|
// 返还积分
|
|
|
|
// 返还积分
|
|
|
|
});
|
|
|
|
});
|
|
|
|
List<SparkChatRequestParam.Message> messageList = fetchContext(userId, userPrompt);
|
|
|
|
List<SparkChatRequestParam.Message> messageList = fetchContext(userId, userPrompt,"SparkMax");
|
|
|
|
SparkChatRequestParam requestParam = SparkChatRequestParam
|
|
|
|
SparkChatRequestParam requestParam = SparkChatRequestParam
|
|
|
|
.builder()
|
|
|
|
.builder()
|
|
|
|
.uid(userId)
|
|
|
|
.uid(userId)
|
|
|
@ -324,7 +369,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
if (sessions.size() == 0) {
|
|
|
|
if (sessions.size() == 0) {
|
|
|
|
// 初始化欢迎语
|
|
|
|
// 初始化欢迎语
|
|
|
|
ChatSession.Message message = ChatSession.Message.of("", "你好" + userName + " ,我是你的私人 AI 助手小豆," +
|
|
|
|
ChatSession.Message message = ChatSession.Message.of("", "你好" + userName + " ,我是你的私人 AI 助手小豆," +
|
|
|
|
"你可以问我任何包括但不仅限于教育的问题,我会尽力为您解答!");
|
|
|
|
"你可以问我任何包括但不仅限于教育的问题,我会尽力为您解答!","SparkMax");
|
|
|
|
List<ChatSession.Message> history = Collections.singletonList(message);
|
|
|
|
List<ChatSession.Message> history = Collections.singletonList(message);
|
|
|
|
session = new ChatSession();
|
|
|
|
session = new ChatSession();
|
|
|
|
session.setId(sessionId);
|
|
|
|
session.setId(sessionId);
|
|
|
@ -351,7 +396,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
log.info("callback: ws complete event emmit");
|
|
|
|
log.info("callback: ws complete event emmit");
|
|
|
|
SseHelper.send(sseEmitter, "[DONE]");
|
|
|
|
SseHelper.send(sseEmitter, "[DONE]");
|
|
|
|
// 处理完成后的事件: 保存消息记录, 缓存更改
|
|
|
|
// 处理完成后的事件: 保存消息记录, 缓存更改
|
|
|
|
ChatSession.Message message = ChatSession.Message.of(userPrompt, s);
|
|
|
|
ChatSession.Message message = ChatSession.Message.of(userPrompt, s,"SparkMax");
|
|
|
|
HistoryCache.updateContext(sessionId, message);
|
|
|
|
HistoryCache.updateContext(sessionId, message);
|
|
|
|
CosmosPatchOperations options = CosmosPatchOperations.create()
|
|
|
|
CosmosPatchOperations options = CosmosPatchOperations.create()
|
|
|
|
.replace("/updateTime", Instant.now().toEpochMilli())
|
|
|
|
.replace("/updateTime", Instant.now().toEpochMilli())
|
|
|
@ -363,7 +408,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
log.error("callback: ws error, info: " + s);
|
|
|
|
log.error("callback: ws error, info: " + s);
|
|
|
|
// 返还积分
|
|
|
|
// 返还积分
|
|
|
|
});
|
|
|
|
});
|
|
|
|
List<SparkChatRequestParam.Message> messageList = fetchContext(userId, userPrompt);
|
|
|
|
List<SparkChatRequestParam.Message> messageList = fetchContext(userId, userPrompt,"SparkMax");
|
|
|
|
SparkChatRequestParam requestParam = SparkChatRequestParam
|
|
|
|
SparkChatRequestParam requestParam = SparkChatRequestParam
|
|
|
|
.builder()
|
|
|
|
.builder()
|
|
|
|
.uid(userId)
|
|
|
|
.uid(userId)
|
|
|
@ -374,7 +419,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
return sseEmitter;
|
|
|
|
return sseEmitter;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
List<SparkChatRequestParam.Message> fetchContext(String userId, String prompt) {
|
|
|
|
List<SparkChatRequestParam.Message> fetchContext(String userId, String prompt, String model) {
|
|
|
|
List<ChatSession.Message> context = HistoryCache.getContext(userId);
|
|
|
|
List<ChatSession.Message> context = HistoryCache.getContext(userId);
|
|
|
|
List<SparkChatRequestParam.Message> paramMessages = new ArrayList<>();
|
|
|
|
List<SparkChatRequestParam.Message> paramMessages = new ArrayList<>();
|
|
|
|
// 暂未缓存,从数据库拉取
|
|
|
|
// 暂未缓存,从数据库拉取
|
|
|
@ -388,10 +433,10 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
|
|
|
|
|
|
|
|
|
|
|
// convert DB Message to Spark Message
|
|
|
|
// convert DB Message to Spark Message
|
|
|
|
context.forEach(item -> {
|
|
|
|
context.forEach(item -> {
|
|
|
|
paramMessages.add(SparkChatRequestParam.Message.ofUser(item.getUserText()));
|
|
|
|
paramMessages.add(SparkChatRequestParam.Message.ofUser(item.getUserText(),model));
|
|
|
|
paramMessages.add(SparkChatRequestParam.Message.ofAssistant(item.getGptText()));
|
|
|
|
paramMessages.add(SparkChatRequestParam.Message.ofAssistant(item.getGptText(),model));
|
|
|
|
});
|
|
|
|
});
|
|
|
|
paramMessages.add(SparkChatRequestParam.Message.ofUser(prompt));
|
|
|
|
paramMessages.add(SparkChatRequestParam.Message.ofUser(prompt,model));
|
|
|
|
return paramMessages;
|
|
|
|
return paramMessages;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|