diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java index 0494d977..34ce70ad 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java @@ -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 historyActionResults, - List 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; } diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ParamsExtractor.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ParamsExtractor.java index 0be5696b..ec7d98b8 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ParamsExtractor.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ParamsExtractor.java @@ -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 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 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 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"; diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/ExtractorInput.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/ExtractorInput.java index 9cc84330..8361e8de 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/ExtractorInput.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/ExtractorInput.java @@ -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 activatedMemorySlices; - /** - * 历史行动执行结果 - */ - private List historyActionResults; - /** - * 最近的消息列表 - */ - private List recentMessages; - /** - * 额外的上下文信息(可来自修复器等) - */ - private List additionalContext; }