mirror of
https://github.com/slhaf/Partner.git
synced 2026-05-12 16:53:04 +08:00
refactor(ActionCore): replace prepared action APIs with generic list/put
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package work.slhaf.partner.core.action;
|
||||
|
||||
import lombok.NonNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import work.slhaf.partner.api.agent.factory.capability.annotation.Capability;
|
||||
import work.slhaf.partner.core.action.entity.ActionData;
|
||||
import work.slhaf.partner.core.action.entity.MetaAction;
|
||||
@@ -12,17 +13,19 @@ import work.slhaf.partner.module.modules.action.interventor.entity.MetaIntervent
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Phaser;
|
||||
|
||||
@Capability(value = "action")
|
||||
public interface ActionCapability {
|
||||
void putPreparedAction(String uuid, ActionData actionData);
|
||||
|
||||
void putAction(@NonNull ActionData actionData);
|
||||
|
||||
Set<ActionData> listActions(@Nullable ActionData.ActionStatus actionStatus, @Nullable String source);
|
||||
|
||||
List<ActionData> popPendingAction(String userId);
|
||||
|
||||
List<ActionData> listPreparedAction(String userId);
|
||||
|
||||
List<ActionData> listPendingAction(String userId);
|
||||
|
||||
void putPendingActions(String userId, ActionData actionData);
|
||||
@@ -52,4 +55,5 @@ public interface ActionCapability {
|
||||
RunnerClient runnerClient();
|
||||
|
||||
void handleInterventions(List<MetaIntervention> interventions, ActionData data);
|
||||
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@ package work.slhaf.partner.core.action;
|
||||
|
||||
import lombok.NonNull;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import lombok.val;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityCore;
|
||||
import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod;
|
||||
import work.slhaf.partner.common.vector.VectorClient;
|
||||
@@ -30,9 +32,9 @@ import java.util.stream.Collectors;
|
||||
public class ActionCore extends PartnerCore<ActionCore> {
|
||||
|
||||
/**
|
||||
* 持久行动池,以用户id为键存储所有状态的任务
|
||||
* 持久行动池
|
||||
*/
|
||||
private HashMap<String, List<ActionData>> actionPool = new HashMap<>();// TODO 考虑是否取消用户分池
|
||||
private CopyOnWriteArraySet<ActionData> actionPool = new CopyOnWriteArraySet<>();
|
||||
|
||||
/**
|
||||
* 待确认任务,以userId区分不同用户,因为需要跨请求确认
|
||||
@@ -66,18 +68,24 @@ public class ActionCore extends PartnerCore<ActionCore> {
|
||||
|
||||
private void setupShutdownHook() {
|
||||
// 将执行中的行动状态置为失败
|
||||
List<ActionData> executingActionList = listExecutingAction();
|
||||
for (ActionData actionData : executingActionList) {
|
||||
val executingActionSet = listActions(ActionData.ActionStatus.EXECUTING, null);
|
||||
for (ActionData actionData : executingActionSet) {
|
||||
actionData.setStatus(ActionData.ActionStatus.FAILED);
|
||||
actionData.setResult("由于系统中断而失败");
|
||||
}
|
||||
}
|
||||
|
||||
private List<ActionData> listExecutingAction() {
|
||||
return actionPool.values().stream()
|
||||
.flatMap(Collection::stream)
|
||||
.filter(action -> action.getStatus() == ActionData.ActionStatus.EXECUTING)
|
||||
.collect(Collectors.toList());
|
||||
@CapabilityMethod
|
||||
public void putAction(@NonNull ActionData actionData) {
|
||||
actionPool.add(actionData);
|
||||
}
|
||||
|
||||
@CapabilityMethod
|
||||
public Set<ActionData> listActions(@Nullable ActionData.ActionStatus actionStatus, @Nullable String source) {
|
||||
return actionPool.stream()
|
||||
.filter(actionData -> actionStatus == null || actionData.getStatus().equals(actionStatus))
|
||||
.filter(actionData -> source == null || actionData.getSource().equals(source))
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@CapabilityMethod
|
||||
@@ -96,23 +104,6 @@ public class ActionCore extends PartnerCore<ActionCore> {
|
||||
return infos;
|
||||
}
|
||||
|
||||
@CapabilityMethod
|
||||
public synchronized void putPreparedAction(String uuid, ActionData actionData) {
|
||||
actionPool.computeIfAbsent(uuid, k -> {
|
||||
List<ActionData> temp = new ArrayList<>();
|
||||
temp.add(actionData);
|
||||
return temp;
|
||||
});
|
||||
}
|
||||
|
||||
@CapabilityMethod
|
||||
public List<ActionData> listPreparedAction(String userId) {
|
||||
List<ActionData> actions = actionPool.get(userId);
|
||||
return actions.stream()
|
||||
.filter(actionData -> actionData.getStatus().equals(ActionData.ActionStatus.PREPARE))
|
||||
.toList();
|
||||
}
|
||||
|
||||
@CapabilityMethod
|
||||
public List<ActionData> listPendingAction(String userId) {
|
||||
return pendingActions.get(userId);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package work.slhaf.partner.module.modules.action.dispatcher;
|
||||
|
||||
import lombok.val;
|
||||
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.Init;
|
||||
@@ -46,7 +47,7 @@ public class ActionDispatcher extends PostRunningModule {
|
||||
// action,理想做法是将执行工具做成执行链的形式,模型的自对话流程、是否通知用户都做成与普通工具同等的通用可选能力,避免绑定固定流程
|
||||
executor.execute(() -> {
|
||||
String userId = context.getUserId();
|
||||
List<ActionData> preparedActions = actionCapability.listPreparedAction(userId);
|
||||
val preparedActions = actionCapability.listActions(ActionData.ActionStatus.PREPARE, userId);
|
||||
// 分类成PLANNING和IMMEDIATE两类
|
||||
List<ScheduledActionData> scheduledActions = new ArrayList<>();
|
||||
List<ImmediateActionData> immediateActions = new ArrayList<>();
|
||||
|
||||
@@ -176,7 +176,7 @@ public class ActionInterventor extends PreRunningModule implements ActivateModel
|
||||
// 参考的对话列表大小或需调整
|
||||
recognizerInput.setRecentMessages(cognationCapability.getChatMessages());
|
||||
recognizerInput.setExecutingActions(actionCapability.listPhaserRecords().stream().map(PhaserRecord::actionData).toList());
|
||||
recognizerInput.setPreparedActions(actionCapability.listPreparedAction(userId));
|
||||
recognizerInput.setPreparedActions(actionCapability.listActions(ActionData.ActionStatus.PREPARE, userId).stream().toList());
|
||||
return recognizerInput;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package work.slhaf.partner.module.modules.action.planner;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import lombok.val;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
|
||||
import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule;
|
||||
@@ -142,11 +143,10 @@ public class ActionPlanner extends PreRunningModule {
|
||||
if (uuids == null) {
|
||||
return;
|
||||
}
|
||||
String contextUuid = context.getUuid();
|
||||
List<ActionData> pendingActions = actionCapability.popPendingAction(context.getUserId());
|
||||
for (ActionData actionData : pendingActions) {
|
||||
if (uuids.contains(actionData.getUuid())) {
|
||||
actionCapability.putPreparedAction(contextUuid, actionData);
|
||||
actionCapability.putAction(actionData);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -157,7 +157,7 @@ public class ActionPlanner extends PreRunningModule {
|
||||
if (evaluatorResult.isNeedConfirm()) {
|
||||
actionCapability.putPendingActions(context.getUserId(), actionData);
|
||||
} else {
|
||||
actionCapability.putPreparedAction(context.getUuid(), actionData);
|
||||
actionCapability.putAction(actionData);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -183,13 +183,13 @@ public class ActionPlanner extends PreRunningModule {
|
||||
}
|
||||
|
||||
private void setupPreparedActions(HashMap<String, String> map, String userId) {
|
||||
List<ActionData> actionData = actionCapability.listPreparedAction(userId);
|
||||
if (actionData == null || actionData.isEmpty()) {
|
||||
val preparedActions = actionCapability.listActions(ActionData.ActionStatus.PREPARE, userId).stream().toList();
|
||||
if (preparedActions.isEmpty()) {
|
||||
map.put("[预备行动] <预备执行或放入计划池的行动信息>", "无预备行动");
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < actionData.size(); i++) {
|
||||
map.put("[预备行动 " + (i + 1) + " ] <预备执行或放入计划池的行动信息>", generateActionStr(actionData.get(i)));
|
||||
for (int i = 0; i < preparedActions.size(); i++) {
|
||||
map.put("[预备行动 " + (i + 1) + " ] <预备执行或放入计划池的行动信息>", generateActionStr(preparedActions.get(i)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user