diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionCorrectionRecognizer.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionCorrectionRecognizer.java index 6f1c8edc..e419234e 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionCorrectionRecognizer.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionCorrectionRecognizer.java @@ -28,21 +28,25 @@ public class ActionCorrectionRecognizer extends AbstractAgentModule.Sub { appendTextElement(document, block, "executing_action_id", input.getActionId()); appendTextElement(document, block, "original_tendency", input.getTendency()); @@ -100,6 +107,7 @@ public class ActionCorrectionRecognizer extends AbstractAgentModule.Sub { appendTextElement(document, block, "executing_action_id", input.getActionId()); appendTextElement(document, block, "original_tendency", input.getTendency()); @@ -122,6 +126,7 @@ public class ActionCorrector extends AbstractAgentModule.Sub= MAX_FINAL_CORRECTION_ATTEMPTS || !applyFinalCorrection(executableAction, stageCursor)) { + break; + } + finalCorrectionAttempts++; } } finishExecutableAction(executableAction); @@ -257,7 +262,7 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { shouldRunCorrector = recognizerResult != null && recognizerResult.isNeedCorrection(); } if (shouldRunCorrector) { - val correctorInput = assemblyHelper.buildCorrectorInput(executableAction); + val correctorInput = assemblyHelper.buildCorrectorInput(executableAction, CorrectorInput.CheckMode.PROCESS_CHECK); actionCorrector.execute(correctorInput) .onSuccess(correctorResult -> { actionCapability.handleInterventions(correctorResult.getMetaInterventionList(), executableAction); @@ -276,6 +281,59 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { } } + private boolean applyFinalCorrection(ExecutableAction executableAction, StageCursor stageCursor) { + val recognizerInput = assemblyHelper.buildCorrectorInput(executableAction, CorrectorInput.CheckMode.FINAL_CHECK); + val recognizerResult = actionCorrectionRecognizer.execute(recognizerInput) + .getOrDefault(new RecognizerResult()); + if (!recognizerResult.isNeedCorrection()) { + return false; + } + + val previousStage = executableAction.getExecutingStage(); + val correctorResult = actionCorrector.execute(recognizerInput).getOrDefault(new CorrectorResult()); + val interventions = correctorResult.getMetaInterventionList() == null + ? new ArrayList() + : correctorResult.getMetaInterventionList(); + if (!interventions.isEmpty()) { + actionCapability.handleInterventions(interventions, executableAction); + } + blockManager.emitActionCorrectionBlock( + executableAction, + recognizerResult.getReason() == null || recognizerResult.getReason().isBlank() + ? correctorResult.getCorrectionReason() + : recognizerResult.getReason(), + interventions + ); + + synchronized (executableAction.getExecutionLock()) { + if (executableAction.getStatus() == Action.Status.FAILED) { + return false; + } + if (interventions.isEmpty() || executableAction.getActionChain().isEmpty()) { + executableAction.setStatus(Action.Status.FAILED); + ensureExecutableResult(executableAction, true, "行动未达到目标,且未能生成可继续执行的纠偏行动"); + return false; + } + if (executableAction.getStatus() == Action.Status.PREPARE) { + normalizeExecutingStage(executableAction, executableAction.getActionChain()); + executableAction.setStatus(Action.Status.EXECUTING); + } else { + Integer nextStage = executableAction.getActionChain().keySet().stream() + .filter(stage -> stage > previousStage) + .min(Integer::compareTo) + .orElse(null); + if (nextStage == null) { + executableAction.setStatus(Action.Status.FAILED); + ensureExecutableResult(executableAction, true, "行动未达到目标,纠偏未生成后续执行阶段"); + return false; + } + executableAction.setExecutingStage(nextStage); + } + stageCursor.refresh(); + return stageCursor.next(); + } + } + private void finishExecutableAction(ExecutableAction executableAction) { // 如果是 ScheduledActionData, 则重置 ActionData 内容,记录执行历史与最终结果 if (executableAction instanceof SchedulableExecutableAction scheduledActionData) { @@ -422,7 +480,7 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { if (!shouldRunCorrectionRecognizer(executableAction)) { return RecognizerTaskRecord.disabled(); } - val recognizerInput = assemblyHelper.buildCorrectorInput(executableAction); + val recognizerInput = assemblyHelper.buildCorrectorInput(executableAction, CorrectorInput.CheckMode.PROCESS_CHECK); val task = buildRecognizerTask(recognizerInput, phaser); Future future = virtualExecutor.submit(task); return new RecognizerTaskRecord(true, future); @@ -664,6 +722,17 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { return stageCount < actionChain.size(); } + private void refresh() { + val orderList = new ArrayList<>(actionChain.keySet()); + orderList.sort(Integer::compareTo); + stageCount = orderList.indexOf(executableAction.getExecutingStage()); + if (stageCount < 0) { + stageCount = 0; + } + executingStageUpdated = false; + stageCountUpdated = false; + } + private void update() { val orderList = new ArrayList<>(actionChain.keySet()); orderList.sort(Integer::compareTo); @@ -689,19 +758,21 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { ); } - private CorrectorInput buildCorrectorInput(ExecutableAction executableAction) { + private CorrectorInput buildCorrectorInput(ExecutableAction executableAction, CorrectorInput.CheckMode checkMode) { Map> overview = new LinkedHashMap<>(); executableAction.getActionChain().forEach((stage, list) -> { List overviewItems = list.stream() .map(metaAction -> new CorrectorInput.ActionChainItem( metaAction.getKey(), resolveHistoryDescription(metaAction.getKey()), - metaAction.getResult().getStatus().name().toLowerCase(Locale.ROOT) + metaAction.getResult().getStatus().name().toLowerCase(Locale.ROOT), + metaAction.getResult().getData() )) .toList(); overview.put(stage, overviewItems); }); return CorrectorInput.builder() + .checkMode(checkMode) .tendency(executableAction.getTendency()) .source(executableAction.getSource()) .reason(executableAction.getReason()) diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/CorrectorInput.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/CorrectorInput.java index f9c6bc37..bb689114 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/CorrectorInput.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/CorrectorInput.java @@ -10,6 +10,7 @@ import java.util.Map; @Data @Builder public class CorrectorInput { + private CheckMode checkMode = CheckMode.PROCESS_CHECK; private String tendency; private String source; private String reason; @@ -18,11 +19,17 @@ public class CorrectorInput { private Map> actionChainOverview; + public enum CheckMode { + PROCESS_CHECK, + FINAL_CHECK + } + @Data @AllArgsConstructor public static class ActionChainItem { private String actionKey; private String description; private String status; + private String result; } }