节点工厂与依赖注入
节点工厂与依赖注入
相关源文件
本章引用的主要源码文件:
api/.importlinterapi/core/app/file_access/__init__.pyapi/core/app/file_access/controller.pyapi/core/app/file_access/scope.pyapi/core/workflow/node_factory.pyapi/core/workflow/node_runtime.pyapi/core/workflow/workflow_entry.pyapi/tests/integration_tests/workflow/nodes/test_code.pyapi/tests/integration_tests/workflow/nodes/test_http.pyapi/tests/integration_tests/workflow/nodes/test_llm.pyapi/tests/integration_tests/workflow/nodes/test_parameter_extractor.pyapi/tests/integration_tests/workflow/nodes/test_template_transform.pyapi/tests/integration_tests/workflow/nodes/test_tool.pyapi/tests/unit_tests/core/app/apps/test_workflow_app_runner_core.pyapi/tests/unit_tests/core/app/apps/test_workflow_app_runner_single_node.pyapi/tests/unit_tests/core/rag/datasource/test_retrieval_attachment_access.pyapi/tests/unit_tests/core/workflow/graph_engine/test_mock_factory.pyapi/tests/unit_tests/core/workflow/graph_engine/test_mock_nodes.pyapi/tests/unit_tests/core/workflow/graph_engine/test_tool_in_chatflow.pyapi/tests/unit_tests/core/workflow/nodes/answer/test_answer.pyapi/tests/unit_tests/core/workflow/nodes/code/__init__.pyapi/tests/unit_tests/core/workflow/nodes/code/code_node_spec.pyapi/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_executor.pyapi/tests/unit_tests/core/workflow/nodes/http_request/test_http_request_node.pyapi/tests/unit_tests/core/workflow/nodes/template_transform/__init__.pyapi/tests/unit_tests/core/workflow/nodes/template_transform/template_transform_node_spec.pyapi/tests/unit_tests/core/workflow/nodes/test_if_else.pyapi/tests/unit_tests/core/workflow/nodes/test_list_operator.pyapi/tests/unit_tests/core/workflow/nodes/tool/test_tool_node.pyapi/tests/unit_tests/core/workflow/nodes/webhook/test_webhook_file_conversion.pyapi/tests/unit_tests/core/workflow/nodes/webhook/test_webhook_node.pyapi/tests/unit_tests/core/workflow/test_node_factory.pyapi/tests/unit_tests/core/workflow/test_node_runtime.pyapi/tests/unit_tests/core/workflow/test_workflow_entry.py
本文深入探讨 Dify 工作流引擎中的 DifyNodeFactory 模式、节点实例化以及依赖注入机制,阐述系统如何将高层工作流定义桥接为可执行的代码实体。
系统架构:从 DSL 到代码实体
工作流引擎将 DSL(领域特定语言)或 UI 中定义的图结构转换为可执行的 Python 对象集合。DifyNodeFactory 在此过程中充当主要转换器,确保每个节点都具备必要的运行时依赖。
映射:自然语言空间到代码实体空间
下图展示了在实例化阶段,UI 概念和用户输入如何映射到具体的后端类和逻辑。
工作流实体映射
来源: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 中或在子引擎构建期间实例化。
初始化与依赖解析
当工作流启动时,使用 GraphInitParams 和 GraphRuntimeState 初始化一个 DifyNodeFactory。它会解析环境和安全上下文,以准备共享资源,例如用于 HTTP 请求的 SSRF 代理和用于脚本节点的 CodeExecutor。
工厂依赖流程
来源:api/core/workflow/node_factory.py:245-285, api/core/workflow/workflow_entry.py:89-92, api/core/workflow/node_factory.py:18-20
关键依赖类别
| 依赖 | 代码实体 | 来源 / 配置 |
|---|---|---|
| 模型访问 | CredentialsProvider、ModelFactory | DifyCredentialsProvider、DifyModelFactory api/core/workflow/node_factory.py:273-280 |
| 代码执行 | CodeExecutor | dify_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 |
| 文件管理 | DatabaseFileAccessController | api/core/workflow/workflow_entry.py:45-45 |
节点实例化逻辑
DifyNodeFactory 中的 create_node 方法使用 resolve_workflow_node_class 函数选择正确的类,并注入特定类型的依赖。
节点创建序列
来源: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 | 为节点提供访问 sys、env 和 user_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.nodes和core.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