refactor(action): simplify corrector input and build messages with context/task block

This commit is contained in:
2026-03-27 14:53:00 +08:00
parent f5b9f8fc58
commit dbfd0b1fc3
3 changed files with 76 additions and 30 deletions

View File

@@ -1,10 +1,16 @@
package work.slhaf.partner.module.action.executor; package work.slhaf.partner.module.action.executor;
import com.alibaba.fastjson2.JSONObject; import kotlin.Unit;
import lombok.val; 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.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.cognition.CognitionCapability;
import work.slhaf.partner.core.cognition.ContextBlock;
import work.slhaf.partner.module.TaskBlock;
import work.slhaf.partner.module.action.executor.entity.CorrectorInput; import work.slhaf.partner.module.action.executor.entity.CorrectorInput;
import work.slhaf.partner.module.action.executor.entity.CorrectorResult; import work.slhaf.partner.module.action.executor.entity.CorrectorResult;
@@ -14,27 +20,55 @@ import java.util.List;
* 负责在单组行动执行后,根据行动意图与结果检查后续行动是否符合目的,必要时直接调整行动链,或发起自对话请求进行干预 * 负责在单组行动执行后,根据行动意图与结果检查后续行动是否符合目的,必要时直接调整行动链,或发起自对话请求进行干预
*/ */
public class ActionCorrector extends AbstractAgentModule.Sub<CorrectorInput, CorrectorResult> implements ActivateModel { public class ActionCorrector extends AbstractAgentModule.Sub<CorrectorInput, CorrectorResult> implements ActivateModel {
@InjectCapability
private CognitionCapability cognitionCapability;
@Override @Override
public CorrectorResult execute(CorrectorInput input) { public CorrectorResult execute(CorrectorInput input) {
val prompt = buildPrompt(input); List<Message> messages = List.of(
return formattedChat(List.of(new Message(Message.Character.USER, prompt)), CorrectorResult.class); resolveContextMessage(),
resolveTaskMessage(input)
);
return formattedChat(messages, CorrectorResult.class);
} }
private String buildPrompt(CorrectorInput input) { private Message resolveTaskMessage(CorrectorInput input) {
val prompt = new JSONObject(); return new TaskBlock() {
prompt.put("[行动来源]", input.getSource()); @Override
prompt.put("[行动倾向]", input.getTendency()); protected void fillXml(@NotNull Document document, @NotNull Element root) {
prompt.put("[行动描述]", input.getDescription()); appendChildElement(document, root, "executable_action_info", block -> {
prompt.put("[行动原因]", input.getReason()); appendTextElement(document, block, "executing_action_id", input.getActionId());
val messages = prompt.putArray("[近期对话]"); appendTextElement(document, block, "original_tendency", input.getTendency());
messages.addAll(input.getRecentMessages()); appendTextElement(document, block, "evaluation_passed_reason", input.getReason());
val memory = prompt.putArray("[已激活记忆]"); appendTextElement(document, block, "description", input.getDescription());
memory.addAll(input.getActivatedSlices()); appendTextElement(document, block, "from_who", input.getSource());
val history = prompt.putArray("[已执行情况]"); return Unit.INSTANCE;
history.addAll(input.getHistory()); });
return prompt.toJSONString();
appendListElement(document, root, "current_action_chain_overview", "action_chain_stage", input.getActionChainOverview().entrySet(), (stageElement, stageData) -> {
stageElement.setAttribute("stage_count", String.valueOf(stageData.getKey()));
appendRepeatedElements(document, stageElement, "meta_action", stageData.getValue(), (metaActionElement, metaActionData) -> {
appendTextElement(document, metaActionElement, "action_key", metaActionData.getActionKey());
appendTextElement(document, metaActionElement, "description", metaActionData.getDescription());
appendTextElement(document, metaActionElement, "status", metaActionData.getStatus());
return Unit.INSTANCE;
});
return Unit.INSTANCE;
});
}
}.encodeToMessage();
} }
private Message resolveContextMessage() {
return cognitionCapability.contextWorkspace().resolve(List.of(
ContextBlock.VisibleDomain.ACTION,
ContextBlock.VisibleDomain.COGNITION,
ContextBlock.VisibleDomain.MEMORY
)).encodeToMessage();
}
@NotNull
@Override @Override
public String modelKey() { public String modelKey() {
return "action_corrector"; return "action_corrector";

View File

@@ -14,8 +14,7 @@ import work.slhaf.partner.core.cognition.CognitionCapability;
import work.slhaf.partner.core.memory.MemoryCapability; import work.slhaf.partner.core.memory.MemoryCapability;
import work.slhaf.partner.module.action.executor.entity.*; import work.slhaf.partner.module.action.executor.entity.*;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.concurrent.*; import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@@ -466,15 +465,24 @@ public class ActionExecutor extends AbstractAgentModule.Standalone {
} }
private CorrectorInput buildCorrectorInput(ExecutableAction executableAction) { private CorrectorInput buildCorrectorInput(ExecutableAction executableAction) {
Map<Integer, List<CorrectorInput.ActionChainItem>> overview = new LinkedHashMap<>();
executableAction.getActionChain().forEach((stage, list) -> {
List<CorrectorInput.ActionChainItem> overviewItems = list.stream()
.map(metaAction -> new CorrectorInput.ActionChainItem(
metaAction.getKey(),
actionCapability.loadMetaActionInfo(metaAction.getKey()).getDescription(),
metaAction.getResult().getStatus().name().toLowerCase(Locale.ROOT)
))
.toList();
overview.put(stage, overviewItems);
});
return CorrectorInput.builder() return CorrectorInput.builder()
.tendency(executableAction.getTendency()) .tendency(executableAction.getTendency())
.source(executableAction.getSource()) .source(executableAction.getSource())
.reason(executableAction.getReason()) .reason(executableAction.getReason())
.description(executableAction.getDescription()) .description(executableAction.getDescription())
.history(executableAction.getHistory().get(executableAction.getExecutingStage())) .actionId(executableAction.getUuid())
.status(executableAction.getStatus()) .actionChainOverview(overview)
.recentMessages(cognitionCapability.getChatMessages())
.activatedSlices(memoryCapability.getActivatedSlices())
.build(); .build();
} }

View File

@@ -1,12 +1,11 @@
package work.slhaf.partner.module.action.executor.entity; package work.slhaf.partner.module.action.executor.entity;
import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.action.entity.ExecutableAction;
import work.slhaf.partner.core.memory.pojo.ActivatedMemorySlice;
import java.util.List; import java.util.List;
import java.util.Map;
@Data @Data
@Builder @Builder
@@ -15,10 +14,15 @@ public class CorrectorInput {
private String source; private String source;
private String reason; private String reason;
private String description; private String description;
private String actionId;
private List<HistoryAction> history; private Map<Integer, List<ActionChainItem>> actionChainOverview;
private ExecutableAction.Status status;
private List<Message> recentMessages; @Data
private List<ActivatedMemorySlice> activatedSlices; @AllArgsConstructor
public static class ActionChainItem {
private String actionKey;
private String description;
private String status;
}
} }