推进 ActionPlanner: 完成了 ActionPlanner 模块中的执行逻辑,同步调整了数据类中的字段。下一步将进行 ActionPlanner 子模块的开发。

This commit is contained in:
2025-10-12 22:55:05 +08:00
parent 85818556f8
commit 84f7befb75
11 changed files with 177 additions and 14 deletions

4
.idea/misc.xml generated
View File

@@ -17,6 +17,10 @@
<item index="12" class="java.lang.String" itemvalue="work.slhaf.partner.api.capability.annotation.CoordinateManager" /> <item index="12" class="java.lang.String" itemvalue="work.slhaf.partner.api.capability.annotation.CoordinateManager" />
<item index="13" class="java.lang.String" itemvalue="work.slhaf.partner.api.register.capability.annotation.Capability" /> <item index="13" class="java.lang.String" itemvalue="work.slhaf.partner.api.register.capability.annotation.Capability" />
</list> </list>
<writeAnnotations>
<writeAnnotation name="work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability" />
<writeAnnotation name="work.slhaf.partner.api.agent.factory.module.annotation.InjectModule" />
</writeAnnotations>
</component> </component>
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager"> <component name="MavenProjectsManager">

View File

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

View File

@@ -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<ActionCore> {
private HashMap<String, MetaActionInfo> 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";
}
}

View File

@@ -1,5 +1,5 @@
package work.slhaf.partner.core.action.entity; package work.slhaf.partner.core.action.entity;
public enum ActionStatus { public enum ActionStatus {
SUCCESS, FAILED, EXECUTING, WAITING SUCCESS, FAILED, EXECUTING, WAITING, PREPARE
} }

View File

@@ -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{
}

View File

@@ -5,9 +5,9 @@ import lombok.Data;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@Data @Data
public class MetaActionInfo { public abstract class MetaActionInfo {
private ActionData actionData; protected String tendency;
private ActionStatus status; protected ActionStatus status;
private String Result; protected ActionData actionData;
private LocalDateTime dateTime; protected String Result;
} }

View File

@@ -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
}
}

View File

@@ -1,46 +1,123 @@
package work.slhaf.partner.module.modules.action.planner; 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.AgentModule;
import work.slhaf.partner.api.agent.factory.module.annotation.InjectModule; 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.common.module.PreRunningModule;
import work.slhaf.partner.module.modules.action.planner.evaluator.ActionEvaluator; 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.ActionExtractor;
import work.slhaf.partner.module.modules.action.planner.extractor.entity.ExtractorInput; 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 work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap; 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 { public class ActionPlanner extends PreRunningModule {
@InjectCapability
private CognationCapability cognationCapability;
@InjectCapability
private ActionCapability actionCapability;
@InjectCapability
private PerceiveCapability perceiveCapability;
@InjectCapability
private CacheCapability cacheCapability;
@InjectModule @InjectModule
private ActionEvaluator actionEvaluator; private ActionEvaluator actionEvaluator;
@InjectModule @InjectModule
private ActionExtractor actionExtractor; private ActionExtractor actionExtractor;
@Override @Override
protected void doExecute(PartnerRunningFlowContext context) throws IOException, ClassNotFoundException { protected void doExecute(PartnerRunningFlowContext context) {
ExtractorInput extractorInput = getExtractorInput(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) { private ExtractorInput getExtractorInput(PartnerRunningFlowContext context) {
ExtractorInput input = new ExtractorInput(); ExtractorInput input = new ExtractorInput();
input.setInput(context.getInput()); input.setInput(context.getInput());
input.setRecentMessages(); List<Message> chatMessages = cognationCapability.getChatMessages();
List<Message> 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; return input;
} }
@Override @Override
protected HashMap<String, String> getPromptDataMap(String userId) { protected HashMap<String, String> getPromptDataMap(String userId) {
return null; MetaActionInfo actionInfo = actionCapability.getPreparedAction(userId);
HashMap<String, String> 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 @Override
protected String moduleName() { protected String moduleName() {
return "task_planner"; return "[行动模块]";
} }
} }

View File

@@ -1,11 +1,16 @@
package work.slhaf.partner.module.modules.action.planner.evaluator.entity; package work.slhaf.partner.module.modules.action.planner.evaluator.entity;
import lombok.Data; 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; import java.util.List;
@Data @Data
public class EvaluatorInput { public class EvaluatorInput {
private List<String> recentMessages; private List<Message> recentMessages;
private User user;
private List<EvaluatedSlice> activatedSlices;
private String tendency; private String tendency;
} }

View File

@@ -4,10 +4,12 @@ import lombok.Data;
import work.slhaf.partner.core.action.entity.ActionData; import work.slhaf.partner.core.action.entity.ActionData;
import work.slhaf.partner.core.action.entity.ActionType; import work.slhaf.partner.core.action.entity.ActionType;
import java.time.LocalDateTime;
@Data @Data
public class EvaluatorResult { public class EvaluatorResult {
private boolean ok; private boolean ok;
private ActionType type; private ActionType type;
private String typeInfo; private String scheduleContent;
private ActionData actionData; private ActionData actionData;
} }

View File

@@ -12,6 +12,7 @@ import java.io.Serial;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.UUID;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
@@ -35,6 +36,8 @@ public class PartnerRunningFlowContext extends RunningFlowContext {
protected ModuleContext moduleContext = new ModuleContext(); protected ModuleContext moduleContext = new ModuleContext();
protected JSONObject coreResponse = new JSONObject(); protected JSONObject coreResponse = new JSONObject();
protected String uuid = UUID.randomUUID().toString();
public PartnerRunningFlowContext() { public PartnerRunningFlowContext() {
activeContext.put(userId, this); activeContext.put(userId, this);
} }