From 5d16d9a0e7240ff4e6346bfee4890159da5a764e Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 19 三月 2026 11:40:51 +0800
Subject: [PATCH] #AI.记忆治理

---
 rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiChatServiceImpl.java |   44 +++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiChatServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiChatServiceImpl.java
index 05dc09b..1ce1279 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiChatServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiChatServiceImpl.java
@@ -12,6 +12,8 @@
 import com.vincent.rsf.server.ai.dto.AiChatRuntimeDto;
 import com.vincent.rsf.server.ai.dto.AiChatStatusDto;
 import com.vincent.rsf.server.ai.dto.AiChatSessionDto;
+import com.vincent.rsf.server.ai.dto.AiChatSessionPinRequest;
+import com.vincent.rsf.server.ai.dto.AiChatSessionRenameRequest;
 import com.vincent.rsf.server.ai.dto.AiResolvedConfig;
 import com.vincent.rsf.server.ai.entity.AiParam;
 import com.vincent.rsf.server.ai.entity.AiPrompt;
@@ -93,19 +95,42 @@
                 .mountedMcpCount(config.getMcpMounts().size())
                 .mountedMcpNames(config.getMcpMounts().stream().map(item -> item.getName()).toList())
                 .mountErrors(List.of())
+                .memorySummary(memory.getMemorySummary())
+                .memoryFacts(memory.getMemoryFacts())
+                .recentMessageCount(memory.getRecentMessageCount())
                 .persistedMessages(memory.getPersistedMessages())
                 .build();
     }
 
     @Override
-    public List<AiChatSessionDto> listSessions(String promptCode, Long userId, Long tenantId) {
+    public List<AiChatSessionDto> listSessions(String promptCode, String keyword, Long userId, Long tenantId) {
         AiResolvedConfig config = aiConfigResolverService.resolve(promptCode, tenantId);
-        return aiChatMemoryService.listSessions(userId, tenantId, config.getPromptCode());
+        return aiChatMemoryService.listSessions(userId, tenantId, config.getPromptCode(), keyword);
     }
 
     @Override
     public void removeSession(Long sessionId, Long userId, Long tenantId) {
         aiChatMemoryService.removeSession(userId, tenantId, sessionId);
+    }
+
+    @Override
+    public AiChatSessionDto renameSession(Long sessionId, AiChatSessionRenameRequest request, Long userId, Long tenantId) {
+        return aiChatMemoryService.renameSession(userId, tenantId, sessionId, request);
+    }
+
+    @Override
+    public AiChatSessionDto pinSession(Long sessionId, AiChatSessionPinRequest request, Long userId, Long tenantId) {
+        return aiChatMemoryService.pinSession(userId, tenantId, sessionId, request);
+    }
+
+    @Override
+    public void clearSessionMemory(Long sessionId, Long userId, Long tenantId) {
+        aiChatMemoryService.clearSessionMemory(userId, tenantId, sessionId);
+    }
+
+    @Override
+    public void retainLatestRound(Long sessionId, Long userId, Long tenantId) {
+        aiChatMemoryService.retainLatestRound(userId, tenantId, sessionId);
     }
 
     @Override
@@ -129,7 +154,7 @@
             AiChatSession session = resolveSession(request, userId, tenantId, config.getPromptCode());
             sessionId = session.getId();
             AiChatMemoryDto memory = loadMemory(userId, tenantId, config.getPromptCode(), session.getId());
-            List<AiChatMessageDto> mergedMessages = mergeMessages(memory.getPersistedMessages(), request.getMessages());
+            List<AiChatMessageDto> mergedMessages = mergeMessages(memory.getShortMemoryMessages(), request.getMessages());
             try (McpMountRuntimeFactory.McpMountRuntime runtime = createRuntime(config, userId)) {
                 emitStrict(emitter, "start", AiChatRuntimeDto.builder()
                         .requestId(requestId)
@@ -141,6 +166,9 @@
                         .mountedMcpCount(runtime.getMountedCount())
                         .mountedMcpNames(runtime.getMountedNames())
                         .mountErrors(runtime.getErrors())
+                        .memorySummary(memory.getMemorySummary())
+                        .memoryFacts(memory.getMemoryFacts())
+                        .recentMessageCount(memory.getRecentMessageCount())
                         .persistedMessages(memory.getPersistedMessages())
                         .build());
                 emitSafely(emitter, "status", AiChatStatusDto.builder()
@@ -155,7 +183,7 @@
                         requestId, userId, tenantId, session.getId(), resolvedModel);
 
                 Prompt prompt = new Prompt(
-                        buildPromptMessages(mergedMessages, config.getPrompt(), request.getMetadata()),
+                        buildPromptMessages(memory, mergedMessages, config.getPrompt(), request.getMetadata()),
                         buildChatOptions(config.getAiParam(), runtime.getToolCallbacks(), userId, request.getMetadata())
                 );
                 OpenAiChatModel chatModel = createChatModel(config.getAiParam());
@@ -388,7 +416,7 @@
         return builder.build();
     }
 
-    private List<Message> buildPromptMessages(List<AiChatMessageDto> sourceMessages, AiPrompt aiPrompt, Map<String, Object> metadata) {
+    private List<Message> buildPromptMessages(AiChatMemoryDto memory, List<AiChatMessageDto> sourceMessages, AiPrompt aiPrompt, Map<String, Object> metadata) {
         if (Cools.isEmpty(sourceMessages)) {
             throw new CoolException("瀵硅瘽娑堟伅涓嶈兘涓虹┖");
         }
@@ -396,6 +424,12 @@
         if (StringUtils.hasText(aiPrompt.getSystemPrompt())) {
             messages.add(new SystemMessage(aiPrompt.getSystemPrompt()));
         }
+        if (memory != null && StringUtils.hasText(memory.getMemorySummary())) {
+            messages.add(new SystemMessage("鍘嗗彶鎽樿:\n" + memory.getMemorySummary()));
+        }
+        if (memory != null && StringUtils.hasText(memory.getMemoryFacts())) {
+            messages.add(new SystemMessage("鍏抽敭浜嬪疄:\n" + memory.getMemoryFacts()));
+        }
         int lastUserIndex = -1;
         for (int i = 0; i < sourceMessages.size(); i++) {
             AiChatMessageDto item = sourceMessages.get(i);

--
Gitblit v1.9.1