From 4a1828ed9419c06d79e9eac166d468ed907ce47b Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Sun, 29 Mar 2026 00:17:14 +0800 Subject: [PATCH] refactor(memory): finished the context block content produced in MemorySelector --- .../memory/selector/MemorySelector.java | 122 +++++++++++++++++- 1 file changed, 121 insertions(+), 1 deletion(-) diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/MemorySelector.java b/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/MemorySelector.java index 5c3b9f35..c148d48c 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/MemorySelector.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/memory/selector/MemorySelector.java @@ -1,14 +1,20 @@ package work.slhaf.partner.module.memory.selector; +import kotlin.Unit; import lombok.Data; import lombok.EqualsAndHashCode; import org.jetbrains.annotations.NotNull; +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.annotation.InjectModule; +import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.core.action.ActionCapability; import work.slhaf.partner.core.action.ActionCore; +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.core.memory.exception.UnExistedDateIndexException; import work.slhaf.partner.core.memory.exception.UnExistedTopicException; import work.slhaf.partner.core.memory.pojo.ActivatedMemorySlice; @@ -33,6 +39,9 @@ import java.util.concurrent.locks.ReentrantLock; @Data public class MemorySelector extends AbstractAgentModule.Running { + private static final String BLOCK_NAME = "activated_memory_slices"; + private static final String SOURCE = "memory_selector"; + @InjectCapability private CognitionCapability cognitionCapability; @InjectCapability @@ -114,7 +123,88 @@ public class MemorySelector extends AbstractAgentModule.Running activatedSlices) { - // TODO + cognitionCapability.contextWorkspace().register(new ContextBlock( + buildMemoryFullBlock(activatedSlices), + buildMemoryCompactBlock(activatedSlices), + buildMemoryAbstractBlock(activatedSlices), + Set.of(ContextBlock.VisibleDomain.MEMORY), + 18, + 8, + 16 + )); + } + + private @NotNull BlockContent buildMemoryAbstractBlock(List activatedSlices) { + return new MemoryBlock(activatedSlices) { + @Override + protected void fillSliceElement(Document document, @NotNull Element sliceElement, ActivatedMemorySlice slice) { + appendTextElement(document, sliceElement, "summary", slice.getSummary()); + } + }; + } + + private @NotNull BlockContent buildMemoryCompactBlock(List activatedSlices) { + return new MemoryBlock(activatedSlices) { + @Override + protected void fillSliceElement(Document document, @NotNull Element sliceElement, ActivatedMemorySlice slice) { + appendTextElement(document, sliceElement, "slice_summary", slice.getSummary()); + appendChildElement(document, sliceElement, "source_messages", (messagesElement) -> { + List messages = slice.getMessages(); + int size = messages.size(); + if (size > 10) { + int middleStart = Math.max(2, (size - 4) / 2); + int middleEnd = Math.min(size - 2, middleStart + 4); + int omittedBeforeMiddle = middleStart - 2; + appendTextElement(document, messagesElement, "omitted_messages", "省略了 " + omittedBeforeMiddle + " 条消息"); + + appendMessageElement(document, messagesElement, messages.subList(middleStart, middleEnd)); + + int omittedAfterMiddle = (size - 2) - middleEnd; + if (omittedAfterMiddle > 0) { + appendTextElement(document, messagesElement, "omitted_messages", "省略了 " + omittedAfterMiddle + " 条消息"); + } + + appendMessageElement(document, messagesElement, messages.subList(size - 2, size)); + } else { + appendMessageElement(document, messagesElement, messages); + } + return Unit.INSTANCE; + }); + } + }; + } + + private @NotNull BlockContent buildMemoryFullBlock(List activatedSlices) { + return new MemoryBlock(activatedSlices) { + @Override + protected void fillSliceElement(Document document, @NotNull Element sliceElement, ActivatedMemorySlice slice) { + appendTextElement(document, sliceElement, "slice_summary", slice.getSummary()); + appendChildElement(document, sliceElement, "source_messages", (messagesElement) -> { + List messages = slice.getMessages(); + int size = messages.size(); + if (size > 10) { + appendMessageElement(document, messagesElement, messages.subList(0, 2)); + + int middleStart = Math.max(2, (size - 4) / 2); + int middleEnd = Math.min(size - 2, middleStart + 4); + int omittedBeforeMiddle = middleStart - 2; + appendTextElement(document, messagesElement, "omitted_messages", "省略了 " + omittedBeforeMiddle + " 条消息"); + + appendMessageElement(document, messagesElement, messages.subList(middleStart, middleEnd)); + + int omittedAfterMiddle = (size - 2) - middleEnd; + if (omittedAfterMiddle > 0) { + appendTextElement(document, messagesElement, "omitted_messages", "省略了 " + omittedAfterMiddle + " 条消息"); + } + + appendMessageElement(document, messagesElement, messages.subList(size - 2, size)); + } else { + appendMessageElement(document, messagesElement, messages); + } + return Unit.INSTANCE; + }); + } + }; } private List selectAndEvaluateMemory(Map snapshotInputs, ExtractorResult extractorResult) { @@ -158,4 +248,34 @@ public class MemorySelector extends AbstractAgentModule.Running activatedSlices; + + protected MemoryBlock(List activatedSlices) { + super(BLOCK_NAME, SOURCE); + this.activatedSlices = activatedSlices; + } + + @Override + protected void fillXml(@NotNull Document document, @NotNull Element root) { + appendRepeatedElements(document, root, "memory_slice", activatedSlices, (sliceElement, slice) -> { + sliceElement.setAttribute("unit_id", slice.getUnitId()); + sliceElement.setAttribute("slice_id", slice.getSliceId()); + fillSliceElement(document, sliceElement, slice); + return Unit.INSTANCE; + }); + } + + protected void appendMessageElement(Document document, Element parent, List messages) { + appendRepeatedElements(document, parent, "message", messages, (messageElement, message) -> { + messageElement.setAttribute("role", message.getRole().name().toLowerCase(Locale.ROOT)); + messageElement.setTextContent(message.getContent()); + return Unit.INSTANCE; + }); + } + + protected abstract void fillSliceElement(Document document, @NotNull Element sliceElement, ActivatedMemorySlice slice); + } }