Merge remote-tracking branch 'origin/develop' into develop

develop
hhb@hotmail.com 3 days ago
commit 7216c673c2

@ -17,6 +17,9 @@ public class ChatCompletionReqDto {
@ApiModelProperty("模型类型: 科大讯飞sparkMaxDeepSeekdeepseek-chat DeepSeek深度思考deepseek-reasoner")
private String model = "sparkMax";
@ApiModelProperty("是否保存会话, true 默认保存; false 不保存")
private boolean isSave = true;
@NotBlank(message = "请输入消息内容")
private String text;
}

@ -12,6 +12,7 @@ import cn.teammodel.common.PK;
import cn.teammodel.config.exception.ServiceException;
import cn.teammodel.model.dto.ai.*;
import cn.teammodel.model.dto.ai.comment.*;
import cn.teammodel.model.entity.TmdUserDetail;
import cn.teammodel.model.entity.ai.ChatApp;
import cn.teammodel.repository.ChatAppRepository;
import cn.teammodel.repository.ChatSessionRepository;
@ -63,12 +64,17 @@ public class ChatMessageServiceImpl implements ChatMessageService {
// 目前仅使用讯飞星火大模型
String appId = chatCompletionReqDto.getAppId();
SseEmitter sseEmitter;
//
sseEmitter = completionBySession(chatCompletionReqDto, userId);
/*
//不保存/保存聊天记录
if (chatCompletionReqDto.getModel().equals("deepseek_chat") || chatCompletionReqDto.getModel().equals("deepseek-reasoner")) {
sseEmitter = completionBySession(chatCompletionReqDto, userId);
} else {
sseEmitter = completionByApp(chatCompletionReqDto, false);
}
*/
return sseEmitter;
}
@ -161,8 +167,9 @@ public class ChatMessageServiceImpl implements ChatMessageService {
String appId = chatCompletionReqDto.getAppId();
String userPrompt = chatCompletionReqDto.getText();
User user = SecurityUtil.getLoginUser();
String userId = user.getId();
String schoolId = user.getSchoolId();
//String userId = user.getId();
String userId = ((TmdUserDetail) SecurityUtil.getAuthentication().getPrincipal()).getClaims().getSubject();
String schoolId = null; //user.getSchoolId();
// 查询 appId 获取 prompt
// 通过 prompt 和 userprompt 生成结果
@ -237,7 +244,6 @@ public class ChatMessageServiceImpl implements ChatMessageService {
String sessionId = chatCompletionReqDto.getSessionId();
String mode = chatCompletionReqDto.getModel();
ChatSession session = RepositoryUtil.findOne(chatSessionRepository.findBySessionId(sessionId), "该会话不存在");
if (!session.getUserId().equals(userId)) {
throw new ServiceException(ErrorCode.NO_AUTH_ERROR.getCode(), "该会话不存在");
@ -258,6 +264,9 @@ public class ChatMessageServiceImpl implements ChatMessageService {
listener.setOnComplete((s) -> {
log.info("callback: ws complete event emmit");
SseHelper.send(finalSseEmitter, "[DONE]");
//断开连接
finalSseEmitter.complete();
if (chatCompletionReqDto.isSave()){
// 处理完成后的事件: 保存消息记录, 缓存更改
ChatSession.Message message = ChatSession.Message.of(userPrompt, s,chatCompletionReqDto.getModel());
HistoryCache.updateContext(sessionId, message);
@ -265,6 +274,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
.replace("/updateTime", Instant.now().toEpochMilli())
.add("/history/-", message);
chatSessionRepository.save(sessionId, PK.of(PK.CHAT_SESSION), ChatSession.class, options);
}
});
// 错误的回调
listener.setOnError((s) -> {

@ -143,7 +143,7 @@ public class DeepSeekServiceImpl implements DeepSeekService {
SseEmitter sseEmitter = new SseEmitter(-1L);
StringBuilder strContent = new StringBuilder();
StringBuilder strReasoning = new StringBuilder();
executorService.execute(()-> {
//executorService.execute(()-> {
try {
log.info("流式回答开始,问题:{}", chatCompletionReqDto.getText());
try (CloseableHttpClient client = HttpClients.createDefault()) {
@ -152,13 +152,21 @@ public class DeepSeekServiceImpl implements DeepSeekService {
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Authorization", "Bearer " + DeepSeekClient.API_Key);
Map<String, Object> question = new HashMap<>();
question.put("role", "user");
question.put("content", chatCompletionReqDto.getText());
List<Map<String, Object>> messages = new ArrayList<>();
//助手的角色
Map<String, Object> systemMessage = new HashMap<>();
systemMessage.put("role", "system");
systemMessage.put("content", "你是一个教师助手");
messages.add(systemMessage);
//用户的消息
Map<String, Object> userMessage = new HashMap<>();
userMessage.put("role", "user");
userMessage.put("content", chatCompletionReqDto.getText());
messages.add(userMessage);
//向DeepSeek发送请求
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("model", chatCompletionReqDto.getModel());
requestMap.put("messages", Collections.singletonList(question));
requestMap.put("messages", messages);
requestMap.put("stream", true);
requestMap.put("max_tokens", 1024);
@ -173,13 +181,17 @@ public class DeepSeekServiceImpl implements DeepSeekService {
String jsonData = line.substring(6);
if ("[DONE]".equals(jsonData)) {
sseEmitter.send("[DONE]");
//断开连接
sseEmitter.complete();
// 会话完成,更新历史会话记录
if (chatCompletionReqDto.isSave()){
ChatSession.Message message = ChatSession.Message.of(chatCompletionReqDto.getText(), strContent.toString(),chatCompletionReqDto.getModel(),strReasoning.toString());
HistoryCache.updateContext(chatCompletionReqDto.getSessionId(), message);
CosmosPatchOperations options = CosmosPatchOperations.create()
.replace("/updateTime", Instant.now().toEpochMilli())
.add("/history/-", message);
chatSessionRepository.save(chatCompletionReqDto.getSessionId(), PK.of(PK.CHAT_SESSION), ChatSession.class, options);
}
break;
}
JsonNode node = objectMapper.readTree(jsonData);
@ -204,8 +216,8 @@ public class DeepSeekServiceImpl implements DeepSeekService {
}
}
}
log.info("流式回答结束,{}",question);
sseEmitter.complete();
log.info("流式回答结束,{}",messages);
//sseEmitter.complete();
}
} catch (Exception e) {
log.error("处理 Deepseek 请求时发生错误", e);
@ -215,7 +227,7 @@ public class DeepSeekServiceImpl implements DeepSeekService {
log.error("处理 Deepseek 请求时发生错误", e);
sseEmitter.completeWithError(e);
}
});
//});
return sseEmitter;
}

Loading…
Cancel
Save