在“代码执行”节点中无法单独关联 input_file, rules_file, stock_file,并怀疑与 userinput.files 有关。请求提供正确映射变量或处理遗留字段的官方方法。

在“代码执行”节点中无法单独关联 input_file, rules_file, stock_file,并怀疑与 userinput.files 有关。请求提供正确映射变量或处理遗留字段的官方方法。

@Dify_Forum_Helper 简单帮我追问一下更多信息,待会发给技术支持。

我这边先帮你向 TA 补充追问一些关键信息,方便技术支持后面排查:


@tiantian0920 想跟你确认几件事,麻烦有空补充一下哈:

  1. 当前使用的 Dify 版本号是多少?

    • 如果是自建 Docker,可以看 docker-compose.ymllanggenius/dify 的 tag
    • 或者在「设置 → 关于」里看版本号截图
  2. 你的输入字段配置具体是怎样的?
    从截图看,开始节点有 3 个文件输入:

    • input_file_(注意这里尾部是 _ 还是没有?)
    • rules_file
    • stock_file
      代码执行节点右侧「输入变量」里,也建了同名的 3 个变量。想确认下:
    • 这 3 个变量的类型是否都设置为 File
    • 代码里是通过 variables["input_file"] / variables["rules_file"] / variables["stock_file"] 这样的方式读取的吗?可以贴一小段关键代码(脱敏即可)。
  3. 现在具体遇到的问题表现是:

    • 在代码执行节点的「输入变量」那里,下拉列表里能不能分别选到 input_file_ / rules_file / stock_file
    • 还是说三个变量都只能映射到同一个 userinput.files(LEGACY)?
    • 运行时实际拿到的是:
      • 全部都为空?
      • 还是 3 个变量拿到的其实是同一个文件?
        麻烦可以贴一张代码执行节点的「输入变量映射」配置截图(右侧那块),以及一张运行记录里变量实际值的截图。
  4. 是否是从旧版本拷贝/导入的工作流?
    因为你这里显示了 userinput.files (LEGACY)

    • 这个字段通常是旧版本的「用户上传文件集合」遗留字段
    • 想确认:这个工作流是新建的,还是从很早之前的工作流复制/导入过来的?
    • 如果是旧流复制过来,开始节点里是否还有隐藏或已删除但没完全清理掉的旧文件字段?
  5. 你期望的行为是怎样的?
    是想要:

    • 用户一次上传 3 个不同用途的文件(输入文件 / 规则表 / 库存表),
    • 然后在代码里能分别拿到:
      input_file  # 用户输入文件
      rules_file  # 规则表
      stock_file  # 库存表
      

    对吗?还是希望它们最后合并成一个数组再处理?


我这边也会把这些问题点整理给技术支持:

  • 当前 UI 同时存在:单独文件变量(input_file / rules_file / stock_file)和 userinput.files (LEGACY),需要确认:
    • 现在的正确映射方式:是否推荐完全不用 userinput.files,而是直接让代码执行节点 1:1 绑定到每个文件字段?
    • 对于已经存在 userinput.files 的老工作流,官方推荐的迁移/清理方式 是什么(比如:重新新建开始节点字段 + 重新绑定 code 节点,还是有系统级迁移逻辑)?
    • LEGACY 字段是否可能干扰到新字段的自动映射或运行结果?

等你把上面的信息和截图补充一下,我会一起转给技术支持,方便他们给出「正确的变量映射方式」以及「如何处理/迁移 userinput.files (LEGACY)」的官方建议。

1、版本号V4.57.0

2、代码里是这样的

先把目前能确认的信息和建议整理给你,方便你和技术支持对齐:


1. 版本 & 代码情况梳理

  • 你当前版本:v4.57.0
  • 代码里是函数签名形式:
def calculate_blank(input_file, rules_file, stock_file):
    df_input = pd.read_excel(input_file)
    df_rules = pd.read_excel(rules_file)
    df_stock = pd.read_excel(stock_file)

说明你的预期是:在「代码执行」节点中,直接拿到 3 个 单独的文件变量


2. 目前 Dify 的“推荐思路”(结合版本和 UI 变化)

在 4.x 以后的版本里,文件输入已经从早期的统一 userinput.files,演进成「每个输入字段一个独立的 File 变量」:

  • 开始节点:

    • input_file_(注意你截图里似乎有个尾巴 _
    • rules_file
    • stock_file
  • 代码执行节点右侧「输入变量」面板里,你应该这样配置(核心是 1:1 手动绑定,而不是再用 userinput.files):

    • 新建 3 个输入变量,类型都设为 File
      • input_file → 映射到「开始节点 / input_file_」
      • rules_file → 映射到「开始节点 / rules_file」
      • stock_file → 映射到「开始节点 / stock_file」

    然后你的代码就可以直接用你贴出来的那种函数签名。

userinput.files (LEGACY) 一般是老版本统一文件集合的兼容字段,在新设计里并不再推荐使用,尤其是像你这样需要区分多个业务含义文件的场景。


3. 建议你现在重点自查这几项

  1. 变量名是否完全一致

    • 开始节点字段叫 input_file_,而你函数里是 input_file
      • 如果右侧代码节点输入变量叫 input_file,但它实际映射到的开始节点字段是 input_file_,这是允许的(名字不要求完全相同),
      • 但要确认:右侧「输入变量 → input_file」里,下拉选中的是 开始·input_file_,而不是选成了 userinput.files (LEGACY)
  2. 每个变量都手动绑定到具体字段

    • 在代码执行节点右侧:
      • input_file 这一行的来源一定要选:用户输入 · input_file_
      • rules_file → 选:用户输入 · rules_file
      • stock_file → 选:用户输入 · stock_file
    • 如果下拉里还能看到 userinput.files (LEGACY)保持不选,不配置任何变量指向它
  3. 运行时检查变量值类型
    在代码开头先打印一下,确认拿到的是文件对象(而不是 None 或字符串):

    import pandas as pd
    
    def calculate_blank(input_file, rules_file, stock_file):
        print("DEBUG input_file =", input_file)
        print("DEBUG rules_file =", rules_file)
        print("DEBUG stock_file =", stock_file)
    
        df_input = pd.read_excel(input_file)
        df_rules = pd.read_excel(rules_file)
        df_stock = pd.read_excel(stock_file)
        ...
    

    然后在「上次运行」里看 3 个变量的值,确认是否分别对应你上传的 3 个 Excel。


4. 关于 userinput.files (LEGACY) 的处理建议

在目前能看到的信息下,可以先按下面的“保守做法”处理:

  1. 新建 / 重建开始节点字段(如果这个流程是从老版本复制、导入来的):

    • 确认开始节点的 3 个输入字段确实是新版「文件」类型(File),而不是历史遗留的那种合并字段。
    • 如果一开始是从旧流复制,可以考虑:
      • 新增 3 个新的 File 字段(比如 input_file_new 等),
      • 在代码节点重新映射,确认没问题后,再删除旧字段和 userinput.files (LEGACY)
  2. 在整个流程里不再使用 userinput.files

    • 不在任何节点引用它;
    • 不再依赖它做文件分发;
    • 真正都从单独的 File 字段读取。

后续如果官方给出更明确的“如何清理 / 迁移 LEGACY 字段”的说明,可以再按照官方步骤做最后一次整理;但在此之前,“不用它 + 全部走显式字段”通常是最安全的做法。


5. 建议你再补几张截图,方便技术支持精确判断

你现在已经给了函数代码,非常有用。再补两张的话,会更容易定位问题:

  1. 代码执行节点右侧「输入变量」的完整截图

    • 让人能看到:input_file / rules_file / stock_file 三行各自映射到哪个来源字段。
  2. 「上次运行」→ 查看该节点的输入数据截图

    • 展示一下这三个变量在运行时的实际值(是否为空 / 是否变成同一个文件)。

我会基于你补的这两张,再帮你把“当前行为”和“预期行为”的差异总结成要点,转给技术支持,重点说明:

  • v4.57.0 上,新老字段混用时的行为;
  • 是否存在 bug(比如映射 UI 允许选,但运行时都指向同一个文件或为空);
  • 能否把 userinput.files (LEGACY) 完全隐藏或一键迁移。

如果你方便,也可以顺手说明一下:这个工作流是新建的,还是从老版本复制/导入的? 这个信息也会影响官方的排查方向。

3、在代码执行节点的「输入变量」那里,下拉列表里不能分别选到 input_file_ / rules_file / stock_file,只能点击

screenshot(2)可以选择,

4、我是购买技术人员远程安装的,不是从旧版本拷贝/导入的工作流,是新建的

5、想要用户一次上传 3 个不同用途的文件(输入文件 / 规则表 / 库存表),

  • 然后在代码里能分别拿到:

    input_file  # 用户输入文件
    rules_file  # 规则表
    stock_file  # 库存表
    

直接让代码执行节点 1:1 绑定到每个文件字段,不想要userinput.files,不然在设置对应的标量值时,,无法选择对应的文件