diff --git a/README.md b/README.md
index ae85120d91..db9931ec08 100644
--- a/README.md
+++ b/README.md
@@ -189,7 +189,7 @@ fit start -Dfit.profiles.active=prod
> 这里直接使用了 `fit` 命令,该命令请参考 `fit-framework` 项目的[指导手册](https://github.com/ModelEngine-Group/fit-framework/blob/main/docs/framework/fit/java/quick-start-guide/03.%20%E4%BD%BF%E7%94%A8%E6%8F%92%E4%BB%B6%E7%9A%84%E7%83%AD%E6%8F%92%E6%8B%94%E8%83%BD%E5%8A%9B.md)。
>
-> 当前,`app-platform` 使用了 `fit` 的 3.5.1 版本,因此,如果采用手动编译,需要在 `fit-framework` 仓库中切换到 `v3.5.1` 标签处进行编译构建操作。
+> 当前,`app-platform` 使用了 `fit` 的 3.5.3 版本,因此,如果采用手动编译,需要在 `fit-framework` 仓库中切换到 `v3.5.3` 标签处进行编译构建操作。
---------
diff --git a/app-builder/plugins/aipp-classify-question/pom.xml b/app-builder/plugins/aipp-classify-question/pom.xml
index f8e5c15017..85a2db9ddf 100644
--- a/app-builder/plugins/aipp-classify-question/pom.xml
+++ b/app-builder/plugins/aipp-classify-question/pom.xml
@@ -66,7 +66,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test
diff --git a/app-builder/plugins/aipp-extractor/pom.xml b/app-builder/plugins/aipp-extractor/pom.xml
index 06568ea252..b56d83838f 100644
--- a/app-builder/plugins/aipp-extractor/pom.xml
+++ b/app-builder/plugins/aipp-extractor/pom.xml
@@ -61,7 +61,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test
diff --git a/app-builder/plugins/aipp-http-call/pom.xml b/app-builder/plugins/aipp-http-call/pom.xml
index 49498ae829..453e5ede46 100644
--- a/app-builder/plugins/aipp-http-call/pom.xml
+++ b/app-builder/plugins/aipp-http-call/pom.xml
@@ -49,7 +49,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test
diff --git a/app-builder/plugins/aipp-loop-tool/pom.xml b/app-builder/plugins/aipp-loop-tool/pom.xml
index d353b3b631..c90e166143 100644
--- a/app-builder/plugins/aipp-loop-tool/pom.xml
+++ b/app-builder/plugins/aipp-loop-tool/pom.xml
@@ -101,7 +101,7 @@
org.fitframework.fel
tool-maven-plugin
- 3.5.1
+ ${fit.version}
build-tool
diff --git a/app-builder/plugins/aipp-parallel-tool/pom.xml b/app-builder/plugins/aipp-parallel-tool/pom.xml
index 57c64362d0..31cf6dd813 100644
--- a/app-builder/plugins/aipp-parallel-tool/pom.xml
+++ b/app-builder/plugins/aipp-parallel-tool/pom.xml
@@ -113,7 +113,7 @@
org.fitframework.fel
tool-maven-plugin
- 3.5.1
+ ${fit.version}
build-tool
diff --git a/app-builder/plugins/aipp-plugin/pom.xml b/app-builder/plugins/aipp-plugin/pom.xml
index 6d7c73536d..8a2e161c4e 100644
--- a/app-builder/plugins/aipp-plugin/pom.xml
+++ b/app-builder/plugins/aipp-plugin/pom.xml
@@ -166,7 +166,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test
@@ -315,7 +315,7 @@
org.fitframework.fel
tool-maven-plugin
- 3.5.1
+ ${fit.version}
build-tool
diff --git a/app-builder/plugins/aipp-plugin/src/main/resources/application.yml b/app-builder/plugins/aipp-plugin/src/main/resources/application.yml
index 345ab5e995..6e5c4ff2b6 100644
--- a/app-builder/plugins/aipp-plugin/src/main/resources/application.yml
+++ b/app-builder/plugins/aipp-plugin/src/main/resources/application.yml
@@ -83,6 +83,7 @@ tool:
FILEEXTRACTNODESTATE: fileExtractionNodeState
LOOPNODESTATE: loopNodeState
PARALLELNODESTATE: parallelNodeState
+ TEXTCONCATENATENODESTATE: textConcatenateNodeState
export-meta:
version: 1.0.1
sensitive:
diff --git a/app-builder/plugins/aipp-plugin/src/main/resources/component/basic_node_en.json b/app-builder/plugins/aipp-plugin/src/main/resources/component/basic_node_en.json
index c68d0119d3..ceac85057b 100644
--- a/app-builder/plugins/aipp-plugin/src/main/resources/component/basic_node_en.json
+++ b/app-builder/plugins/aipp-plugin/src/main/resources/component/basic_node_en.json
@@ -73,5 +73,10 @@
"type": "parallelNodeState",
"name": "Parallel",
"uniqueName": ""
+ },
+ {
+ "type": "textConcatenateNodeState",
+ "name": "Text Joiner",
+ "uniqueName": ""
}
]
\ No newline at end of file
diff --git a/app-builder/plugins/aipp-plugin/src/main/resources/component/basic_node_zh.json b/app-builder/plugins/aipp-plugin/src/main/resources/component/basic_node_zh.json
index 2f90ee566a..0a925f5591 100644
--- a/app-builder/plugins/aipp-plugin/src/main/resources/component/basic_node_zh.json
+++ b/app-builder/plugins/aipp-plugin/src/main/resources/component/basic_node_zh.json
@@ -73,5 +73,10 @@
"type": "parallelNodeState",
"name": "并行",
"uniqueName": ""
+ },
+ {
+ "type": "textConcatenateNodeState",
+ "name": "文本拼接",
+ "uniqueName": ""
}
]
\ No newline at end of file
diff --git a/app-builder/plugins/aipp-rewriter/pom.xml b/app-builder/plugins/aipp-rewriter/pom.xml
index 986e5556a3..a559675087 100644
--- a/app-builder/plugins/aipp-rewriter/pom.xml
+++ b/app-builder/plugins/aipp-rewriter/pom.xml
@@ -62,7 +62,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test
diff --git a/app-builder/plugins/aipp-template-render/pom.xml b/app-builder/plugins/aipp-template-render/pom.xml
new file mode 100644
index 0000000000..074c5b7333
--- /dev/null
+++ b/app-builder/plugins/aipp-template-render/pom.xml
@@ -0,0 +1,89 @@
+
+
+ 4.0.0
+
+
+ modelengine.fit.jade
+ app-builder-plugin-parent
+ 1.0.0-SNAPSHOT
+
+
+ modelengine.fit.jade.plugin
+ aipp-template-render
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+
+ modelengine.jade.service
+ aipp-template-render-service
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+
+
+ org.assertj
+ assertj-core
+
+
+ org.mockito
+ mockito-core
+
+
+ modelengine.fit.jade
+ aipp-service
+
+
+
+
+
+
+ org.fitframework
+ fit-build-maven-plugin
+ ${fit.version}
+
+
+ build-plugin
+
+ build-plugin
+
+
+
+ package-plugin
+
+ package-plugin
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ ${maven.antrun.version}
+
+
+ install
+
+
+
+
+
+
+ run
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-builder/plugins/aipp-template-render/src/main/java/modelengine/fit/jade/aipp/template/render/TemplateServiceImpl.java b/app-builder/plugins/aipp-template-render/src/main/java/modelengine/fit/jade/aipp/template/render/TemplateServiceImpl.java
new file mode 100644
index 0000000000..b0989cad69
--- /dev/null
+++ b/app-builder/plugins/aipp-template-render/src/main/java/modelengine/fit/jade/aipp/template/render/TemplateServiceImpl.java
@@ -0,0 +1,41 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+package modelengine.fit.jade.aipp.template.render;
+
+import static modelengine.fitframework.util.ObjectUtils.nullIf;
+
+import modelengine.fitframework.annotation.Component;
+import modelengine.fitframework.parameterization.ParameterizationMode;
+import modelengine.fitframework.parameterization.ParameterizedString;
+import modelengine.fitframework.parameterization.ParameterizedStringResolver;
+
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * {@link TemplateService} 的实现类。
+ *
+ * @author 孙怡菲
+ * @since 2025-08-29
+ */
+@Component
+public class TemplateServiceImpl implements TemplateService {
+ @Override
+ public String renderTemplate(String template, Map args) {
+ if (template == null) {
+ return null;
+ }
+ if (args == null) {
+ args = Map.of();
+ }
+ Map params = nullIf(args, Collections.emptyMap());
+ ParameterizedStringResolver resolver =
+ ParameterizedStringResolver.create("{{", "}}", '/', ParameterizationMode.LENIENT_EMPTY);
+ ParameterizedString parameterizedString = resolver.resolve(template);
+ return parameterizedString.format(params, null);
+ }
+}
diff --git a/app-builder/plugins/aipp-template-render/src/main/resources/application.yml b/app-builder/plugins/aipp-template-render/src/main/resources/application.yml
new file mode 100644
index 0000000000..f335d5a7ad
--- /dev/null
+++ b/app-builder/plugins/aipp-template-render/src/main/resources/application.yml
@@ -0,0 +1,4 @@
+fit:
+ beans:
+ packages:
+ - 'modelengine.fit.jade.aipp.template.render'
\ No newline at end of file
diff --git a/app-builder/plugins/aipp-template-render/src/test/java/modelengine/fit/jade/aipp/template/render/TemplateServiceImplTest.java b/app-builder/plugins/aipp-template-render/src/test/java/modelengine/fit/jade/aipp/template/render/TemplateServiceImplTest.java
new file mode 100644
index 0000000000..5a304b86a4
--- /dev/null
+++ b/app-builder/plugins/aipp-template-render/src/test/java/modelengine/fit/jade/aipp/template/render/TemplateServiceImplTest.java
@@ -0,0 +1,118 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+package modelengine.fit.jade.aipp.template.render;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * {@link TemplateServiceImpl} 的测试类。
+ *
+ * @author 孙怡菲
+ * @since 2025-08-28
+ */
+class TemplateServiceImplTest {
+ private TemplateServiceImpl textTool;
+
+ @BeforeEach
+ void setUp() {
+ this.textTool = new TemplateServiceImpl();
+ }
+
+ @Test
+ @DisplayName("基础模板变量替换成功")
+ void shouldReplaceBasicVariables() {
+ String template = "Hello {{name}}, your score is {{score}}.";
+ Map args = new HashMap<>();
+ args.put("name", "Tom");
+ args.put("score", 95);
+
+ String result = this.textTool.renderTemplate(template, args);
+ assertEquals("Hello Tom, your score is 95.", result);
+ }
+
+ @Test
+ @DisplayName("缺失变量时置为空字符串")
+ void shouldReplaceMissingVariableWithEmpty() {
+ String template = "Hello {{name}}, your score is {{score}}.";
+ Map args = new HashMap<>();
+ args.put("name", "Tom");
+
+ String result = this.textTool.renderTemplate(template, args);
+ assertEquals("Hello Tom, your score is .", result);
+ }
+
+ @Test
+ @DisplayName("空参数Map时模板变量置为空")
+ void shouldHandleEmptyArgsMap() {
+ String template = "Hello {{name}}!";
+ Map args = new HashMap<>();
+
+ String result = this.textTool.renderTemplate(template, args);
+ assertEquals("Hello !", result);
+ }
+
+ @Test
+ @DisplayName("参数为null时模板变量置为空")
+ void shouldHandleNullArgs() {
+ String template = "Hello {{name}}!";
+
+ String result = this.textTool.renderTemplate(template, null);
+ assertEquals("Hello !", result);
+ }
+
+ @Test
+ @DisplayName("模板无占位符时内容保持不变")
+ void shouldHandleTemplateWithoutPlaceholders() {
+ String template = "Hello world!";
+
+ String result = this.textTool.renderTemplate(template, Map.of("name", "Tom"));
+ assertEquals("Hello world!", result);
+ }
+
+ @Test
+ @DisplayName("变量中包含占位符内容保持不变")
+ void shouldHandleVariableWithPlaceholders() {
+ String template = "Hello {{name}}!";
+
+ String result = this.textTool.renderTemplate(template, Map.of("name", "{{Tom}}"));
+ assertEquals("Hello {{Tom}}!", result);
+ }
+
+ @Test
+ @DisplayName("变量为 List 时正常替换")
+ void shouldReplaceListVariableCorrectly() {
+ String template = "Items: {{items}}";
+ Map args = new HashMap<>();
+ args.put("items", Arrays.asList("apple", "banana", "cherry"));
+
+ String result = this.textTool.renderTemplate(template, args);
+ assertEquals("Items: [apple, banana, cherry]", result);
+ }
+
+ @Test
+ @DisplayName("变量为 Map 时正常替换")
+ void shouldReplaceMapVariableCorrectly() {
+ String template = "Map data: {{data}}";
+ Map args = new HashMap<>();
+ Map mapValue = new LinkedHashMap<>();
+ mapValue.put("a", 1);
+ mapValue.put("b", 2);
+ args.put("data", mapValue);
+
+ String result = this.textTool.renderTemplate(template, args);
+ assertEquals("Map data: {a=1, b=2}", result);
+ }
+}
\ No newline at end of file
diff --git a/app-builder/plugins/aipp-text-concatenation/pom.xml b/app-builder/plugins/aipp-text-concatenation/pom.xml
new file mode 100644
index 0000000000..8c9b7dc75a
--- /dev/null
+++ b/app-builder/plugins/aipp-text-concatenation/pom.xml
@@ -0,0 +1,99 @@
+
+
+ 4.0.0
+
+
+ modelengine.fit.jade
+ app-builder-plugin-parent
+ 1.0.0-SNAPSHOT
+
+
+ modelengine.fit.jade.plugin
+ aipp-text-concatenation
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+
+ org.fitframework
+ fit-api
+
+
+ org.fitframework
+ fit-util
+
+
+
+
+ org.fitframework.fel
+ tool-service
+
+
+ modelengine.jade.service
+ aipp-template-render-service
+
+
+
+
+
+
+ org.fitframework
+ fit-build-maven-plugin
+ ${fit.version}
+
+
+ build-plugin
+
+ build-plugin
+
+
+
+ package-plugin
+
+ package-plugin
+
+
+
+
+
+ org.fitframework.fel
+ tool-maven-plugin
+ ${fit.version}
+
+
+ build-tool
+
+ build-tool
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ ${maven.antrun.version}
+
+
+ install
+
+
+
+
+
+
+ run
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-builder/plugins/aipp-text-concatenation/src/main/java/modelengine/fit/jade/aipp/text/concatenation/impl/DefaultTextConcatenationToolImpl.java b/app-builder/plugins/aipp-text-concatenation/src/main/java/modelengine/fit/jade/aipp/text/concatenation/impl/DefaultTextConcatenationToolImpl.java
new file mode 100644
index 0000000000..f6a6f8503e
--- /dev/null
+++ b/app-builder/plugins/aipp-text-concatenation/src/main/java/modelengine/fit/jade/aipp/text/concatenation/impl/DefaultTextConcatenationToolImpl.java
@@ -0,0 +1,47 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+package modelengine.fit.jade.aipp.text.concatenation.impl;
+
+import modelengine.fel.tool.annotation.Attribute;
+import modelengine.fel.tool.annotation.Group;
+import modelengine.fel.tool.annotation.ToolMethod;
+import modelengine.fit.jade.aipp.template.render.TemplateService;
+import modelengine.fit.jade.aipp.text.concatenation.service.TextConcatenationTool;
+import modelengine.fitframework.annotation.Component;
+import modelengine.fitframework.annotation.Fitable;
+import modelengine.fitframework.annotation.Property;
+
+import java.util.Map;
+
+/**
+ * {@link TextConcatenationTool} 的实现类。
+ *
+ * @author 孙怡菲
+ * @since 2025-08-28
+ */
+@Component
+@Group(name = "implGroup_text_concatenation_tool")
+public class DefaultTextConcatenationToolImpl implements TextConcatenationTool {
+ private static final String FITABLE_ID = "default_impl";
+
+ private final TemplateService templateService;
+
+ public DefaultTextConcatenationToolImpl(TemplateService templateService) {
+ this.templateService = templateService;
+ }
+
+ @Fitable(FITABLE_ID)
+ @ToolMethod(name = "renderTemplateDefault", extensions = {
+ @Attribute(key = "tags", value = "FIT"), @Attribute(key = "tags", value = "BASIC"),
+ @Attribute(key = "tags", value = "TEXTCONCATENATENODE")
+ })
+ @Property(description = "默认的文本拼接实现")
+ @Override
+ public String renderTemplate(String template, Map args) {
+ return this.templateService.renderTemplate(template, args);
+ }
+}
\ No newline at end of file
diff --git a/app-builder/plugins/aipp-text-concatenation/src/main/java/modelengine/fit/jade/aipp/text/concatenation/service/TextConcatenationTool.java b/app-builder/plugins/aipp-text-concatenation/src/main/java/modelengine/fit/jade/aipp/text/concatenation/service/TextConcatenationTool.java
new file mode 100644
index 0000000000..a75399d226
--- /dev/null
+++ b/app-builder/plugins/aipp-text-concatenation/src/main/java/modelengine/fit/jade/aipp/text/concatenation/service/TextConcatenationTool.java
@@ -0,0 +1,35 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+package modelengine.fit.jade.aipp.text.concatenation.service;
+
+import modelengine.fel.tool.annotation.Group;
+import modelengine.fel.tool.annotation.ToolMethod;
+import modelengine.fitframework.annotation.Genericable;
+import modelengine.fitframework.annotation.Property;
+
+import java.util.Map;
+
+/**
+ * 文本拼接工具接口,提供基于模板的文本渲染功能。
+ *
+ * @author 孙怡菲
+ * @since 2025-08-28
+ */
+@Group(name = "defGroup_text_concatenation_tool")
+public interface TextConcatenationTool {
+ /**
+ * 渲染文本模板。
+ *
+ * @param template 模板内容。
+ * @param args 拼接的变量映射,key 为变量名,value 为变量值。
+ * @return 渲染后的文本内容。
+ */
+ @ToolMethod(name = "renderTemplate", description = "用于文本拼接的工具")
+ @Genericable("modelengine.jade.concatenate.text")
+ String renderTemplate(@Property(description = "模板内容", required = true) String template,
+ @Property(description = "拼接的变量", required = true) Map args);
+}
diff --git a/app-builder/plugins/aipp-text-concatenation/src/main/resources/application.yml b/app-builder/plugins/aipp-text-concatenation/src/main/resources/application.yml
new file mode 100644
index 0000000000..2499e00459
--- /dev/null
+++ b/app-builder/plugins/aipp-text-concatenation/src/main/resources/application.yml
@@ -0,0 +1,4 @@
+fit:
+ beans:
+ packages:
+ - 'modelengine.fit.jade.aipp.text.concatenation'
\ No newline at end of file
diff --git a/app-builder/plugins/aipp-text-concatenation/src/main/resources/sql/data/aipp_text_concatenation_tool.sql b/app-builder/plugins/aipp-text-concatenation/src/main/resources/sql/data/aipp_text_concatenation_tool.sql
new file mode 100644
index 0000000000..2c813f8688
--- /dev/null
+++ b/app-builder/plugins/aipp-text-concatenation/src/main/resources/sql/data/aipp_text_concatenation_tool.sql
@@ -0,0 +1,15 @@
+INSERT INTO store_plugin (plugin_id, plugin_name, extension, deploy_status, is_builtin, source, icon) VALUES ('9a83227d6c19864af903495f7f84ac0046a4544d19f988664783c42336743227', '文本拼接工具', '{"uniqueness.groupId":"modelengine.fit.jade.plugin","pluginFullName":"aipp-text-concatenation-1.0.0-SNAPSHOT-1756387444539.jar","checksum":"6ef42fb01f0c89a8cb182ac18b8882e9e49f96ca6383fd38d90a72f979311479","name":"文本拼接工具","description":"这是一个用于文本拼接工具","uniqueness.artifactId":"text.concatenation.tool","type":"java"}', 'DEPLOYED', false, '', NULL) ON CONFLICT (plugin_id) DO NOTHING;
+
+INSERT INTO store_plugin_tool (tool_name, plugin_id, tool_unique_name, source, icon) VALUES ('renderTemplateDefault', '9a83227d6c19864af903495f7f84ac0046a4544d19f988664783c42336743227', '192a8c72-dce9-40a5-a07e-4f8126c0f295', '', NULL) ON CONFLICT(plugin_id, tool_unique_name) DO NOTHING;
+
+INSERT INTO store_tool (name, schema, runnables, extensions, unique_name, version, is_latest, group_name, definition_name, definition_group_name) VALUES ('renderTemplateDefault', '{"name":"renderTemplateDefault","description":"","parameters":{"type":"object","properties":{"template":{"default":"","examples":[""],"name":"template","description":"模板内容","type":"string"},"args":{"default":"","examples":[""],"name":"args","description":"拼接的变量","type":"object","properties":{}}},"required":["template","args"]},"return":{"convertor":"","examples":[""],"name":"","description":"默认的文本拼接实现","type":"string"},"order":["template","args"]}', '{"FIT":{"genericableId":"modelengine.jade.concatenate.text","fitableId":"default_impl"}}', '{"tags":["FIT","BASIC","TEXTCONCATENATENODE"]}', '192a8c72-dce9-40a5-a07e-4f8126c0f295', '1.0.0', true, 'implGroup_text_concatenation_tool', 'renderTemplate', 'defGroup_text_concatenation_tool') ON CONFLICT(unique_name, version) DO NOTHING;
+
+INSERT INTO store_definition (name, schema, definition_group_name) VALUES ('renderTemplate', '{"name":"renderTemplate","description":"用于文本拼接的工具","parameters":{"type":"object","properties":{"template":{"description":"模板内容","name":"template","type":"string","examples":[""],"default":""},"args":{"description":"拼接的变量","name":"args","type":"object","properties":{},"examples":[""],"default":""}},"required":["template","args"]},"order":["template","args"],"return":{"type":"string","convertor":""}}', 'defGroup_text_concatenation_tool') ON CONFLICT (definition_group_name, name) DO NOTHING;
+
+INSERT INTO store_definition_group (name, summary, description, extensions) VALUES ('defGroup_text_concatenation_tool', '', '', '{}') ON CONFLICT(name) DO NOTHING;
+
+INSERT INTO store_tag (tool_unique_name, name) VALUES ('192a8c72-dce9-40a5-a07e-4f8126c0f295', 'FIT') ON CONFLICT(tool_unique_name, name) DO NOTHING;
+INSERT INTO store_tag (tool_unique_name, name) VALUES ('192a8c72-dce9-40a5-a07e-4f8126c0f295', 'TEXTCONCATENATENODESTATE') ON CONFLICT(tool_unique_name, name) DO NOTHING;
+INSERT INTO store_tag (tool_unique_name, name) VALUES ('192a8c72-dce9-40a5-a07e-4f8126c0f295', 'BASIC') ON CONFLICT(tool_unique_name, name) DO NOTHING;
+
+INSERT INTO store_tool_group (name, definition_group_name, summary, description, extensions) VALUES ('implGroup_text_concatenation_tool', 'defGroup_text_concatenation_tool', '', '', '{}') ON CONFLICT(name) DO NOTHING;
diff --git a/app-builder/plugins/aipp-variable-aggregation/pom.xml b/app-builder/plugins/aipp-variable-aggregation/pom.xml
index bc6d728ce9..76ee836076 100644
--- a/app-builder/plugins/aipp-variable-aggregation/pom.xml
+++ b/app-builder/plugins/aipp-variable-aggregation/pom.xml
@@ -39,7 +39,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test
diff --git a/app-builder/plugins/aipp-websocket-plugin/pom.xml b/app-builder/plugins/aipp-websocket-plugin/pom.xml
index 41ea1fe631..167fef7f2e 100644
--- a/app-builder/plugins/aipp-websocket-plugin/pom.xml
+++ b/app-builder/plugins/aipp-websocket-plugin/pom.xml
@@ -62,7 +62,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test
diff --git a/app-builder/plugins/app-metrics/pom.xml b/app-builder/plugins/app-metrics/pom.xml
index ef54877336..6fbcc5e29f 100644
--- a/app-builder/plugins/app-metrics/pom.xml
+++ b/app-builder/plugins/app-metrics/pom.xml
@@ -110,7 +110,7 @@
org.fitframework
fit-build-maven-plugin
- 3.5.1
+ ${fit.version}
user
3
@@ -133,7 +133,7 @@
org.fitframework
fit-dependency-maven-plugin
- 3.5.1
+ ${fit.version}
dependency
diff --git a/app-builder/plugins/plugins-show-case-parent/agent-test/pom.xml b/app-builder/plugins/plugins-show-case-parent/agent-test/pom.xml
index 80257b19fe..4e60bcb50d 100644
--- a/app-builder/plugins/plugins-show-case-parent/agent-test/pom.xml
+++ b/app-builder/plugins/plugins-show-case-parent/agent-test/pom.xml
@@ -82,7 +82,7 @@
org.fitframework
fit-build-maven-plugin
- 3.5.1
+ ${fit.version}
build-plugin
@@ -95,7 +95,7 @@
org.fitframework.fel
tool-maven-plugin
- 3.5.1
+ ${fit.version}
build-tool
diff --git a/app-builder/plugins/plugins-show-case-parent/aito-data/pom.xml b/app-builder/plugins/plugins-show-case-parent/aito-data/pom.xml
index 735f9e9a4e..71f8e4fa3f 100644
--- a/app-builder/plugins/plugins-show-case-parent/aito-data/pom.xml
+++ b/app-builder/plugins/plugins-show-case-parent/aito-data/pom.xml
@@ -86,7 +86,7 @@
org.fitframework
fit-build-maven-plugin
- 3.5.1
+ ${fit.version}
build-plugin
@@ -105,7 +105,7 @@
org.fitframework.fel
tool-maven-plugin
- 3.5.1
+ 3.5.3
build-tool
diff --git a/app-builder/plugins/plugins-show-case-parent/fortune-telling/pom.xml b/app-builder/plugins/plugins-show-case-parent/fortune-telling/pom.xml
index 33ad301322..820b7d0a13 100644
--- a/app-builder/plugins/plugins-show-case-parent/fortune-telling/pom.xml
+++ b/app-builder/plugins/plugins-show-case-parent/fortune-telling/pom.xml
@@ -47,7 +47,7 @@
org.fitframework
fit-build-maven-plugin
- 3.5.1
+ ${fit.version}
build-plugin
@@ -66,7 +66,7 @@
org.fitframework.fel
tool-maven-plugin
- 3.5.1
+ ${fit.version}
build-tool
diff --git a/app-builder/plugins/pom.xml b/app-builder/plugins/pom.xml
index 4a0ab34250..4687a7b962 100644
--- a/app-builder/plugins/pom.xml
+++ b/app-builder/plugins/pom.xml
@@ -29,6 +29,8 @@
aipp-plugin
aipp-prompt-builder
aipp-rewriter
+ aipp-template-render
+ aipp-text-concatenation
aipp-variable-aggregation
aipp-websocket-plugin
app-announcement
diff --git a/app-builder/plugins/task-new/pom.xml b/app-builder/plugins/task-new/pom.xml
index 6dc342abb0..4a50850858 100644
--- a/app-builder/plugins/task-new/pom.xml
+++ b/app-builder/plugins/task-new/pom.xml
@@ -97,7 +97,7 @@
org.fitframework.fel
tool-maven-plugin
- 3.5.1
+ ${fit.version}
build-tool
diff --git a/app-builder/plugins/tool-waterflow/pom.xml b/app-builder/plugins/tool-waterflow/pom.xml
index b1a25bc460..0e9260dc1a 100644
--- a/app-builder/plugins/tool-waterflow/pom.xml
+++ b/app-builder/plugins/tool-waterflow/pom.xml
@@ -69,7 +69,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test
diff --git a/app-builder/services/aipp-template-render-service/pom.xml b/app-builder/services/aipp-template-render-service/pom.xml
new file mode 100644
index 0000000000..99ef01078c
--- /dev/null
+++ b/app-builder/services/aipp-template-render-service/pom.xml
@@ -0,0 +1,20 @@
+
+
+ 4.0.0
+
+ modelengine.fit.jade
+ app-builder-service-parent
+ 1.0.0-SNAPSHOT
+
+
+ modelengine.jade.service
+ aipp-template-render-service
+
+
+ 17
+ 17
+ UTF-8
+
+
\ No newline at end of file
diff --git a/app-builder/services/aipp-template-render-service/src/main/java/modelengine/fit/jade/aipp/template/render/TemplateService.java b/app-builder/services/aipp-template-render-service/src/main/java/modelengine/fit/jade/aipp/template/render/TemplateService.java
new file mode 100644
index 0000000000..dfa8c17949
--- /dev/null
+++ b/app-builder/services/aipp-template-render-service/src/main/java/modelengine/fit/jade/aipp/template/render/TemplateService.java
@@ -0,0 +1,26 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+package modelengine.fit.jade.aipp.template.render;
+
+import java.util.Map;
+
+/**
+ * 模板渲染服务接口,提供基于变量替换的模板渲染功能。
+ *
+ * @author 孙怡菲
+ * @since 2025-08-29
+ */
+public interface TemplateService {
+ /**
+ * 渲染文本模板。
+ *
+ * @param template 模板内容,包含变量占位符。
+ * @param args 模板变量映射,key 为变量名,value 为变量值。
+ * @return 渲染后的完整文本内容。
+ */
+ String renderTemplate(String template, Map args);
+}
diff --git a/app-builder/services/dynamic-form-genericable/pom.xml b/app-builder/services/dynamic-form-genericable/pom.xml
index 24f8c2acae..79d45b4b78 100644
--- a/app-builder/services/dynamic-form-genericable/pom.xml
+++ b/app-builder/services/dynamic-form-genericable/pom.xml
@@ -18,12 +18,12 @@
org.fitframework
fit-api
- 3.5.1
+ ${fit.version}
org.fitframework
fit-util
- 3.5.1
+ ${fit.version}
modelengine.fit.jane
@@ -33,7 +33,7 @@
org.fitframework.service
fit-http-classic
- 3.5.1
+ ${fit.version}
org.projectlombok
diff --git a/app-builder/services/pom.xml b/app-builder/services/pom.xml
index 46a9cd5419..4bbfcd7cc5 100644
--- a/app-builder/services/pom.xml
+++ b/app-builder/services/pom.xml
@@ -25,6 +25,7 @@
aipp-prompt-builder
aipp-rewriter
aipp-service
+ aipp-template-render-service
aipp-variable-aggregation
app-base
dynamic-form-genericable
diff --git a/app-builder/waterflow/java/pom.xml b/app-builder/waterflow/java/pom.xml
index 242a631532..6b429b7968 100644
--- a/app-builder/waterflow/java/pom.xml
+++ b/app-builder/waterflow/java/pom.xml
@@ -21,7 +21,7 @@
17
- 3.5.1
+ 3.5.3
1.0.0-SNAPSHOT
diff --git a/app-builder/waterflow/java/waterflow-dependency/pom.xml b/app-builder/waterflow/java/waterflow-dependency/pom.xml
index 2f01e5f0ba..8ce3d038cb 100644
--- a/app-builder/waterflow/java/waterflow-dependency/pom.xml
+++ b/app-builder/waterflow/java/waterflow-dependency/pom.xml
@@ -14,10 +14,10 @@
17
- 3.5.1
- 3.5.1
+ 3.5.3
+ 3.5.3
1.0.0-SNAPSHOT
- 3.5.1
+ 3.5.3
1.2.20
diff --git a/carver/plugins/tool-execution/pom.xml b/carver/plugins/tool-execution/pom.xml
index 0c2acf6208..bac15ddf4d 100644
--- a/carver/plugins/tool-execution/pom.xml
+++ b/carver/plugins/tool-execution/pom.xml
@@ -50,7 +50,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test
diff --git a/carver/plugins/tool-repository-postgresql/pom.xml b/carver/plugins/tool-repository-postgresql/pom.xml
index 8071aa9589..ad2f753345 100644
--- a/carver/plugins/tool-repository-postgresql/pom.xml
+++ b/carver/plugins/tool-repository-postgresql/pom.xml
@@ -87,7 +87,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test
diff --git a/common/components/ui-word-globalizer/pom.xml b/common/components/ui-word-globalizer/pom.xml
index 928cac1b88..718db12803 100644
--- a/common/components/ui-word-globalizer/pom.xml
+++ b/common/components/ui-word-globalizer/pom.xml
@@ -40,7 +40,7 @@
org.fitframework
fit-dependency-maven-plugin
- 3.5.1
+ ${fit.version}
dependency
diff --git a/common/dependency/pom.xml b/common/dependency/pom.xml
index 90f2ed1a45..08557400ca 100644
--- a/common/dependency/pom.xml
+++ b/common/dependency/pom.xml
@@ -14,9 +14,9 @@
17
- 3.5.1
- 3.5.1
- 3.5.1
+ 3.5.3
+ 3.5.3
+ 3.5.3
1.0.0-SNAPSHOT
1.0.0-SNAPSHOT
1.0.0-SNAPSHOT
@@ -377,6 +377,11 @@
aipp-file-extract-service
1.0.0-SNAPSHOT
+
+ modelengine.jade.service
+ aipp-template-render-service
+ 1.0.0-SNAPSHOT
+
diff --git a/common/plugins/schema-generator/pom.xml b/common/plugins/schema-generator/pom.xml
index 7b418bcd9d..3a7345db5d 100644
--- a/common/plugins/schema-generator/pom.xml
+++ b/common/plugins/schema-generator/pom.xml
@@ -45,7 +45,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test
diff --git a/common/plugins/schema-validator-everit-h1/pom.xml b/common/plugins/schema-validator-everit-h1/pom.xml
index 09a1bebd02..bc1bc16681 100644
--- a/common/plugins/schema-validator-everit-h1/pom.xml
+++ b/common/plugins/schema-validator-everit-h1/pom.xml
@@ -54,7 +54,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test
diff --git a/frontend/src/assets/icon.js b/frontend/src/assets/icon.js
index a2ea532ea0..e57682010e 100644
--- a/frontend/src/assets/icon.js
+++ b/frontend/src/assets/icon.js
@@ -64,6 +64,7 @@ const TextToImageIcon = (props) => ( ()} {...props} />;
const LoopIcon = (props) => ()} {...props} />;
const PairingIcon = (props) => ()} {...props} />;
+const TextConcatenateIcon = (props) => ;
export {
LeftArrowIcon,
@@ -121,6 +122,7 @@ export {
TextToImageIcon,
FileExtractionIcon,
LoopIcon,
- PairingIcon
+ PairingIcon,
+ TextConcatenateIcon
}
diff --git a/frontend/src/components/icons/base.tsx b/frontend/src/components/icons/base.tsx
index b7da05fa1f..2e83c1441a 100644
--- a/frontend/src/components/icons/base.tsx
+++ b/frontend/src/components/icons/base.tsx
@@ -952,5 +952,21 @@ export const BaseIcons = {
+ ),
+ TextConcatenate:() =>(
+
)
}
diff --git a/frontend/src/pages/addFlow/components/basic-item.tsx b/frontend/src/pages/addFlow/components/basic-item.tsx
index 14bfd651bd..a5adaf8b5b 100644
--- a/frontend/src/pages/addFlow/components/basic-item.tsx
+++ b/frontend/src/pages/addFlow/components/basic-item.tsx
@@ -24,6 +24,7 @@ import {
FileExtractionIcon,
LoopIcon,
PairingIcon,
+ TextConcatenateIcon,
} from '@/assets/icon';
import { handleClickAddBasicNode, handleDragBasicNode } from '../utils'
@@ -60,7 +61,8 @@ const BasicItems = (props: any) => {
'noteNode': ,
'loopNodeState': ,
'manualCheckNodeState': ,
- 'parallelNodeState':
+ 'parallelNodeState': ,
+ 'textConcatenateNodeState':
}[type];
}
return <>
diff --git a/pom.xml b/pom.xml
index 0e162ed1a8..62ed7b2fec 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@
17
- 3.5.1
+ 3.5.3
1.0.0-SNAPSHOT
diff --git a/store/plugins/store-tool-deployer/pom.xml b/store/plugins/store-tool-deployer/pom.xml
index 37ef8efea1..1cefce1ffc 100644
--- a/store/plugins/store-tool-deployer/pom.xml
+++ b/store/plugins/store-tool-deployer/pom.xml
@@ -49,7 +49,7 @@
org.fitframework.fel
tool-info
- 3.5.1
+ ${fit.version}
@@ -64,7 +64,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test
diff --git a/store/plugins/store-tool-uploader/pom.xml b/store/plugins/store-tool-uploader/pom.xml
index 94fc49bbc3..ae656dc14d 100644
--- a/store/plugins/store-tool-uploader/pom.xml
+++ b/store/plugins/store-tool-uploader/pom.xml
@@ -53,7 +53,7 @@
org.fitframework.fel
tool-info
- 3.5.1
+ ${fit.version}
@@ -68,7 +68,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test
diff --git a/store/services/store-service/pom.xml b/store/services/store-service/pom.xml
index 0cefcff986..217d13409a 100644
--- a/store/services/store-service/pom.xml
+++ b/store/services/store-service/pom.xml
@@ -45,7 +45,7 @@
org.fitframework.plugin
fit-message-serializer-json-jackson
- 3.5.1
+ ${fit.version}
test