From 32fcbcdc626334718e97889affd4e4c70621f332 Mon Sep 17 00:00:00 2001 From: zhsama Date: Tue, 10 Feb 2026 16:39:04 +0800 Subject: [PATCH] feat(workflow): refine variable validation and scoping for workflow nodes, remove redundant End block checks --- .../workflow-variable-block/component.tsx | 19 ++++++++++++++++--- .../workflow/hooks/use-available-blocks.ts | 4 ++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/web/app/components/base/prompt-editor/plugins/workflow-variable-block/component.tsx b/web/app/components/base/prompt-editor/plugins/workflow-variable-block/component.tsx index e2040af375..6401ba0c54 100644 --- a/web/app/components/base/prompt-editor/plugins/workflow-variable-block/component.tsx +++ b/web/app/components/base/prompt-editor/plugins/workflow-variable-block/component.tsx @@ -70,14 +70,27 @@ const WorkflowVariableBlockComponent = ({ )() const [localWorkflowNodesMap, setLocalWorkflowNodesMap] = useState(workflowNodesMap) const [localNodeOutputVars, setLocalNodeOutputVars] = useState(nodeOutputVars || []) + const scopedNodeOutputVars = useMemo(() => { + if (!localNodeOutputVars.length) + return [] + + const candidateNodeIds = [variables[0], variables[1]].filter(Boolean) + if (!candidateNodeIds.length) + return localNodeOutputVars + + return localNodeOutputVars.filter(item => candidateNodeIds.includes(item.nodeId)) + }, [localNodeOutputVars, variables]) const node = localWorkflowNodesMap![variables[isRagVar ? 1 : 0]] const isContextVariable = (node?.type === BlockEnum.Agent || node?.type === BlockEnum.LLM) && variables[variablesLength - 1] === 'context' const isException = isExceptionVariable(varName, node?.type) const variableValid = useMemo(() => { - if (localNodeOutputVars.length) - return isValueSelectorInNodeOutputVars(variables, localNodeOutputVars) + if (localNodeOutputVars.length) { + if (!scopedNodeOutputVars.length) + return false + return isValueSelectorInNodeOutputVars(variables, scopedNodeOutputVars) + } let variableValid = true const isEnv = isENV(variables) @@ -102,7 +115,7 @@ const WorkflowVariableBlockComponent = ({ variableValid = !!node } return variableValid - }, [variables, node, environmentVariables, conversationVariables, isRagVar, ragVariables, localNodeOutputVars]) + }, [variables, node, environmentVariables, conversationVariables, isRagVar, ragVariables, localNodeOutputVars, scopedNodeOutputVars]) const reactflow = useReactFlow() const store = useStoreApi() diff --git a/web/app/components/workflow/hooks/use-available-blocks.ts b/web/app/components/workflow/hooks/use-available-blocks.ts index 3d92142b10..888e126474 100644 --- a/web/app/components/workflow/hooks/use-available-blocks.ts +++ b/web/app/components/workflow/hooks/use-available-blocks.ts @@ -30,7 +30,7 @@ export const useAvailableBlocks = (nodeType?: BlockEnum, inContainer?: boolean) return availableNodesType }, [availableNodesType, nodeType]) const availableNextBlocks = useMemo(() => { - if (!nodeType || nodeType === BlockEnum.End || nodeType === BlockEnum.LoopEnd || nodeType === BlockEnum.KnowledgeBase) + if (!nodeType || nodeType === BlockEnum.LoopEnd || nodeType === BlockEnum.KnowledgeBase) return [] return availableNodesType @@ -42,7 +42,7 @@ export const useAvailableBlocks = (nodeType?: BlockEnum, inContainer?: boolean) availablePrevBlocks = [] let availableNextBlocks = availableNodesType - if (!nodeType || nodeType === BlockEnum.End || nodeType === BlockEnum.LoopEnd || nodeType === BlockEnum.KnowledgeBase) + if (!nodeType || nodeType === BlockEnum.LoopEnd || nodeType === BlockEnum.KnowledgeBase) availableNextBlocks = [] return {