dify之Web 前端工作流编排(Workflow Builder)

Dify 的 Web 前端工作流编排(Workflow Builder) 是整个平台里最复杂、也是最具创新性的部分之一。

下面是一个完整、深入但清晰的技术分析👇:


🧩 一、工作流编排的核心定位

Dify 的"工作流编排"模块(Workflow Builder)是可视化拖拽式的流程设计器,允许用户在网页上像画流程图一样组装 LLM 应用逻辑

它实现了:

  • 拖拽节点(Node)
  • 节点间连线(Edge)
  • 参数设置面板(Properties Panel)
  • 实时预览与执行
  • 流程的保存、发布、执行回调

🧠 二、技术栈概览(前端部分)

模块 技术
框架基础 React + TypeScript
UI组件库 TailwindCSS + Radix UI + Shadcn/UI
工作流可视化引擎 🧩 React Flow(核心)
状态管理 Zustand / React Query
构建工具 Vite
代码组织 Monorepo(基于 pnpm workspace)
国际化 i18next
通信 REST + WebSocket(实时运行状态)

🔧 三、核心依赖:React Flow

Dify 前端工作流界面使用了 React Flow ------ 一个专门用于构建可视化流程图编辑器的 React 库。

它支持:

  • 拖拽节点、缩放、平移
  • 自定义节点类型(例如:LLM 节点、Tool 节点、条件判断节点等)
  • 连线事件与动态计算
  • 节点状态(运行中、错误、完成)可视化

🔗 官方库地址: https://reactflow.dev/

在 Dify 中,你会看到类似以下结构:

复制代码
web/
 ├─ app/
 │   ├─ components/workflow/
 │   │   ├─ index.tsx          ← 工作流主入口
 │   │   ├─ node-types/        ← 自定义节点组件(LLM、HTTP、Condition 等)
 │   │   ├─ edges/             ← 自定义连线样式与逻辑
 │   │   ├─ store.ts           ← Zustand 状态管理
 │   │   ├─ useWorkflow.ts     ← 流程逻辑 Hooks
 │   │   └─ ...
 │   └─ pages/workflow/        ← 页面布局
 ├─ shared/
 │   ├─ api/                   ← 与后端交互
 │   ├─ ui/                    ← 通用UI组件(如 Modal、Sidebar、Tabs)

🧱 四、运行机制(前端层面)

简化流程如下:

  1. 用户拖拽节点

    • React Flow 负责渲染与节点管理;
    • 新节点定义写入 Zustand 全局 store。
  2. 节点参数配置

    • 点击节点 → 打开右侧属性面板;
    • 参数编辑后写入 store;
    • 实时校验。
  3. 连线逻辑

    • React Flow 提供 onConnect() 事件;
    • 保存连线关系,更新 DAG(有向无环图)结构。
  4. 保存/发布

    • 前端序列化工作流(节点 + 连线 + 参数);
    • 通过 API 调用后端(/api/workflows)保存。
  5. 执行可视化

    • 运行时通过 WebSocket 获取后端执行状态;
    • 动态高亮节点、显示输出结果。

🧩 五、前后端交互

功能 前端调用 后端模块
保存工作流 POST /api/workflows dify/server/workflow/
加载工作流 GET /api/workflows/:id
执行工作流 POST /api/workflows/:id/execute Celery 异步任务
实时状态 WebSocket /ws/workflows/:id FastAPI WebSocket 通道

💡 六、React Flow + 自定义节点举例

例如一个"LLM 调用节点"前端定义结构:

tsx 复制代码
import { Handle, Position } from 'reactflow'

export default function LLMNode({ data }) {
  return (
    <div className="p-3 rounded-2xl bg-white shadow-sm border">
      <div className="font-semibold text-sm mb-2">LLM Node</div>
      <div className="text-xs text-gray-500">Model: {data.model}</div>

      <Handle type="target" position={Position.Left} />
      <Handle type="source" position={Position.Right} />
    </div>
  )
}

这类自定义节点在 Dify 中以多种形式存在:

  • Input node
  • LLM node
  • Tool node
  • Condition node
  • Output node
  • HTTP Request node

🔍 七、总结

维度 技术说明
核心框架 React + TypeScript
UI 框架 TailwindCSS + Shadcn/UI
工作流引擎 React Flow
状态管理 Zustand
后端交互 REST / WebSocket
执行引擎(后端) Python + Celery + FastAPI
主要文件目录 /web/app/components/workflow/

🚀 八、可扩展方向(如果你想二开)

  • 新增节点类型 :在 node-types/ 目录增加组件 + 注册节点类型;
  • 定制参数面板:扩展右侧属性表单;
  • 接入自定义 API:修改工作流执行时序;
  • 样式/布局修改:调整 React Flow 配置项(如 snap-to-grid、mini-map 等)。

相关推荐
木易 士心6 小时前
Vue 3 Props 响应式深度解析:从原理到最佳实践
前端·javascript·vue.js
海鸥两三9 小时前
uniapp 小程序引入 uview plus 框架,获得精美的UI框架
前端·vue.js·ui·小程序·uni-app
lightgis10 小时前
16openlayers加载COG(云优化Geotiff)
前端·javascript·html·html5
小飞大王66610 小时前
TypeScript核心类型系统完全指南
前端·javascript·typescript
你的人类朋友12 小时前
✍️记录自己的git分支管理实践
前端·git·后端
合作小小程序员小小店12 小时前
web网页开发,在线考勤管理系统,基于Idea,html,css,vue,java,springboot,mysql
java·前端·vue.js·后端·intellij-idea·springboot
防火墙在线12 小时前
前后端通信加解密(Web Crypto API )
前端·vue.js·网络协议·node.js·express
Jacky-00812 小时前
Node + vite + React 创建项目
前端·react.js·前端框架
CoderYanger13 小时前
前端基础——CSS练习项目:百度热榜实现
开发语言·前端·css·百度·html·1024程序员节
i_am_a_div_日积月累_13 小时前
10个css更新
前端·css