Skip to content

[Feature] 功能建议:可阻塞执行的「自定义 HTML 表单」节点 让 html_rander暂停工作流并返回 JSON #6526

Description

@Takunsyo

MaxKB Version

MaxKB v2.10.2-lts(专业版)

Please describe your needs or suggestions for improvements

「表单收集」节点目前只支持静态配置的固定字段列表。当工作流需要操作
员对运行时才能确定数量的列表(N 个条目)进行逐项确认时,没有可用的
方案:

  • 对每个条目循环一次表单节点可以实现,但会产生 N 个连续的表单页面。
    在我们的派工工作流中,操作员一次需要复核 30–50 个检查项——30–50 连续
    弹出的表单队列基本不可用。
  • html_rander 可以在一个页面里渲染丰富的自定义 UI(复选框列表、分组
    单选、实时预览),但它无法阻塞工作流,也无法把结构化数据返回给下游
    节点
    • iframe 仅带 sandbox="allow-scripts" → opaque origin(源为 null)→
      无法访问父页面 DOM(已实测:parent.document
      parent.document.forms、对输入框赋值均抛出 SecurityError),
      因此也无法代填「表单收集」节点的字段。
    • sendMessage(str) 发送的是一条聊天消息,会直接结束当前轮次——
      用于入口表单没问题,但无法作为工作流中间节点的输入。
    • 兄弟 iframe 之间的 postMessage 可用,但数据只停留在前端,
      服务端的 Python / SQL / LLM 节点永远拿不到。

我们目前的临时方案是自建了一套 iframe 之间的 postMessage 总线,让后续的
html 块在前端消费用户的选择结果——能用,但确认后的数据对 Python/SQL/LLM
节点完全不可见,只能做别扭的前后端混合设计。

Please describe the solution you suggest

方案 A —— 可阻塞的自定义表单节点(首选)

新增一种节点类型:在现有的沙箱 iframe 中渲染作者提供的 HTML,并像
「表单收集」一样暂停工作流,当页面调用注入的全局函数时恢复执行,例如:

// 在沙箱 iframe 内可用,与现有的 sendMessage() 同类
submitForm({ confirmed_ids: ["3", "19"], qty: 2, note: "..." });
  • 参数(可 JSON 序列化的对象)成为该节点的输出:
    {{自定义表单节点.result.confirmed_ids}} 等。
  • 沙箱保持现状(仅 allow-scripts)——桥接方式是注入函数,
    不需要 allow-same-origin
  • 加分项:超时/重新提示选项;提交后保留页面为只读展示的开关。

方案 B —— 表单收集节点支持动态字段

允许「表单收集」节点绑定上游变量{label, value, checked, description} 数组),由原生
表单渲染。灵活性不如方案 A,但能覆盖变长列表确认的场景。

Additional Information

价值说明

任何需要人工复核 LLM 变长输出的工作流(复核 N 个选定结果、批准 N 个检查
项、从 N 个候选中选择)都会撞上这堵墙。方案 A 只需一个与现有
sendMessage 对称的单函数 API(submitForm),就能把 html_rander 从
纯展示层升级为一等输入界面。

环境信息

  • MaxKB v2.10.2-lts 专业版,工作流应用
  • 实测 iframe 属性:<iframe srcdoc allow="geolocation" sandbox="allow-scripts">

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions