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;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user