refactor(communication): route messages through cognition workspace

This commit is contained in:
2026-03-22 22:01:04 +08:00
parent 977d92881c
commit 93b0199c9e
2 changed files with 34 additions and 25 deletions

View File

@@ -297,6 +297,7 @@ abstract class BlockContent protected constructor(
abstract class CommunicationBlockContent( abstract class CommunicationBlockContent(
blockName: String, blockName: String,
source: String, source: String,
val type: Projection,
) : BlockContent( ) : BlockContent(
blockName, blockName,
source, source,

View File

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