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