package tech.aiflowy.ai.entity; import tech.aiflowy.ai.mapper.AiBotConversationMessageMapper; import tech.aiflowy.ai.service.AiBotConversationMessageService; import tech.aiflowy.ai.service.AiBotMessageService; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.agentsflex.core.llm.functions.Function; import com.agentsflex.core.memory.ChatMemory; import com.agentsflex.core.message.*; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import com.mybatisflex.core.query.QueryWrapper; import tech.aiflowy.common.satoken.util.SaTokenUtil; import javax.annotation.Resource; import java.math.BigInteger; import java.util.ArrayList; import java.util.Date; import java.util.List; public class AiBotMessageMemory implements ChatMemory { private final BigInteger botId; private final BigInteger accountId; private final String sessionId; private final int isExternalMsg; private final AiBotMessageService messageService; private final AiBotConversationMessageMapper aiBotConversationMessageMapper; private final AiBotConversationMessageService aiBotConversationService; public AiBotMessageMemory(BigInteger botId, BigInteger accountId, String sessionId, int isExternalMsg, AiBotMessageService messageService, AiBotConversationMessageMapper aiBotConversationMessageMapper, AiBotConversationMessageService aiBotConversationService ) { this.botId = botId; this.accountId = accountId; this.sessionId = sessionId; this.isExternalMsg = isExternalMsg; this.messageService = messageService; this.aiBotConversationMessageMapper = aiBotConversationMessageMapper; this.aiBotConversationService = aiBotConversationService; } @Override public List getMessages() { List sysAiMessages = messageService.list(QueryWrapper.create() .eq(AiBotMessage::getBotId, botId, true) .eq(AiBotMessage::getAccountId, accountId, true) .eq(AiBotMessage::getSessionId, sessionId, true) .eq(AiBotMessage::getIsExternalMsg, isExternalMsg, true) .orderBy(AiBotMessage::getCreated, true) ); if (sysAiMessages == null || sysAiMessages.isEmpty()) { return null; } List messages = new ArrayList<>(sysAiMessages.size()); for (AiBotMessage aiBotMessage : sysAiMessages) { Message message = aiBotMessage.toMessage(); if (message != null) messages.add(message); } return messages; } @Override public void addMessage(Message message) { AiBotMessage aiMessage = new AiBotMessage(); aiMessage.setCreated(new Date()); aiMessage.setBotId(botId); aiMessage.setAccountId(accountId); aiMessage.setSessionId(sessionId); aiMessage.setIsExternalMsg(isExternalMsg); if (message instanceof AiMessage) { AiMessage m = (AiMessage) message; aiMessage.setContent(m.getFullContent()); aiMessage.setRole("assistant"); aiMessage.setTotalTokens(m.getTotalTokens()); aiMessage.setPromptTokens(m.getPromptTokens()); aiMessage.setCompletionTokens(m.getCompletionTokens()); List calls = m.getCalls(); if (CollectionUtil.isNotEmpty(calls)) { return; } } else if (message instanceof HumanMessage) { HumanMessage hm = (HumanMessage) message; aiMessage.setContent(hm.getContent()); List functions = hm.getFunctions(); aiMessage.setFunctions(JSON.toJSONString(functions, SerializerFeature.WriteClassName)); aiMessage.setRole("user"); } else if (message instanceof SystemMessage) { aiMessage.setRole("system"); aiMessage.setContent(((SystemMessage) message).getContent()); } if (StrUtil.isNotEmpty(aiMessage.getContent())) { AiBotConversationMessage aiBotConversation = aiBotConversationMessageMapper.selectOneById(aiMessage.getSessionId()); if (aiBotConversation == null && isExternalMsg == 1){ AiBotConversationMessage conversation = new AiBotConversationMessage(); conversation.setSessionId(aiMessage.getSessionId()); conversation.setTitle(aiMessage.getContent()); conversation.setBotId(aiMessage.getBotId()); conversation.setCreated(new Date()); conversation.setAccountId(SaTokenUtil.getLoginAccount().getId()); aiBotConversationService.save(conversation); } messageService.save(aiMessage); } } @Override public Object id() { return botId; } }