From e798332828264ca6f87aa6f26894044081af3a44 Mon Sep 17 00:00:00 2001 From: v-zhangjc9 Date: Sat, 12 Jul 2025 23:24:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(ai-web):=20=E5=A2=9E=E5=8A=A0=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E6=B8=B2=E6=9F=93=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- service-ai/pom.xml | 20 +++++++- service-ai/service-ai-web/pom.xml | 4 ++ .../service/ai/web/engine/FlowHelper.java | 51 ++++++++++++------- .../service/ai/web/engine/node/LlmNode.java | 12 +++-- .../ai/web/engine/node/OutputNode.java | 5 +- 5 files changed, 66 insertions(+), 26 deletions(-) diff --git a/service-ai/pom.xml b/service-ai/pom.xml index 2b1f205..8f8be7b 100644 --- a/service-ai/pom.xml +++ b/service-ai/pom.xml @@ -30,6 +30,7 @@ 5.1.0 5.8.27 1.6.3 + 2.13.2 @@ -153,12 +154,27 @@ com.yomahub liteflow-spring-boot-starter - 2.13.2 + ${liteflow.version} com.yomahub liteflow-el-builder - 2.13.2 + ${liteflow.version} + + + com.yomahub + liteflow-script-graaljs + ${liteflow.version} + + + com.yomahub + liteflow-script-python + ${liteflow.version} + + + com.yomahub + liteflow-script-lua + ${liteflow.version} org.noear diff --git a/service-ai/service-ai-web/pom.xml b/service-ai/service-ai-web/pom.xml index 450a070..d216b41 100644 --- a/service-ai/service-ai-web/pom.xml +++ b/service-ai/service-ai-web/pom.xml @@ -50,6 +50,10 @@ org.springframework.boot spring-boot-starter-data-jpa + + org.freemarker + freemarker + com.blinkfox fenix-spring-boot-starter 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 index a0a7830..7d9188a 100644 --- 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 @@ -1,6 +1,9 @@ package com.lanyuanxiaoyao.service.ai.web.engine; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.template.TemplateEngine; +import cn.hutool.extra.template.TemplateUtil; import com.lanyuanxiaoyao.service.ai.web.engine.entity.FlowContext; import java.util.Map; import org.eclipse.collections.api.factory.Maps; @@ -11,6 +14,8 @@ import org.eclipse.collections.api.map.ImmutableMap; * @version 20250711 */ public class FlowHelper { + private static final TemplateEngine TEMPLATE_ENGINE = TemplateUtil.createEngine(); + public static ImmutableMap generateInputVariablesMap(String nodeId, FlowContext context) { var variableMap = Maps.mutable.empty(); var currentNodeData = context.get(nodeId); @@ -18,27 +23,39 @@ public class FlowHelper { 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); + var targetVariable = generateVariable(expression, context); + if (ObjectUtil.isNotNull(targetVariable)) { 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(); } + + public static Object generateVariable(String expression, FlowContext context) { + 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)); + } + return targetNodeData.get(targetVariableName); + } else if (context.getInput().containsKey(expression)) { + if (!context.getInput().containsKey(expression)) { + throw new RuntimeException(StrUtil.format("Target variable not found in input {}", expression)); + } + return context.getInput().get(expression); + } + return null; + } + + public static String renderTemplateText(String templateText, Map data) { + var template = TEMPLATE_ENGINE.getTemplate(templateText); + return template.render(data); + } } 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 2cddeaf..1b89bf1 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,8 +1,11 @@ package com.lanyuanxiaoyao.service.ai.web.engine.node; +import cn.hutool.core.util.StrUtil; +import com.lanyuanxiaoyao.service.ai.web.configuration.SpringBeanGetter; import com.lanyuanxiaoyao.service.ai.web.engine.FlowHelper; import com.lanyuanxiaoyao.service.ai.web.engine.FlowNodeRunner; import lombok.extern.slf4j.Slf4j; +import org.springframework.ai.chat.client.ChatClient; /** * @author lanyuanxiaoyao @@ -14,10 +17,9 @@ public class LlmNode extends FlowNodeRunner { public void run() { var variableMap = FlowHelper.generateInputVariablesMap(getNodeId(), getContext()); log.info("Variable map: {}", variableMap); - setData("text", "llm"); - - /* var prompt = (String) getData("systemPrompt"); - if (StrUtil.isNotBlank(prompt)) { + var sourcePrompt = (String) getData("systemPrompt"); + if (StrUtil.isNotBlank(sourcePrompt)) { + var prompt = FlowHelper.renderTemplateText(sourcePrompt, variableMap.toMap()); var builder = SpringBeanGetter.getBean("chat", ChatClient.Builder.class); var client = builder.build(); var content = client.prompt() @@ -25,6 +27,6 @@ public class LlmNode extends FlowNodeRunner { .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 330d6e6..eee76f5 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 @@ -12,7 +12,8 @@ import lombok.extern.slf4j.Slf4j; public class OutputNode extends FlowNodeRunner { @Override public void run() { - var variableMap = FlowHelper.generateInputVariablesMap(getNodeId(), getContext()); - log.info("Variable map: {}", variableMap); + String expression = getData("output"); + var targetVariable = FlowHelper.generateVariable(expression, getContext()); + log.info("Target: {}", targetVariable); } }