diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowHelper.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowHelper.java new file mode 100644 index 0000000..a0a7830 --- /dev/null +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowHelper.java @@ -0,0 +1,44 @@ +package com.lanyuanxiaoyao.service.ai.web.engine; + +import cn.hutool.core.util.StrUtil; +import com.lanyuanxiaoyao.service.ai.web.engine.entity.FlowContext; +import java.util.Map; +import org.eclipse.collections.api.factory.Maps; +import org.eclipse.collections.api.map.ImmutableMap; + +/** + * @author lanyuanxiaoyao + * @version 20250711 + */ +public class FlowHelper { + public static ImmutableMap generateInputVariablesMap(String nodeId, FlowContext context) { + var variableMap = Maps.mutable.empty(); + var currentNodeData = context.get(nodeId); + if (currentNodeData.containsKey("inputs")) { + var inputsMap = (Map>) currentNodeData.get("inputs"); + for (String variableName : inputsMap.keySet()) { + var expression = inputsMap.get(variableName).get("variable"); + if (StrUtil.contains(expression, ".")) { + var splits = StrUtil.splitTrim(expression, ".", 2); + var targetNodeId = splits.get(0); + var targetVariableName = splits.get(1); + if (!context.getData().containsKey(targetNodeId)) { + throw new RuntimeException(StrUtil.format("Target node id not found: {}", targetNodeId)); + } + var targetNodeData = context.getData().get(targetNodeId); + if (!targetNodeData.containsKey(targetVariableName)) { + throw new RuntimeException(StrUtil.format("Target node variable not found: {}.{}", targetNodeId, targetVariableName)); + } + var targetVariable = targetNodeData.get(targetVariableName); + variableMap.put(variableName, targetVariable); + } else if (context.getInput().containsKey(expression)) { + if (!context.getInput().containsKey(variableName)) { + throw new RuntimeException(StrUtil.format("Target variable not found in input {}", variableName)); + } + variableMap.put(variableName, context.getInput().get(variableName)); + } + } + } + return variableMap.toImmutable(); + } +} diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowNodeRunner.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowNodeRunner.java index 1e99e18..c86c845 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowNodeRunner.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/FlowNodeRunner.java @@ -2,6 +2,7 @@ package com.lanyuanxiaoyao.service.ai.web.engine; import com.lanyuanxiaoyao.service.ai.web.engine.entity.FlowContext; import lombok.Getter; +import org.eclipse.collections.api.map.MutableMap; public abstract class FlowNodeRunner { @Getter @@ -19,6 +20,10 @@ public abstract class FlowNodeRunner { this.context = context; } + protected MutableMap getData() { + return context.get(nodeId); + } + protected T getData(String key) { var data = context.get(nodeId); return (T) data.get(key); diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/entity/FlowContext.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/entity/FlowContext.java index e0cc7e7..2f6182e 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/entity/FlowContext.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/engine/entity/FlowContext.java @@ -2,10 +2,12 @@ package com.lanyuanxiaoyao.service.ai.web.engine.entity; import lombok.Data; import org.eclipse.collections.api.factory.Maps; +import org.eclipse.collections.api.map.ImmutableMap; import org.eclipse.collections.api.map.MutableMap; @Data public class FlowContext { + private ImmutableMap input = Maps.immutable.empty(); private MutableMap> data = Maps.mutable.>empty().asSynchronized(); public MutableMap get(String key) { 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 index ee1ba43..2cddeaf 100644 --- 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 @@ -1,5 +1,6 @@ package com.lanyuanxiaoyao.service.ai.web.engine.node; +import com.lanyuanxiaoyao.service.ai.web.engine.FlowHelper; import com.lanyuanxiaoyao.service.ai.web.engine.FlowNodeRunner; import lombok.extern.slf4j.Slf4j; @@ -11,6 +12,19 @@ import lombok.extern.slf4j.Slf4j; public class LlmNode extends FlowNodeRunner { @Override public void run() { - log.info("LLM Node {}", (String)getData("systemPrompt")); + var variableMap = FlowHelper.generateInputVariablesMap(getNodeId(), getContext()); + log.info("Variable map: {}", variableMap); + setData("text", "llm"); + + /* var prompt = (String) getData("systemPrompt"); + if (StrUtil.isNotBlank(prompt)) { + var builder = SpringBeanGetter.getBean("chat", ChatClient.Builder.class); + var client = builder.build(); + var content = client.prompt() + .user(prompt) + .call() + .content(); + setData("text", content); + }*/ } } 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 index ad98744..330d6e6 100644 --- 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 @@ -1,7 +1,7 @@ package com.lanyuanxiaoyao.service.ai.web.engine.node; +import com.lanyuanxiaoyao.service.ai.web.engine.FlowHelper; import com.lanyuanxiaoyao.service.ai.web.engine.FlowNodeRunner; -import java.util.Map; import lombok.extern.slf4j.Slf4j; /** @@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j; public class OutputNode extends FlowNodeRunner { @Override public void run() { - log.info("Output Node {}", (Map) getData("inputs")); + var variableMap = FlowHelper.generateInputVariablesMap(getNodeId(), getContext()); + log.info("Variable map: {}", variableMap); } } 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 41a8c68..4c812ef 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 @@ -2,6 +2,7 @@ package com.lanyuanxiaoyao.service.ai.web.service.task; import cn.hutool.core.util.IdUtil; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.lanyuanxiaoyao.service.ai.web.base.service.SimpleServiceSupport; import com.lanyuanxiaoyao.service.ai.web.engine.FlowExecutor; @@ -47,6 +48,7 @@ public class FlowTaskService extends SimpleServiceSupport { ) ); FlowContext context = new FlowContext(); + context.setInput(mapper.readValue(flowTask.getInput(), new TypeReference<>() {})); context.setData(graphVo.getData()); executor.execute(flowGraph, context); }