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

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

应用编排与外部知识接入 · 本章是 Dify DeepWiki 中文译文的独立章节页,保留原始链接、源码锚点、模块标签和章节层级。

项目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
模块标签
  • 接口与服务契约
  • 模型调用与提供方适配
  • 图谱与关系
  • 文档对象与元数据
  • 智能体运行时

中文译文

节点工厂与依赖注入(中文译文)

原始 DeepWiki 页面:https://deepwiki.com/langgenius/dify/5.2-node-factory-and-dependency-injection
翻译时间:2026-05-27T08:44:24.204Z
翻译模型:deepseek-chat
原文字符数:11594
项目:Dify (dify)

---

节点工厂与依赖注入

相关源文件

以下文件用于生成此 Wiki 页面:

  • 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 概念和用户输入如何映射到具体的后端类和逻辑。

工作流实体映射

graph TD
    subgraph "自然语言 / UI 空间"
        UserNode["工作流节点(UI)"]
        UserVar["变量 {{#node.var#}}"]
        UserModel["模型选择(GPT-4)"]
        UserCode["Python/JS 代码块"]
    end

    subgraph "代码实体空间(api/core/workflow)"
        NodeFactory["DifyNodeFactory<br/>(node_factory.py)"]
        VariablePool["VariablePool<br/>(graphon/runtime.py)"]
        ModelInstance["ModelInstance<br/>(core/model_manager.py)"]
        CodeExecutor["CodeExecutor<br/>(node_factory.py)"]
    end

    UserNode -->|由...实例化| NodeFactory
    UserVar -->|通过...解析| VariablePool
    UserModel -->|由...管理| ModelInstance
    UserCode -->|由...执行| CodeExecutor

    style NodeFactory stroke-width:2px
    style VariablePool stroke-width:2px

来源: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

工厂依赖流程

graph LR
    subgraph "输入上下文"
        GIP["GraphInitParams"]
        GRS["GraphRuntimeState"]
    end

    subgraph "DifyNodeFactory(api/core/workflow/node_factory.py)"
        DRC["_resolve_dify_context()"]
        LLM_Acc["build_dify_model_access()"]
        HTTP_Acc["build_http_request_config()"]
    end

    subgraph "注入的依赖"
        CP["CredentialsProvider"]
        MF["ModelFactory"]
        HC["HttpClient(graphon_ssrf_proxy)"]
        CE["CodeExecutor"]
    end

    GIP --> DRC
    DRC --> LLM_Acc
    DRC --> HTTP_Acc

    LLM_Acc --> CP
    LLM_Acc --> MF
    HTTP_Acc --> HC
    DRC --> CE

来源: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 函数选择正确的类,并注入特定类型的依赖。

节点创建序列
sequenceDiagram
    participant GE as GraphEngine
    participant NF as DifyNodeFactory
    participant LC as 节点类(例如 LLMNode)

    GE->>NF: create_node(node_config)
    NF->>NF: resolve_workflow_node_class(node_type, version)

    alt 是 LLM / 参数提取器
        NF->>NF: fetch_model_config()
        NF->>NF: fetch_memory()
        NF->>LC: init(credentials_provider, model_instance, memory)
    else 是代码节点
        NF->>LC: init(code_executor, code_limits)
    else 是 HTTP 请求
        NF->>LC: init(http_client, http_request_config, file_manager)
    end

    LC-->>NF: 节点实例
    NF-->>GE: 节点实例

来源: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