From 84f7befb757dbd87f73a2afe1088d6cecf804663 Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Sun, 12 Oct 2025 22:55:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A8=E8=BF=9B=20ActionPlanner:=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E4=BA=86=20ActionPlanner=20=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E6=89=A7=E8=A1=8C=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E8=B0=83=E6=95=B4=E4=BA=86=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=B1=BB=E4=B8=AD=E7=9A=84=E5=AD=97=E6=AE=B5=E3=80=82=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E6=AD=A5=E5=B0=86=E8=BF=9B=E8=A1=8C=20ActionPlanner?= =?UTF-8?q?=20=E5=AD=90=E6=A8=A1=E5=9D=97=E7=9A=84=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 4 + .../partner/core/action/ActionCapability.java | 11 +++ .../slhaf/partner/core/action/ActionCore.java | 37 ++++++++ .../core/action/entity/ActionStatus.java | 2 +- .../action/entity/ImmediateActionInfo.java | 9 ++ .../core/action/entity/MetaActionInfo.java | 10 +-- .../action/entity/ScheduledActionInfo.java | 15 ++++ .../modules/action/planner/ActionPlanner.java | 89 +++++++++++++++++-- .../evaluator/entity/EvaluatorInput.java | 7 +- .../evaluator/entity/EvaluatorResult.java | 4 +- .../context/PartnerRunningFlowContext.java | 3 + 11 files changed, 177 insertions(+), 14 deletions(-) create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCapability.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ImmediateActionInfo.java create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ScheduledActionInfo.java diff --git a/.idea/misc.xml b/.idea/misc.xml index 0281dc35..a0b4e20a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -17,6 +17,10 @@ + + + + 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 new file mode 100644 index 00000000..a75a72e2 --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCapability.java @@ -0,0 +1,11 @@ +package work.slhaf.partner.core.action; + +import work.slhaf.partner.api.agent.factory.capability.annotation.Capability; +import work.slhaf.partner.core.action.entity.MetaActionInfo; + +@Capability(value = "action") +public interface ActionCapability { + void putPreparedAction(String uuid, MetaActionInfo metaActionInfo); + + MetaActionInfo getPreparedAction(String userId); +} 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 new file mode 100644 index 00000000..9bbc39b3 --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java @@ -0,0 +1,37 @@ +package work.slhaf.partner.core.action; + +import lombok.Getter; +import lombok.Setter; +import work.slhaf.partner.api.agent.factory.capability.annotation.Capability; +import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod; +import work.slhaf.partner.core.PartnerCore; +import work.slhaf.partner.core.action.entity.MetaActionInfo; + +import java.io.IOException; +import java.util.HashMap; + +@Setter +@Getter +@Capability(value = "action") +public class ActionCore extends PartnerCore { + + private HashMap preparedActions = new HashMap<>(); + + public ActionCore() throws IOException, ClassNotFoundException { + } + + @CapabilityMethod + public synchronized void putPreparedAction(String uuid, MetaActionInfo metaActionInfo) { + preparedActions.put(uuid, metaActionInfo); + } + + @CapabilityMethod + public MetaActionInfo getPreparedAction(String userId){ + return preparedActions.get(userId); + } + + @Override + protected String getCoreKey() { + return "action-core"; + } +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionStatus.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionStatus.java index 1bb77215..31256076 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionStatus.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionStatus.java @@ -1,5 +1,5 @@ package work.slhaf.partner.core.action.entity; public enum ActionStatus { - SUCCESS, FAILED, EXECUTING, WAITING + SUCCESS, FAILED, EXECUTING, WAITING, PREPARE } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ImmediateActionInfo.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ImmediateActionInfo.java new file mode 100644 index 00000000..f0ba45ff --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ImmediateActionInfo.java @@ -0,0 +1,9 @@ +package work.slhaf.partner.core.action.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class ImmediateActionInfo extends MetaActionInfo{ +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/MetaActionInfo.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/MetaActionInfo.java index 7cf97bf3..a84e03ca 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/MetaActionInfo.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/MetaActionInfo.java @@ -5,9 +5,9 @@ import lombok.Data; import java.time.LocalDateTime; @Data -public class MetaActionInfo { - private ActionData actionData; - private ActionStatus status; - private String Result; - private LocalDateTime dateTime; +public abstract class MetaActionInfo { + protected String tendency; + protected ActionStatus status; + protected ActionData actionData; + protected String Result; } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ScheduledActionInfo.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ScheduledActionInfo.java new file mode 100644 index 00000000..ddf86503 --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ScheduledActionInfo.java @@ -0,0 +1,15 @@ +package work.slhaf.partner.core.action.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class ScheduledActionInfo extends MetaActionInfo { + private ScheduledType type; + private String scheduleContent; //如果为周期,则对应cron表达式,如果为一次性,则对应为LocalDateTime字符串 + + enum ScheduledType { + CYCLE, ONCE + } +} 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 fabbb404..fa26296e 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,46 +1,123 @@ package work.slhaf.partner.module.modules.action.planner; +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.InjectModule; +import work.slhaf.partner.api.chat.pojo.Message; +import work.slhaf.partner.core.action.ActionCapability; +import work.slhaf.partner.core.action.entity.ActionStatus; +import work.slhaf.partner.core.action.entity.ImmediateActionInfo; +import work.slhaf.partner.core.action.entity.MetaActionInfo; +import work.slhaf.partner.core.action.entity.ScheduledActionInfo; +import work.slhaf.partner.core.cache.CacheCapability; +import work.slhaf.partner.core.cognation.CognationCapability; +import work.slhaf.partner.core.perceive.PerceiveCapability; import work.slhaf.partner.module.common.module.PreRunningModule; import work.slhaf.partner.module.modules.action.planner.evaluator.ActionEvaluator; +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.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.runtime.interaction.data.context.PartnerRunningFlowContext; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; /** - * 负责针对本次输入生成基础的行动建议,是否执行由主模型判断。 + * 负责针对本次输入生成基础的行动计划,在主模型传达意愿后,执行行动或者放入计划池 */ -@AgentModule(name = "task_planner",order = 2) +@AgentModule(name = "task_planner", order = 2) public class ActionPlanner extends PreRunningModule { + @InjectCapability + private CognationCapability cognationCapability; + @InjectCapability + private ActionCapability actionCapability; + @InjectCapability + private PerceiveCapability perceiveCapability; + @InjectCapability + private CacheCapability cacheCapability; + @InjectModule private ActionEvaluator actionEvaluator; @InjectModule private ActionExtractor actionExtractor; @Override - protected void doExecute(PartnerRunningFlowContext context) throws IOException, ClassNotFoundException { + protected void doExecute(PartnerRunningFlowContext context) { ExtractorInput extractorInput = getExtractorInput(context); + ExtractorResult extractorResult = actionExtractor.execute(extractorInput); + EvaluatorInput evaluatorInput = getEvaluatorInput(extractorResult, context.getUserId()); + EvaluatorResult evaluatorResult = actionEvaluator.execute(evaluatorInput); + setupPreparedActionInfo(evaluatorResult, context.getUuid()); + + } + + private void setupPreparedActionInfo(EvaluatorResult evaluatorResult, String uuid) { + MetaActionInfo metaActionInfo = switch (evaluatorResult.getType()) { + case PLANNING -> { + ScheduledActionInfo actionInfo = new ScheduledActionInfo(); + actionInfo.setActionData(evaluatorResult.getActionData()); + actionInfo.setScheduleContent(evaluatorResult.getScheduleContent()); + actionInfo.setStatus(ActionStatus.PREPARE); + yield actionInfo; + } + case IMMEDIATE -> { + ImmediateActionInfo actionInfo = new ImmediateActionInfo(); + actionInfo.setActionData(evaluatorResult.getActionData()); + actionInfo.setStatus(ActionStatus.PREPARE); + yield actionInfo; + } + }; + actionCapability.putPreparedAction(uuid, metaActionInfo); + } + + private EvaluatorInput getEvaluatorInput(ExtractorResult extractorResult, String userId) { + EvaluatorInput input = new EvaluatorInput(); + input.setTendency(extractorResult.getTendency()); + input.setUser(perceiveCapability.getUser(userId)); + input.setRecentMessages(cognationCapability.getChatMessages()); + input.setActivatedSlices(cacheCapability.getActivatedSlices(userId)); + return input; } private ExtractorInput getExtractorInput(PartnerRunningFlowContext context) { ExtractorInput input = new ExtractorInput(); input.setInput(context.getInput()); - input.setRecentMessages(); + List chatMessages = cognationCapability.getChatMessages(); + List 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; } @Override protected HashMap getPromptDataMap(String userId) { - return null; + MetaActionInfo actionInfo = actionCapability.getPreparedAction(userId); + HashMap map = new HashMap<>(); + map.put("[行动确认原因] <生成行动的原因>", actionInfo.getActionData().getReason()); + + if (actionInfo instanceof ImmediateActionInfo) { + map.put("[行动类型] <将执行的行动类型,分为即时行动与计划行动>", "即时"); + map.put("[行动倾向] <你将要执行的动作>", actionInfo.getTendency()); + map.put("[行动工具] <本次行动将要调用的工具>", actionInfo.getActionData().getKey() + ": " + actionInfo.getActionData().getDescription()); + } else { + ScheduledActionInfo info = (ScheduledActionInfo) actionInfo; + map.put("[行动类型] <将执行的行动类型,分为即时行动与计划行动>", "计划"); + map.put("[计划内容] <生成的计划行动的内容,主要是计划时间的DateTime值或者CRON表达式>", info.getScheduleContent()); + } + return map; } @Override protected String moduleName() { - return "task_planner"; + return "[行动模块]"; } } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorInput.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorInput.java index f933e97d..02aa8cc9 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorInput.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorInput.java @@ -1,11 +1,16 @@ package work.slhaf.partner.module.modules.action.planner.evaluator.entity; import lombok.Data; +import work.slhaf.partner.api.chat.pojo.Message; +import work.slhaf.partner.core.memory.pojo.EvaluatedSlice; +import work.slhaf.partner.core.perceive.pojo.User; import java.util.List; @Data public class EvaluatorInput { - private List recentMessages; + private List recentMessages; + private User user; + private List activatedSlices; private String tendency; } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorResult.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorResult.java index 84302d18..fd40488a 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorResult.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/evaluator/entity/EvaluatorResult.java @@ -4,10 +4,12 @@ import lombok.Data; import work.slhaf.partner.core.action.entity.ActionData; import work.slhaf.partner.core.action.entity.ActionType; +import java.time.LocalDateTime; + @Data public class EvaluatorResult { private boolean ok; private ActionType type; - private String typeInfo; + private String scheduleContent; private ActionData actionData; } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/runtime/interaction/data/context/PartnerRunningFlowContext.java b/Partner-Main/src/main/java/work/slhaf/partner/runtime/interaction/data/context/PartnerRunningFlowContext.java index b018a292..74c985ab 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/runtime/interaction/data/context/PartnerRunningFlowContext.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/runtime/interaction/data/context/PartnerRunningFlowContext.java @@ -12,6 +12,7 @@ import java.io.Serial; import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; +import java.util.UUID; @EqualsAndHashCode(callSuper = true) @Data @@ -35,6 +36,8 @@ public class PartnerRunningFlowContext extends RunningFlowContext { protected ModuleContext moduleContext = new ModuleContext(); protected JSONObject coreResponse = new JSONObject(); + protected String uuid = UUID.randomUUID().toString(); + public PartnerRunningFlowContext() { activeContext.put(userId, this); }