mirror of
https://github.com/slhaf/Partner.git
synced 2026-05-12 08:43:02 +08:00
refactor(action): simplify extractor input and switch params extraction to context/task block messages
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user