mirror of
https://github.com/slhaf/Partner.git
synced 2026-05-12 16:53:04 +08:00
推进 ActionPlanner: 完成了 ActionPlanner 模块中的执行逻辑,同步调整了数据类中的字段。下一步将进行 ActionPlanner 子模块的开发。
This commit is contained in:
4
.idea/misc.xml
generated
4
.idea/misc.xml
generated
@@ -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">
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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{
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 "[行动模块]";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user