mirror of
https://github.com/slhaf/Partner.git
synced 2026-05-12 08:43:02 +08:00
refactor(communication): route messages through cognition workspace
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user