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; } }