重新思考 Workrun:AI 时代,我们还需要手动编排 Workflow 吗?

22 阅读15分钟

最近在做 Workrun 的时候,我越来越频繁地问自己一个问题:

用户只是想完成一件事,为什么要先学会搭建一个工作流?

这个问题有点尴尬,因为 Workrun 原本就在做这件事:提供一个可视化画布,让用户添加节点、配置模型、接入工具,再通过连线把它们组织成可以执行的流程。

从工程角度看,这套设计很自然。节点承担处理逻辑,连线表达执行顺序,状态负责数据共享。需要模型就放一个 Agent 节点,需要调用应用就接入对应能力,需要人工参与就增加一个交互节点。

但随着功能逐渐丰富,我发现,Workrun 虽然提供了不少 AI 能力,使用方式却仍然很传统。

用户需要先理解系统,再想办法使用系统完成自己的工作。

这篇文章想聊聊我为什么开始重新设计 Workrun,以及目前的一些思考和实践。相关功能还在持续迭代,很多问题也没有最终答案。

有了 Agent 节点,应用就算 AI 化了吗?

最初,我把很多精力放在节点能力上。

Agent 能接哪些模型,工具如何挂载,MCP 如何接入,Skills 怎样使用,节点之间如何共享数据。这些工作都很重要,缺了它们,工作流就只能停留在画布上。

先看一个 Workrun 现有能力的演示:查询天气,再根据天气规划行程。这个流程通过可视化编辑器配置,节点负责不同的处理步骤,工具提供实际能力,连线组织执行顺序。

weather-trip-planning.gif

受素材大小限制,压缩后比较模糊,如果想查看更清楚的演示视频,可以直接进入 Workrun 的官网查看: workrun-docs.pages.dev/#an-everyda…

这个流程可以正常运行,但在点击运行之前,用户需要先把它搭建出来。

随着节点和能力越来越丰富,配置时需要做的选择也越来越多。面对一个任务,用户得先判断:

  • 应该使用普通 Agent,还是具备代码执行能力的节点?
  • 需要接入哪些工具?
  • 输入文件怎样交给处理节点?
  • 上一个节点的结果,怎样让下一个节点访问?
  • 哪些字段应该作为最终输出?

对熟悉系统的人来说,这些配置都有明确的含义。但用户最初表达的需求,可能只有一句话:

帮我处理这份资料,整理成一份报告。

从这句话到一张可执行的流程图,中间还隔着一段不小的距离。而在原来的设计里,这段距离主要由用户自己走完。

我开始觉得,仅仅把模型放进节点,并没有充分改变这个应用的使用方式。

AI 已经能够理解自然语言、选择工具,也能够根据反馈修改方案。既然如此,Workrun 是否可以承担更多配置工作,让用户直接从目标开始?

我想先改变入口

重新设计时,我首先把目标放到了对话上。

用户打开 Workrun,可以直接说自己要做什么。系统理解任务、检查输入,再判断接下来应该怎样处理。

这里有一个很容易被忽略的细节:并不是每个任务都需要创建 Workflow。

如果用户只是临时处理一份文件,现有能力足以完成,那么直接完成就好。为了处理一次任务,先创建一个工作流,再执行它,会多出一份需要管理的定义。

只有当用户表达出复用或自动化的需要时,Workflow 才应该成为讨论的重点。

下面这段视频展示了我正在迭代的交互。我先上传一份销售数据,提出一个普通需求:

帮我分析一下这份销售数据。

这时,系统直接处理当前任务。随后,我补充了另一个需求:

以后要重复做,整理成流程,先不要运行。

系统由此进入规划阶段,检查可用能力,形成方案,等待用户确认后再创建 Workflow。

Recording_2026_10_21_10_53_05.gif

受素材大小限制,动图只展示最终的对话记录和生成结果,没有完整录下等待与执行过程。压缩后部分文字较小,下面会结合流程图说明设计。

动图对应的演示视频原件上传到了 Github,如果有需要可以自行查看(会触发下载):github.com/1111mp/work…

整个过程中,用户表达的是自己要做什么,以及希望何时创建、是否运行。具体使用哪些节点、怎样配置工具、如何传递数据,由系统根据 Workrun 的实际能力决定。

其中,“先不要运行”是一个明确边界。创建完成后,用户得到的是一份可以查看、修改和重复使用的 Workflow。执行需要后续单独提出,不能因为流程已经保存,就自动开始运行。

这段演示也是近期开发中使用的测试场景之一。它能展示目前的交互方式,但自主编排的稳定性和结果正确性仍需要在更多任务中验证。

我希望产品逐步形成这样的处理路径:

graph TD
A[用户通过对话表达需求] --> B[主 Agent 理解目标并检查输入]
B --> C{是否需要复用或自动化}

C -->|一次性任务| D[使用现有能力直接处理]
D --> E[交付结果]

C -->|需要复用| F[发现已有 Workflow 和相关能力]
F --> G{已有流程是否适合}

G -->|适合| H[选择已有 Workflow]
G -->|不适合| I[规划并讨论方案]
I --> J[用户确认当前版本]
J --> K[配置 校验并保存 Workflow]

H --> L{当前是否授权执行}
K --> L
L -->|是| M[执行并交付实际结果]
L -->|否| N[保留定义 等待后续使用]

复用在这里同样重要。如果已有合适的 Workflow,就应该优先使用,而不是每次都重新生成。

这也是我现在对 Everything is workflow 的理解:系统能够把工作组织成流程,并在需要的时候将它沉淀下来。用户不必在每一次请求中主动考虑流程。

AI 主导编排之后,画布怎么办?

我并不打算放弃可视化编辑器。

自己开发和调试 Workrun 时,画布依然很有用。它能直接展示执行顺序、处理边界和节点配置。某个步骤失败了,也更容易找到问题发生在哪里。

只是它在产品中的角色需要调整。

过去,画布是用户表达需求的主要入口。以后,它可以更多地承担检查、修改和调试的职责。

AI 配好了一个 Workflow,用户可以打开它,查看实际使用了什么能力,修改某个节点的指令,调整分支条件,或者限制某些数据的访问范围。

这带来了一项很重要的设计要求:

AI 创建出来的 Workflow,应该与用户手动创建的 Workflow 使用同一套能力和配置。

我不希望维护两套系统。一套给用户在画布里使用,另一套藏在 Agent 后面,依靠特殊协议完成执行。

否则,之后很容易遇到一连串问题:自动生成的流程能不能在编辑器里修改?用户修改之后,Agent 能不能理解?两条执行路径的行为是否一致?

目前选择的方向是让 AI 配置普通的 Workflow。节点、连线、输入输出和状态权限,都沿用 Workrun 已有的原生能力。

这样,用户随时可以接手,系统也有一份明确的定义可以保存、检查和执行。

从一句话到一个流程,中间需要讨论

开始做对话式编排之后,我发现,“理解一句话,然后生成流程”这个描述还是过于简单了。

用户的输入经常是不完整的。一次性任务中可以接受的临时判断,放进一个要反复执行的流程里,可能就成了长期存在的错误假设。

例如:

  • 以后输入文件的格式会不会变化?
  • 遇到缺失数据,应该停止还是继续?
  • 结果需要一段文字,还是一个供其他系统读取的文件?
  • 某些外部操作是否需要人工确认?

这些问题不能全部交给模型猜,也不适合变成一张冗长的必填表单。

我更希望模型能够判断:哪些信息可以自己检查,哪些可以采用明确的默认值,哪些确实需要用户决定。

因此,目前采用了三个 Agent 分工:

角色主要职责
主 Agent理解意图、处理直接任务、维持对话并协调后续动作
Planning Agent发现能力、检查输入、提出问题、形成并修订方案
Workflow Agent根据已确认方案完成配置、校验和保存

实现上使用 adk-rust 的原生 sub_agent 机制。各自的代码、工具和 Skills 分开组织,能够执行的动作也有不同边界。

规划阶段允许探索和调整。真正进入编排阶段时,则需要依据用户确认的内容落地。

整体协作过程如下:

graph TD
    A[用户提出复用需求] --> B[主 Agent]
    B -->|委托规划| C[Planning Agent]
    C --> D[发现能力 检查输入 形成方案]
    D --> E[保存方案版本]
    E --> F[原生检查点暂停 展示方案卡片]

    F --> G{用户反馈}
    G -->|补充信息或修改| H[Planning Agent 修订方案]
    H --> E

    G -->|确认当前版本| I[原生机制记录创建授权]
    I --> J[主 Agent 委托 Workflow Agent]
    J --> K[配置节点 校验并修复]
    K --> L[保存普通 Workflow]
    L --> M[返回 Workflow ID 与未验证事项]

用户不需要告诉 Planning Agent 应该选择哪种节点。但如果不同选择会明显改变结果、成本或外部影响,系统就应该解释清楚。

同时,回答问题不能被当作确认方案。

用户补充了一个条件,只说明方案获得了新信息,并不意味着用户已经接受修改后的全部内容。

确认之后创建,创建之后也不一定执行

这部分看起来像交互细节,实际实现时却很容易出问题。

用户说“整理成流程,先不要运行”,至少包含两个独立要求:创建一个可复用的定义,以及暂时不要执行它。

方案确认又是更前面的一步。

目前,我通过 ADK Graph 和 SQLite 检查点管理这段生命周期。保存方案后,调用会在原生检查点暂停,由界面展示方案卡片。用户可以继续反馈,也可以确认当前版本。

确认后,才进入 Workflow 的配置和保存阶段。

这里没有让模型再生成一遍方案总结。已经有了一份可以审查的方案,就让它成为这个阶段的交付物。

执行授权单独处理。Workflow 保存成功后,系统返回定义和保存结果,等待用户后续提出运行请求。

这种区分也会影响后续对话。

用户要求运行一个已有流程,不能顺带获得重新创建或修改它的授权。某个流程尚未创建,系统也不能因为收到一句“执行一下”,就跳过方案确认。

这些边界仅靠提示词约定并不够,所以我把它们落实在原生任务状态和检查点机制中。模型负责理解与决策,系统负责约束当前可以发生的动作。

模型需要先理解 Workrun

自主编排过程中,一个很直接的教训是:不能假设模型天然知道如何使用这个产品。

模型可能知道工作流是什么,也熟悉常见的 Agent 框架,但这些知识未必对应 Workrun 的实际行为。

以数据传递为例,Workrun 已经有自己的状态机制:

  • 运行输入进入 global state。
  • 节点输出默认位于私有 namespace。
  • 需要共享时,可以发布到 global,或者配置允许访问的节点。
  • 执行顺序由连线决定,数据可见性由状态配置决定。

这些能力本来就存在。自主编排需要做的是理解它们,然后配置它们。

如果模型配置错了,就再增加一套自动映射或隐式传递逻辑,系统会逐渐变得难以解释。用户在画布里看到一套规则,实际运行却可能依靠另一套处理才能成功。

所以,我开始把现有能力整理成模型可以按需读取的资料。

目前大致分为四层:

资料回答的问题
能力总览Workrun 有哪些能力,应该去哪里发现?
角色 Skills如何规划、配置和交付?
节点参考某个节点支持哪些字段,有什么限制?
动态资源发现当前工作区实际有哪些模型、App、工具和 Skills?

静态资料与动态发现共同支持编排,最终仍然落到同一份原生定义上:

graph TD
    A[角色 Skills 与共享能力总览] -.-> B[规划与编排 Agent]
    C[原生节点契约] --> D[生成的节点参考]
    D -.->|按需读取| B
    E[工作区动态资源发现] -.->|真实 ID 与资源契约| B

    B --> F[原生 Workflow 文档]
    F --> G[结构校验与原生编译]
    G -->|发现问题| B
    G -->|校验通过后保存| H[普通 Workflow 目录]

    H --> I[可视化编辑器]
    I -->|修改并保存| H
    H -->|单独授权执行| J[原生 Workflow 执行器]
    J --> K[运行回执 输出与文件产物]

节点参考尽量从原生契约生成,由 generate-workflow-reference.mjs 集成进开发和打包流程。这样可以减少手写文档与代码分别维护带来的偏差。

读取时先提供摘要,需要使用某个节点,再加载详细内容。像 CodeAct 这样的受限运行环境,也需要让模型在规划和配置时了解其支持范围,不能凭一般的 Python 使用经验猜测依赖是否可用。

静态资料不能代替动态发现。文档里介绍了某种工具,不代表用户当前已经安装、配置好了它。

同样,给一个 Agent 配置了 Skill,也不能想当然地认为它已经具备 Skill 所描述的执行能力。它依赖哪些工具、工具是否可用、是否实际配置到了节点上,都需要检查。

“流程跑完了”只是验证的开始

实际测试中,最让我警惕的不是执行报错,而是流程显示完成,输出却没有满足需求。

这类问题有时很隐蔽。

一个普通 Agent 可以生成结构完整、语言流畅的报告。即使没有执行可靠的计算,它也可能写出“已完成自动化计算”。运行系统看到节点正常返回,会将这一轮标记为完成。

但用户关心的是结果对不对。

这让我逐渐把几个判断拆开:

判断能说明什么
配置校验通过当前定义被校验器和编译器接受
节点执行完成技术执行正常结束
所需输出存在声明的结果实际产生
验收条件得到验证有证据支持任务达成

它们需要不同的证据。

结构校验可以发现字段、连接和资源引用的问题,却不能保证处理方法合理。执行完成可以证明技术链路结束,却不能证明计算、解释或外部操作符合预期。

尤其是需要精确、可重复处理的工作,必须有真正适合的执行能力。指令里写着“请准确计算”,并不会让普通模型节点自动获得计算工具。

我也不希望因此规定所有任务必须使用某一种节点。语言生成、数据转换、工具查询、文件处理,本来就有不同的需求。系统应该提供清楚的能力契约,让模型选择合适的方法,再根据任务留下必要的结果和验证证据。

目前已经有一些本地测试,用来检查角色隔离、方案确认、原生状态、暂停恢复和子 Workflow 复用等行为。

不过,这些测试有明确边界。它们能验证机制,不能据此宣布模型已经具备稳定的自主编排能力。后者还需要在不同任务和不同输入下持续评估。

增加更多规则,也可能让事情变复杂

迭代过程中,我也走过一段弯路。

每发现一个问题,就很容易想到再补一段提示词、增加一份记录,或者加入一个新的检查机制。单独看,每项都有理由;放在一起,系统却越来越难理解。

后来我做了一轮减法审查。

有些诊断能力进入了正常请求的关键路径,有些上下文会自动回放大量历史内容,角色说明和 Skills 里也出现了不少重复要求。

它们增加了维护成本,却没有直接证明自主编排变得更可靠。

于是,我撤掉了部分额外机制,也重新压缩了知识资料:

  • 角色说明集中表达职责、授权和交接边界。
  • Skills 说明工作方法与必要步骤。
  • 具体字段和限制留在原生参考中。
  • 真实资源信息通过动态发现取得。

这次调整没有改变节点的状态机制,也没有增加新的工作流协议。

我现在更关注一个实际问题:模型需要某条信息时,能否找到明确、准确的来源?

文档更多不一定更好,文本更短也不能直接等同于效果更好。最终仍然要看它能不能被正确理解,并落实为可用配置。

我现在怎样看待手动编排

回到标题里的问题:AI 时代,我们还需要手动编排 Workflow 吗?

我的答案是,仍然需要保留,但不应该要求每个用户从这里开始。

对熟悉系统、需要精细控制的人来说,手动编辑会一直有价值。对于只想表达目标、获得结果的人来说,系统应该承担更多理解和配置工作。

Workrun 这次重设计,尝试让这两种使用方式共存:

用户从对话开始,和系统一起明确需求;AI 发现已有能力,提出方案,在确认后配置出普通的 Workflow;需要检查、修改或调试时,再回到可视化编辑器。

目前这条链路正在逐步落地,自主编排的稳定性、能力选择和结果验证还在持续迭代。我还不能说,用户随便描述一件事,Workrun 就一定能够生成一个可靠的自动化流程。

但现在的方向比之前更清楚了。

我希望用户最终保存下来的,是一份自己看得懂、改得动,并且换一份输入仍然有用的工作流程。为了得到它,用户不必先学会 Workrun 的每一个配置项。

👉 Workrun GitHub 项目地址:github.com/1111mp/work…

👉 Workrun 官网地址:workrun-docs.pages.dev