详细介绍了 Dify API 后端服务的架构,包括其核心组件、服务组织、数据流和集成点。API 后端是 Dify 的中核心系统,将 Web 前端与各种 AI 模型和数据存储系统连接起来。
API 后端架构概述
Dify 的 API 后端基于现代 Python 技术栈构建,并以 Flask 作为 Web 框架。它采用模块化架构,在路由、业务逻辑和数据访问之间清晰地划分了关注点。该系统设计为水平可扩展,并配备无状态 API 服务器和处理后台任务的 Worker。
应用程序启动过程
Dify API 后端遵循标准 Flask 应用程序结构,并采用工厂模式创建应用程序,允许针对开发、测试和生产环境进行不同的配置。
应用程序以 API 服务器模式或工作模式启动,由 MODE
环境变量决定:
- API 模式 :通过 Flask/Gunicorn 处理 HTTP 请求
- 工作模式 :使用 Celery 处理后台任务
服务架构
API 后端由多个服务组成,共同提供 Dify 的完整功能。
核心组件
Flask 应用程序和扩展
Flask 应用程序是 API 服务的核心技术,并有多个扩展提供附加功能:
- Flask-SQLAlchemy :用于数据库交互的 ORM
- Flask-Migrate :数据库迁移
- Flask-RESTful :RESTful API 框架
- Flask-CORS :跨域资源共享
- Flask-Login :用户身份验证
- Celery :异步处理的任务队列
配置系统
Dify 的配置由一个组织良好的系统处理,该系统使用 Pydantic 进行验证和类型检查。配置从环境变量加载,并分组到相关组件中:
数据库模型
Dify 的数据模型围绕关键实体:
- 帐户 :用户帐户和身份验证
- 租户 :多租户支持
- App :基于平台构建的 AI 应用
- 数据集 :RAG 应用程序的知识库
- 文档 :数据集中的文件和内容
- 对话 :聊天历史和上下文
- 提供者 :LLM 提供者配置
API 路由系统
API 路由按功能区域和 RESTful 端点进行组织。主要 API 类别包括:
- 控制台 API(Console API) :由 Web 控制台用于管理
- App API :由基于 Dify 构建的应用程序使用
- 服务 API(Service API) :内部服务和集成
核心服务组件
向量数据库抽象
Dify 通过抽象层为多个向量数据库提供统一的接口,实现向量数据库提供商之间的无缝切换。
存储系统抽象
与向量数据库抽象类似,Dify 为不同的存储后端提供了统一的接口:
异步任务处理
Celery 用于异步任务处理,并使用 Redis 作为消息代理。主要任务类别包括:
- 数据集索引和处理
- 用于长时间运行操作的 LLM 生成
- 电子邮件通知
- 操作跟踪和日志记录
部署基础设施
Dify 的后端使用 Docker 进行容器化,并为不同组件提供单独的服务。标准部署包括:
关键部署组件:
- API 容器(API Container) :主 Flask 应用程序
- 工作者容器(Worker Container) :用于后台任务的 Celery 工作者
- Web 容器(Web Container) :NextJS 前端应用程序
- 数据库容器(Database Container) :PostgreSQL 数据库
- Redis 容器(Redis Container) :用于缓存的 Redis 和 Celery 代理
- 沙盒容器(Sandbox Container) :用于代码执行的隔离环境
- 守护程序插件(Plugin Daemon) :管理插件执行
- SSRF 代理(SSRF Proxy) :出站连接的安全层
- Nginx :反向代理和 SSL 终止
安全注意事项
API 后端包含几个安全功能:
- SSRF 代理(SSRF Proxy) :通过代理出站连接来防止服务器端请求伪造
- 沙盒隔离(Sandbox Isolation) :代码执行发生在隔离的沙盒容器中
- 身份验证(Authentication) :API 密钥和基于 JWT 的身份验证
- CORS 配置(CORS Configuration) :可配置跨域资源共享
- 环境变量安全(Environment Variable Security) :通过环境变量管理敏感凭据
开发和测试
API 后端包括全面的测试基础设施:
- 单元测试(Unit Tests) :单独测试各个组件
- 集成测试(Integration Tests) :测试组件交互
- VDB 测试(VDB Tests) :测试向量数据库实现
- 工作流测试(Workflow Tests) :测试工作流执行
总结
Dify 的 API 后端架构展现了结构良好的模块化设计,具有可扩展性和灵活性。通过抽象存储和向量数据库系统,无论使用何种底层技术,它都能提供一致的接口。API 服务器和工作器之间的分离可实现高效的资源利用率并提高可靠性。
配置系统对应用程序的各个方面提供了细粒度的控制,使其能够适应不同的部署环境和用例。
推荐阅读
- A2A 与 MCP 协议的深度融合:智能体生态的互补性与协同
- 手把手实操!我用扣子搭建了一个漫画生成的Agent
- 最简单的方式把 AI Agent 讲明白、用明白 - 来自著名 Agent 框架 Agno 创始人的优质分享
- 大模型应用开发从小工到专家
- AI Agent 视觉指南:通过 60 张可视化图表透视智能体
- 全面剖析 MCP、A2A 与 Function Calling 的架构关系
参考资料
https://github.com/langgenius/dify
欢迎关注公众号,更及时的接收消息,后续会继续写一些相关 LLM 的文章。