refactor(MetaAction): separate key attribute into name and location

Context:
This change adapts MetaAction locating to support different MetaAction types,
including loading from the local filesystem and from MCP tools.
This commit is contained in:
2025-12-19 21:35:39 +08:00
parent dc4074715e
commit 4dea948f82
9 changed files with 32 additions and 28 deletions

View File

@@ -228,6 +228,12 @@ public class ActionCore extends PartnerCore<ActionCore> {
metaAction.setParams(metaActionInfo.getParams()); metaAction.setParams(metaActionInfo.getParams());
metaAction.setType(metaActionInfo.getType()); metaAction.setType(metaActionInfo.getType());
metaAction.setIo(metaActionInfo.isIo()); metaAction.setIo(metaActionInfo.isIo());
String[] split = actionKey.split("::");
if (split.length < 2) {
throw new MetaActionNotFoundException("未找到对应的行动程序,原因: 传入的 actionKey(" + actionKey + ") 存在异常");
}
metaAction.setLocation(split[0]);
metaAction.setName(split[1]);
return metaAction; return metaAction;
} }

View File

@@ -2,11 +2,8 @@ package work.slhaf.partner.core.action.entity;
import lombok.Data; import lombok.Data;
import java.nio.file.Path;
import java.util.Map; import java.util.Map;
import static work.slhaf.partner.common.Constant.Path.ACTION_PROGRAM;
/** /**
* 行动链中的单一元素,封装了调用外部行动程序的必要信息与结果容器,可被{@link work.slhaf.partner.core.action.ActionCapability}执行 * 行动链中的单一元素,封装了调用外部行动程序的必要信息与结果容器,可被{@link work.slhaf.partner.core.action.ActionCapability}执行
*/ */
@@ -14,9 +11,9 @@ import static work.slhaf.partner.common.Constant.Path.ACTION_PROGRAM;
public class MetaAction { public class MetaAction {
/** /**
* 行动key,用于标识与定位行动程序 * 行动name,用于标识行动程序
*/ */
private String key; private String name;
/** /**
* 行动程序可接受的参数,由调用处设置 * 行动程序可接受的参数,由调用处设置
*/ */
@@ -34,13 +31,19 @@ public class MetaAction {
*/ */
private MetaActionType type; private MetaActionType type;
private Path path; /**
* 当类型为 MCP 时,该字段对应相应 MCP Client 注册时生成的 id;
* 当类型为 ORIGIN 时,该字段对应相应的磁盘路径字符串
*/
private String location;
public void resetPath() { /**
path = switch (type) { * actionKey 将由 location+name 共同定位
case ORIGIN -> path; *
case MCP -> Path.of(ACTION_PROGRAM, key, "action.json"); * @return actionKey
}; */
public String getKey() {
return location + "::" + name;
} }
@Data @Data

View File

@@ -57,7 +57,7 @@ public class LocalRunnerClient extends RunnerClient {
private RunnerResponse doRunWithOrigin(MetaAction metaAction) { private RunnerResponse doRunWithOrigin(MetaAction metaAction) {
RunnerResponse response = new RunnerResponse(); RunnerResponse response = new RunnerResponse();
File file = metaAction.getPath().toFile(); File file = new File(metaAction.getLocation());
String ext = FileUtil.getSuffix(file); String ext = FileUtil.getSuffix(file);
if (ext == null || ext.isEmpty()) { if (ext == null || ext.isEmpty()) {
response.setOk(false); response.setOk(false);
@@ -98,13 +98,13 @@ public class LocalRunnerClient extends RunnerClient {
} }
@Override @Override
public Path buildTmpPath(MetaAction tempAction, String codeType) { public String buildTmpPath(MetaAction tempAction, String codeType) {
return Path.of(TMP_ACTION_DIR_LOCAL, System.currentTimeMillis() + "-" + tempAction.getKey() + codeType); return Path.of(TMP_ACTION_DIR_LOCAL, System.currentTimeMillis() + "-" + tempAction.getKey() + codeType).toString();
} }
@Override @Override
public void tmpSerialize(MetaAction tempAction, String code, String codeType) throws IOException { public void tmpSerialize(MetaAction tempAction, String code, String codeType) throws IOException {
Path path = tempAction.getPath(); Path path = Path.of(tempAction.getLocation());
File file = path.toFile(); File file = path.toFile();
file.createNewFile(); file.createNewFile();
Files.writeString(path, code); Files.writeString(path, code);

View File

@@ -27,7 +27,6 @@ import work.slhaf.partner.core.action.entity.MetaAction.ResultStatus;
import work.slhaf.partner.core.action.entity.MetaActionInfo; import work.slhaf.partner.core.action.entity.MetaActionInfo;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path;
import java.time.Duration; import java.time.Duration;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -152,7 +151,7 @@ public abstract class RunnerClient {
protected abstract RunnerResponse doRun(MetaAction metaAction); protected abstract RunnerResponse doRun(MetaAction metaAction);
public abstract Path buildTmpPath(MetaAction tempAction, String codeType); public abstract String buildTmpPath(MetaAction tempAction, String codeType);
public abstract void tmpSerialize(MetaAction tempAction, String code, String codeType) throws IOException; public abstract void tmpSerialize(MetaAction tempAction, String code, String codeType) throws IOException;

View File

@@ -1,13 +1,11 @@
package work.slhaf.partner.core.action.runner; package work.slhaf.partner.core.action.runner;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import work.slhaf.partner.core.action.entity.McpData; import work.slhaf.partner.core.action.entity.McpData;
import work.slhaf.partner.core.action.entity.MetaAction; import work.slhaf.partner.core.action.entity.MetaAction;
import work.slhaf.partner.core.action.entity.MetaActionInfo; import work.slhaf.partner.core.action.entity.MetaActionInfo;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
@@ -42,7 +40,7 @@ public class SandboxRunnerClient extends RunnerClient {
} }
@Override @Override
public Path buildTmpPath(MetaAction tempAction, String codeType) { public String buildTmpPath(MetaAction tempAction, String codeType) {
throw new UnsupportedOperationException("Unimplemented method 'buildTmpPath'"); throw new UnsupportedOperationException("Unimplemented method 'buildTmpPath'");
} }

View File

@@ -48,7 +48,7 @@ public class DynamicActionGenerator extends AgentRunningSubModule<GeneratorInput
// 将临时行动单元序列化至临时文件夹,并设置程序路径、放置在队列中,等待执行状态变化,并根据序列化选项选择是否补充 MetaActionInfo 并持久序列化 // 将临时行动单元序列化至临时文件夹,并设置程序路径、放置在队列中,等待执行状态变化,并根据序列化选项选择是否补充 MetaActionInfo 并持久序列化
// 通过 ActionCapability 暴露的接口序列化至临时文件夹同时返回Path对象并设置。队列建议交给 SandboxRunner // 通过 ActionCapability 暴露的接口序列化至临时文件夹同时返回Path对象并设置。队列建议交给 SandboxRunner
// 持有,包括监听与序列化线程 // 持有,包括监听与序列化线程
tempAction.setPath(runnerClient.buildTmpPath(tempAction, generatorData.getCodeType())); tempAction.setLocation(runnerClient.buildTmpPath(tempAction, generatorData.getCodeType()));
runnerClient.tmpSerialize(tempAction, generatorData.getCode(), generatorData.getCodeType()); runnerClient.tmpSerialize(tempAction, generatorData.getCode(), generatorData.getCodeType());
if (generatorData.isSerialize()) { if (generatorData.isSerialize()) {
waitingSerialize(); waitingSerialize();
@@ -66,7 +66,7 @@ public class DynamicActionGenerator extends AgentRunningSubModule<GeneratorInput
private MetaAction buildAction(GeneratorInput input) { private MetaAction buildAction(GeneratorInput input) {
MetaAction tempAction = new MetaAction(); MetaAction tempAction = new MetaAction();
tempAction.setKey(input.getKey()); tempAction.setName(input.getActionName());
tempAction.setParams(input.getParams()); tempAction.setParams(input.getParams());
tempAction.setIo(true); tempAction.setIo(true);
tempAction.setType(MetaActionType.ORIGIN); tempAction.setType(MetaActionType.ORIGIN);

View File

@@ -6,7 +6,7 @@ import java.util.Map;
@Data @Data
public class GeneratorInput { public class GeneratorInput {
private String key; private String actionName;
private Map<String, String> params; private Map<String, String> params;
private String description; private String description;
private Map<String, String> paramsDescription; private Map<String, String> paramsDescription;

View File

@@ -6,7 +6,6 @@ import org.junit.jupiter.api.Test;
import work.slhaf.partner.core.action.entity.MetaAction; import work.slhaf.partner.core.action.entity.MetaAction;
import work.slhaf.partner.core.action.entity.MetaActionType; import work.slhaf.partner.core.action.entity.MetaActionType;
import java.nio.file.Path;
import java.util.Map; import java.util.Map;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@@ -30,10 +29,10 @@ public class LocalRunnerClientTest {
private static @NotNull MetaAction buildTmpMetaAction() { private static @NotNull MetaAction buildTmpMetaAction() {
MetaAction metaAction = new MetaAction(); MetaAction metaAction = new MetaAction();
metaAction.setIo(false); metaAction.setIo(false);
metaAction.setKey("hello_world"); metaAction.setName("hello_world");
metaAction.setParams(Map.of("name", "origin_run")); metaAction.setParams(Map.of("name", "origin_run"));
metaAction.setType(MetaActionType.ORIGIN); metaAction.setType(MetaActionType.ORIGIN);
metaAction.setPath(Path.of("/home/slhaf/Projects/IdeaProjects/Projects/Partner/Partner-Main/src/test/java/resources/action/tmp/hello_world.py")); metaAction.setLocation("/home/slhaf/Projects/IdeaProjects/Projects/Partner/Partner-Main/src/test/java/resources/action/tmp/hello_world.py");
return metaAction; return metaAction;
} }
} }

View File

@@ -13,7 +13,6 @@ import work.slhaf.partner.core.action.entity.MetaAction;
import work.slhaf.partner.core.action.entity.MetaActionInfo; import work.slhaf.partner.core.action.entity.MetaActionInfo;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@@ -86,7 +85,7 @@ public class RunnerClientTest {
} }
@Override @Override
public Path buildTmpPath(MetaAction tempAction, String codeType) { public String buildTmpPath(MetaAction tempAction, String codeType) {
return null; return null;
} }