From 065d7aee856305cd7f6392f25d0e0ac578726be3 Mon Sep 17 00:00:00 2001
From: zhangjinyang <409225776@qq.com>
Date: 星期四, 22 五月 2025 14:59:50 +0800
Subject: [PATCH] feat: 新增单节点执行功能。 close #IC7QJU
---
aiflowy-modules/aiflowy-module-ai/src/main/java/tech/aiflowy/ai/controller/AiWorkflowController.java | 70 +++++++++++++++++++++++++++++++++++
1 files changed, 70 insertions(+), 0 deletions(-)
diff --git a/aiflowy-modules/aiflowy-module-ai/src/main/java/tech/aiflowy/ai/controller/AiWorkflowController.java b/aiflowy-modules/aiflowy-module-ai/src/main/java/tech/aiflowy/ai/controller/AiWorkflowController.java
index db1a208..c9b1e82 100644
--- a/aiflowy-modules/aiflowy-module-ai/src/main/java/tech/aiflowy/ai/controller/AiWorkflowController.java
+++ b/aiflowy-modules/aiflowy-module-ai/src/main/java/tech/aiflowy/ai/controller/AiWorkflowController.java
@@ -1,9 +1,13 @@
package tech.aiflowy.ai.controller;
import cn.dev33.satoken.annotation.SaIgnore;
+import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.StrUtil;
import com.agentsflex.core.chain.*;
+import com.alibaba.fastjson.JSONObject;
import dev.tinyflow.core.Tinyflow;
+import dev.tinyflow.core.parser.NodeParser;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -20,6 +24,7 @@
import java.io.InputStream;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -98,6 +103,7 @@
}
});
+
chain.addOutputListener(new ChainOutputListener() {
@Override
public void onOutput(Chain chain, ChainNode node, Object outputMessage) {
@@ -130,4 +136,68 @@
apiKeyService.checkApiKey(apiKey);
return tryRunning(id, variables);
}
+
+ @PostMapping("/singleRun")
+ public Result singleRun(
+ @JsonBody(value = "id", required = true) BigInteger id,
+ @JsonBody(value = "node", required = true) Map<String, Object> node,
+ @JsonBody("variables") Map<String, Object> variables) {
+
+ AiWorkflow workflow = service.getById(id);
+ if (workflow == null) {
+ return Result.fail(1, "宸ヤ綔娴佷笉瀛樺湪");
+ }
+ List<ChainNode> nodes = new ArrayList<>();
+ Tinyflow tinyflow = workflow.toTinyflow();
+ Chain fullChain = tinyflow.toChain();
+ if (fullChain != null) {
+ nodes = fullChain.getNodes();
+ }
+ Map<String, NodeParser> map = tinyflow.getChainParser().getNodeParserMap();
+ NodeParser parser = map.get(node.get("type").toString());
+ if (parser == null) {
+ return Result.fail(1, "鑺傜偣绫诲瀷涓嶅瓨鍦�");
+ }
+ ChainNode currentNode = parser.parse(new JSONObject(node), tinyflow);
+ if (currentNode == null) {
+ return Result.fail(1, "鑺傜偣涓嶅瓨鍦�");
+ }
+ currentNode.setInwardEdges(null);
+ currentNode.setOutwardEdges(null);
+ fixParamType(nodes, currentNode);
+ Chain chain = new Chain();
+ chain.addNode(currentNode);
+ Map<String, Object> res = chain.executeForResult(variables);
+ return Result.success(res);
+ }
+
+ /**
+ * 淇寮曠敤绫荤殑鍊肩被鍨�
+ */
+ private void fixParamType(List<ChainNode> allNodes, ChainNode currentNode) {
+ List<Parameter> currentParams = currentNode.getParameters();
+ if (CollectionUtil.isEmpty(currentParams)) {
+ return;
+ }
+ for (Parameter parameter : currentParams) {
+ RefType refType = parameter.getRefType();
+ if (refType.equals(RefType.REF)) {
+ parameter.setRefType(RefType.INPUT);
+ String ref = parameter.getRef();
+ if (StrUtil.isNotEmpty(ref)) {
+ for (ChainNode node : allNodes) {
+ List<Parameter> parameters = node.getParameters();
+ if (parameters != null) {
+ for (Parameter nodeParameter : parameters) {
+ String nodeAttr = node.getId() + "." + nodeParameter.getName();
+ if (ref.equals(nodeAttr)) {
+ parameter.setDataType(nodeParameter.getDataType());
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
}
\ No newline at end of file
--
Gitblit v1.8.0