diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatSession.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatSession.java index aa8967a2..5b37dbc5 100644 --- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatSession.java +++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/ChatSession.java @@ -1,5 +1,6 @@ package org.ruoyi.domain; +import com.alibaba.excel.annotation.ExcelProperty; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -47,6 +48,9 @@ public class ChatSession extends BaseEntity { * 备注 */ private String remark; - + /** + * 会话id + */ + private String conversationId; } diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatSessionBo.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatSessionBo.java index b47c11ce..d71b0b5f 100644 --- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatSessionBo.java +++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/bo/ChatSessionBo.java @@ -1,5 +1,6 @@ package org.ruoyi.domain.bo; +import com.alibaba.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -44,6 +45,9 @@ public class ChatSessionBo extends BaseEntity { * 备注 */ private String remark; - + /** + * 会话id + */ + private String conversationId; } diff --git a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatSessionVo.java b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatSessionVo.java index fb41319a..9d142591 100644 --- a/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatSessionVo.java +++ b/ruoyi-modules-api/ruoyi-chat-api/src/main/java/org/ruoyi/domain/vo/ChatSessionVo.java @@ -61,6 +61,11 @@ public class ChatSessionVo implements Serializable { @ExcelProperty(value = "创建时间") private String createTime; + /** + * 会话id + */ + @ExcelProperty(value = "会话id") + private String conversationId; } diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/DifyServiceImpl.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/DifyServiceImpl.java index d609ab98..d9092cc9 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/DifyServiceImpl.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/DifyServiceImpl.java @@ -1,5 +1,6 @@ package org.ruoyi.chat.service.chat.impl; +import cn.hutool.core.util.StrUtil; import io.github.imfangs.dify.client.DifyClient; import io.github.imfangs.dify.client.DifyClientFactory; import io.github.imfangs.dify.client.callback.ChatStreamCallback; @@ -12,10 +13,15 @@ import io.github.imfangs.dify.client.model.chat.ChatMessage; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.ruoyi.chat.enums.ChatModeType; +import org.ruoyi.chat.service.chat.IChatCostService; import org.ruoyi.chat.service.chat.IChatService; +import org.ruoyi.common.chat.entity.chat.Message; import org.ruoyi.common.chat.request.ChatRequest; +import org.ruoyi.domain.bo.ChatSessionBo; import org.ruoyi.domain.vo.ChatModelVo; +import org.ruoyi.domain.vo.ChatSessionVo; import org.ruoyi.service.IChatModelService; +import org.ruoyi.service.IChatSessionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @@ -31,6 +37,10 @@ public class DifyServiceImpl implements IChatService { @Autowired private IChatModelService chatModelService; + @Autowired + private IChatSessionService chatSessionService; + @Autowired + private IChatCostService chatCostService; @Override public SseEmitter chat(ChatRequest chatRequest, SseEmitter emitter) { @@ -53,6 +63,15 @@ public class DifyServiceImpl implements IChatService { .responseMode(ResponseMode.STREAMING) .build(); + // 获取conversationId + ChatSessionVo sessionInfo = chatSessionService.queryById(chatRequest.getSessionId()); + if (StrUtil.isNotBlank(sessionInfo.getConversationId())) { + message.setConversationId(sessionInfo.getConversationId()); + } + + // 获取模型返回的消息 + StringBuffer respMessage = new StringBuffer(); + // 发送流式消息 try { chatClient.sendChatMessageStream(message, new ChatStreamCallback() { @@ -60,6 +79,7 @@ public class DifyServiceImpl implements IChatService { @Override public void onMessage(MessageEvent event) { emitter.send(event.getAnswer()); + respMessage.append(event.getAnswer()); log.info("收到消息片段: {}", event.getAnswer()); } @@ -67,6 +87,29 @@ public class DifyServiceImpl implements IChatService { public void onMessageEnd(MessageEndEvent event) { emitter.complete(); log.info("消息结束,完整消息ID: {}", event.getMessageId()); + // 更新conversationId + if (StrUtil.isBlank(sessionInfo.getConversationId())) { + String conversationId = event.getConversationId(); + sessionInfo.setConversationId(conversationId); + // 更新conversationId + ChatSessionBo chatSessionBo = new ChatSessionBo(); + chatSessionBo.setConversationId(sessionInfo.getConversationId()); + chatSessionBo.setId(sessionInfo.getId()); + chatSessionBo.setUserId(sessionInfo.getUserId()); + chatSessionBo.setSessionTitle(sessionInfo.getSessionTitle()); + chatSessionBo.setSessionContent(sessionInfo.getSessionContent()); + chatSessionBo.setRemark(sessionInfo.getRemark()); + chatSessionService.updateByBo(chatSessionBo); + } + // 扣除费用 + ChatRequest chatRequestResponse = new ChatRequest(); + // 设置对话角色 + chatRequestResponse.setRole(Message.Role.ASSISTANT.getName()); + chatRequestResponse.setModel(chatRequest.getModel()); + chatRequestResponse.setUserId(chatRequest.getUserId()); + chatRequestResponse.setSessionId(chatRequest.getSessionId()); + chatRequestResponse.setPrompt(respMessage.toString()); + chatCostService.deductToken(chatRequestResponse); } @Override