From 3a99a0232d2dd7e654b4c4387e8cd4a7225ff7ed Mon Sep 17 00:00:00 2001 From: shaohuzhang1 Date: Wed, 8 Apr 2026 12:15:23 +0800 Subject: [PATCH] fix: [Workflow Tool] Form collection nodes cannot be added to the loop body of the workflow tool canvas --- .../flow/step_node/direct_reply_node/i_reply_node.py | 4 ++-- .../flow/step_node/loop_node/impl/base_loop_node.py | 2 ++ ui/src/workflow/common/data.ts | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/application/flow/step_node/direct_reply_node/i_reply_node.py b/apps/application/flow/step_node/direct_reply_node/i_reply_node.py index 9526d3c046a..1a963d76a58 100644 --- a/apps/application/flow/step_node/direct_reply_node/i_reply_node.py +++ b/apps/application/flow/step_node/direct_reply_node/i_reply_node.py @@ -40,7 +40,7 @@ def is_valid(self, *, raise_exception=False): class IReplyNode(INode): type = 'reply-node' support = [WorkflowMode.APPLICATION, WorkflowMode.APPLICATION_LOOP, WorkflowMode.KNOWLEDGE_LOOP, - WorkflowMode.KNOWLEDGE, WorkflowMode.TOOL] + WorkflowMode.KNOWLEDGE, WorkflowMode.TOOL, WorkflowMode.TOOL_LOOP] def get_node_params_serializer_class(self) -> Type[serializers.Serializer]: return ReplyNodeParamsSerializer @@ -48,7 +48,7 @@ def get_node_params_serializer_class(self) -> Type[serializers.Serializer]: def _run(self): if [WorkflowMode.KNOWLEDGE, WorkflowMode.KNOWLEDGE_LOOP, WorkflowMode.TOOL, WorkflowMode.TOOL_LOOP].__contains__( - self.workflow_manage.flow.workflow_mode): + self.workflow_manage.flow.workflow_mode): return self.execute(**self.node_params_serializer.data, **self.flow_params_serializer.data, **{'stream': True}) else: diff --git a/apps/application/flow/step_node/loop_node/impl/base_loop_node.py b/apps/application/flow/step_node/loop_node/impl/base_loop_node.py index 6b03d628664..56aea5c4d20 100644 --- a/apps/application/flow/step_node/loop_node/impl/base_loop_node.py +++ b/apps/application/flow/step_node/loop_node/impl/base_loop_node.py @@ -269,6 +269,8 @@ def execute(self, loop_type, array, number, loop_body, **kwargs) -> NodeResult: from application.flow.loop_workflow_manage import LoopWorkflowManage, Workflow from application.flow.knowledge_loop_workflow_manage import KnowledgeLoopWorkflowManage from application.flow.tool_loop_workflow_manage import ToolLoopWorkflowManage + self.node_params['is_result'] = True + def workflow_manage_new_instance(loop_data, global_data, start_node_id=None, start_node_data=None, chat_record=None, child_node=None): workflow_mode = {WorkflowMode.APPLICATION: WorkflowMode.APPLICATION_LOOP, diff --git a/ui/src/workflow/common/data.ts b/ui/src/workflow/common/data.ts index 8264a14179f..34f7861c426 100644 --- a/ui/src/workflow/common/data.ts +++ b/ui/src/workflow/common/data.ts @@ -942,7 +942,7 @@ export const toolLoopMenuNodes = [ }, { label: t('workflow.nodes.classify.businessLogic'), - list: [conditionNode, replyNode, loopContinueNode, loopBreakNode], + list: [conditionNode, formNode, replyNode, loopContinueNode, loopBreakNode], }, { label: t('workflow.nodes.classify.dataProcessing'),