From bf37c163fbcaa4f61b16de3bc737d425d2e8cad9 Mon Sep 17 00:00:00 2001 From: v-zhangjc9 Date: Fri, 11 Jul 2025 14:26:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(ai-web):=20=E5=AE=8C=E6=88=90=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E4=BB=BB=E5=8A=A1=E7=9A=84=E5=89=8D=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E6=8B=89=E9=80=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/task/TaskController.java | 7 +++ .../service/ai/web/engine/FlowExecutor.java | 7 ++- .../ai/web/engine/FlowGraphRunner.java | 7 +-- .../service/ai/web/engine/node/LlmNode.java | 16 +++++++ .../ai/web/engine/node/OutputNode.java | 17 +++++++ .../ai/web/service/task/FlowTaskService.java | 47 ++++++++++++++++++- 6 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/node/LlmNode.java create mode 100644 service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/node/OutputNode.java diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/controller/task/TaskController.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/controller/task/TaskController.java index 93565bc..cf1d9cd 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/controller/task/TaskController.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/controller/task/TaskController.java @@ -9,6 +9,7 @@ import com.lanyuanxiaoyao.service.ai.web.entity.FlowTask; import com.lanyuanxiaoyao.service.ai.web.entity.FlowTaskTemplate; import com.lanyuanxiaoyao.service.ai.web.service.task.FlowTaskService; import com.lanyuanxiaoyao.service.ai.web.service.task.FlowTaskTemplateService; +import java.lang.reflect.InvocationTargetException; import java.util.Map; import lombok.Data; import lombok.EqualsAndHashCode; @@ -47,6 +48,12 @@ public class TaskController extends SimpleControllerSupport execute(@PathVariable("id") Long id) throws JsonProcessingException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { + flowTaskService.execute(id); + return AmisResponse.responseSuccess(); + } + @Override protected SaveItemMapper saveItemMapper() { return item -> { diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowExecutor.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowExecutor.java index a92da6c..f808e6c 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowExecutor.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowExecutor.java @@ -1,5 +1,6 @@ package com.lanyuanxiaoyao.service.ai.web.engine; +import com.lanyuanxiaoyao.service.ai.web.engine.entity.FlowContext; import com.lanyuanxiaoyao.service.ai.web.engine.entity.FlowGraph; import com.lanyuanxiaoyao.service.ai.web.engine.store.FlowStore; import java.lang.reflect.InvocationTargetException; @@ -21,7 +22,11 @@ public class FlowExecutor { } public void execute(FlowGraph graph) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { - var runner = new FlowGraphRunner(graph, flowStore, runnerMap); + execute(graph, new FlowContext()); + } + + public void execute(FlowGraph graph, FlowContext context) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { + var runner = new FlowGraphRunner(graph, context, flowStore, runnerMap); runner.run(); } } diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowGraphRunner.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowGraphRunner.java index d185085..20cce22 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowGraphRunner.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowGraphRunner.java @@ -20,6 +20,7 @@ import org.eclipse.collections.api.multimap.set.ImmutableSetMultimap; */ public final class FlowGraphRunner { private final FlowGraph flowGraph; + private final FlowContext flowContext; private final FlowStore flowStore; private final ImmutableMap> nodeRunnerClass; private final Queue executionQueue = new LinkedList<>(); @@ -27,8 +28,9 @@ public final class FlowGraphRunner { private final ImmutableSetMultimap nodeOutputMap; private final ImmutableMap nodeMap; - public FlowGraphRunner(FlowGraph flowGraph, FlowStore flowStore, ImmutableMap> nodeRunnerClass) { + public FlowGraphRunner(FlowGraph flowGraph, FlowContext flowContext, FlowStore flowStore, ImmutableMap> nodeRunnerClass) { this.flowGraph = flowGraph; + this.flowContext = flowContext; this.flowStore = flowStore; this.nodeRunnerClass = nodeRunnerClass; @@ -40,13 +42,12 @@ public final class FlowGraphRunner { public void run() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { flowStore.init(flowGraph); - var context = new FlowContext(); for (FlowNode node : flowGraph.nodes()) { executionQueue.offer(node); } while (!executionQueue.isEmpty()) { var node = executionQueue.poll(); - process(node, context); + process(node, flowContext); } } diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/node/LlmNode.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/node/LlmNode.java new file mode 100644 index 0000000..ee1ba43 --- /dev/null +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/node/LlmNode.java @@ -0,0 +1,16 @@ +package com.lanyuanxiaoyao.service.ai.web.engine.node; + +import com.lanyuanxiaoyao.service.ai.web.engine.FlowNodeRunner; +import lombok.extern.slf4j.Slf4j; + +/** + * @author lanyuanxiaoyao + * @version 20250711 + */ +@Slf4j +public class LlmNode extends FlowNodeRunner { + @Override + public void run() { + log.info("LLM Node {}", (String)getData("systemPrompt")); + } +} diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/node/OutputNode.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/node/OutputNode.java new file mode 100644 index 0000000..ad98744 --- /dev/null +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/node/OutputNode.java @@ -0,0 +1,17 @@ +package com.lanyuanxiaoyao.service.ai.web.engine.node; + +import com.lanyuanxiaoyao.service.ai.web.engine.FlowNodeRunner; +import java.util.Map; +import lombok.extern.slf4j.Slf4j; + +/** + * @author lanyuanxiaoyao + * @version 20250711 + */ +@Slf4j +public class OutputNode extends FlowNodeRunner { + @Override + public void run() { + log.info("Output Node {}", (Map) getData("inputs")); + } +} diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/task/FlowTaskService.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/task/FlowTaskService.java index d3dbd83..41a8c68 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/task/FlowTaskService.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/task/FlowTaskService.java @@ -1,15 +1,60 @@ package com.lanyuanxiaoyao.service.ai.web.service.task; +import cn.hutool.core.util.IdUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.lanyuanxiaoyao.service.ai.web.base.service.SimpleServiceSupport; +import com.lanyuanxiaoyao.service.ai.web.engine.FlowExecutor; +import com.lanyuanxiaoyao.service.ai.web.engine.entity.FlowContext; +import com.lanyuanxiaoyao.service.ai.web.engine.entity.FlowEdge; +import com.lanyuanxiaoyao.service.ai.web.engine.entity.FlowGraph; +import com.lanyuanxiaoyao.service.ai.web.engine.entity.FlowNode; +import com.lanyuanxiaoyao.service.ai.web.engine.node.LlmNode; +import com.lanyuanxiaoyao.service.ai.web.engine.node.OutputNode; +import com.lanyuanxiaoyao.service.ai.web.engine.store.InMemoryFlowStore; import com.lanyuanxiaoyao.service.ai.web.entity.FlowTask; import com.lanyuanxiaoyao.service.ai.web.repository.FlowTaskRepository; +import java.lang.reflect.InvocationTargetException; +import lombok.Data; import lombok.extern.slf4j.Slf4j; +import org.eclipse.collections.api.factory.Maps; +import org.eclipse.collections.api.map.MutableMap; +import org.eclipse.collections.api.set.ImmutableSet; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.stereotype.Service; @Slf4j @Service public class FlowTaskService extends SimpleServiceSupport { - public FlowTaskService(FlowTaskRepository flowTaskRepository) { + private final ObjectMapper mapper; + + public FlowTaskService(FlowTaskRepository flowTaskRepository, Jackson2ObjectMapperBuilder builder) { super(flowTaskRepository); + this.mapper = builder.build(); + } + + public void execute(Long id) throws JsonProcessingException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { + var flowTask = detailOrThrow(id); + var graphVo = mapper.readValue(flowTask.getTemplateFlowGraph(), FlowGraphVo.class); + var flowGraph = new FlowGraph(IdUtil.fastUUID(), graphVo.getNodes(), graphVo.getEdges()); + + var store = new InMemoryFlowStore(); + var executor = new FlowExecutor( + store, + Maps.immutable.of( + "output-node", OutputNode.class, + "llm-node", LlmNode.class + ) + ); + FlowContext context = new FlowContext(); + context.setData(graphVo.getData()); + executor.execute(flowGraph, context); + } + + @Data + public static final class FlowGraphVo { + private ImmutableSet nodes; + private ImmutableSet edges; + private MutableMap> data; } }