Langflow
用 React 19 + Vite + Zustand + Python/FastAPI 构建的可视化 Agent / RAG / 工作流平台;与 BodySense 前端技术栈匹配度最高。本篇记录其 graph 执行模型、流式交互与 React↔Python 垂直切片。
[!info] related notes
Langflow
这是什么
可视化构建 Agent / RAG / 工作流的平台(约 149k stars)。它的技术组合几乎就是 BodySense 的 Python + React 组合:
Python + FastAPI(src/backend)
React 19 + TypeScript + Vite + Zustand + Tailwind(src/frontend)
uv(后端)
[!warning] 噪音提示 integrations 与组件数量极多(icons/ 下几百个组件图标),核心代码容易被插件噪音淹没。只学 graph 执行、streaming、Zustand store、React Flow 状态建模、Python component contract、图执行测试。
在你三层参考架构里的位置
用户定位:与 BodySense 前端技术栈匹配度最高的 React + Python 项目。最值得学的是一条完整 vertical slice:
React 节点组件 → Zustand 工作流状态 → API → Python graph → component/tool → 流式执行结果 → React 状态更新
这与 BodySense 的咨询流(React → Go → Python LangGraph → SSE → React reducer)非常接近。
版本快照
| 项 | 值 |
|---|---|
| 分支 | main |
| commit | 3325c4642c48(2026-08-08) |
| 抓取日期 | 2026-08-11 |
| 语言 | Python >=3.10,<3.15(pyproject.toml:name = "langflow",version = "1.11.3") |
| 前端 | React 19 + Vite + Zustand + Tailwind |
| 包管理 | uv(后端 uv.lock)/ yarn(前端 package-lock.json) |
仓库鸟瞰:顶层目录结构
langflow/
├── src/
│ ├── backend/ # Python/FastAPI
│ │ └── base/langflow/ # 真正的应用代码
│ ├── frontend/ # React 19 前端
│ │ └── src/
│ ├── bundles/ sdk/ langflow-stepflow/ lfx/
├── docs/ # docusaurus 文档站
├── docker/ deploy/ scripts/ tests/ regressions/
├── pyproject.toml package.json Makefile
src/backend/base/langflow/(核心后端,depth 1,节选):
base/langflow/
├── main.py server.py langflow_launcher.py # 入口与装配
├── graph/ # 图执行引擎(核心)
├── api/ # FastAPI 路由(build / router / v1 / v2)
├── interface/ # 组件导入 / 初始化 / 运行
├── base/ # agents / tools / memory / models / vectorstores
├── components/ custom/ # 组件与自定义组件
├── schema/ # 数据结构(graph / message / artifact …)
├── services/ # auth / chat / flow / cache / job_queue / session …
├── processing/ # 流展开与处理
├── serialization/ # 图序列化
├── events/ # 事件管理(流式)
├── worker.py middleware.py settings.py
src/frontend/src/(核心前端,depth 1,节选):
frontend/src/
├── CustomNodes/ # React Flow 自定义节点(GenericNode / NoteNode)
├── components/ modals/ pages/
├── stores/ # Zustand:flowStore / messagesStore / flowBuilderWelcomeStore …
├── contexts/ controllers/ hooks/ utils/ types/
├── routes.tsx index.tsx App.tsx
└── icons/ # 几百个组件/provider 图标(噪音区)
顶层边界职责
| 顶层目录 | 回答什么问题 | 备注 |
|---|---|---|
base/langflow/graph/ | 一张图怎么执行 | 最该读的核心 |
base/langflow/api/ | 前端请求怎么进来 | FastAPI 路由 |
base/langflow/services/ | 聊天/流/作业怎么编排 | 含 background_execution |
base/langflow/schema/ | 节点/边/消息怎么建模 | 图的数据结构 |
frontend/src/CustomNodes/ | 节点怎么渲染 | React Flow |
frontend/src/stores/ | 工作流状态怎么存 | Zustand |
frontend/src/pages/FlowPage/ | 编辑画布主页面 | 主交互 |
分层与依赖方向
flowchart TB
RN[React 节点组件 CustomNodes] --> ST[Zustand stores]
ST --> API[FastAPI api/]
API --> GRAPH[graph/ 执行引擎]
GRAPH --> COMP[components/ tools/]
COMP --> EVT[events/ 流式]
EVT --> ST
关键入口与调用链
| 入口 | 路径 | 说明 |
|---|---|---|
| 后端入口 | src/backend/base/langflow/main.py | FastAPI 装配 |
| 图执行 | src/backend/base/langflow/graph/ | 节点拓扑执行 |
| 前端主页面 | src/frontend/src/pages/FlowPage/ | 画布 |
| 节点渲染 | src/frontend/src/CustomNodes/ | React Flow 节点 |
| 状态 | src/frontend/src/stores/flowStore.ts | 工作流状态 |
阅读路线(用户建议:只学六样)
graph/执行模型(节点如何被调度)events/+ API 的 streaming(结果如何流式回来)stores/(Zustand 工作流状态)CustomNodes/(React Flow 状态建模)base/的component/toolcontract(Python 组件契约)- 图执行测试(
tests/下)
深挖一条线:从点击节点到流式结果(一条 vertical slice)
选「在前端画布点一次『运行』,看一个节点执行并把结果流式回来」作为主线——它把 React 节点 → Zustand → API → Python graph → component → 事件流 → React 更新 整条垂直切片穿了一遍,和 BodySense 的咨询流(React → Go → Python LangGraph → SSE → React)同构。
src/frontend/src/CustomNodes/ React Flow 节点被点击「运行」
→ src/frontend/src/stores/flowStore.ts Zustand 写入工作流状态
→ src/backend/base/langflow/api/ FastAPI 收到运行请求
→ src/backend/base/langflow/graph/ 图执行引擎:按拓扑调度节点
→ src/backend/base/langflow/components/ 或 custom/ 执行该节点的 component/tool
→ 产生结果
→ src/backend/base/langflow/events/ 事件管理(流式)
→ SSE 把结果流式推回
→ src/frontend/src/stores/flowStore.ts / messagesStore React 状态更新
→ CustomNodes/ 增量重渲染
跟读要点:
graph/是核心:断在节点调度处,看一个图如何被展开成执行顺序(对照 BodySense 的 LangGraph runtime)events/+ API 的 streaming:确认是 SSE 还是 WebSocket(待验证),结果如何被切片推回stores/flowStore.ts:前端工作流状态如何被后端事件增量更新(对照 BodySense 的 React reducer 消费 SSE)components/的 component contract:Python 组件怎么被统一调用(插件化契约)
自检:点一次运行,前端状态、后端图执行、流式事件三者如何对齐?BodySense 的 SSE→reducer 能否照这个范式收紧?
值得偷师 / 不建议照抄
| 做法 | 评价 | 我的判断 |
|---|---|---|
| graph 执行引擎 + 流式事件 | 强 | 直接对照 BodySense 的 LangGraph runtime + SSE |
| Zustand 管理工作流状态 | 强 | BodySense React 侧可参考 |
| React Flow 节点建模 | 强 | 可视化编排范式 |
| Python component contract | 强 | 插件化组件的契约设计 |
| 几百个组件/provider 注册 | 弱 | 噪音,不要搬进 BodySense |
我的疑问与待验证
- Langflow 的 streaming 用 SSE 还是 WebSocket?与 BodySense 当前的 SSE 方案如何对齐?
- 图执行测试如何 mock 外部 provider?对照 BodySense 的 eval 体系。
沉淀出的笔记
相关链接 / 官方入口
| 入口 | 地址 |
|---|---|
| 仓库 | https://github.com/langflow-ai/langflow |
| 工程说明 | https://github.com/langflow-ai/langflow/blob/main/AGENTS.md |