refactor(action): simplify extractor input and switch params extraction to context/task block messages

This commit is contained in:
2026-03-26 21:43:48 +08:00
parent 7bbb7745f4
commit f5b9f8fc58
3 changed files with 73 additions and 64 deletions

View File

@@ -1,6 +1,7 @@
package work.slhaf.partner.module.action.executor;
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.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.annotation.Init;
@@ -242,7 +243,7 @@ public class ActionExecutor extends AbstractAgentModule.Standalone {
continue;
}
ExecutorService executor = next.getIo() ? virtualExecutor : platformExecutor;
executor.execute(buildMataActionTask(next, phaser, executableAction, source));
executor.execute(buildMataActionTask(next, phaser, executableAction));
if (first) {
phaser.arriveAndDeregister();
latch.countDown();
@@ -259,12 +260,12 @@ public class ActionExecutor extends AbstractAgentModule.Standalone {
return new MetaActionsListeningRecord(accepting, phase);
}
private Runnable buildMataActionTask(MetaAction metaAction, Phaser phaser, ExecutableAction executableAction, String source) {
private Runnable buildMataActionTask(MetaAction metaAction, Phaser phaser, ExecutableAction executableAction) {
phaser.register();
return () -> {
val actionKey = metaAction.getKey();
try {
executeMetaActionWithRetry(metaAction, executableAction, source);
executeMetaActionWithRetry(metaAction, executableAction);
} catch (Exception e) {
log.error("Action executing failed: {}", actionKey, e);
} finally {
@@ -273,7 +274,7 @@ public class ActionExecutor extends AbstractAgentModule.Standalone {
};
}
private void executeMetaActionWithRetry(MetaAction metaAction, ExecutableAction actionData, String source) {
private void executeMetaActionWithRetry(MetaAction metaAction, ExecutableAction actionData) {
String failureReason = "参数提取失败";
val actionKey = metaAction.getKey();
for (int attempt = 1; attempt <= MAX_EXTRACTOR_ATTEMPTS; attempt++) {
@@ -282,16 +283,9 @@ public class ActionExecutor extends AbstractAgentModule.Standalone {
metaAction.getParams().clear();
val executingStage = actionData.getExecutingStage();
val historyActionResults = actionData.getHistory().get(executingStage);
val additionalContext = actionData.getAdditionalContext().get(executingStage);
val extractorInput = assemblyHelper.buildExtractorInput(metaAction, source, historyActionResults, additionalContext);
ExtractorResult extractorResult;
try {
extractorResult = paramsExtractor.execute(extractorInput);
} catch (Exception e) {
failureReason = buildAttemptFailureReason("参数提取异常", e.getLocalizedMessage());
continue;
}
val extractorInput = assemblyHelper.buildExtractorInput(metaAction.getKey(), actionData.getUuid(), actionData.getDescription());
ExtractorResult extractorResult = paramsExtractor.execute(extractorInput);
if (extractorResult == null || !extractorResult.isOk()) {
failureReason = buildAttemptFailureReason("参数提取失败", null);
@@ -463,14 +457,11 @@ public class ActionExecutor extends AbstractAgentModule.Standalone {
private AssemblyHelper() {
}
private ExtractorInput buildExtractorInput(MetaAction action, String source, List<HistoryAction> historyActionResults,
List<String> additionalContext) {
private ExtractorInput buildExtractorInput(String actionKey, @NotNull String uuid, @NotNull String description) {
ExtractorInput input = new ExtractorInput();
input.setActivatedMemorySlices(memoryCapability.getActivatedSlices());
input.setRecentMessages(cognitionCapability.getChatMessages());
input.setMetaActionInfo(actionCapability.loadMetaActionInfo(action.getKey()));
input.setHistoryActionResults(historyActionResults);
input.setAdditionalContext(additionalContext);
input.setMetaActionInfo(actionCapability.loadMetaActionInfo(actionKey));
input.setTargetActionId(uuid);
input.setTargetActionDesc(description);
return input;
}

View File

@@ -1,14 +1,19 @@
package work.slhaf.partner.module.action.executor;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import kotlin.Unit;
import org.jetbrains.annotations.NotNull;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability;
import work.slhaf.partner.api.agent.factory.component.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.component.abstracts.ActivateModel;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.action.entity.MetaActionInfo;
import work.slhaf.partner.core.cognition.CognitionCapability;
import work.slhaf.partner.core.cognition.ContextBlock;
import work.slhaf.partner.module.TaskBlock;
import work.slhaf.partner.module.action.executor.entity.ExtractorInput;
import work.slhaf.partner.module.action.executor.entity.ExtractorResult;
import work.slhaf.partner.module.action.executor.entity.HistoryAction;
import java.util.HashMap;
import java.util.List;
@@ -17,12 +22,19 @@ import java.util.List;
* 负责依据输入内容进行行动单元的参数信息提取
*/
public class ParamsExtractor extends AbstractAgentModule.Sub<ExtractorInput, ExtractorResult> implements ActivateModel {
@InjectCapability
private CognitionCapability cognitionCapability;
@Override
public ExtractorResult execute(ExtractorInput input) {
String prompt = buildPrompt(input);
ExtractorResult result;
try {
result = formattedChat(List.of(new Message(Message.Character.USER, prompt)), ExtractorResult.class);
List<Message> messages = List.of(
resolveContextMessage(),
resolveTaskMessage(input)
);
result = formattedChat(messages, ExtractorResult.class);
} catch (Exception e) {
log.error("ParamsExtractor解析结果失败", e);
result = new ExtractorResult();
@@ -32,26 +44,41 @@ public class ParamsExtractor extends AbstractAgentModule.Sub<ExtractorInput, Ext
return result;
}
private String buildPrompt(ExtractorInput input) {
JSONObject prompt = new JSONObject();
JSONObject actionData = prompt.putObject("[本次行动信息]");
MetaActionInfo actionInfo = input.getMetaActionInfo();
actionData.put("[行动描述]", actionInfo.getDescription());
actionData.put("[行动参数说明]", actionInfo.getParams());
JSONArray historyData = prompt.putArray("[历史行动执行结果]");
List<HistoryAction> historyActions = input.getHistoryActionResults();
for (HistoryAction historyAction : historyActions) {
JSONObject historyItem = new JSONObject();
historyItem.put("[行动Key]", historyAction.actionKey());
historyItem.put("[行动描述]", historyAction.description());
historyItem.put("[行动结果]", historyAction.result());
historyData.add(historyItem);
}
JSONArray messageData = prompt.putArray("[最近消息列表]");
messageData.addAll(input.getRecentMessages());
return prompt.toString();
private Message resolveTaskMessage(ExtractorInput input) {
return new TaskBlock() {
@Override
protected void fillXml(@NotNull Document document, @NotNull Element root) {
appendChildElement(document, root, "target_action", blok -> {
appendTextElement(document, blok, "uuid", input.getTargetActionId());
appendTextElement(document, blok, "description", input.getTargetActionDesc());
return Unit.INSTANCE;
});
appendChildElement(document, root, "meta_action_info", element -> {
MetaActionInfo info = input.getMetaActionInfo();
appendTextElement(document, element, "description", info.getDescription());
appendListElement(document, element, "params", "param", info.getParams().entrySet(), (item, param) -> {
item.setAttribute("name", param.getKey());
item.setTextContent(param.getValue());
return Unit.INSTANCE;
});
return Unit.INSTANCE;
});
}
}.encodeToMessage();
}
private Message resolveContextMessage() {
return cognitionCapability.contextWorkspace()
.resolve(List.of(
ContextBlock.VisibleDomain.ACTION,
ContextBlock.VisibleDomain.COGNITION,
ContextBlock.VisibleDomain.MEMORY
))
.encodeToMessage();
}
@NotNull
@Override
public String modelKey() {
return "params_extractor";

View File

@@ -1,32 +1,23 @@
package work.slhaf.partner.module.action.executor.entity;
import lombok.Data;
import work.slhaf.partner.api.chat.pojo.Message;
import work.slhaf.partner.core.action.entity.MetaActionInfo;
import work.slhaf.partner.core.memory.pojo.ActivatedMemorySlice;
import java.util.List;
@Data
public class ExtractorInput {
/**
* 目标行动数据的 uuid
*/
private String targetActionId;
/**
* 目标行动的 description
*/
private String targetActionDesc;
/**
* 目标 MetaActionInfo
*/
private MetaActionInfo metaActionInfo;
/**
* 可参考的记忆切片
*/
private List<ActivatedMemorySlice> activatedMemorySlices;
/**
* 历史行动执行结果
*/
private List<HistoryAction> historyActionResults;
/**
* 最近的消息列表
*/
private List<Message> recentMessages;
/**
* 额外的上下文信息(可来自修复器等)
*/
private List<String> additionalContext;
}