dify 变量聚合器错误

pvcm50d1  于 1个月前  发布在  其他
关注(0)|答案(1)|浏览(42)

自检

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

Dify 版本

0.6.11

云或自托管

自托管(源代码)

重现步骤

当变量聚合器整合多个知识检索节点时,会发生异常

✔️ 预期行为

  • 无响应*

❌ 实际行为

当变量聚合器整合多个知识检索节点时,会发生异常

w8ntj3qf

w8ntj3qf1#

你好,sheng228!我在这里协助你解决bug、回答问题以及成为贡献者。在我等待人工维护者时,请告诉我如何帮助。

要解决与Dify版本0.6.11中的VariableAssignerNodeData相关的验证问题,其中advanced_settings.groups.0中的output_type错误地设置为array[object],而不是像'string'、'number'、'array'或'object'这样的有效类型,你需要确保output_type被设置为有效类型之一。

在提供的代码中,outputType是根据以下逻辑确定的:

const outputType = useMemo(() => {
  if (!groupEnabled)
    return item.variableAssignerNodeData.output_type
  const group = item.variableAssignerNodeData.advanced_settings?.groups.find(group => group.groupId === item.targetHandleId)
  return group?.output_type || ''
}, [item.variableAssignerNodeData, item.targetHandleId, groupEnabled])

要修复此问题,你应该确保item.variableAssignerNodeDatagroup.output_type中的output_type被设置为有效类型。你可以添加一个验证检查来强制执行这一点:

const validOutputTypes = ['string', 'number', 'array', 'object'];

const outputType = useMemo(() => {
  if (!groupEnabled)
    return validOutputTypes.includes(item.variableAssignerNodeData.output_type) ? item.variableAssignerNodeData.output_type : 'string'; // Default to 'string' or handle error
  const group = item.variableAssignerNodeData.advanced_settings?.groups.find(group => group.groupId === item.targetHandleId)
  return validOutputTypes.includes(group?.output_type) ? group.output_type : 'string'; // Default to 'string' or handle error
}, [item.variableAssignerNodeData, item.targetHandleId, groupEnabled]);

这确保了outputType始终被设置为有效类型,如果当前值无效,则默认为'string'。根据需要调整默认类型。

此外,Dify代码库中的VariableAssignerNodeDataAdvancedSettings类强制要求output_type必须是有效类型('string'、'number'、'array'、'object'):

from typing import Literal, Optional
from pydantic import BaseModel

class AdvancedSettings(BaseModel):
    group_enabled: bool

    class Group(BaseModel):
        output_type: Literal['string', 'number', 'array', 'object']
        variables: list[list[str]]
        group_name: str

    groups: list[Group]

class VariableAssignerNodeData(BaseModel):
    type: str = 'variable-assigner'
    output_type: str
    variables: list[list[str]]
    advanced_settings: Optional[AdvancedSettings] = None

这个Pydantic模型确保output_type根据允许的类型进行验证,防止出现无效值,如array[object]1(https://github.com/langgenius/dify/blob/main/web/app/components/workflow/nodes/variable-assigner/components/node-group-item.tsx)2(https://github.com/langgenius/dify/blob/main/api/core/workflow/nodes/variable_aggregator/entities.py)。

此外,Dify代码库中的variable/utils.ts文件包含处理不同节点类型及其输出结构的逻辑,确保正确设置和验证output_type:

case BlockEnum.VariableAssigner: {
  const {
    output_type,
    advanced_settings,
  } = data as VariableAssignerNodeType
  const isGroup = !!advanced_settings?.group_enabled
  if (!isGroup) {
    res.vars = [
      {
        variable: 'output',
        type: output_type,
      },
    ]
  }
  else {
    res.vars = advanced_settings?.groups.map((group) => {
      return {
        variable: group.group_name,
        type: VarType.object,
        children: [{
          variable: 'output',
          type: group.output_type,
        }],
      }
    })
  }
  break
}

这确保了在output_type3(https://github.com/langgenius/dify/blob/main/web/app/components/workflow/nodes/_base/components/variable/utils.ts)的上下文中正确设置和验证VariableAssignerNodeType

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

相关问题