From 08100aea8a54a89178b1b9be5205d3d32abdb7e6 Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Fri, 6 Feb 2026 21:38:54 +0800 Subject: [PATCH] refactor(ActionCore): replace prepared action APIs with generic list/put --- .../partner/core/action/ActionCapability.java | 10 +++-- .../slhaf/partner/core/action/ActionCore.java | 43 ++++++++----------- .../action/dispatcher/ActionDispatcher.java | 3 +- .../action/interventor/ActionInterventor.java | 2 +- .../modules/action/planner/ActionPlanner.java | 14 +++--- 5 files changed, 34 insertions(+), 38 deletions(-) diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCapability.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCapability.java index 49b6e8d3..1f99bfe0 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCapability.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCapability.java @@ -1,6 +1,7 @@ package work.slhaf.partner.core.action; import lombok.NonNull; +import org.jetbrains.annotations.Nullable; import work.slhaf.partner.api.agent.factory.capability.annotation.Capability; import work.slhaf.partner.core.action.entity.ActionData; import work.slhaf.partner.core.action.entity.MetaAction; @@ -12,17 +13,19 @@ import work.slhaf.partner.module.modules.action.interventor.entity.MetaIntervent import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Phaser; @Capability(value = "action") public interface ActionCapability { - void putPreparedAction(String uuid, ActionData actionData); + + void putAction(@NonNull ActionData actionData); + + Set listActions(@Nullable ActionData.ActionStatus actionStatus, @Nullable String source); List popPendingAction(String userId); - List listPreparedAction(String userId); - List listPendingAction(String userId); void putPendingActions(String userId, ActionData actionData); @@ -52,4 +55,5 @@ public interface ActionCapability { RunnerClient runnerClient(); void handleInterventions(List interventions, ActionData data); + } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java index e236b561..06b88c88 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java @@ -2,6 +2,8 @@ package work.slhaf.partner.core.action; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.jetbrains.annotations.Nullable; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod; import work.slhaf.partner.common.vector.VectorClient; @@ -30,9 +32,9 @@ import java.util.stream.Collectors; public class ActionCore extends PartnerCore { /** - * 持久行动池,以用户id为键存储所有状态的任务 + * 持久行动池 */ - private HashMap> actionPool = new HashMap<>();// TODO 考虑是否取消用户分池 + private CopyOnWriteArraySet actionPool = new CopyOnWriteArraySet<>(); /** * 待确认任务,以userId区分不同用户,因为需要跨请求确认 @@ -66,18 +68,24 @@ public class ActionCore extends PartnerCore { private void setupShutdownHook() { // 将执行中的行动状态置为失败 - List executingActionList = listExecutingAction(); - for (ActionData actionData : executingActionList) { + val executingActionSet = listActions(ActionData.ActionStatus.EXECUTING, null); + for (ActionData actionData : executingActionSet) { actionData.setStatus(ActionData.ActionStatus.FAILED); actionData.setResult("由于系统中断而失败"); } } - private List listExecutingAction() { - return actionPool.values().stream() - .flatMap(Collection::stream) - .filter(action -> action.getStatus() == ActionData.ActionStatus.EXECUTING) - .collect(Collectors.toList()); + @CapabilityMethod + public void putAction(@NonNull ActionData actionData) { + actionPool.add(actionData); + } + + @CapabilityMethod + public Set listActions(@Nullable ActionData.ActionStatus actionStatus, @Nullable String source) { + return actionPool.stream() + .filter(actionData -> actionStatus == null || actionData.getStatus().equals(actionStatus)) + .filter(actionData -> source == null || actionData.getSource().equals(source)) + .collect(Collectors.toSet()); } @CapabilityMethod @@ -96,23 +104,6 @@ public class ActionCore extends PartnerCore { return infos; } - @CapabilityMethod - public synchronized void putPreparedAction(String uuid, ActionData actionData) { - actionPool.computeIfAbsent(uuid, k -> { - List temp = new ArrayList<>(); - temp.add(actionData); - return temp; - }); - } - - @CapabilityMethod - public List listPreparedAction(String userId) { - List actions = actionPool.get(userId); - return actions.stream() - .filter(actionData -> actionData.getStatus().equals(ActionData.ActionStatus.PREPARE)) - .toList(); - } - @CapabilityMethod public List listPendingAction(String userId) { return pendingActions.get(userId); diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/dispatcher/ActionDispatcher.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/dispatcher/ActionDispatcher.java index 7d611a59..a4c7a659 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/dispatcher/ActionDispatcher.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/dispatcher/ActionDispatcher.java @@ -1,5 +1,6 @@ package work.slhaf.partner.module.modules.action.dispatcher; +import lombok.val; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule; import work.slhaf.partner.api.agent.factory.module.annotation.Init; @@ -46,7 +47,7 @@ public class ActionDispatcher extends PostRunningModule { // action,理想做法是将执行工具做成执行链的形式,模型的自对话流程、是否通知用户都做成与普通工具同等的通用可选能力,避免绑定固定流程 executor.execute(() -> { String userId = context.getUserId(); - List preparedActions = actionCapability.listPreparedAction(userId); + val preparedActions = actionCapability.listActions(ActionData.ActionStatus.PREPARE, userId); // 分类成PLANNING和IMMEDIATE两类 List scheduledActions = new ArrayList<>(); List immediateActions = new ArrayList<>(); diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/interventor/ActionInterventor.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/interventor/ActionInterventor.java index 549e1685..f81f1e88 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/interventor/ActionInterventor.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/interventor/ActionInterventor.java @@ -176,7 +176,7 @@ public class ActionInterventor extends PreRunningModule implements ActivateModel // 参考的对话列表大小或需调整 recognizerInput.setRecentMessages(cognationCapability.getChatMessages()); recognizerInput.setExecutingActions(actionCapability.listPhaserRecords().stream().map(PhaserRecord::actionData).toList()); - recognizerInput.setPreparedActions(actionCapability.listPreparedAction(userId)); + recognizerInput.setPreparedActions(actionCapability.listActions(ActionData.ActionStatus.PREPARE, userId).stream().toList()); return recognizerInput; } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java index fb834340..21fc04d9 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java @@ -1,6 +1,7 @@ package work.slhaf.partner.module.modules.action.planner; import lombok.extern.slf4j.Slf4j; +import lombok.val; import org.jetbrains.annotations.NotNull; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule; @@ -142,11 +143,10 @@ public class ActionPlanner extends PreRunningModule { if (uuids == null) { return; } - String contextUuid = context.getUuid(); List pendingActions = actionCapability.popPendingAction(context.getUserId()); for (ActionData actionData : pendingActions) { if (uuids.contains(actionData.getUuid())) { - actionCapability.putPreparedAction(contextUuid, actionData); + actionCapability.putAction(actionData); } } } @@ -157,7 +157,7 @@ public class ActionPlanner extends PreRunningModule { if (evaluatorResult.isNeedConfirm()) { actionCapability.putPendingActions(context.getUserId(), actionData); } else { - actionCapability.putPreparedAction(context.getUuid(), actionData); + actionCapability.putAction(actionData); } } } @@ -183,13 +183,13 @@ public class ActionPlanner extends PreRunningModule { } private void setupPreparedActions(HashMap map, String userId) { - List actionData = actionCapability.listPreparedAction(userId); - if (actionData == null || actionData.isEmpty()) { + val preparedActions = actionCapability.listActions(ActionData.ActionStatus.PREPARE, userId).stream().toList(); + if (preparedActions.isEmpty()) { map.put("[预备行动] <预备执行或放入计划池的行动信息>", "无预备行动"); return; } - for (int i = 0; i < actionData.size(); i++) { - map.put("[预备行动 " + (i + 1) + " ] <预备执行或放入计划池的行动信息>", generateActionStr(actionData.get(i))); + for (int i = 0; i < preparedActions.size(); i++) { + map.put("[预备行动 " + (i + 1) + " ] <预备执行或放入计划池的行动信息>", generateActionStr(preparedActions.get(i))); } }