From 274d007ba11c3b3a329678c3c5e598ae0b0ddad7 Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Sun, 29 Mar 2026 18:24:38 +0800 Subject: [PATCH] refactor(memory): add DialogRollingService to control message rolling logic --- .../communication/DialogRollingService.java | 77 +++++++++++++++++++ .../module/memory/updater/MemoryUpdater.java | 20 ++++- 2 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 Partner-Core/src/main/java/work/slhaf/partner/module/communication/DialogRollingService.java diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/communication/DialogRollingService.java b/Partner-Core/src/main/java/work/slhaf/partner/module/communication/DialogRollingService.java new file mode 100644 index 00000000..bdef636d --- /dev/null +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/communication/DialogRollingService.java @@ -0,0 +1,77 @@ +package work.slhaf.partner.module.communication; + +import kotlin.Unit; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; +import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule; +import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel; +import work.slhaf.partner.api.chat.pojo.Message; +import work.slhaf.partner.core.cognition.BlockContent; +import work.slhaf.partner.core.cognition.CognitionCapability; +import work.slhaf.partner.core.cognition.ContextBlock; +import work.slhaf.partner.module.TaskBlock; + +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +public class DialogRollingService extends AbstractAgentModule.Standalone implements ActivateModel { + + @InjectCapability + private CognitionCapability cognitionCapability; + + public void rollMessages(List snapshotMessages, int rollingSize, int retainSize) { + rollMessages(snapshotMessages, rollingSize, retainSize, null, null, null); + } + + public void rollMessages(List snapshotMessages, int rollingSize, int retainSize, @Nullable String unitId, @Nullable String sliceId, @Nullable String summary) { + summary = summary == null ? summarize(snapshotMessages) : summary; + cognitionCapability.contextWorkspace().register(new ContextBlock( + buildDialogAbstractBlock(summary, unitId, sliceId), + Set.of(ContextBlock.VisibleDomain.MEMORY, ContextBlock.VisibleDomain.COMMUNICATION), + 35, + 8, + 10 + )); + cognitionCapability.rollChatMessagesWithSnapshot(rollingSize, retainSize); + } + + private String summarize(List snapshotMessages) { + List messages = List.of( + resolveTaskBlock(snapshotMessages) + ); + return chat(messages); + } + + private @NotNull BlockContent buildDialogAbstractBlock(String summary, @Nullable String unitId, @Nullable String sliceId) { + return new BlockContent("dialog_history", "dialog_rolling_service") { + @Override + protected void fillXml(@NotNull Document document, @NotNull Element root) { + if (unitId != null) root.setAttribute("related_memory_unit_id", unitId); + if (sliceId != null) root.setAttribute("related_memory_slice_id", sliceId); + root.setAttribute("datetime", ZonedDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + + appendTextElement(document, root, "summary", summary); + } + }; + } + + private Message resolveTaskBlock(List snapshotMessages) { + return new TaskBlock() { + @Override + protected void fillXml(@NotNull Document document, @NotNull Element root) { + appendRepeatedElements(document, root, "message", snapshotMessages, (messageElement, message) -> { + messageElement.setAttribute("role", message.getRole().name().toLowerCase(Locale.ROOT)); + messageElement.setTextContent(message.getContent()); + return Unit.INSTANCE; + }); + } + }.encodeToMessage(); + } + +} diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/memory/updater/MemoryUpdater.java b/Partner-Core/src/main/java/work/slhaf/partner/module/memory/updater/MemoryUpdater.java index 460e1744..e397d8bc 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/memory/updater/MemoryUpdater.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/memory/updater/MemoryUpdater.java @@ -19,6 +19,7 @@ import work.slhaf.partner.core.memory.pojo.MemorySlice; import work.slhaf.partner.core.memory.pojo.MemoryUnit; import work.slhaf.partner.core.perceive.PerceiveCapability; import work.slhaf.partner.module.action.scheduler.ActionScheduler; +import work.slhaf.partner.module.communication.DialogRollingService; import work.slhaf.partner.module.memory.runtime.MemoryRuntime; import work.slhaf.partner.module.memory.updater.summarizer.MultiSummarizer; import work.slhaf.partner.module.memory.updater.summarizer.SingleSummarizer; @@ -55,6 +56,8 @@ public class MemoryUpdater extends AbstractAgentModule.Running chatSnapshot) { + private RollingRecord updateMemory(List chatSnapshot) { log.debug("[MemoryUpdater] 记忆更新流程开始..."); if (chatSnapshot.isEmpty()) { - return; + return null; } SummarizeInput summarizeInput = new SummarizeInput(chatSnapshot, memoryRuntime.getTopicTree()); log.debug("[MemoryUpdater] 记忆更新-总结流程-输入: {}", JSONObject.toJSONString(summarizeInput)); @@ -141,6 +148,8 @@ public class MemoryUpdater extends AbstractAgentModule.Running