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);
}