diff --git a/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/ContextWorkspace.kt b/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/ContextWorkspace.kt index 5fe9108c..dc6c0f83 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/ContextWorkspace.kt +++ b/Partner-Core/src/main/java/work/slhaf/partner/core/cognition/ContextWorkspace.kt @@ -297,6 +297,7 @@ abstract class BlockContent protected constructor( abstract class CommunicationBlockContent( blockName: String, source: String, + val type: Projection, ) : BlockContent( blockName, source, diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/core/CommunicationProducer.java b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/core/CommunicationProducer.java index 6ee5c098..24f36e34 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/core/CommunicationProducer.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/core/CommunicationProducer.java @@ -10,9 +10,11 @@ import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapabili 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.agent.factory.component.annotation.Init; -import work.slhaf.partner.api.agent.runtime.interaction.flow.ContextBlock; 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.CommunicationBlockContent; +import work.slhaf.partner.core.cognition.ContextBlock; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext; import javax.xml.parsers.DocumentBuilderFactory; @@ -22,7 +24,10 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.StringWriter; -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import static work.slhaf.partner.common.util.ExtractUtil.extractJson; @@ -100,14 +105,16 @@ public class CommunicationProducer extends AbstractAgentModule.Running buildChatMessages(PartnerRunningFlowContext runningFlowContext) { + List communicationBlocks = cognitionCapability.contextWorkspace() + .resolve(List.of(ContextBlock.VisibleDomain.COMMUNICATION)); List historyMessages = snapshotConversationMessages(); List temp = new ArrayList<>(historyMessages.size() + 2); - Message contextMessage = buildContextMessage(runningFlowContext); + Message contextMessage = buildContextMessage(communicationBlocks); if (contextMessage != null) { temp.add(contextMessage); } temp.addAll(historyMessages); - temp.add(buildInputMessage(runningFlowContext)); + temp.add(buildInputMessage(runningFlowContext, communicationBlocks)); return temp; } @@ -134,30 +141,28 @@ public class CommunicationProducer extends AbstractAgentModule.Running contextBlocks = filterContextBlocks( - runningFlowContext.getContextBlocks(), - ContextBlock.Type.CONTEXT - ); + private Message buildContextMessage(List communicationBlocks) { + List contextBlocks = communicationBlocks.stream() + .filter(this::belongsToContextSection) + .toList(); if (contextBlocks.isEmpty()) { return null; } return new Message(Message.Character.USER, buildContextXml(contextBlocks)); } - private Message buildInputMessage(PartnerRunningFlowContext runningFlowContext) { - return new Message(Message.Character.USER, buildInputXml(runningFlowContext)); + private Message buildInputMessage(PartnerRunningFlowContext runningFlowContext, List communicationBlocks) { + return new Message(Message.Character.USER, buildInputXml(runningFlowContext, communicationBlocks)); } - private String buildContextXml(List contextBlocks) { + private String buildContextXml(List contextBlocks) { try { Document document = newDocument(); Element root = document.createElement("context"); document.appendChild(root); contextBlocks.stream() - .sorted(Comparator.comparingInt(ContextBlock::getPriority)) - .map(ContextBlock::encodeToXml) + .map(BlockContent::encodeToXml) .forEach(blockElement -> { root.appendChild(document.importNode(blockElement, true)); }); @@ -168,7 +173,7 @@ public class CommunicationProducer extends AbstractAgentModule.Running communicationBlocks) { try { Document document = newDocument(); Element root = document.createElement("input"); @@ -179,7 +184,7 @@ public class CommunicationProducer extends AbstractAgentModule.Running entry : runningFlowContext.getAdditionalUserInfo().entrySet()) { appendTextElement(document, root, sanitizeTagName(entry.getKey()), entry.getValue()); } - appendSupplyBlocks(document, root, runningFlowContext.getContextBlocks()); + appendSupplyBlocks(document, root, communicationBlocks); return toXmlString(document); } catch (Exception e) { @@ -204,11 +209,11 @@ public class CommunicationProducer extends AbstractAgentModule.Running filterContextBlocks(List contextBlocks, ContextBlock.Type type) { - return contextBlocks.stream() - .filter(block -> block.getType() == type) - .sorted(Comparator.comparingInt(ContextBlock::getPriority)) - .toList(); + private boolean belongsToContextSection(BlockContent blockContent) { + if (!(blockContent instanceof CommunicationBlockContent communicationBlockContent)) { + return true; + } + return communicationBlockContent.getType() == CommunicationBlockContent.Projection.CONTEXT; } private String formatConversationUserMessage(PartnerRunningFlowContext runningFlowContext) { @@ -227,18 +232,21 @@ public class CommunicationProducer extends AbstractAgentModule.Running contextBlocks) { - Map> groupedBlocks = filterContextBlocks(contextBlocks, ContextBlock.Type.SUPPLY).stream() + private void appendSupplyBlocks(Document document, Element inputRoot, List contextBlocks) { + Map> groupedBlocks = contextBlocks.stream() + .filter(CommunicationBlockContent.class::isInstance) + .map(CommunicationBlockContent.class::cast) + .filter(block -> block.getType() == CommunicationBlockContent.Projection.SUPPLY) .collect(Collectors.groupingBy( block -> sanitizeTagName(block.getBlockName()), LinkedHashMap::new, Collectors.toList() )); - for (Map.Entry> entry : groupedBlocks.entrySet()) { + for (Map.Entry> entry : groupedBlocks.entrySet()) { Element groupElement = document.createElement(entry.getKey()); inputRoot.appendChild(groupElement); - for (ContextBlock block : entry.getValue()) { + for (CommunicationBlockContent block : entry.getValue()) { Element blockElement = block.encodeToXml(); groupElement.appendChild(document.importNode(blockElement, true)); }