dify 上游节点删除不自动移除下游节点中的相关引用

ss2ws0br  于 2个月前  发布在  其他
关注(0)|答案(2)|浏览(34)

自检

  • 这仅用于提交 bug 报告,如果您想提问,请访问 Discussions
  • 我已在 search for existing issues 中搜索了现有问题,包括已关闭的问题。
  • 我确认我使用英文提交此报告(我已阅读并同意 Language Policy )。
  • 请务必使用英文提交 Issue,否则会被关闭。谢谢!:)
  • 请不要修改此模板 :) 并填写所有必需的字段。

Dify 版本

0.6.11

云或自托管

云、自托管(Docker)、自托管(源代码)

重现步骤

  1. 创建一个具有输出变量的上游节点。
  2. 将这些输出变量链接到下游节点。
  3. 删除上游节点。

✔️ 预期行为

在删除上游节点后,其输出变量在下游节点中的任何引用应自动删除。

❌ 实际行为

已删除的上游节点的输出变量在下游节点中的引用仍然存在,可能导致错误或未定义的行为。

eqoofvh9

eqoofvh91#

步骤1

步骤2

步骤3

eqfvzcg8

eqfvzcg82#

要解决在下游节点中仍然存在已删除上游节点输出变量引用的问题,您可以使用 removeUsedVarInNodes 函数。该函数旨在从下游节点中删除对变量的引用。
以下是相关的代码片段:

const removeUsedVarInNodes = useCallback((varSelector: ValueSelector) => {
    const nodeId = varSelector[0]
    const { getNodes, setNodes } = store.getState()
    const afterNodes = getAfterNodesInSameBranch(nodeId)
    const effectNodes = findUsedVarNodes(varSelector, afterNodes)
    if (effectNodes.length > 0) {
      const newNodes = getNodes().map((node) => {
        if (effectNodes.find(n => n.id === node.id))
          return updateNodeVars(node, varSelector, [])

        return node
      })
      setNodes(newNodes)
    }
  }, [getAfterNodesInSameBranch, store])

要使用此功能,请调用 removeUsedVarInNodes 并传入适当的 varSelector(用于标识要删除的变量)。这将更新节点并删除已删除变量的引用。
此外,web/app/components/workflow/nodes/variable-assigner/use-config.ts 文件中的 useConfig 钩子提供了一种全面的方法来管理变量赋值及其引用。它包括处理变量删除的函数,如 handleGroupRemovedonRemoveVarConfirm,以确保正确更新或删除引用。
例如,onRemoveVarConfirm 函数确保所有已删除变量的引用都被清理:

const onRemoveVarConfirm = useCallback(() => {
    removedVars.forEach((v) => {
      removeUsedVarInNodes(v)
    })
    hideRemoveVarConfirm()
    if (removeType === 'group') {
      const newInputs = produce(inputs, (draft) => {
        draft.advanced_settings.groups.splice(removedGroupIndex, 1)
      })
      setInputs(newInputs)
    }
    else {
      // removeType === 'enableChanged' to enabled
      const newInputs = produce(inputs, (draft) => {
        draft.advanced_settings.group_enabled = false
        draft.output_type = draft.advanced_settings.groups[0].output_type
        draft.variables = draft.advanced_settings.groups[0].variables
      })
      setInputs(newInputs)
    }
  }, [removedVars, hideRemoveVarConfirm, removeType, removeUsedVarInNodes, inputs, setInputs, removedGroupIndex])

通过使用这些函数,您可以确保已删除上游节点输出变量的所有引用都从下游节点中删除,防止潜在错误或未定义行为 1(https://github.com/langgenius/dify/blob/main/web/app/components/workflow/hooks/use-workflow.ts)2(https://github.com/langgenius/dify/blob/main/web/app/components/workflow/nodes/variable-assigner/use-config.ts)。

  • 要继续与 Dosu 交谈,请提及 @dosu。*

相关问题