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

View File

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

View File

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