agentic_huge_data_base / wiki
页面 Dify · 5.2 节点工厂与依赖注入·DeepWiki 中文全文译文

5.2 · 节点工厂与依赖注入(Node Factory and Dependency Injection)

应用编排与外部知识接入 · 聚焦本章的模块关系、源码依据与实现要点。

项目Dify 章节5.2 状态全文译文 模块接口与服务契约、模型调用与提供方适配、图谱与关系、文档对象与元数据
源码线索
  • api/.importlinter
  • api/core/app/file_access/__init__.py
  • api/core/app/file_access/controller.py
  • api/core/app/file_access/scope.py
  • api/core/workflow/node_factory.py
  • api/core/workflow/node_runtime.py
  • api/core/workflow/workflow_entry.py
  • api/tests/integration_tests/workflow/nodes/test_code.py
  • api/tests/integration_tests/workflow/nodes/test_http.py
  • api/tests/integration_tests/workflow/nodes/test_llm.py
模块标签
  • 接口与服务契约
  • 模型调用与提供方适配
  • 图谱与关系
  • 文档对象与元数据
  • 智能体运行时

章节正文

节点工厂与依赖注入

节点工厂与依赖注入

相关源文件

本章引用的主要源码文件:

  • api/.importlinter
  • api/core/app/file_access/__init__.py
  • api/core/app/file_access/controller.py
  • api/core/app/file_access/scope.py
  • api/core/workflow/node_factory.py
  • api/core/workflow/node_runtime.py
  • api/core/workflow/workflow_entry.py
  • api/tests/integration_tests/workflow/nodes/test_code.py
  • api/tests/integration_tests/workflow/nodes/test_http.py
  • api/tests/integration_tests/workflow/nodes/test_llm.py
  • api/tests/integration_tests/workflow/nodes/test_parameter_extractor.py
  • api/tests/integration_tests/workflow/nodes/test_template_transform.py
  • api/tests/integration_tests/workflow/nodes/test_tool.py
  • api/tests/unit_tests/core/app/apps/test_workflow_app_runner_core.py
  • api/tests/unit_tests/core/app/apps/test_workflow_app_runner_single_node.py
  • api/tests/unit_tests/core/rag/datasource/test_retrieval_attachment_access.py
  • api/tests/unit_tests/core/workflow/graph_engine/test_mock_factory.py
  • api/tests/unit_tests/core/workflow/graph_engine/test_mock_nodes.py
  • api/tests/unit_tests/core/workflow/graph_engine/test_tool_in_chatflow.py
  • api/tests/unit_tests/core/workflow/nodes/answer/test_answer.py
  • api/tests/unit_tests/core/workflow/nodes/code/__init__.py
  • api/tests/unit_tests/core/workflow/nodes/code/code_node_spec.py
  • api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_executor.py
  • api/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_node.py
  • api/tests/unit_tests/core/workflow/nodes/template_transform/__init__.py
  • api/tests/unit_tests/core/workflow/nodes/template_transform/template_transform_node_spec.py
  • api/tests/unit_tests/core/workflow/nodes/test_if_else.py
  • api/tests/unit_tests/core/workflow/nodes/test_list_operator.py
  • api/tests/unit_tests/core/workflow/nodes/tool/test_tool_node.py
  • api/tests/unit_tests/core/workflow/nodes/webhook/test_webhook_file_conversion.py
  • api/tests/unit_tests/core/workflow/nodes/webhook/test_webhook_node.py
  • api/tests/unit_tests/core/workflow/test_node_factory.py
  • api/tests/unit_tests/core/workflow/test_node_runtime.py
  • api/tests/unit_tests/core/workflow/test_workflow_entry.py

本文深入探讨 Dify 工作流引擎中的 DifyNodeFactory 模式、节点实例化以及依赖注入机制,阐述系统如何将高层工作流定义桥接为可执行的代码实体。

系统架构:从 DSL 到代码实体

工作流引擎将 DSL(领域特定语言)或 UI 中定义的图结构转换为可执行的 Python 对象集合。DifyNodeFactory 在此过程中充当主要转换器,确保每个节点都具备必要的运行时依赖。

映射:自然语言空间到代码实体空间

下图展示了在实例化阶段,UI 概念和用户输入如何映射到具体的后端类和逻辑。

工作流实体映射

Dify · 映射:自然语言空间到代码实体空间 · 图 1
Dify · 映射:自然语言空间到代码实体空间 · 图 1

来源:api/core/workflow/node_factory.py:13-33, api/core/workflow/workflow_entry.py:89-92, api/core/workflow/node_factory.py:172-200

DifyNodeFactory 实现

DifyNodeFactory 类负责使用所有必需的依赖(包括模型访问、代码执行器和 HTTP 客户端)来初始化节点。它通常在 WorkflowEntry 中或在子引擎构建期间实例化。

初始化与依赖解析

当工作流启动时,使用 GraphInitParamsGraphRuntimeState 初始化一个 DifyNodeFactory。它会解析环境和安全上下文,以准备共享资源,例如用于 HTTP 请求的 SSRF 代理和用于脚本节点的 CodeExecutor

工厂依赖流程

Dify · 初始化与依赖解析 · 图 2
Dify · 初始化与依赖解析 · 图 2

来源:api/core/workflow/node_factory.py:245-285, api/core/workflow/workflow_entry.py:89-92, api/core/workflow/node_factory.py:18-20

关键依赖类别
依赖代码实体来源 / 配置
模型访问CredentialsProviderModelFactoryDifyCredentialsProviderDifyModelFactory api/core/workflow/node_factory.py:273-280
代码执行CodeExecutordify_config.CODE_EXECUTION_ENDPOINT api/core/workflow/node_factory.py:14-17
HTTP 请求graphon_ssrf_proxy(HttpClient)dify_config.HTTP_REQUEST_NODE_SSL_VERIFY api/core/workflow/node_factory.py:18-19
文件管理DatabaseFileAccessControllerapi/core/workflow/workflow_entry.py:45-45

节点实例化逻辑

DifyNodeFactory 中的 create_node 方法使用 resolve_workflow_node_class 函数选择正确的类,并注入特定类型的依赖。

节点创建序列
Dify · 节点创建序列 · 图 3
Dify · 节点创建序列 · 图 3

来源:api/core/workflow/node_factory.py:123-134, api/core/workflow/node_factory.py:328-450, api/core/workflow/workflow_entry.py:99-103

专用运行时适配器

Dify 使用多个适配器类来满足 graphon 协议,同时保留后端特定的逻辑:

  • DifyPreparedLLM:向节点隐藏完整的 ModelManager 复杂性,提供简化的 LLMProtocol 接口 api/core/workflow/node_runtime.py:143-147
  • DifyFileReferenceFactory:使用 DatabaseFileAccessController 将原始映射转换为 Dify 的文件存储逻辑 api/core/workflow/node_runtime.py:131-140
  • DifyToolFileManager:管理工具执行的文件生命周期,包括临时存储和检索 api/core/workflow/node_runtime.py:30-32

变量与文件依赖注入

在执行生命周期中,节点会接收与变量解析和文件处理相关的依赖。

变量池初始化

在执行之前,VariablePool 会填充系统变量、用户输入和环境变量。

组件职责代码引用
VariablePool为节点提供访问 sysenvuser_input 的统一接口api/core/workflow/workflow_entry.py:40-41
add_variables_to_pool将引导变量注入运行时状态api/core/workflow/variable_pool_initializer.py:25-25
DifyPromptMessageSerializer将复杂变量序列化为模型兼容的提示消息api/core/workflow/node_runtime.py:28-28

来源:api/core/workflow/workflow_entry.py:84-88, api/core/workflow/node_factory.py:24-33, api/tests/integration_tests/workflow/nodes/test_llm.py:56-68

注册与发现

工作流层拥有节点注册表,将 graphon 的核心节点与 Dify 特定的实现相结合。

  • register_nodes():递归导入 graphon.nodescore.workflow.nodes 中的模块,以触发类注册 api/core/workflow/node_factory.py:105-108
  • resolve_workflow_node_class:根据 NodeType 和版本在注册表中执行查找,如果未找到特定版本匹配,则回退到 latest 版本 api/core/workflow/node_factory.py:123-134

来源:api/core/workflow/node_factory.py:105-120, api/core/workflow/node_factory.py:172-180