toolNames = null;
if (conversation.getRoleId() != null) {
AiChatRoleDO chatRole = chatRoleService.getChatRole(conversation.getRoleId());
if (chatRole != null && CollUtil.isNotEmpty(chatRole.getToolIds())) {
toolNames = convertSet(toolService.getToolList(chatRole.getToolIds()), AiToolDO::getName);
}
}
// 2.2 构建 ChatOptions 对象
AiPlatformEnum platform = AiPlatformEnum.validatePlatform(model.getPlatform());
ChatOptions chatOptions = AiUtils.buildChatOptions(platform, model.getModel(),
conversation.getTemperature(), conversation.getMaxTokens(), toolNames);
return new Prompt(chatMessages, chatOptions);
}
/**
* 从历史消息中,获得倒序的 n 组消息作为消息上下文
*
* n 组:指的是 user + assistant 形成一组
*
* @param messages 消息列表
* @param conversation 对话
* @param sendReqVO 发送请求
* @return 消息上下文
*/
private List filterContextMessages(List messages,
AiChatConversationDO conversation,
AiChatMessageSendReqVO sendReqVO) {
if (conversation.getMaxContexts() == null || ObjUtil.notEqual(sendReqVO.getUseContext(), Boolean.TRUE)) {
return Collections.emptyList();
}
List contextMessages = new ArrayList<>(conversation.getMaxContexts() * 2);
for (int i = messages.size() - 1; i >= 0; i--) {
AiChatMessageDO assistantMessage = CollUtil.get(messages, i);
if (assistantMessage == null || assistantMessage.getReplyId() == null) {
continue;
}
AiChatMessageDO userMessage = CollUtil.get(messages, i - 1);
if (userMessage == null
|| ObjUtil.notEqual(assistantMessage.getReplyId(), userMessage.getId())
|| StrUtil.isEmpty(assistantMessage.getContent())) {
continue;
}
// 由于后续要 reverse 反转,所以先添加 assistantMessage
contextMessages.add(assistantMessage);
contextMessages.add(userMessage);
// 超过最大上下文,结束
if (contextMessages.size() >= conversation.getMaxContexts() * 2) {
break;
}
}
Collections.reverse(contextMessages);
return contextMessages;
}
private AiChatMessageDO createChatMessage(Long conversationId, Long replyId,
AiModelDO model, Long userId, Long roleId,
MessageType messageType, String content, Boolean useContext,
List knowledgeSegments) {
AiChatMessageDO message = new AiChatMessageDO().setConversationId(conversationId).setReplyId(replyId)
.setModel(model.getModel()).setModelId(model.getId()).setUserId(userId).setRoleId(roleId)
.setType(messageType.getValue()).setContent(content).setUseContext(useContext)
.setSegmentIds(convertList(knowledgeSegments, AiKnowledgeSegmentSearchRespBO::getId));
message.setCreateTime(LocalDateTime.now());
chatMessageMapper.insert(message);
return message;
}
@Override
public PageResult getChatMessagePageByConversationId(AiChatMessageReqVO reqVO) {
return chatMessageMapper.selectPageByConversationId(reqVO);
}
@Override
public List getChatMessageListByConversationId(Long conversationId) {
return chatMessageMapper.selectListByConversationId(conversationId);
}
@Override
public void deleteChatMessage(Long id, Long userId) {
// 1. 校验消息存在
AiChatMessageDO message = chatMessageMapper.selectById(id);
if (message == null || ObjUtil.notEqual(message.getUserId(), userId)) {
throw exception(CHAT_MESSAGE_NOT_EXIST);
}
// 2. 执行删除
chatMessageMapper.deleteById(id);
}
@Override
public void deleteChatMessageByConversationId(Long conversationId, Long userId) {
// 1. 校验消息存在
List messages = chatMessageMapper.selectListByConversationId(conversationId);
if (CollUtil.isEmpty(messages) || ObjUtil.notEqual(messages.get(0).getUserId(), userId)) {
throw exception(CHAT_MESSAGE_NOT_EXIST);
}
// 2. 执行删除
chatMessageMapper.deleteBatchIds(convertList(messages, AiChatMessageDO::getId));
}
@Override
public void deleteChatMessageByAdmin(Long id) {
// 1. 校验消息存在
AiChatMessageDO message = chatMessageMapper.selectById(id);
if (message == null) {
throw exception(CHAT_MESSAGE_NOT_EXIST);
}
// 2. 执行删除
chatMessageMapper.deleteById(id);
}
@Override
public Map getChatMessageCountMap(Collection conversationIds) {
return chatMessageMapper.selectCountMapByConversationId(conversationIds);
}
@Override
public PageResult getChatMessagePage(AiChatMessagePageReqVO pageReqVO) {
return chatMessageMapper.selectPage(pageReqVO);
}
private String getScheduleSuggest(String content) {
String spliceText = content.contains("总结:") ? "总结:" : "结论:";
String regex = "^([\\s\\S]*?)" + spliceText + "([\\s\\S]*)$";
Pattern pattern = java.util.regex.Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
return matcher.group(2).trim();
}
return "";
}
}