LangFlow 前端架构
src/frontend/
├── public # 静态资源目录
├── src
│ ├── alerts # 告警消息组件(成功/错误/通知)
│ ├── assets # 静态资源(图片/字体)
│ ├── boilerplate # 基础组件模板
│ ├── components # 组件定义
│ │ ├── common # 通用基础组件(加载/分页/工具提示/错误处理)
│ │ ├── core # 核心业务组件(复杂业务相关组件)
│ │ ├── ui # Shadcn组件及外部库组件
│ ├── constants # 项目常量与配置文件
│ ├── contexts # 组件上下文(数据共享)
│ ├── controllers # 基于Axios和React Query的API请求封装
│ ├── customEdges # 图形界面自定义边组件
│ ├── customization # 自定义组件与钩子(含节点/边扩展)
│ ├── customNodes # 自定义节点组件(含笔记节点)
│ ├── helpers # 按功能组织的辅助函数
│ ├── hooks # 可复用逻辑钩子(组件复用)
│ ├── icons # 各类服务的SVG图标资源
│ ├── modals # 模态框组件(用户交互)
│ ├── pages # 页面组件(每个对应独立模块)
│ ├── shared # 可复用的全局组件与钩子
│ ├── stores # Zustand状态管理(authStore/flowStore等)
│ ├── types # 全局数据类型定义
│ └── utils # 通用工具函数(数据格式化/日期处理等)
└── tests # 测试目录(使用Playwright进行端到端测试)
核心技术栈
- React + Zustand:使用React作为前端框架,Zustand进行全局状态管理,避免Redux的复杂性
- Tailwind CSS + shadcn/ui:UI组件使用Shadcn(基于React的UI组件库)配合Tailwind CSS实现灵活定制
- React Query + Axios:API请求使用Axios封装,配合React Query实现数据获取与缓存
- Vite:提供极快的热更新,提升开发效率
- Playwright:集成自动化端到端测试,保障质量
- React Flow:基于React Flow的自定义工作流构建,支持自定义节点和边
- LangChain:支持各类LangChain组件(包括LLMs/tools/agents等)
- Docker:支持容器化部署,便于管理
用户体验
- 自定义工作流:LangFlow提供了简洁的自定义工作流构建方式,但在集成DeepSeek服务时界面响应缓慢。部署后简单对话界面响应时间近30秒,建议本地部署DeepSeek提升响应速度。
- 调试体验:调试过程中存在界面卡顿,输出内容无法流畅滚动,影响开发流畅性。
开发体验
- 代码格式化与规范:集成Prettier格式化和ESLint规范检查,保障代码一致性和质量
- 自动化测试:使用Playwright进行端到端自动化测试,保障应用稳定性和可用性
- 快速开发:基于Vite的开发环境支持热更新提升效率。配合Tailwind CSS快速构建响应式界面
- 文档清晰:LangFlow提供了详细文档帮助开发者快速上手。但社区支持仍处于早期阶段,可能影响问题快速解决
- 二次开发支持:LangFlow支持二次开发,可进行定制化。需要一定前端和LangChain技术背景
- 社区支持:LangFlow社区相对较小,可能遇到未解决问题
局限性
- 社区支持有限:LangFlow社区相对较小,可能遇到一些挑战
- 产品定位单一:LangFlow专注LangChain工作流可视化编排,更适合技术开发者。对复杂业务二次开发支持有限
Dify 前端架构
Dify采用基于Next.js的更复杂全面的结构:
web/
├── app # 主应用目录(Next.js App Router)
│ ├── (commonLayout) # 管理界面布局
│ │ ├── app # 应用管理
│ │ ├── apps # 应用列表
│ │ ├── datasets # 数据集管理
│ │ ├── education-apply # 教育版申请
│ │ ├── explore # 应用探索
│ │ ├── plugins # 插件管理
│ │ └── tools # 工具管理
│ ├── (shareLayout) # 分享/使用界面布局
│ │ ├── chat # 聊天界面
│ │ ├── chatbot # 聊天机器人界面
│ │ ├── completion # 文本补全
│ │ └── workflow # 工作流界面
│ ├── components # 组件目录(非常全面)
│ │ ├── app # 应用相关组件
│ │ ├── base # 基础UI组件(非常全面)
│ │ ├── billing # 计费相关组件
│ │ ├── datasets # 数据集相关组件
│ │ ├── plugins # 插件相关组件
│ │ ├── workflow # 工作流相关组件
│ │ └── ... # 更多专业组件目录
│ ├── signin # 登录相关页面
│ └── ... # 其他页面目录
├── i18n # 国际化支持(多语言)
├── service # API服务定义与封装
└── ... # 其他支持目录
整体架构特点
-
基于Next.js的路由系统:
- 采用Next.js App Router格式(
app/目录) - 采用嵌套路由结构和布局系统
- 采用Next.js App Router格式(
-
清晰的功能模块:
- 应用管理(apps)
- 数据集管理(datasets)
- 工作流(workflow)
- 聊天界面(chat)
- 插件系统(plugins)
- 工具集成(tools)
-
丰富的组件库:
- 大量基础UI组件
- 功能组件
- 业务组件
-
国际化支持:
- 支持多语言(i18n目录)
组件系统分析
组件系统非常全面,主要分为:
-
基础组件(
components/base):- UI元素:按钮、输入框、对话框、下拉菜单等
- 功能组件:复制按钮、文件上传、图片上传等
- 编辑器组件:Markdown编辑器、提示词编辑器等
-
业务组件:
- 应用相关(
components/app) - 数据集相关(
components/datasets) - 工作流相关(
components/workflow) - 插件相关(
components/plugins)
- 应用相关(
-
页面级组件:
- 登录/注册页面
- 账户管理页面
- 探索页面等
组件实现特点(看的出来很多都是经过实际应用锤炼完善的)
-
原子化设计且完全自定义:
components/base目录实现原子化UI设计,模块化架构- 所有基础组件遵循Utility-First原则使用Tailwind CSS原子类
- 零自定义CSS代码
- 绝大多数组件完全自定义开发,极少第三方依赖
- 分层设计解耦基础组件与复合组件
-
高封装性与完备性:
- 覆盖大多数业务场景
- 可直接复用无需二次开发
- 例如:聊天页面消息渲染的Markdown组件,不仅支持标准语法渲染(代码块/表格/图片/链接/超链接/标题/引用/列表),并扩展支持echarts表格绘制、mermaid图表绘制、思维链、语音输入等
-
出色的组件性能优化:
- 使用
useCallback缓存函数实例 - 使用
use-context-selector优化context使用 - 使用
useMemo优化复杂计算 - 以上优化基本在每个组件该注意的地方中都正确使用了,保证了组件的性能
- 使用
-
良好的组件接口设计:
- 严格的组件接口定义
- 合理的默认值和属性校验
- 封装复杂逻辑,提供简洁API
-
严格的组件状态控制:
- 简单状态管理基于
useState - 复杂状态管理基于
useReducer - 组件间状态共享使用Zustand
- 父子组件状态共享使用context
- 简单状态管理基于
API模块分析
API接口定义在/web/service目录:
-
基础请求封装(较复杂):
- 定义在
base.ts,以request函数为基础 - 封装GET/POST/PUT/DELETE请求方法
- 支持拦截器、超时处理、错误处理
- 多环境适配:通过IS_CE_EDITION区分社区版
- 安全机制:自动token刷新、SSO特殊处理
- 特殊方法:
ssePost支持SSE的POST请求,处理20+种事件类型
- 定义在
-
业务接口封装:
- 基于
base.ts定义常用API接口,如getUserInfo、getWorkspaceList、getAppList等
- 基于
特色功能模块
-
工作流系统:
- 节点系统(
workflow/nodes) - 操作面板(
workflow/panel) - 执行引擎(
workflow/run) - 状态管理(
workflow/store)
- 节点系统(
-
数据集管理:
- 文档处理
- 元数据管理
- 外部知识库集成
- 检索方式配置
-
插件系统:
- 市场浏览
- 插件安装
- 权限管理
- 应用集成
-
应用配置:
- 提示词配置
- 调试功能
- 日志管理
- 功能开关
对比分析
Dify优势
-
完整的AI应用开发生命周期支持:
- 提供从开发到部署的完整解决方案
- 丰富的多媒体处理能力
- 全面的团队协作与权限管理
- 现代全栈前端技术栈
- 完整的国际化方案
-
全面的组件系统:
- 大量的基础组件
- 高复用性的业务组件
- 性能优化的组件设计
- 良好的组件接口
- 严格的状态管理
-
先进的路由与布局:
- Next.js App Router与嵌套布局
- 清晰分离管理界面与用户界面
-
API与状态管理:
- 复杂的API封装与安全特性
- 良好的状态管理策略
LangFlow优势
-
专注LLM工作流可视化编排:
- 深度集成LangChain生态
- 简洁直观的用户界面
- 清晰的前后端职责分离
-
更简单的架构:
- 更直接的组件组织
- 更易学习和理解
- 二次开发门槛更低
-
快速原型设计:
- 快速搭建LLM工作流实验
- 直接可视化LangChain组件与关系
-
更轻量级的技术栈:
- 更少的依赖和更简单的架构
- 更专注于核心功能
结论
两者都是优秀的AI开发工具,定位和侧重点不同:
-
Dify更像一个全面的AI应用开发平台,适合需要构建功能丰富、团队协作和生产级部署的完整应用的团队。
-
LangFlow更专注于LLM工作流可视化,适合基于LangChain的应用的快速实验和原型设计。
-
dify 开发文档相对完善,国人开发社区活跃,社区资源丰富。
选择取决于具体需求:
-
如果需要完整的AI应用开发解决方案,具有丰富功能、团队协作和企业级能力,选择Dify。
-
如果主要需要快速设计和测试LLM工作流,注重简洁性和与LangChain的直接集成,选择LangFlow。
-
整体来说 dify 的技术架构成熟度和前端代码的实现水平是优于langflow的, 但需要对 nextjs、react及其相关技术栈有较深掌握程度,还需要多花点功夫研究下源码,才能快速上手。