二:庖丁解牛 Dify:一文读懂 v1.8.0 源码目录设计与模块职责
应用类型(chat、agent、workflow)模型提供商(OpenAI、Anthropic、通义千问)节点类型(LLM、Tool、IfElse)避免“魔法字符串”,提升可维护性。层级模块核心能力前端层web/可视化编排界面、Prompt 编辑器、调试面板API 层RESTful 接口暴露业务逻辑层api/core/Agent、RAG、Workflow、Prompt 编译模型抽象层统一调用 Op
下面是部分目录结构
./
├── api
│ ├── configs
│ │ ├── deploy
│ │ ├── enterprise
│ │ ├── extra
│ │ ├── feature
│ │ │ └── hosted_service
│ │ ├── middleware
│ │ │ ├── cache
│ │ │ ├── storage
│ │ │ └── vdb
│ │ ├── observability
│ │ │ └── otel
│ │ ├── packaging
│ │ └── remote_settings_sources
│ │ ├── apollo
│ │ └── nacos
│ ├── constants
│ ├── contexts
│ ├── controllers
│ │ ├── common
│ │ ├── console
│ │ │ ├── app
│ │ │ ├── auth
│ │ │ ├── billing
│ │ │ ├── datasets
│ │ │ ├── explore
│ │ │ ├── tag
│ │ │ └── workspace
│ │ ├── files
│ │ ├── inner_api
│ │ │ ├── plugin
│ │ │ └── workspace
│ │ ├── mcp
│ │ ├── service_api
│ │ │ ├── app
│ │ │ ├── dataset
│ │ │ └── workspace
│ │ └── web
│ ├── core
│ │ ├── agent
│ │ │ ├── output_parser
│ │ │ ├── prompt
│ │ │ └── strategy
│ │ ├── app
│ │ │ ├── app_config
│ │ │ │ ├── common
│ │ │ │ │ ├── parameters_mapping
│ │ │ │ │ └── sensitive_word_avoidance
│ │ │ │ ├── easy_ui_based_app
│ │ │ │ │ ├── agent
│ │ │ │ │ ├── dataset
│ │ │ │ │ ├── model_config
│ │ │ │ │ ├── prompt_template
│ │ │ │ │ └── variables
│ │ │ │ ├── features
│ │ │ │ │ ├── file_upload
│ │ │ │ │ ├── more_like_this
│ │ │ │ │ ├── opening_statement
│ │ │ │ │ ├── retrieval_resource
│ │ │ │ │ ├── speech_to_text
│ │ │ │ │ ├── suggested_questions_after_answer
│ │ │ │ │ └── text_to_speech
│ │ │ │ └── workflow_ui_based_app
│ │ │ │ └── variables
│ │ │ ├── apps
│ │ │ │ ├── advanced_chat
│ │ │ │ ├── agent_chat
│ │ │ │ ├── chat
│ │ │ │ ├── common
│ │ │ │ ├── completion
│ │ │ │ └── workflow
│ │ │ ├── entities
│ │ │ ├── features
│ │ │ │ ├── annotation_reply
│ │ │ │ ├── hosting_moderation
│ │ │ │ └── rate_limiting
│ │ │ └── task_pipeline
│ │ ├── base
│ │ │ └── tts
│ │ ├── callback_handler
│ │ ├── entities
│ │ ├── errors
│ │ ├── extension
│ │ ├── external_data_tool
│ │ │ └── api
│ │ ├── file
│ │ ├── helper
│ │ │ └── code_executor
│ │ │ ├── javascript
│ │ │ ├── jinja2
│ │ │ └── python3
│ │ ├── llm_generator
│ │ │ └── output_parser
│ │ ├── mcp
│ │ │ ├── auth
│ │ │ ├── client
│ │ │ ├── server
│ │ │ └── session
│ │ ├── memory
│ │ ├── model_runtime
│ │ │ ├── callbacks
│ │ │ ├── docs
│ │ │ │ ├── en_US
│ │ │ │ │ └── images
│ │ │ │ │ └── index
│ │ │ │ └── zh_Hans
│ │ │ │ └── images
│ │ │ │ └── index
│ │ │ ├── entities
│ │ │ ├── errors
│ │ │ ├── model_providers
│ │ │ │ └── __base
│ │ │ │ └── tokenizers
│ │ │ ├── schema_validators
│ │ │ └── utils
│ │ ├── moderation
│ │ │ ├── api
│ │ │ ├── keywords
│ │ │ └── openai_moderation
│ │ ├── ops
│ │ │ ├── aliyun_trace
│ │ │ │ ├── data_exporter
│ │ │ │ └── entities
│ │ │ ├── arize_phoenix_trace
│ │ │ ├── entities
│ │ │ ├── langfuse_trace
│ │ │ │ └── entities
│ │ │ ├── langsmith_trace
│ │ │ │ └── entities
│ │ │ ├── opik_trace
│ │ │ └── weave_trace
│ │ │ └── entities
│ │ ├── plugin
│ │ │ ├── backwards_invocation
│ │ │ ├── endpoint
│ │ │ ├── entities
│ │ │ ├── impl
│ │ │ └── utils
│ │ ├── prompt
│ │ │ ├── entities
│ │ │ ├── prompt_templates
│ │ │ └── utils
│ │ ├── rag
│ │ │ ├── cleaner
│ │ │ ├── data_post_processor
│ │ │ ├── datasource
│ │ │ │ ├── keyword
│ │ │ │ │ └── jieba
│ │ │ │ └── vdb
│ │ │ │ ├── analyticdb
│ │ │ │ ├── baidu
│ │ │ │ ├── chroma
│ │ │ │ ├── clickzetta
│ │ │ │ ├── couchbase
│ │ │ │ ├── elasticsearch
│ │ │ │ ├── huawei
│ │ │ │ ├── lindorm
│ │ │ │ ├── matrixone
│ │ │ │ ├── milvus
│ │ │ │ ├── myscale
│ │ │ │ ├── oceanbase
│ │ │ │ ├── opengauss
│ │ │ │ ├── opensearch
│ │ │ │ ├── oracle
│ │ │ │ ├── pgvector
│ │ │ │ ├── pgvecto_rs
│ │ │ │ ├── pyvastbase
│ │ │ │ ├── qdrant
│ │ │ │ ├── relyt
│ │ │ │ ├── tablestore
│ │ │ │ ├── tencent
│ │ │ │ ├── tidb_on_qdrant
│ │ │ │ ├── tidb_vector
│ │ │ │ ├── upstash
│ │ │ │ ├── vikingdb
│ │ │ │ └── weaviate
│ │ │ ├── docstore
│ │ │ ├── embedding
│ │ │ ├── entities
│ │ │ ├── extractor
│ │ │ │ ├── blob
│ │ │ │ ├── entity
│ │ │ │ ├── firecrawl
│ │ │ │ ├── unstructured
│ │ │ │ └── watercrawl
│ │ │ ├── index_processor
│ │ │ │ ├── constant
│ │ │ │ └── processor
│ │ │ ├── models
│ │ │ ├── rerank
│ │ │ │ └── entity
│ │ │ ├── retrieval
│ │ │ │ ├── output_parser
│ │ │ │ └── router
│ │ │ └── splitter
│ │ ├── repositories
│ │ ├── tools
│ │ │ ├── __base
│ │ │ ├── builtin_tool
│ │ │ │ └── providers
│ │ │ │ ├── audio
│ │ │ │ │ ├── _assets
│ │ │ │ │ └── tools
│ │ │ │ ├── code
│ │ │ │ │ ├── _assets
│ │ │ │ │ └── tools
│ │ │ │ ├── time
│ │ │ │ │ ├── _assets
│ │ │ │ │ └── tools
│ │ │ │ └── webscraper
│ │ │ │ ├── _assets
│ │ │ │ └── tools
│ │ │ ├── custom_tool
│ │ │ ├── entities
│ │ │ ├── mcp_tool
│ │ │ ├── plugin_tool
│ │ │ ├── utils
│ │ │ │ └── dataset_retriever
│ │ │ └── workflow_as_tool
│ │ ├── variables
│ │ └── workflow
│ │ ├── callbacks
│ │ ├── entities
│ │ ├── graph_engine
│ │ │ ├── condition_handlers
│ │ │ └── entities
│ │ ├── nodes
│ │ │ ├── agent
│ │ │ ├── answer
│ │ │ ├── base
│ │ │ ├── code
│ │ │ ├── document_extractor
│ │ │ ├── end
│ │ │ ├── event
│ │ │ ├── http_request
│ │ │ ├── if_else
│ │ │ ├── iteration
│ │ │ ├── knowledge_retrieval
│ │ │ ├── list_operator
│ │ │ ├── llm
│ │ │ ├── loop
│ │ │ ├── parameter_extractor
│ │ │ ├── question_classifier
│ │ │ ├── start
│ │ │ ├── template_transform
│ │ │ ├── tool
│ │ │ ├── variable_aggregator
│ │ │ └── variable_assigner
│ │ │ ├── common
│ │ │ ├── v1
│ │ │ └── v2
│ │ ├── repositories
│ │ └── utils
│ │ └── condition
│ ├── docker
│ ├── events
│ │ └── event_handlers
│ ├── extensions
│ │ └── storage
│ │ └── clickzetta_volume
│ ├── factories
│ ├── fields
│ ├── libs
│ ├── migrations
│ │ └── versions
│ ├── models
│ ├── repositories
│ ├── schedule
│ ├── services
│ │ ├── auth
│ │ │ ├── firecrawl
│ │ │ ├── jina
│ │ │ └── watercrawl
│ │ ├── enterprise
│ │ ├── entities
│ │ │ ├── external_knowledge_entities
│ │ │ └── knowledge_entities
│ │ ├── errors
│ │ ├── plugin
│ │ ├── recommend_app
│ │ │ ├── buildin
│ │ │ ├── database
│ │ │ └── remote
│ │ ├── tools
│ │ └── workflow
│ ├── tasks
│ │ └── annotation
│ ├── templates
│ │ └── without-brand
│ └── tests
├── dev
│ └── pytest
├── docker
├── images
├── sdks
│ ├── nodejs-client
│ ├── php-client
│ └── python-client
│ ├── dify_client
│ └── tests
└── web
├── app
├── scripts
├── service
│ ├── demo
│ └── knowledge
├── __tests__
│ └── goto-anything
├── themes
├── types
└── utils
🧩 Dify 源码目录功能详解(按模块划分)
一、api/ —— 后端服务核心(AI 引擎 + 业务逻辑)
技术栈:Python (Flask/FastAPI 混合) + SQLAlchemy + Celery + Redis
定位:Dify 的“大脑”,负责 AI 编排、数据管理、权限控制、API 提供。
1. api/configs/ —— 全局配置中心
集中管理系统运行所需的各种配置项,支持多环境、多部署模式。
deploy/:不同部署方式的配置(本地、云、K8s)enterprise/:企业版专属功能开关(如 SSO、审计日志)feature/:功能开关管理(Feature Flag),例如:hosted_service/:是否为 SaaS 托管服务
middleware/:中间件配置cache/:缓存策略(Redis)storage/:文件存储(本地/S3/OSS)vdb/:向量数据库连接配置
observability/:可观测性集成otel/:OpenTelemetry 链路追踪配置
packaging/:打包发布相关配置remote_settings_sources/:支持从远程配置中心拉取配置apollo/,nacos/:对接携程 Apollo 或阿里 Nacos
✅ 设计亮点:解耦配置与代码,便于动态调整行为而无需重启服务。
2. api/constants/ —— 常量定义
统一管理所有枚举值、状态码、类型标识等,如:
- 应用类型(chat、agent、workflow)
- 模型提供商(OpenAI、Anthropic、通义千问)
- 节点类型(LLM、Tool、IfElse)
避免“魔法字符串”,提升可维护性。
3. api/contexts/ —— 上下文管理
维护请求级别的上下文信息,如当前用户、工作空间、应用实例等,用于权限校验和数据隔离。
4. api/controllers/ —— 控制器层(MVC 中的 C)
处理 HTTP 请求,返回 JSON 响应。分为多个子系统:
| 子目录 | 功能说明 |
|---|---|
console/ |
面向管理后台的接口(用户、工作区、账单、数据集) |
service_api/ |
面向外部调用者(前端或第三方)的应用级 API |
inner_api/ |
内部微服务间通信接口(如插件系统) |
files/ |
文件上传下载接口 |
mcp/ |
MCP(Model Control Plane)相关接口,模型治理 |
分层清晰,职责分明:
console是管理端,service_api是运行时。
5. api/core/ —— 最核心的业务引擎模块
这是 Dify 的“心脏”,实现了 AI 应用的核心能力。
🔹 core/app/ —— 应用运行时核心
app_config/:解析应用配置(Prompt 模板、变量、功能开关)easy_ui_based_app/:简单应用(聊天机器人)workflow_ui_based_app/:复杂工作流应用
features/:各类增强功能实现file_upload,speech_to_text,text_to_speech:多媒体支持suggested_questions_after_answer:回答后推荐问题
apps/:不同应用类型的执行入口chat/,agent_chat/,completion/,workflow/
🔹 core/agent/ —— Agent 行为引擎
prompt/:Agent 提示词构造strategy/:决策策略(如 ReAct、Plan-and-Solve)output_parser/:解析 LLM 输出以判断是否调用工具
🔹 core/llm_generator/ —— 大模型生成器
封装对 LLM 的调用逻辑,支持流式输出、错误重试、上下文拼接。
🔹 core/model_runtime/ —— 模型运行时抽象层
统一接口调用不同厂商的模型服务:
model_providers/:各家模型适配器(OpenAI、Azure、HuggingFace 等)callbacks/:回调机制(用于日志、追踪)schema_validators/:输入参数校验utils/:工具函数
✅ 核心价值:屏蔽底层差异,上层逻辑无需关心具体用哪家模型
🔹 core/rag/ —— RAG 全流程引擎
完整实现检索增强生成链路:
| 子目录 | 作用 |
|---|---|
datasource/ |
支持多种向量数据库 → 极其丰富! 包括: chroma, qdrant, weaviate, milvus, pgvector, elasticsearch, tidb_vector, analyticdb 等 |
extractor/ |
文档内容提取unstructured(通用解析)、firecrawl(网页抓取) |
splitter/ |
文本切片策略 |
embedding/ |
调用 embedding 模型生成向量 |
retrieval/ |
检索器,支持关键词+向量混合检索 |
index_processor/ |
构建索引的处理器 |
cleaner/ |
数据清洗 |
rerank/ |
重排序(Reranker)支持 |
💡 亮点:支持 20+ 种向量数据库,真正做到了“插件化”存储。
🔹 core/tools/ —— 工具系统(Tooling)
实现 Agent 调用外部能力的核心机制:
builtin_tool/:内置工具(时间、代码执行、音频处理)custom_tool/:用户自定义工具(HTTP 请求、脚本)plugin_tool/:插件化工具(通过 SDK 扩展)workflow_as_tool/:将整个工作流当作一个工具调用code_executor/:安全沙箱执行代码(JS/Python/Jinja2)
✅ 实现了真正的 Function Calling / Tool Use 能力。
🔹 core/workflow/ —— 可视化工作流引擎
Dify 最强大的功能之一:图形化编排复杂逻辑。
nodes/:各种节点类型实现llm,tool,if_else,http_request,code,knowledge_retrieval等
graph_engine/:图执行引擎,处理节点依赖、条件跳转callbacks/:执行过程中的事件回调utils/condition:条件表达式解析
🎯 类似于低代码流程引擎,但专为 AI 场景优化。
🔹 core/prompt/ —— Prompt 工程核心
prompt_templates/:预设 Prompt 模板库entities/:Prompt 变量、上下文结构定义
6. api/models/ 与 api/repositories/
models/:数据库 ORM 模型(SQLAlchemy)repositories/:数据访问层(DAO),封装 CRUD 操作
遵循经典分层架构:Controller → Service → Repository → Model
7. api/services/ —— 高层业务服务
封装跨领域的业务逻辑:
auth/:认证服务(Firecrawl、Watercrawl 等第三方登录)plugin/:插件管理系统workflow/:工作流调度服务recommend_app/:应用推荐系统(内置/数据库/远程)
8. api/tasks/ —— 异步任务(Celery Worker)
处理耗时操作:
annotation/:标注任务异步处理
9. api/extensions/ —— 扩展机制
storage/clickzetta_volume/:对接 ClickZetta 存储卷(企业级特性)
10. api/tests/ —— 测试套件
完整的单元测试与集成测试,保障代码质量。
二、web/ —— 前端应用(React + TypeScript)
技术栈:React App Router(Next.js 风格)、Tailwind CSS、Zustand、Monaco Editor
主要目录:
| 目录 | 作用 |
|---|---|
app/ |
基于 App Router 的页面路由系统 |
service/ |
前端 API 服务封装(如知识库操作、应用调试) |
themes/ |
主题样式定制(支持暗黑模式) |
types/ |
TypeScript 类型定义 |
utils/ |
工具函数 |
__tests__/ |
前端测试 |
scripts/ |
构建脚本 |
特点:现代化前端架构,支持 SSR、静态生成、动态路由。
三、sdks/ —— 官方客户端 SDK
提供多种语言的 SDK,方便开发者集成 Dify 应用:
python-client/:Python SDK(最常用)nodejs-client/:Node.js SDKphp-client/:PHP SDK
使用场景:在自有系统中调用 Dify 发布的 API。
四、docker/ 与 images/
docker/:Dockerfile 和构建脚本images/:镜像构建资源(如 logo、启动页)
支持一键部署:docker-compose up
五、dev/pytest —— 开发测试工具
集成 pytest 测试框架,用于本地开发调试。
🏁 总结:Dify 架构全景图
| 层级 | 模块 | 核心能力 |
|---|---|---|
| 前端层 | web/ |
可视化编排界面、Prompt 编辑器、调试面板 |
| API 层 | api/controllers/ |
RESTful 接口暴露 |
| 业务逻辑层 | api/core/ |
Agent、RAG、Workflow、Prompt 编译 |
| 模型抽象层 | model_runtime/ |
统一调用 OpenAI、国产模型、本地模型 |
| 数据层 | rag/datasource/ |
支持 20+ 向量数据库 |
| 扩展层 | sdks/, plugin/ |
多语言支持、插件生态 |
| 运维层 | configs/, observability/ |
配置管理、链路追踪、企业集成 |
✅ Dify 源码设计精髓
- 模块高度解耦:每个功能独立成包,便于维护和扩展。
- AI 原生优先:所有设计围绕 LLM 特性展开(上下文、流式、工具调用)。
- 企业级就绪:支持 Nacos/Apollo 配置中心、OTel 追踪、多租户。
- 可插拔架构:向量库、模型提供商、工具均可替换。
- 开发者友好:提供 SDK、清晰文档、测试完备。
更多推荐
所有评论(0)