refactor(action): adjust ActionPlanner and related submodules to adapt to current Agent Context acquisition

This commit is contained in:
2026-03-24 11:49:29 +08:00
parent 313cea0d3b
commit 50b07488a6
4 changed files with 34 additions and 37 deletions

View File

@@ -6,7 +6,6 @@ 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.annotation.Init; import work.slhaf.partner.api.agent.factory.component.annotation.Init;
import work.slhaf.partner.api.agent.factory.component.annotation.InjectModule; import work.slhaf.partner.api.agent.factory.component.annotation.InjectModule;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.common.vector.VectorClient; import work.slhaf.partner.common.vector.VectorClient;
import work.slhaf.partner.core.action.ActionCapability; import work.slhaf.partner.core.action.ActionCapability;
import work.slhaf.partner.core.action.ActionCore; import work.slhaf.partner.core.action.ActionCore;
@@ -14,7 +13,6 @@ import work.slhaf.partner.core.action.entity.*;
import work.slhaf.partner.core.action.entity.cache.CacheAdjustData; import work.slhaf.partner.core.action.entity.cache.CacheAdjustData;
import work.slhaf.partner.core.action.entity.cache.CacheAdjustMetaData; import work.slhaf.partner.core.action.entity.cache.CacheAdjustMetaData;
import work.slhaf.partner.core.cognition.CognitionCapability; import work.slhaf.partner.core.cognition.CognitionCapability;
import work.slhaf.partner.core.memory.MemoryCapability;
import work.slhaf.partner.module.modules.action.executor.ActionExecutor; import work.slhaf.partner.module.modules.action.executor.ActionExecutor;
import work.slhaf.partner.module.modules.action.planner.confirmer.ActionConfirmer; import work.slhaf.partner.module.modules.action.planner.confirmer.ActionConfirmer;
import work.slhaf.partner.module.modules.action.planner.confirmer.entity.ConfirmerInput; import work.slhaf.partner.module.modules.action.planner.confirmer.entity.ConfirmerInput;
@@ -24,7 +22,6 @@ import work.slhaf.partner.module.modules.action.planner.evaluator.ActionEvaluato
import work.slhaf.partner.module.modules.action.planner.evaluator.entity.EvaluatorInput; import work.slhaf.partner.module.modules.action.planner.evaluator.entity.EvaluatorInput;
import work.slhaf.partner.module.modules.action.planner.evaluator.entity.EvaluatorResult; import work.slhaf.partner.module.modules.action.planner.evaluator.entity.EvaluatorResult;
import work.slhaf.partner.module.modules.action.planner.extractor.ActionExtractor; import work.slhaf.partner.module.modules.action.planner.extractor.ActionExtractor;
import work.slhaf.partner.module.modules.action.planner.extractor.entity.ExtractorInput;
import work.slhaf.partner.module.modules.action.planner.extractor.entity.ExtractorResult; import work.slhaf.partner.module.modules.action.planner.extractor.entity.ExtractorResult;
import work.slhaf.partner.module.modules.action.scheduler.ActionScheduler; import work.slhaf.partner.module.modules.action.scheduler.ActionScheduler;
import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
@@ -52,8 +49,6 @@ public class ActionPlanner extends AbstractAgentModule.Running<PartnerRunningFlo
private CognitionCapability cognitionCapability; private CognitionCapability cognitionCapability;
@InjectCapability @InjectCapability
private ActionCapability actionCapability; private ActionCapability actionCapability;
@InjectCapability
private MemoryCapability memoryCapability;
@InjectModule @InjectModule
private ActionEvaluator actionEvaluator; private ActionEvaluator actionEvaluator;
@@ -74,7 +69,7 @@ public class ActionPlanner extends AbstractAgentModule.Running<PartnerRunningFlo
} }
@Override @Override
public void execute(PartnerRunningFlowContext context) { public void execute(@NotNull PartnerRunningFlowContext context) {
try { try {
List<Callable<Void>> tasks = new ArrayList<>(); List<Callable<Void>> tasks = new ArrayList<>();
addConfirmTask(tasks, context); addConfirmTask(tasks, context);
@@ -93,12 +88,11 @@ public class ActionPlanner extends AbstractAgentModule.Running<PartnerRunningFlo
*/ */
private void addNewActionTask(List<Callable<Void>> tasks, PartnerRunningFlowContext context) { private void addNewActionTask(List<Callable<Void>> tasks, PartnerRunningFlowContext context) {
tasks.add(() -> { tasks.add(() -> {
ExtractorInput extractorInput = assemblyHelper.buildExtractorInput(context); ExtractorResult extractorResult = actionExtractor.execute(context.getInput());
ExtractorResult extractorResult = actionExtractor.execute(extractorInput);
if (extractorResult.getTendencies().isEmpty()) { if (extractorResult.getTendencies().isEmpty()) {
return null; return null;
} }
EvaluatorInput evaluatorInput = assemblyHelper.buildEvaluatorInput(extractorResult, context.getSource()); EvaluatorInput evaluatorInput = assemblyHelper.buildEvaluatorInput(extractorResult);
List<EvaluatorResult> evaluatorResults = actionEvaluator.execute(evaluatorInput); // 并发操作均为访问 List<EvaluatorResult> evaluatorResults = actionEvaluator.execute(evaluatorInput); // 并发操作均为访问
putActionData(evaluatorResults, context); putActionData(evaluatorResults, context);
updateTendencyCache(evaluatorResults, context.getInput(), extractorResult); updateTendencyCache(evaluatorResults, context.getInput(), extractorResult);
@@ -306,25 +300,9 @@ public class ActionPlanner extends AbstractAgentModule.Running<PartnerRunningFlo
private ActionAssemblyHelper() { private ActionAssemblyHelper() {
} }
private ExtractorInput buildExtractorInput(PartnerRunningFlowContext context) { private EvaluatorInput buildEvaluatorInput(ExtractorResult extractorResult) {
ExtractorInput input = new ExtractorInput();
input.setInput(context.getInput());
List<Message> chatMessages = cognitionCapability.snapshotChatMessages();
List<Message> recentMessages = new ArrayList<>();
if (chatMessages.size() > 5) {
recentMessages.addAll(chatMessages.subList(chatMessages.size() - 5, chatMessages.size() - 1));
} else if (chatMessages.size() > 1) {
recentMessages.addAll(chatMessages.subList(0, chatMessages.size() - 1));
}
input.setRecentMessages(recentMessages);
return input;
}
private EvaluatorInput buildEvaluatorInput(ExtractorResult extractorResult, String userId) {
EvaluatorInput input = new EvaluatorInput(); EvaluatorInput input = new EvaluatorInput();
input.setTendencies(extractorResult.getTendencies()); input.setTendencies(extractorResult.getTendencies());
input.setRecentMessages(cognitionCapability.snapshotChatMessages());
input.setActivatedSlices(memoryCapability.getActivatedSlices());
return input; return input;
} }

View File

@@ -10,6 +10,8 @@ import work.slhaf.partner.api.agent.factory.component.annotation.Init;
import work.slhaf.partner.api.chat.pojo.Message; import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor; import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor;
import work.slhaf.partner.core.action.ActionCapability; import work.slhaf.partner.core.action.ActionCapability;
import work.slhaf.partner.core.cognition.CognitionCapability;
import work.slhaf.partner.core.cognition.ContextBlock;
import work.slhaf.partner.core.memory.pojo.ActivatedMemorySlice; import work.slhaf.partner.core.memory.pojo.ActivatedMemorySlice;
import work.slhaf.partner.module.modules.action.planner.evaluator.entity.EvaluatorBatchInput; import work.slhaf.partner.module.modules.action.planner.evaluator.entity.EvaluatorBatchInput;
import work.slhaf.partner.module.modules.action.planner.evaluator.entity.EvaluatorInput; import work.slhaf.partner.module.modules.action.planner.evaluator.entity.EvaluatorInput;
@@ -22,8 +24,12 @@ import java.util.Map;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
public class ActionEvaluator extends AbstractAgentModule.Sub<EvaluatorInput, List<EvaluatorResult>> implements ActivateModel { public class ActionEvaluator extends AbstractAgentModule.Sub<EvaluatorInput, List<EvaluatorResult>> implements ActivateModel {
@InjectCapability @InjectCapability
private ActionCapability actionCapability; private ActionCapability actionCapability;
@InjectCapability
private CognitionCapability cognitionCapability;
private InteractionThreadPoolExecutor executor; private InteractionThreadPoolExecutor executor;
@Init @Init
@@ -40,16 +46,20 @@ public class ActionEvaluator extends AbstractAgentModule.Sub<EvaluatorInput, Lis
@Override @Override
public List<EvaluatorResult> execute(EvaluatorInput data) { public List<EvaluatorResult> execute(EvaluatorInput data) {
List<EvaluatorBatchInput> batchInputs = buildEvaluatorBatchInput(data); List<EvaluatorBatchInput> batchInputs = buildEvaluatorBatchInput(data);
List<Callable<EvaluatorResult>> tasks = getTasks(batchInputs); List<Callable<EvaluatorResult>> tasks = buildEvaluateTasks(batchInputs);
return executor.invokeAllAndReturn(tasks); return executor.invokeAllAndReturn(tasks);
} }
private List<Callable<EvaluatorResult>> getTasks(List<EvaluatorBatchInput> batchInputs) { private List<Callable<EvaluatorResult>> buildEvaluateTasks(List<EvaluatorBatchInput> batchInputs) {
List<Callable<EvaluatorResult>> list = new ArrayList<>(); List<Callable<EvaluatorResult>> list = new ArrayList<>();
for (EvaluatorBatchInput batchInput : batchInputs) { for (EvaluatorBatchInput batchInput : batchInputs) {
list.add(() -> { list.add(() -> {
List<Message> messages = List.of(
cognitionCapability.contextWorkspace().resolve(List.of(ContextBlock.VisibleDomain.ACTION, ContextBlock.VisibleDomain.COGNITION, ContextBlock.VisibleDomain.MEMORY)).encodeToContextMessage(),
new Message(Message.Character.USER, buildPrompt(batchInput))
);
EvaluatorResult evaluatorResult = formattedChat( EvaluatorResult evaluatorResult = formattedChat(
List.of(new Message(Message.Character.USER, buildPrompt(batchInput))), messages,
EvaluatorResult.class EvaluatorResult.class
); );
evaluatorResult.setTendency(batchInput.getTendency()); evaluatorResult.setTendency(batchInput.getTendency());

View File

@@ -1,32 +1,40 @@
package work.slhaf.partner.module.modules.action.planner.extractor; package work.slhaf.partner.module.modules.action.planner.extractor;
import com.alibaba.fastjson2.JSONObject; import org.jetbrains.annotations.NotNull;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; 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.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.chat.pojo.Message; import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.action.ActionCapability; import work.slhaf.partner.core.action.ActionCapability;
import work.slhaf.partner.module.modules.action.planner.extractor.entity.ExtractorInput; import work.slhaf.partner.core.cognition.CognitionCapability;
import work.slhaf.partner.core.cognition.ContextBlock;
import work.slhaf.partner.module.modules.action.planner.extractor.entity.ExtractorResult; import work.slhaf.partner.module.modules.action.planner.extractor.entity.ExtractorResult;
import java.util.List; import java.util.List;
public class ActionExtractor extends AbstractAgentModule.Sub<ExtractorInput, ExtractorResult> implements ActivateModel { public class ActionExtractor extends AbstractAgentModule.Sub<String, ExtractorResult> implements ActivateModel {
@InjectCapability @InjectCapability
private ActionCapability actionCapability; private ActionCapability actionCapability;
@InjectCapability
private CognitionCapability cognitionCapability;
@Override @Override
public ExtractorResult execute(ExtractorInput data) { public ExtractorResult execute(String input) {
ExtractorResult result = new ExtractorResult(); List<String> tendencyCache = actionCapability.selectTendencyCache(input);
List<String> tendencyCache = actionCapability.selectTendencyCache(data.getInput());
if (tendencyCache != null && !tendencyCache.isEmpty()) { if (tendencyCache != null && !tendencyCache.isEmpty()) {
ExtractorResult result = new ExtractorResult();
result.setTendencies(tendencyCache); result.setTendencies(tendencyCache);
return result; return result;
} }
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
try { try {
List<Message> messages = List.of(
cognitionCapability.contextWorkspace().resolve(List.of(ContextBlock.VisibleDomain.COGNITION)).encodeToContextMessage(),
new Message(Message.Character.USER, input)
);
return formattedChat( return formattedChat(
List.of(new Message(Message.Character.USER, JSONObject.toJSONString(data))), messages,
ExtractorResult.class ExtractorResult.class
); );
} catch (Exception e) { } catch (Exception e) {
@@ -36,6 +44,7 @@ public class ActionExtractor extends AbstractAgentModule.Sub<ExtractorInput, Ext
return new ExtractorResult(); return new ExtractorResult();
} }
@NotNull
@Override @Override
public String modelKey() { public String modelKey() {
return "action_extractor"; return "action_extractor";

View File

@@ -101,7 +101,7 @@ public class CommunicationProducer extends AbstractAgentModule.Running<PartnerRu
@Override @Override
protected void fillXml(@NotNull Document document, @NotNull Element root) { protected void fillXml(@NotNull Document document, @NotNull Element root) {
List<Message> chatMessages = cognitionCapability.getChatMessages(); List<Message> chatMessages = cognitionCapability.getChatMessages();
appendRepeatedElements(document, root, "chat_message", List.of(chatMessages.subList(chatMessages.size() - 5, chatMessages.size() - 1))); appendRepeatedElements(document, root, "chat_message", List.of(chatMessages.subList(chatMessages.size() - 7, chatMessages.size() - 1)));
} }
}, },
Set.of(ContextBlock.VisibleDomain.COGNITION), Set.of(ContextBlock.VisibleDomain.COGNITION),