mirror of
https://github.com/slhaf/Partner.git
synced 2026-05-12 08:43:02 +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="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">
|
||||
|
||||
@@ -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;
|
||||
|
||||
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;
|
||||
|
||||
@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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
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<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 "[行动模块]";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user