推进 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="13" class="java.lang.String" itemvalue="work.slhaf.partner.api.register.capability.annotation.Capability" />
</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 name="ExternalStorageConfigurationManager" enabled="true" />
<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;
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;
@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;
}

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;
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)
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<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;
}
@Override
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
protected String moduleName() {
return "task_planner";
return "[行动模块]";
}
}

View File

@@ -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<String> recentMessages;
private List<Message> recentMessages;
private User user;
private List<EvaluatedSlice> activatedSlices;
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.ActionType;
import java.time.LocalDateTime;
@Data
public class EvaluatorResult {
private boolean ok;
private ActionType type;
private String typeInfo;
private String scheduleContent;
private ActionData actionData;
}

View File

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