数据截至 (上游 commit fefb05ff27be)
Coze Studio 工作流构建器 — 架构与原理
30 秒导读: Coze Studio 的「工作流」让你在画布上拖出一串节点(开始 → 大模型 → 选择器 → 结束……),连上线、配好「这个节点的输入取自那个节点的哪个字段」,点运行就能跑。本文讲清这套东西底层到底怎么实现:前端画布(基于 flowgram 自由布局编辑器)画出来的 JSON,怎样被后端编译成一张 cloudwego/eino 的数据流图,再以字段级依赖驱动并发执行,全程支持流式输出、运行中向用户提问(中断/恢复)、节点出错兜底。
1. 这是什么(零基础也能懂)
一句话定义: 一个可视化、低代码的 AI 编排器——你在画布上把「大模型 / 插件 / 代码 / 条件判断 / 循环」等积木拖出来连成图,平台就能按图执行,产出结果。
解决什么问题 / 给谁用:
假设你要做一个「智能客服」:先用大模型判断用户意图,意图是「退款」就查数据库订单、走退款插件;是「闲聊」就直接让大模型回复。如果纯手写代码,你要自己处理调用顺序、并发、流式输出、出错重试、把上一步的某个字段喂给下一步……很烦。
工作流构建器把这些编排逻辑变成拖拽:节点是积木,连线是「先后/数据流向」,每个节点的输入框里选「取自 XX 节点的 YY 字段」。给不想写后端编排代码的产品/运营/开发者用。
它能做什么:
- 提供 ~50 种内置节点:大模型、插件、子工作流、代码、知识库检索、数据库增删改查、HTTP 请求、条件选择器、循环/批处理、问答、变量聚合等(见
backend/domain/workflow/entity/node_meta.go:259的NodeTypeMetas)。 - 支持流式输出(大模型边生成边吐字)、运行中向用户提问(问答节点会中断、等用户回答再恢复)、节点出错兜底(重试 / 走异常分支 / 返回默认值)。
- 一份工作流可以被别的工作流当子节点嵌套调用,也可以被 Agent 当工具调用 。
用起来什么样:
最小的一条工作流就是「开始 → 大模型 → 结束」。画布存成 JSON(节点列表 + 连线列表),后端拿到后跑一遍,从「开始」节点喂入用户输入,流到「大模型」,再流到「结束」输出。运行时前端能看到每个节点高亮、实时显示输入输出。
一句话直觉/类比:
把它想成可视化的 Unix 管道:每个节点是一个命令,连线是管道
|,但比管道强——管道只能把上一个的 stdout 整个塞给下一个;这里能精确指定「把节点 A 输出的user.name字段,接到节点 B 输入的query字段」,而且多个上游可以汇入一个下游。
2. 顶层全景(它大概怎么转)
整套系统横跨前端画布和后端执行引擎两大块,中间用一份画布 JSON(vo.Canvas)做契约。
┌─────────────────────── 前端(浏览器,React + flowgram)──────────────────────┐
│ │
│ 用户拖拽节点 / 连线 / 配字段映射 │
│ │ │
│ ▼ │
│ flowgram 自由布局画布 ──serialize──► 画布 JSON(节点[] + 连线[]) │
│ (workflow/playground) │
│ │ ▲ │
│ │ 保存 / 点「试运行」 │ 运行时事件(节点高亮、流式字) │
└────────────┼──────────────────────────────────┼──────────────────────────────┘
│ HTTP │ SSE / 轮询
┌────────────▼───────── ─────────────────────────┼──────────────────────────────┐
│ ▼ │ 后端(Go) │
│ ① CanvasToWorkflowSchema │ │
│ 画布 JSON → WorkflowSchema(规整化) │ │
│ │ │ │
│ ▼ │ │
│ ② compose.NewWorkflow │ │
│ WorkflowSchema → eino 数据流图(编译) │ │
│ │ │ │
│ ▼ │ │
│ ③ wf.SyncRun / AsyncRun │ │
│ eino Runner 执行 ──► 节点回调 ──► 事件 ────┘ │
│ (并发 / 流式 / 中断 / 兜底) │
└──────────────────────────────────────────────────────────────────────────────┘
部件一句话职责:
| 部件 | 干什么 | 在哪 |
|---|---|---|
| 画布 / 节点表单 | 用户拖拽编辑,序列化成 JSON | frontend/packages/workflow/playground/、nodes/ |
vo.Canvas | 前后端契约:Nodes[] + Edges[] 的 JSON 结构 | backend/domain/workflow/entity/vo/canvas.go |
CanvasToWorkflowSchema | 把画布 JSON 规整成后端的 WorkflowSchema | backend/domain/workflow/internal/canvas/adaptor/to_schema.go:66 |
WorkflowSchema | 引擎内部的「节点 + 连线 + 层级 + 分支」中间表示 | backend/domain/workflow/internal/schema/workflow_schema.go:35 |
compose.NewWorkflow | 把 WorkflowSchema 编译成 eino 图并 Compile 成 Runner | backend/domain/workflow/internal/compose/workflow.go:83 |
| 节点实现 | 每种节点的真正逻辑(LLM、选择器、代码……) | backend/domain/workflow/internal/nodes/< |