|
|
@@ -0,0 +1,748 @@
|
|
|
+# Dify 参考项目说明
|
|
|
+
|
|
|
+> 项目位置:`D:/projects/agent-management/dify`(外部参考仓库,**不参与本仓库构建**)
|
|
|
+> 版本快照:`1.16.0`
|
|
|
+> 文档目的:为 agent-management 后续在工作流编排、智能体调度、节点执行信封化等方向的演进提供可借鉴的工程参考。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 0. 一句话定位
|
|
|
+
|
|
|
+Dify 是一个 **开源 LLMOSS(LLM Operating System / Stack)**,对外提供 Chatbot / Workflow / Agent / Text-Generator / RAG 知识库五类应用形态,底层通过 **Flask API + Celery Worker + Plugin Daemon(Go)+ Agent Backend(Python/pydantic-ai)+ Local Sandbox(Go/Landlock)** 一组协同服务完成大模型应用的编排、执行与扩展。
|
|
|
+
|
|
|
+**与 agent-management 项目的关系**:Dify 是同类问题的"重型开源参考实现"。它在工作流引擎(DAG 调度)、智能体运行时(pydantic-ai)、插件化模型/工具(plugin_daemon)、HITL 暂停-恢复(pause_state_persist_layer)等方面有成熟工程化方案,可作为本仓库工作流改造、Hermes 智能体执行、Skill 文件同步等模块的设计参照。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 1. 主要做了哪些工作
|
|
|
+
|
|
|
+### 1.1 应用形态抽象(core/app/apps/)
|
|
|
+
|
|
|
+把 LLM 应用统一抽象为 4 类:
|
|
|
+- **ChatApp / AdvancedChatApp**:对话型,AdvancedChatApp 走工作流引擎
|
|
|
+- **CompletionApp**:一次完成型
|
|
|
+- **AgentChatApp**:独立 Agent 应用(非工作流),走 CotAgentRunner / FunctionCallAgentRunner
|
|
|
+- **WorkflowApp**:基于 DAG 画布的工作流应用
|
|
|
+
|
|
|
+每类应用都有独立的 `AppGenerator` 与 `AppQueueManager`,通过统一的 `task_pipeline` 把事件流推送给前端(SSE / WebSocket / Blocking)。
|
|
|
+
|
|
|
+### 1.2 工作流引擎(core/workflow/ + services/workflow/)
|
|
|
+
|
|
|
+- **构图**:前端 ReactFlow 画布导出 `{nodes, edges}` JSON,由 `WorkflowEntry` 装配 `Graph`(来自外部 `graphon` 包)
|
|
|
+- **节点系统**:通过 `DifyNodeFactory`(`core/workflow/node_factory.py:279`)按 `type+version` 注册并构造节点实例
|
|
|
+- **节点类型**:start、end、llm、knowledge_retrieval、if-else、code、template-transform、question-classifier、http-request、variable-aggregator、parameter-extractor、iteration、agent(v1/v2)、human_input、trigger(plugin/schedule/webhook)、datasource 等
|
|
|
+- **调度**:`GraphEngine` 内部线程池(min_workers/max_workers + 弹性伸缩),按"完成即触发后继"方式驱动 DAG
|
|
|
+- **HITL**:原生 `PauseRequestedEvent` + `PauseStatePersistenceLayer`(`core/app/layers/pause_state_persist_layer.py:77-177`)把图运行时状态、流过滤器状态、暂停原因全量序列化到 DB,恢复时重建
|
|
|
+
|
|
|
+### 1.3 RAG 知识库(core/rag/)
|
|
|
+
|
|
|
+- 完整的"文档 → 切分 → 嵌入 → 入库 → 检索 → 重排 → 引用"链路
|
|
|
+- 内置 28 种向量库适配(plugin 化,按需 `uv sync --group vdb-<name>`)
|
|
|
+- 检索结构:splitter / extractor / index_processor / retrieval / rerank / data_post_processor
|
|
|
+
|
|
|
+### 1.4 智能体能力(双轨实现)
|
|
|
+
|
|
|
+| 实现 | 路径 | 推理循环位置 |
|
|
|
+|---|---|---|
|
|
|
+| 老版 Agent Chat | `core/agent/cot_agent_runner.py` / `fc_agent_runner.py` | Dify 内部 while 循环 |
|
|
|
+| 工作流 Agent v1 节点 | `core/workflow/nodes/agent/` | 通过 plugin daemon 外包 |
|
|
|
+| 工作流 Agent v2 节点 | `core/workflow/nodes/agent_v2/` + `dify-agent` 子项目 | 完全外包给独立 `dify-agent-backend` 服务(基于 pydantic-ai) |
|
|
|
+
|
|
|
+### 1.5 插件化扩展(plugin_daemon + 插件市场)
|
|
|
+
|
|
|
+- 所有模型 provider、工具 provider、向量库 provider 都外置为插件
|
|
|
+- 由 Go 编写的 `dify-plugin-daemon` 进程加载与执行
|
|
|
+- API 通过 HTTP/gRPC 调用插件,所有插件共享一份 daemon 维护的连接与凭据
|
|
|
+
|
|
|
+### 1.6 沙箱化 Agent 工作区(dify-agent-runtime,Go)
|
|
|
+
|
|
|
+- `shellctl` 服务器:通过 tmux 控制持久化 Shell 会话
|
|
|
+- `sanitize-pty`:ANSI 控制字符清洗
|
|
|
+- `landlock`:Linux LSM 文件系统隔离
|
|
|
+- 让 Dify Agent 具备"在受限沙箱里执行 Shell 命令"的能力
|
|
|
+
|
|
|
+### 1.7 多端协同与可观测
|
|
|
+
|
|
|
+- 前端基于 **loro-crdt** 实现工作流画布的多人协同编辑
|
|
|
+- 后端基于 **OpenTelemetry** 全链路埋点(Flask / Celery / httpx / redis / sqlalchemy),可对接 Langfuse / LangSmith / Phoenix / MLflow / Arize / Opik / Weave / 阿里云 SLS / 腾讯云
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 2. 技术栈
|
|
|
+
|
|
|
+### 2.1 后端 API(`api/`,Python 3.12)
|
|
|
+
|
|
|
+| 类别 | 技术 |
|
|
|
+|---|---|
|
|
|
+| **运行容器** | gunicorn + gevent + gevent-websocket |
|
|
|
+| **Web 框架** | Flask 3.1 + flask-restx + flask-login + flask-migrate + flask-orjson + flask-cors + flask-compress |
|
|
|
+| **OpenAPI** | fastopenapi[flask] 0.7.0 |
|
|
|
+| **实时** | python-socketio 5.13(工作流多人协同 WebSocket) |
|
|
|
+| **任务队列** | Celery 5.6(api / worker / worker_beat 三角色) |
|
|
|
+| **ORM** | SQLAlchemy + Flask-SQLAlchemy(psycopg2-binary / mysql-connector) |
|
|
|
+| **业务库** | PostgreSQL 15(默认) / MySQL 8(备选),通过 docker-compose profile 切换 |
|
|
|
+| **缓存/消息** | Redis 6(hiredis),全后端共用 |
|
|
|
+| **LLM 接入** | **litellm 1.83**(统一收敛) + google-cloud-aiplatform + azure-identity |
|
|
|
+| **HTTP 客户端** | httpx[socks] 0.28 + httpx-sse 0.4 + sseclient-py |
|
|
|
+| **JSON 修复** | json-repair 0.60(结构化输出补救) |
|
|
|
+| **向量库** | 28 种插件化适配(Weaviate / Qdrant / Milvus / pgvector / Chroma / ES / OpenSearch / OceanBase / Oracle / MyScale / ...) |
|
|
|
+| **对象存储** | 10 种插件化适配(S3 / OSS / COS / BOS / OBS / TOS / Azure Blob / GCS / Supabase / OpenDAL) |
|
|
|
+| **Trace** | 8 种插件化适配(Langfuse / LangSmith / Phoenix / MLflow / Arize / Opik / Weave / 阿里云 / 腾讯云) |
|
|
|
+| **可观测** | OpenTelemetry distro + 五种 instrumentation(celery/flask/httpx/redis/sqlalchemy)+ B3 传播 |
|
|
|
+| **其他** | nltk(分词)/ tiktoken(token 计数)/ gmpy2(大数)/ croniter(定时)/ bleach(HTML 消毒)/ zstandard(压缩) |
|
|
|
+
|
|
|
+### 2.2 新一代 Agent 子项目(`dify-agent/`,Python 3.12)
|
|
|
+
|
|
|
+| 类别 | 技术 |
|
|
|
+|---|---|
|
|
|
+| **核心 Agent 框架** | **pydantic-ai-slim 1.102**(关键依赖) |
|
|
|
+| **数据建模** | pydantic 2.12 |
|
|
|
+| **HTTP** | httpx 0.28 + httpx2 2.5 |
|
|
|
+| **独立服务模式** | FastAPI 0.136 + uvicorn 0.46 |
|
|
|
+| **gRPC** | grpclib + protobuf(与 Local Sandbox 通信) |
|
|
|
+| **可观测** | logfire[fastapi,httpx,redis] |
|
|
|
+| **加密** | jwcrypto(Agent Stub Bearer Token / JWE) |
|
|
|
+| **包管理** | uv workspace(被 `api/pyproject.toml` 以 editable 形式引用) |
|
|
|
+
|
|
|
+### 2.3 Agent Runtime 子项目(`dify-agent-runtime/`,Go 1.26)
|
|
|
+
|
|
|
+| 类别 | 技术 |
|
|
|
+|---|---|
|
|
|
+| **CLI 框架** | spf13/cobra 1.10 |
|
|
|
+| **沙箱隔离** | landlock-lsm/go-landlock v0.9(Linux LSM) |
|
|
|
+| **gRPC** | google.golang.org/grpc v1.82 + protobuf v1.36 |
|
|
|
+| **状态存储** | modernc.org/sqlite v1.37(纯 Go SQLite,无 CGO) |
|
|
|
+| **产出二进制** | shellctl / shellctl-runner / shellctl-runner-exit / shellctl-sanitize-pty |
|
|
|
+
|
|
|
+### 2.4 前端(`web/`,TypeScript)
|
|
|
+
|
|
|
+| 类别 | 技术 |
|
|
|
+|---|---|
|
|
|
+| **框架** | Next.js 16 + React 19.2 + React DOM 19.2(App Router / RSC) |
|
|
|
+| **备选构建** | Vinext 1.0-beta(基于 vite-plus,实验性) |
|
|
|
+| **构建工具** | @voidzero-dev/vite-plus-core 0.2.5(通过 overrides 替换官方 vite)+ @vitejs/plugin-rsc |
|
|
|
+| **TypeScript** | typescript 6.0(通过 @typescript/native 走 native 编译器) |
|
|
|
+| **样式** | Tailwind CSS 4.3 + @tailwindcss/typography |
|
|
|
+| **状态管理** | Zustand 5 + Jotai 2.20(含 jotai-effect / jotai-scope / jotai-tanstack-query) |
|
|
|
+| **数据层** | TanStack Query 5.101 + TanStack Form 1.33 + Immer 11 + Zundo 2.3(时间旅行) |
|
|
|
+| **协同** | loro-crdt 1.13(工作流画布多人协同) |
|
|
|
+| **画布** | ReactFlow 11.11 + ELK.js 0.11(图布局) |
|
|
|
+| **富文本/代码** | Lexical 0.47 + Monaco Editor 4.7 |
|
|
|
+| **可视化** | ECharts 6.1 + Mermaid 11.16 + KaTeX 0.17 + Shiki 4.3 + Streamdown(流式 Markdown) |
|
|
|
+| **网络/RPC** | oRPC 1.14(类型安全 RPC)+ ky 2.0 + socket.io-client 4.8 + eventsource-parser 3.1 |
|
|
|
+| **校验** | Zod 4.4 |
|
|
|
+| **i18n** | i18next 26 + react-i18next 17 |
|
|
|
+| **可观测** | Sentry 10.66 + Amplitude(含 session-replay) |
|
|
|
+| **测试** | Vitest 4.1 + Testing Library + Playwright 1.61(+ Cucumber) + Storybook 10.5 |
|
|
|
+
|
|
|
+### 2.5 Monorepo 工作区(`pnpm-workspace.yaml`)
|
|
|
+
|
|
|
+`web` + `e2e` + `sdks/nodejs-client` + `packages/*` + `cli`。
|
|
|
+其中 `packages/*` 包含 7 个内部包:`@dify/contracts` / `@dify/iconify-collections` / `@dify/tsconfig` / `@langgenius/dev-proxy` / `@langgenius/dify-ui` / `jotai-tanstack-form` / `migrate-no-unchecked-indexed-access`。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 3. 必需依赖(运行时无法省略)
|
|
|
+
|
|
|
+最小可运行集(源自 `docker/docker-compose.yaml`):
|
|
|
+
|
|
|
+| 依赖 | 角色 | 必需性 |
|
|
|
+|---|---|---|
|
|
|
+| **PostgreSQL 15** 或 **MySQL 8** | 业务库(dify)+ 插件库(dify_plugin) | 二选一 |
|
|
|
+| **Redis 6** | Celery broker + 缓存 + 协作通道 | 必需,全后端共用 |
|
|
|
+| **dify-plugin-daemon**(Go) | 插件加载与执行,所有模型/工具扩展都通过它 | 必需 |
|
|
|
+| **dify-agent-backend**(dify-agent server) | 新一代 Agent 运行时(pydantic-ai) | Agent v2 节点必需 |
|
|
|
+| **dify-agent-local-sandbox**(dify-agent-runtime Go) | Agent Shell 工作区,提供 `shellctl` 服务 | Agent shell 能力必需 |
|
|
|
+| **dify-sandbox** | 代码节点沙箱(独立于 agent-local-sandbox) | 代码节点 / 工具执行必需 |
|
|
|
+| **ssrf_proxy**(Squid) | 出网安全代理,sandbox 通过它出网 | 默认启用 |
|
|
|
+| **nginx** | 反向代理统一入口(80/443) | 默认启用 |
|
|
|
+| **dify-api / worker / worker_beat** | 业务进程,同一镜像三种启动模式 | 必需 |
|
|
|
+| **dify-web** | Next.js 前端 | 必需 |
|
|
|
+
|
|
|
+向量库(任选其一,默认 **Weaviate**,通过 `VECTOR_STORE` 切换):Qdrant / Milvus(+ etcd + minio)/ pgvector / pgvecto-rs / Chroma / Elasticsearch / OpenSearch / OceanBase / Oracle / MyScale / 等。
|
|
|
+
|
|
|
+可选:**Unstructured**(文档解析,`ETL_TYPE=Unstructured` 时启用)/ **Certbot**(HTTPS 证书)/ **Kibana**(ES profile 下)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 4. 工作流编排与调度的具体方法
|
|
|
+
|
|
|
+### 4.1 整体架构
|
|
|
+
|
|
|
+```
|
|
|
+前端画布(ReactFlow)
|
|
|
+ │ 导出 graph_config = {nodes, edges}
|
|
|
+ ▼
|
|
|
+WorkflowEntry(api/core/workflow/workflow_entry.py)
|
|
|
+ │ ① Graph.init(graph_config, node_factory) 构造 DAG
|
|
|
+ │ ② 装配 GraphEngine(外部 graphon 包)
|
|
|
+ │ ③ 套上 ResponseStreamFilter 维持响应顺序
|
|
|
+ ▼
|
|
|
+GraphEngine(graphon 包内)
|
|
|
+ │ 内部线程池 + 弹性伸缩
|
|
|
+ │ 按边依赖"完成即触发后继"
|
|
|
+ │ yield GraphEngineEvent
|
|
|
+ ▼
|
|
|
+WorkflowAppQueueManager(api/core/app/apps/workflow/app_queue_manager.py)
|
|
|
+ │ q.put(message)
|
|
|
+ ▼
|
|
|
+TaskPipeline(api/core/app/task_pipeline/)
|
|
|
+ │ ConvertToSSE / StreamGenerating / Pipeline
|
|
|
+ ▼
|
|
|
+前端 SSE / WebSocket
|
|
|
+```
|
|
|
+
|
|
|
+### 4.2 节点生命周期
|
|
|
+
|
|
|
+每个节点继承 `graphon.nodes.base.node.Node`,实现:
|
|
|
+
|
|
|
+1. `version()` 类方法 → 返回版本字符串(如 Agent v2 返回 `"2"`)
|
|
|
+2. `_run()` 异步生成器 → yield 出 `NodeEventBase` 事件
|
|
|
+3. `populate_start_event(event)` → 在节点启动事件中附加元数据
|
|
|
+4. `_extract_variable_selector_to_variable_mapping()` → 声明消费哪些上游变量(用于 publish 时依赖校验)
|
|
|
+
|
|
|
+事件类型:
|
|
|
+- `NodeRunResult`:节点执行结果,包含 `status / inputs / outputs / process_data / metadata / error / error_type`
|
|
|
+- `StreamCompletedEvent`:流结束信号,包装一个 `NodeRunResult`
|
|
|
+- `PauseRequestedEvent`:HITL 暂停信号,携带 `reason`
|
|
|
+
|
|
|
+### 4.3 关键调度特性
|
|
|
+
|
|
|
+- **基于 DAG**:顶层图严格有向无环,依赖边只能指向前序节点
|
|
|
+- **并行执行**:GraphEngine 线程池(min/max workers + scale up/down threshold)
|
|
|
+- **完成即触发**:节点完成后由 GraphEngine 内部决定后继,不做"同层 barrier 等待"(从测试 `test_parallel_human_input_join_resume.py` 可印证并行 + join)
|
|
|
+- **子工作流嵌套**:`_WorkflowChildEngineBuilder`(`workflow_entry.py:72-140`)为工具节点创建隔离的 child GraphEngine,复用父图 variable_pool,但用全新的 GraphRuntimeState 与 InMemoryChannel
|
|
|
+- **顶层图不支持回环**:循环只能通过 Agent 节点内部的 ReAct/FC 迭代实现
|
|
|
+
|
|
|
+### 4.4 失败与重试
|
|
|
+
|
|
|
+**关键差异**:Dify **没有统一的节点级 `failStrategy` 配置**。失败处理分散在各节点内部:
|
|
|
+
|
|
|
+- **Agent v2 节点**:通过 `OutputFailureOrchestrator`(`core/workflow/nodes/agent_v2/output_failure_orchestrator.py`)决策四种动作:`RETRY` / `USE_DEFAULT` / `TAKE_FAIL_BRANCH` / `FAIL`,配合 per-output 的 `OutputTypeChecker` 在每次成功后做类型校验
|
|
|
+- **传输层错误**:流式错误/异常终止直接 yield 失败 envelope,不重试
|
|
|
+- **节点失败后兄弟节点/后继节点**:完全由 GraphEngine 图级策略决定(在 graphon 包内)
|
|
|
+
|
|
|
+> 对照参考:本仓库(agent-management)的 `WorkflowEngine` 把 `failStrategy: abort | skip` 提到引擎层统一处理,对齐所有节点,是比 Dify 更一致的工程改进。
|
|
|
+
|
|
|
+### 4.5 HITL(人工介入)
|
|
|
+
|
|
|
+两条独立路径:
|
|
|
+
|
|
|
+**路径 A:独立 Human Input 节点**
|
|
|
+- `HumanInputNodeData`(`core/workflow/nodes/human_input/entities.py`)→ 表单定义
|
|
|
+- `DifyHITLCallback`(`core/workflow/nodes/human_input/callback.py`)→ 表单生命周期回调
|
|
|
+- `HumanInputFormRepositoryImpl` → 表单状态持久化
|
|
|
+
|
|
|
+**路径 B:Agent v2 内部的 ask_human 延迟工具调用**
|
|
|
+- Agent 在执行过程中通过 `AgentBackendDeferredToolCallInternalEvent` 请求人工输入
|
|
|
+- Dify 转换为 `HumanInputRequired` 暂停事件,保存 `pending_form_id` 与 `pending_tool_call_id` 到 `WorkflowAgentRuntimeSessionStore`
|
|
|
+- 工作流恢复时把表单结果作为 `deferred_tool_results` 注入下一次 Agent backend 调用,让 Agent 在原上下文继续
|
|
|
+
|
|
|
+**持久化层**:`PauseStatePersistenceLayer`(`core/app/layers/pause_state_persist_layer.py:77-177`)在收到 `GraphRunPausedEvent` 时序列化:`generate_entity` + `serialized_graph_runtime_state` + `serialized_response_stream_filter_state` + `pause_reasons`,恢复时全量重建。
|
|
|
+
|
|
|
+### 4.6 流式输出
|
|
|
+
|
|
|
+`GraphEngine` 是一个生成器,产出 `GraphEngineEvent` 流。Dify 通过 `iter_dify_graph_engine_events`(`workflow_entry.py:49-69`)在原始事件流上套 `ResponseStreamFilter`,以维持"按响应顺序输出"的历史语义(兼容 graphon v0.5.0+ 的变量流分块)。最终经 `TaskPipeline` 转换为 SSE / WebSocket 推给前端。
|
|
|
+
|
|
|
+### 4.7 任务队列与多租户
|
|
|
+
|
|
|
+- `WorkflowAppQueueManager`(`core/app/apps/workflow/app_queue_manager.py:24-44`):单工作流执行内的事件队列
|
|
|
+- `QueueDispatcherManager`(`services/workflow/queue_dispatcher.py:72-111`):按租户套餐分配优先级,跨租户隔离
|
|
|
+
|
|
|
+### 4.8 节点类型清单
|
|
|
+
|
|
|
+| 类别 | 节点 |
|
|
|
+|---|---|
|
|
|
+| **入口/出口** | start、end、datasource |
|
|
|
+| **控制流** | if-else、iteration、variable-aggregator、parameter-extractor |
|
|
|
+| **生成式** | llm、question-classifier、template-transform |
|
|
|
+| **执行式** | code、http-request |
|
|
|
+| **知识增强** | knowledge_retrieval、knowledge_index |
|
|
|
+| **智能体** | agent(v1 插件化)、agent_v2(dify-agent 后端) |
|
|
|
+| **人工介入** | human_input |
|
|
|
+| **触发器** | trigger_plugin、trigger_schedule、trigger_webhook |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 5. 多智能体协同方面的探索
|
|
|
+
|
|
|
+### 5.1 重要结论(必须澄清)
|
|
|
+
|
|
|
+**经过完整探索,Dify 项目在"智能调度而非强依赖 DAG"方面没有任何探索。** 所有调度路径都基于强依赖的 DAG,不存在 LLM 决定执行顺序、动态路由、Agent 调度 Agent 的原生模式。
|
|
|
+
|
|
|
+用户在需求描述中提到的"智能调度而非强依赖 DAG",更准确的对应物应该是本仓库(agent-management)`backend/src/main/java/com/agent/management/engine/WorkflowEngine.java` 等近期改造(参见 commit `1e166dd`"节点完成后立即触发后继节点,不再被同层慢节点阻塞"等),而不是 Dify 自身。
|
|
|
+
|
|
|
+下面如实说明 Dify 实际的设计形态。
|
|
|
+
|
|
|
+### 5.2 工作流顶层:严格 DAG
|
|
|
+
|
|
|
+由外部 `graphon` 包的 `GraphEngine` 按边依赖调度,无回环、无动态跳转。
|
|
|
+
|
|
|
+### 5.3 Agent 节点内部:固定循环
|
|
|
+
|
|
|
+- **CotAgentRunner**(`api/core/agent/cot_agent_runner.py:106-266`):固定 while 循环,每次重新组织 prompt(含历史 + scratchpad + 工具描述),通过 ReAct 协议(`Thought/Action/Observation`)解析,最大迭代 `min(max_iteration, 99) + 1`
|
|
|
+- **FunctionCallAgentRunner**(`api/core/agent/fc_agent_runner.py:81-330`):固定 while 循环,使用 LLM 原生 tool_calls
|
|
|
+- **Agent v2**(`api/core/workflow/nodes/agent_v2/`):把推理循环外包给 `dify-agent-backend` 服务的 pydantic-ai `Agent.run()`
|
|
|
+
|
|
|
+三种实现的"决策"都体现在 **tool calling**(调用哪个工具、何时输出最终答案),但工具是预先注册的函数集合,不是图节点,**工具调用 ≠ 图路由**。
|
|
|
+
|
|
|
+### 5.4 agenton Compositor:单 Agent 的层组合(不是多 Agent 协同)
|
|
|
+
|
|
|
+`dify-agent/src/agenton/compositor/` 是一个 **框架中立的层图(layer graph)组合器**,常被误以为是"多智能体协同",实际定位如下:
|
|
|
+
|
|
|
+| 设计点 | 实际情况 |
|
|
|
+|---|---|
|
|
|
+| 目的 | 把**单个 Agent 一次 LLM 调用**所需的 system prompt / user prompt / tools / output contract 分模块组合 |
|
|
|
+| 节点(LayerNode) | 无状态,声明 `name / provider / deps` |
|
|
|
+| 边(deps) | 严格约束为"只能指向前序节点"(`compositor/core.py:257-289`),形成 DAG |
|
|
|
+| 执行顺序 | 在 `CompositorConfig.layers` 中静态声明,**运行时不可变** |
|
|
|
+| 进入/退出 | 按 slots 顺序进入(`run.py:127-145`),反向退出 |
|
|
|
+| 聚合输出 | prompts/user_prompts/tools 通过 `CompositorRun` properties 线性聚合(`run.py:247-278`),扁平化为两个列表喂给单个 pydantic-ai Agent |
|
|
|
+| 是否支持分支/并行/路由 | **全部不支持** |
|
|
|
+| 与 pydantic-ai 关系 | 嵌套:`Compositor.enter()` 外层准备资源 → 内层 `Agent.run()` 跑标准推理循环 |
|
|
|
+
|
|
|
+**已有的 Layer 类型**(`dify-agent/src/dify_agent/layers/`):
|
|
|
+
|
|
|
+- `ask_human/`:人工输入延迟工具(pydantic-ai external deferred tool)
|
|
|
+- `dify_plugin/`:Dify 插件(LLM 与工具)
|
|
|
+- `dify_core_tools/`:Dify 核心工具
|
|
|
+- `knowledge/`:知识库检索工具
|
|
|
+- `output/`:结构化输出契约(提供 pydantic-ai 的 `output_type`)
|
|
|
+- `shell/`:Shell 命令执行(4 个工具:run/wait/input/interrupt)
|
|
|
+- `drive/`、`execution_context/`、`config/`:辅助层
|
|
|
+
|
|
|
+这些 Layer **不直接协作**,各自通过 properties 暴露 prompt/tool,最终被 `dify_agent/runtime/runner.py:321-374` 聚合后**喂给同一个 pydantic-ai Agent**。
|
|
|
+
|
|
|
+### 5.5 Session Snapshot:单 Agent 的断点续传
|
|
|
+
|
|
|
+`CompositorSessionSnapshot`(`compositor/schemas.py:78-115`)让**同一个 agent session 跨多次 agent run 续接**,典型场景:
|
|
|
+
|
|
|
+```
|
|
|
+workflow run → agent run #1(执行到一半遇到 ask_human)→ snapshot 持久化
|
|
|
+ ↓ workflow 暂停(HITL)
|
|
|
+ ↓ 人提交答案
|
|
|
+workflow 恢复 → agent run #2(从 snapshot 复用原状态继续)
|
|
|
+```
|
|
|
+
|
|
|
+这是**单 Agent 的状态持久化**,不是多 Agent 间的协同。文档原话(`dify-agent/docs/dify-agent/concepts/run-lifecycle/index.md:7-11`):
|
|
|
+
|
|
|
+> "A `workflow run` is one full workflow execution. An `agent run` is one Agent execution started by an Agent node while the workflow is running. They are not a one-to-one mapping: one `workflow run` often contains multiple `agent run`s."
|
|
|
+
|
|
|
+**多 Agent 协同是 Dify 外部 workflow 引擎的职责**,dify-agent 只是被工作流调用的执行单元,自身不做编排。
|
|
|
+
|
|
|
+### 5.6 没有 SubAgent / Supervisor / Handoff 抽象
|
|
|
+
|
|
|
+对整个 `dify-agent/` 仓库做了如下针对性搜索,全部零命中:
|
|
|
+
|
|
|
+- `multi.?agent|sub.?agent|subagent|spawn|handoff|delegate|orchestrat|supervisor|manager.?agent` → 命中只在 docstring 字面词或无关语义
|
|
|
+- `LLM.*(decide|choose|route|select).*(order|layer|next)|dynamic.*(execution|graph|dag)|model.?decides` → **零匹配**
|
|
|
+
|
|
|
+`Compositor` 的默认 provider 集合(`dify-agent/src/dify_agent/runtime/compositor_factory.py:77-128`)也不包含任何 `SubAgentLayer` / `RouterLayer` / `SupervisorLayer`。
|
|
|
+
|
|
|
+### 5.7 对本仓库的启示
|
|
|
+
|
|
|
+| Dify 的局限 | 本仓库可能的演进方向 |
|
|
|
+|---|---|
|
|
|
+| 工作流顶层不支持回环 | 引入 Agent 自主路由(让 LLM 决定下一个激活的后继节点)需要扩展 GraphEngine 调度策略 |
|
|
|
+| 无 multi-agent 原生模式 | 把 Agent 节点的 tool calling 扩展为"子图调用"(需扩展 child_engine_builder)或引入"agent 作为另一个 agent 的工具"的语义层 |
|
|
|
+| 无统一 failStrategy | 本仓库已做到(`failStrategy: abort | skip` 在引擎层统一处理) |
|
|
|
+| Envelope 校验仅对 Agent v2 强制 | 本仓库已做到(所有节点统一 `{status, message, data}` envelope) |
|
|
|
+| 分支未选路径状态不清晰 | 本仓库已做到(commit `1e166dd` 提到自动标记 SKIPPED) |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 6. 目录树说明(顶层 + 主要子目录)
|
|
|
+
|
|
|
+### 6.1 顶层目录
|
|
|
+
|
|
|
+```
|
|
|
+dify/
|
|
|
+├── api/ # Python 后端(主仓库核心,Flask + Celery)
|
|
|
+├── dify-agent/ # Python 新一代 Agent 框架(pydantic-ai + agenton)
|
|
|
+├── dify-agent-runtime/ # Go 实现的 Agent Shell 沙箱运行时(shellctl + landlock)
|
|
|
+├── web/ # Next.js + React 19 前端(控制台 + Web App)
|
|
|
+├── packages/ # pnpm workspace 内部包(contracts / dify-ui / dev-proxy 等 7 个)
|
|
|
+├── sdks/ # 官方 SDK(nodejs-client / php-client)
|
|
|
+├── cli/ # Dify CLI(TypeScript,独立 npm 包)
|
|
|
+├── docker/ # docker-compose 编排(含 28 种向量库的 profile 模板)
|
|
|
+├── dev/ # 本地开发脚本(start-api / start-web / start-worker / start-beat)
|
|
|
+├── scripts/ # 仓库治理脚本(lint / ast-grep 规则 / 压测)
|
|
|
+├── e2e/ # E2E 测试(Playwright + Cucumber)
|
|
|
+├── docs/ # 产品/概念文档(多语言 + design + weaviate 子目录)
|
|
|
+├── images/ # 仓库用图
|
|
|
+├── README.md / SECURITY.md / LICENSE / CONTRIBUTING.md / AUTHORS
|
|
|
+├── Makefile # 顶层构建/测试入口
|
|
|
+├── package.json / pnpm-workspace.yaml / pnpm-lock.yaml # 前端 monorepo 元数据
|
|
|
+├── vite.config.ts / eslint.config.mjs / lint.config.ts / oxlint-suppressions.json
|
|
|
+├── codecov.yml / depot.json
|
|
|
+├── CLAUDE.md / AGENTS.md # AI 协作指引
|
|
|
+```
|
|
|
+
|
|
|
+### 6.2 `api/`(Python 后端)
|
|
|
+
|
|
|
+```
|
|
|
+api/
|
|
|
+├── app.py / app_factory.py / dify_app.py / gunicorn.conf.py # 入口与 WSGI 配置
|
|
|
+├── celery_entrypoint.py / celery_healthcheck.py # Celery worker/beat 入口
|
|
|
+├── pyproject.toml / pytest.ini / conftest.py # 依赖与测试配置
|
|
|
+├── Dockerfile # 主镜像
|
|
|
+├── controllers/ # HTTP 控制器层(console / service_api / openapi / inner_api / web / mcp / trigger / files / common)
|
|
|
+├── services/ # 业务服务层(account / agent / app / dataset / workflow / ...)
|
|
|
+│ └── workflow/ # 工作流编排服务(scheduler / queue_dispatcher / workflow_converter / node_output_inspector_service)
|
|
|
+├── core/ # 核心业务逻辑(详见 6.3)
|
|
|
+├── models/ # SQLAlchemy ORM 实体(account / agent / dataset / workflow / ...)
|
|
|
+├── repositories/ # 仓储层(封装复杂查询)
|
|
|
+├── migrations/ # Alembic 数据库迁移
|
|
|
+├── extensions/ # Flask 扩展注册(ext_database / ext_celery / ext_redis / ext_logging / ...)
|
|
|
+├── configs/ # 分层配置(app_config / feature / enterprise / packaging / observability / middleware / deploy / remote_settings_sources)
|
|
|
+├── events/ # 领域事件与事件处理器(app / dataset / document / message / tenant)
|
|
|
+├── contexts/ / context/ # 请求/应用级上下文(execution_context / flask_app_context / models)
|
|
|
+├── factories/ # 工厂类
|
|
|
+├── fields/ # flask-restx 字段定义
|
|
|
+├── enums/ # 枚举类型
|
|
|
+├── constants/ # 常量
|
|
|
+├── errors/ # 错误与异常
|
|
|
+├── commands/ # CLI 命令(account / data_migrate / plugin / rbac / retention / storage / system / vector)
|
|
|
+├── schedule/ # Celery Beat 定时任务(clean_embedding / clean_messages / clean_workflow_runs / queue_monitor / workflow_schedule / ...)
|
|
|
+├── libs/ # 公共工具库(archive_storage / datetime_utils / encryption / exception / file_utils / infinite_scroll_pagination / json_in_md_parser / ...)
|
|
|
+├── clients/ # 外部客户端
|
|
|
+├── providers/ # 插件化的 provider 适配(vdb/ 向量库,trace/ 可观测)
|
|
|
+├── enterprise/ # 企业版专有代码(telemetry/)
|
|
|
+├── openapi/ # OpenAPI 规范文件
|
|
|
+├── docker/ # 容器内辅助脚本
|
|
|
+└── dev/ # 本地开发辅助
|
|
|
+```
|
|
|
+
|
|
|
+### 6.3 `api/core/`(核心业务逻辑)
|
|
|
+
|
|
|
+```
|
|
|
+core/
|
|
|
+├── workflow/ # 工作流引擎(顶层入口)
|
|
|
+│ ├── workflow_entry.py # WorkflowEntry:装配 Graph + GraphEngine + 过滤器(核心文件)
|
|
|
+│ ├── graph_topology.py # WorkflowGraphTopology:邻接表与上游集合(仅用于校验,非运行时调度)
|
|
|
+│ ├── node_factory.py # DifyNodeFactory:节点注册与构造
|
|
|
+│ ├── node_runtime.py # 节点运行时辅助(变量池、HITL 表单仓储)
|
|
|
+│ ├── human_input_*.py # HITL 适配器、表单、策略
|
|
|
+│ ├── system_variables.py # 系统级变量定义
|
|
|
+│ ├── variable_pool_initializer.py # 共享变量池初始化
|
|
|
+│ ├── variable_prefixes.py # 变量前缀解析
|
|
|
+│ ├── template_rendering.py # Jinja2 模板渲染
|
|
|
+│ ├── file_reference.py # 文件引用处理
|
|
|
+│ ├── snippet_start.py # snippet 节点辅助
|
|
|
+│ ├── workflow_run_outputs.py # 运行输出聚合
|
|
|
+│ ├── generator/ # LLM 辅助生成工作流(planner/builder prompts)
|
|
|
+│ └── nodes/ # 各类节点实现
|
|
|
+│ ├── agent/ # Agent v1 节点(plugin 化策略)
|
|
|
+│ ├── agent_v2/ # Agent v2 节点(调用 dify-agent-backend)
|
|
|
+│ ├── datasource/ # 数据源节点
|
|
|
+│ ├── human_input/ # 人工输入节点(表单 + 回调)
|
|
|
+│ ├── knowledge_index/ # 知识库索引节点
|
|
|
+│ ├── knowledge_retrieval/ # 知识库检索节点
|
|
|
+│ ├── trigger_plugin/ # 插件触发器节点
|
|
|
+│ ├── trigger_schedule/ # 定时触发器节点
|
|
|
+│ └── trigger_webhook/ # Webhook 触发器节点
|
|
|
+├── app/ # 应用抽象层
|
|
|
+│ ├── apps/ # 4 类应用(advanced_chat / agent_app / agent_chat / chat / completion / workflow)
|
|
|
+│ ├── app_config/ # 应用配置(ChatAppConfig / CompletionAppConfig / WorkflowAppConfig / AgentAppConfig)
|
|
|
+│ ├── entities/ # 应用实体
|
|
|
+│ ├── features/ # 应用功能(dialog / file_upload / moderation / suggested_questions / ...)
|
|
|
+│ ├── file_access/ # 文件访问
|
|
|
+│ ├── layers/ # 应用层(pause_state_persist_layer / observability_layer / ...)
|
|
|
+│ ├── llm/ # LLM 调用辅助
|
|
|
+│ ├── task_pipeline/ # 任务管道(SSE / 流生成 / Pipeline)
|
|
|
+│ ├── workflow/ # 工作流应用层(file_runtime / retry_history / layers)
|
|
|
+│ ├── base_app_generator.py / base_app_runner.py / base_app_queue_manager.py
|
|
|
+│ ├── message_generator.py / streaming_utils.py
|
|
|
+│ └── draft_variable_saver.py
|
|
|
+├── agent/ # 独立 Agent Chat App 的 Runner(非工作流节点)
|
|
|
+│ ├── base_agent_runner.py # 基类
|
|
|
+│ ├── cot_agent_runner.py # ReAct 推理循环
|
|
|
+│ ├── cot_chat_agent_runner.py # Chat 模型 ReAct
|
|
|
+│ ├── cot_completion_agent_runner.py # Completion 模型 ReAct
|
|
|
+│ ├── fc_agent_runner.py # Function Calling 推理循环
|
|
|
+│ ├── output_parser/ # ReAct 输出解析
|
|
|
+│ ├── strategy/ # 策略(含 plugin 化的 PluginAgentStrategy)
|
|
|
+│ ├── prompt/ # Agent prompt 模板
|
|
|
+│ └── entities.py / errors.py / plugin_entities.py
|
|
|
+├── rag/ # RAG 知识库引擎(splitter / extractor / embedding / pipeline / retrieval / rerank / docstore / ...)
|
|
|
+├── tools/ # 工具系统
|
|
|
+│ ├── __base__/ # 工具基类
|
|
|
+│ ├── builtin_tool/ # 内置工具
|
|
|
+│ ├── custom_tool/ # 自定义工具(OpenAPI schema)
|
|
|
+│ ├── plugin_tool/ # 插件工具
|
|
|
+│ ├── mcp_tool/ # MCP 工具
|
|
|
+│ ├── workflow_as_tool/ # 工作流作为工具(关键:child engine builder 的对端)
|
|
|
+│ ├── tool_engine.py / tool_manager.py / tool_file_manager.py / tool_label_manager.py
|
|
|
+│ └── utils/
|
|
|
+├── memory/ # 会话记忆(token_buffer_memory)
|
|
|
+├── file/ # 文件(remote_fetcher)
|
|
|
+├── model_manager.py / provider_manager.py # 模型/Provider 管理器
|
|
|
+├── datasource/ # 数据源抽象
|
|
|
+├── db/ # 数据库辅助
|
|
|
+├── rbac/ # RBAC 实体
|
|
|
+├── mcp/ # MCP 客户端与服务端(auth / client / server / session)
|
|
|
+├── plugin/ # 插件系统( backwards_invocation / endpoint / entities / impl / plugin_service / utils)
|
|
|
+├── trigger/ # 触发器管理(constants / entities / provider / trigger_manager / utils / debug)
|
|
|
+├── ops/ # 可观测(ops_trace_manager / entities / utils)
|
|
|
+├── prompt/ # Prompt 工具
|
|
|
+├── moderation/ # 内容审核
|
|
|
+├── external_data_tool/ # 外部数据工具
|
|
|
+├── llm_generator/ # LLM 生成器(用于辅助生成提示词/工作流)
|
|
|
+├── indexing_runner.py # 知识库索引执行器
|
|
|
+├── callback_handler/ # 回调处理
|
|
|
+├── helper/ # 辅助函数
|
|
|
+├── extension/ # 核心扩展点
|
|
|
+├── entities/ / schemas/ # 实体与 Schema
|
|
|
+├── errors/ # 错误定义
|
|
|
+├── logging/ # 日志
|
|
|
+├── telemetry/ # 遥测
|
|
|
+├── repositories/ # 核心层仓储
|
|
|
+├── hosting_configuration.py # 多租户 hosting 配置
|
|
|
+└── base/ # 基础抽象
|
|
|
+```
|
|
|
+
|
|
|
+### 6.4 `dify-agent/`(新一代 Agent 框架,Python)
|
|
|
+
|
|
|
+```
|
|
|
+dify-agent/
|
|
|
+├── pyproject.toml # uv workspace 元数据(含 grpc / server 可选依赖组)
|
|
|
+├── README.md / Makefile / mkdocs.yml
|
|
|
+├── Dockerfile # 独立 agent_backend 镜像
|
|
|
+├── docs/ # 概念文档(concepts/run-lifecycle / ...)
|
|
|
+├── examples/ # 使用示例
|
|
|
+├── proto/ # gRPC proto(与 Local Sandbox 对齐)
|
|
|
+├── tests/ # 单元测试
|
|
|
+└── src/
|
|
|
+ ├── agenton/ # 框架中立的层图(layer graph)组合器
|
|
|
+ │ ├── compositor/ # Compositor + CompositorRun + schemas
|
|
|
+ │ │ ├── core.py # Compositor / LayerNode(无状态 DAG 计划)
|
|
|
+ │ │ ├── run.py # CompositorRun(一次活动运行时 + 资源作用域)
|
|
|
+ │ │ ├── providers.py # LayerProvider(工厂)
|
|
|
+ │ │ ├── schemas.py # 可序列化 DTO(CompositorSessionSnapshot)
|
|
|
+ │ │ └── types.py # 泛型类型变量
|
|
|
+ │ ├── layers/ # Layer 抽象基类
|
|
|
+ │ │ ├── base.py # Layer / LayerDeps / LayerConfig / LifecycleState
|
|
|
+ │ │ └── types.py # PlainLayer / PydanticAILayer 类型族
|
|
|
+ │ └── __init__.py # 门面(自述 state-only core)
|
|
|
+ ├── agenton_collections/ # 可复用 Layer 与 Transformer 实现
|
|
|
+ │ ├── layers/
|
|
|
+ │ │ ├── plain/ # 普通字符串 prompt/tool 层
|
|
|
+ │ │ └── pydantic_ai/ # pydantic-ai 桥接(history 等)
|
|
|
+ │ └── transformers/ # 类型转换器(PYDANTIC_AI_TRANSFORMERS)
|
|
|
+ │ └── pydantic_ai.py
|
|
|
+ ├── dify_agent/ # Dify 业务运行时(FastAPI server)
|
|
|
+ │ ├── runtime/ # 运行时入口
|
|
|
+ │ │ ├── runner.py # AgentRunRunner:组合 compositor + pydantic-ai
|
|
|
+ │ │ ├── agent_factory.py # create_agent(一行:Agent(model, output_type, tools))
|
|
|
+ │ │ ├── compositor_factory.py # 默认 provider 集合
|
|
|
+ │ │ ├── run_scheduler.py # 调度(无 Redis job queue,进程内)
|
|
|
+ │ │ └── output_contract.py # 输出契约解析
|
|
|
+ │ ├── layers/ # Dify 业务 Layer(详见 5.4)
|
|
|
+ │ │ ├── ask_human/ # 人工输入延迟工具
|
|
|
+ │ │ ├── config/ # 配置层
|
|
|
+ │ │ ├── dify_core_tools/ # Dify 核心工具层
|
|
|
+ │ │ ├── dify_plugin/ # Dify 插件层(LLM 与工具)
|
|
|
+ │ │ ├── drive/ # 文件 Drive 层
|
|
|
+ │ │ ├── execution_context/ # 执行上下文层
|
|
|
+ │ │ ├── knowledge/ # 知识库检索层
|
|
|
+ │ │ ├── output/ # 结构化输出契约层(output_type)
|
|
|
+ │ │ └── shell/ # Shell 命令执行层(4 个工具)
|
|
|
+ │ ├── adapters/ # Shell / LLM 适配器
|
|
|
+ │ ├── agent_stub/ # gRPC Stub 协议、文件上传下载(drive)
|
|
|
+ │ ├── client/ # 与 Dify API 对接的客户端
|
|
|
+ │ ├── protocol/ # 公开协议(DTO)
|
|
|
+ │ ├── server/ # FastAPI server 路由与生命周期
|
|
|
+ │ ├── storage/ # 存储适配(snapshot 落盘)
|
|
|
+ │ └── plugin_daemon_transport.py # 与 plugin_daemon 通信
|
|
|
+ └── shellctl/ # Python 版 shellctl 客户端(与 Go 版 dify-agent-runtime 对端)
|
|
|
+ ├── client/
|
|
|
+ └── shared/
|
|
|
+```
|
|
|
+
|
|
|
+### 6.5 `dify-agent-runtime/`(Agent Shell 沙箱,Go)
|
|
|
+
|
|
|
+```
|
|
|
+dify-agent-runtime/
|
|
|
+├── go.mod / go.sum # Go 1.26
|
|
|
+├── Makefile / README.md
|
|
|
+├── packaging_test.go # 打包测试
|
|
|
+├── cmd/ # CLI 入口(cobra)
|
|
|
+│ ├── shellctl/ # 主服务(serve --listen 0.0.0.0:5004)
|
|
|
+│ ├── dify-agent-cli/ # Agent CLI(在沙箱内调用)
|
|
|
+│ ├── runner/ # 集成 Landlock 的 job runner
|
|
|
+│ ├── runner-exit/ # 退出状态写 SQLite
|
|
|
+│ └── sanitize-pty/ # tmux pipe-pane PTY 过滤器
|
|
|
+├── internal/ # 内部实现
|
|
|
+│ ├── server/ # shellctl HTTP/gRPC 服务
|
|
|
+│ ├── agentcli/ # Agent CLI 实现
|
|
|
+│ ├── landlock/ # Linux Landlock LSM 隔离封装
|
|
|
+│ ├── sanitize/ # PTY ANSI 清洗
|
|
|
+│ ├── runner_exit/ # 退出码处理
|
|
|
+│ ├── cmdutil/ # 命令工具
|
|
|
+│ ├── envvar/ # 环境变量
|
|
|
+│ └── stubclient/ # 与 dify-agent gRPC Stub 通信
|
|
|
+├── gen/ # 由 proto 生成的 Go 代码(gen/dify/agent/stub/v1/)
|
|
|
+├── docker/ # 容器构建辅助
|
|
|
+└── tests/ # 测试
|
|
|
+```
|
|
|
+
|
|
|
+### 6.6 `web/`(前端,Next.js + React 19)
|
|
|
+
|
|
|
+```
|
|
|
+web/
|
|
|
+├── package.json / Dockerfile / next.config.mjs / vite.config.ts / tsconfig.json
|
|
|
+├── app/ # Next.js App Router 路由
|
|
|
+├── features/ # 功能模块(按业务领域划分)
|
|
|
+├── components/ # 共享组件(隐含,按 features 内组织)
|
|
|
+├── hooks/ # 自定义 Hook
|
|
|
+├── context/ # React Context
|
|
|
+├── models/ # 前端类型定义
|
|
|
+├── constants/ # 常量
|
|
|
+├── assets/ / icons/ # 静态资源
|
|
|
+├── i18n/ / i18n-config/ # 国际化(i18next)
|
|
|
+├── config/ # 前端配置
|
|
|
+├── bin/ # 入口脚本
|
|
|
+├── docs/ # 前端文档
|
|
|
+├── docker/ # 容器构建
|
|
|
+├── __mocks__ / __tests__ # Mock 与测试
|
|
|
+├── next/ # Next.js 特定代码
|
|
|
+├── global.d.ts / env.ts / instrumentation-client.ts
|
|
|
+├── dev-proxy.config.ts # 开发代理
|
|
|
+└── knip.config.ts # 死代码检测配置
|
|
|
+```
|
|
|
+
|
|
|
+### 6.7 `docker/`(部署编排)
|
|
|
+
|
|
|
+```
|
|
|
+docker/
|
|
|
+├── docker-compose.yaml # 自动生成的最终编排
|
|
|
+├── docker-compose-template.yaml # 手维护的模板(源头)
|
|
|
+├── docker-compose.middleware.yaml # 仅中间件(DB / Redis)的精简版
|
|
|
+├── docker-compose.pytest.ports.yaml # 测试用端口编排
|
|
|
+├── generate_docker_compose # 从 template + envs 生成最终 yaml 的脚本
|
|
|
+├── dify-env-sync.py / dify-env-sync.sh # 环境变量同步
|
|
|
+├── envs/ # 按 profile 拆分的环境变量(向量库 / 业务库)
|
|
|
+├── volumes/ # 持久化卷挂载点
|
|
|
+├── nginx/ # Nginx 反向代理配置
|
|
|
+├── ssrf_proxy/ # Squid SSRF 代理配置
|
|
|
+├── certbot/ # HTTPS 证书
|
|
|
+├── startupscripts/ # 容器启动脚本
|
|
|
+├── elasticsearch/ / pgvector/ / couchbase-server/ / iris/ / tidb/ # 各向量库的辅助配置
|
|
|
+└── README.md
|
|
|
+```
|
|
|
+
|
|
|
+### 6.8 `packages/`(pnpm workspace 内部包)
|
|
|
+
|
|
|
+```
|
|
|
+packages/
|
|
|
+├── contracts/ # @dify/contracts:前后端共享的类型契约
|
|
|
+├── dify-ui/ # @langgenius/dify-ui:可复用 UI 组件库
|
|
|
+├── dev-proxy/ # @langgenius/dev-proxy:本地开发代理
|
|
|
+├── iconify-collections/ # @dify/iconify-collections:图标集合
|
|
|
+├── tsconfig/ # @dify/tsconfig:共享 tsconfig
|
|
|
+├── jotai-tanstack-form/ # jotai 与 TanStack Form 的桥接包
|
|
|
+└── migrate-no-unchecked-indexed-access/ # 迁移工具包
|
|
|
+```
|
|
|
+
|
|
|
+### 6.9 `sdks/`(官方 SDK)
|
|
|
+
|
|
|
+```
|
|
|
+sdks/
|
|
|
+├── nodejs-client/ # Node.js 客户端 SDK(TypeScript)
|
|
|
+├── php-client/ # PHP 客户端 SDK
|
|
|
+└── README.md
|
|
|
+```
|
|
|
+
|
|
|
+### 6.10 `cli/`(Dify CLI)
|
|
|
+
|
|
|
+```
|
|
|
+cli/
|
|
|
+├── package.json / tsconfig.json / vite.config.ts
|
|
|
+├── bin/ # CLI 入口(dify-cli)
|
|
|
+├── src/ # CLI 命令实现
|
|
|
+├── scripts/ # 辅助脚本
|
|
|
+├── test/ # 测试
|
|
|
+├── AGENTS.md / ARD.md # 架构决策记录
|
|
|
+└── README.md
|
|
|
+```
|
|
|
+
|
|
|
+### 6.11 `dev/`(本地开发脚本)
|
|
|
+
|
|
|
+```
|
|
|
+dev/
|
|
|
+├── setup* # 一键拉起开发环境
|
|
|
+├── start-api* # 启动 Flask API
|
|
|
+├── start-web* # 启动 Next.js 前端
|
|
|
+├── start-worker* # 启动 Celery Worker
|
|
|
+├── start-beat* # 启动 Celery Beat
|
|
|
+├── start-docker-compose* # 启动 docker-compose
|
|
|
+├── sync-uv* # 同步 uv workspace 依赖
|
|
|
+├── reformat* # 代码格式化
|
|
|
+├── ty-check* # 类型检查(pyrefly)
|
|
|
+└── pyrefly-check-local*
|
|
|
+```
|
|
|
+
|
|
|
+### 6.12 `e2e/`(端到端测试)
|
|
|
+
|
|
|
+```
|
|
|
+e2e/
|
|
|
+├── package.json / cucumber.config.ts
|
|
|
+├── features/ # Cucumber 特性文件
|
|
|
+├── fixtures/ # 测试夹具
|
|
|
+├── support/ # 测试支持代码
|
|
|
+├── scripts/ # 辅助脚本
|
|
|
+├── tests/ # 测试实现
|
|
|
+├── test-env.ts # 测试环境配置
|
|
|
+├── AGENTS.md / README.md
|
|
|
+```
|
|
|
+
|
|
|
+### 6.13 `scripts/`(仓库治理)
|
|
|
+
|
|
|
+```
|
|
|
+scripts/
|
|
|
+├── ast_grep_guard.py / ast_grep_rules/ # AST 检查规则
|
|
|
+├── check_no_new_controller_sqlalchemy.py # 禁止在 controller 直接用 SQLAlchemy
|
|
|
+├── check_no_new_getattr.py # 禁止新增 getattr 调用
|
|
|
+├── lint_controller_sqlalchemy.py # 检查 controller 层 SQL 渗漏
|
|
|
+└── stress-test/ # 压测脚本
|
|
|
+```
|
|
|
+
|
|
|
+### 6.14 `docs/`(产品文档)
|
|
|
+
|
|
|
+```
|
|
|
+docs/
|
|
|
+├── design/ # 设计文档(架构 / 决策)
|
|
|
+├── zh-CN/ zh-TW/ en-US/ # 多语言文档(中文简/繁、英文)
|
|
|
+├── ja-JP/ ko-KR/ fr-FR/ ...# 其他语言
|
|
|
+├── cross-env-app-migration/ # 跨环境应用迁移指南
|
|
|
+├── weaviate/ # Weaviate 专题
|
|
|
+├── eu-ai-act-compliance.md # 欧盟 AI Act 合规
|
|
|
+└── tlh/ # 克林贡语(彩蛋)
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 7. 对本仓库(agent-management)的关键借鉴清单
|
|
|
+
|
|
|
+| 借鉴维度 | Dify 实现位置 | 对应本仓库模块 |
|
|
|
+|---|---|---|
|
|
|
+| 工作流信封化 | `services/workflow/node_output_inspector_service.py`(仅 Agent v2) | `engine/NodeOutputEnvelope`(已全节点统一) |
|
|
|
+| 节点级失败策略 | `core/workflow/nodes/agent_v2/output_failure_orchestrator.py`(仅 Agent v2) | `engine/RetryPolicy` + `failStrategy`(已引擎层统一) |
|
|
|
+| HITL 暂停-恢复 | `core/app/layers/pause_state_persist_layer.py` | 可参考其状态序列化设计 |
|
|
|
+| 子工作流嵌套 | `core/workflow/workflow_entry.py:72-140`(`_WorkflowChildEngineBuilder`) | 未来扩展"工作流作为工具"时可参考 |
|
|
|
+| 插件化模型/工具 | `dify-plugin-daemon`(Go)+ `core/plugin/` | Hermes Bridge 设计可对照 |
|
|
|
+| 沙箱化 Shell 执行 | `dify-agent-runtime/internal/landlock/` + `shellctl` | `docs/hermes-sandbox.md` 可对照 |
|
|
|
+| 多人协同画布 | loro-crdt + socket.io | 前端 ReactFlow 改造时可参考 |
|
|
|
+| 可观测全链路 | OpenTelemetry + 8 种 trace 后端 | 未来接入 Langfuse 可参考 `api/providers/trace/` |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 附录:探索方法说明
|
|
|
+
|
|
|
+本文档基于以下方式收集信息:
|
|
|
+1. 直接阅读 `pyproject.toml` / `go.mod` / `package.json` / `docker-compose.yaml` 提取技术栈与依赖
|
|
|
+2. 直接阅读核心源码文件(`workflow_entry.py`、`agent_node.py`、`cot_agent_runner.py`、`compositor/core.py`、`runtime/runner.py` 等)提取调度与执行细节
|
|
|
+3. 对 `dify-agent/` 全仓库做针对性关键字搜索(`multi.?agent` / `dynamic.*graph` / `LLM.*(decide|route)` 等),结论为"零命中"以支撑第 5 章判断
|
|
|
+4. 阅读官方概念文档(`dify-agent/docs/dify-agent/concepts/run-lifecycle/index.md` 等)确认设计意图
|
|
|
+
|
|
|
+文档中所有"file_path:line_number"引用均可直接定位到对应源码位置,便于深入查阅。
|