refactor(dify_graph): unify invoke and user enums source in workflow (#32873)

This commit is contained in:
99
2026-03-03 15:05:20 +08:00
committed by GitHub
parent 48c8aac092
commit c8688ec371
44 changed files with 124 additions and 157 deletions

View File

@ -7,14 +7,13 @@ from configs import dify_config
from core.app.entities.app_invoke_entities import InvokeFrom
from core.workflow.node_factory import DifyNodeFactory
from dify_graph.entities import GraphInitParams
from dify_graph.enums import WorkflowNodeExecutionStatus
from dify_graph.enums import UserFrom, WorkflowNodeExecutionStatus
from dify_graph.graph import Graph
from dify_graph.node_events import NodeRunResult
from dify_graph.nodes.code.code_node import CodeNode
from dify_graph.nodes.code.limits import CodeNodeLimits
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from models.enums import UserFrom
from tests.integration_tests.workflow.nodes.__mock.code_executor import setup_code_executor_mock
CODE_MAX_STRING_LENGTH = dify_config.CODE_MAX_STRING_LENGTH

View File

@ -10,13 +10,12 @@ from core.helper.ssrf_proxy import ssrf_proxy
from core.tools.tool_file_manager import ToolFileManager
from core.workflow.node_factory import DifyNodeFactory
from dify_graph.entities import GraphInitParams
from dify_graph.enums import WorkflowNodeExecutionStatus
from dify_graph.enums import UserFrom, WorkflowNodeExecutionStatus
from dify_graph.file.file_manager import file_manager
from dify_graph.graph import Graph
from dify_graph.nodes.http_request import HttpRequestNode, HttpRequestNodeConfig
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from models.enums import UserFrom
from tests.integration_tests.workflow.nodes.__mock.http import setup_http_mock
HTTP_REQUEST_CONFIG = HttpRequestNodeConfig(

View File

@ -8,14 +8,13 @@ from core.app.entities.app_invoke_entities import InvokeFrom
from core.llm_generator.output_parser.structured_output import _parse_structured_output
from core.model_manager import ModelInstance
from dify_graph.entities import GraphInitParams
from dify_graph.enums import WorkflowNodeExecutionStatus
from dify_graph.enums import UserFrom, WorkflowNodeExecutionStatus
from dify_graph.node_events import StreamCompletedEvent
from dify_graph.nodes.llm.node import LLMNode
from dify_graph.nodes.llm.protocols import CredentialsProvider, ModelFactory
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from extensions.ext_database import db
from models.enums import UserFrom
"""FOR MOCK FIXTURES, DO NOT REMOVE"""

View File

@ -6,14 +6,13 @@ from unittest.mock import MagicMock
from core.app.entities.app_invoke_entities import InvokeFrom
from core.model_manager import ModelInstance
from dify_graph.entities import GraphInitParams
from dify_graph.enums import WorkflowNodeExecutionStatus
from dify_graph.enums import UserFrom, WorkflowNodeExecutionStatus
from dify_graph.model_runtime.entities import AssistantPromptMessage, UserPromptMessage
from dify_graph.nodes.llm.protocols import CredentialsProvider, ModelFactory
from dify_graph.nodes.parameter_extractor.parameter_extractor_node import ParameterExtractorNode
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from extensions.ext_database import db
from models.enums import UserFrom
from tests.integration_tests.workflow.nodes.__mock.model import get_mocked_fetch_model_instance
"""FOR MOCK FIXTURES, DO NOT REMOVE"""

View File

@ -4,13 +4,12 @@ import uuid
from core.app.entities.app_invoke_entities import InvokeFrom
from core.workflow.node_factory import DifyNodeFactory
from dify_graph.entities import GraphInitParams
from dify_graph.enums import WorkflowNodeExecutionStatus
from dify_graph.enums import UserFrom, WorkflowNodeExecutionStatus
from dify_graph.graph import Graph
from dify_graph.nodes.template_transform.template_renderer import TemplateRenderError
from dify_graph.nodes.template_transform.template_transform_node import TemplateTransformNode
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from models.enums import UserFrom
class _SimpleJinja2Renderer:

View File

@ -6,13 +6,12 @@ from core.app.entities.app_invoke_entities import InvokeFrom
from core.tools.utils.configuration import ToolParameterConfigurationManager
from core.workflow.node_factory import DifyNodeFactory
from dify_graph.entities import GraphInitParams
from dify_graph.enums import WorkflowNodeExecutionStatus
from dify_graph.enums import UserFrom, WorkflowNodeExecutionStatus
from dify_graph.graph import Graph
from dify_graph.node_events import StreamCompletedEvent
from dify_graph.nodes.tool.tool_node import ToolNode
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from models.enums import UserFrom
def init_tool_node(config: dict):

View File

@ -7,12 +7,12 @@ import pytest
from core.app.entities.app_invoke_entities import InvokeFrom
from core.workflow.node_factory import DifyNodeFactory
from dify_graph.entities import GraphInitParams
from dify_graph.enums import UserFrom
from dify_graph.graph import Graph
from dify_graph.graph.validation import GraphValidationError
from dify_graph.nodes import NodeType
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from models.enums import UserFrom
def _build_iteration_graph(node_id: str) -> dict[str, Any]:

View File

@ -8,14 +8,13 @@ import pytest
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities import GraphInitParams
from dify_graph.enums import ErrorStrategy, NodeExecutionType, NodeType
from dify_graph.enums import ErrorStrategy, NodeExecutionType, NodeType, UserFrom
from dify_graph.graph import Graph
from dify_graph.graph.validation import GraphValidationError
from dify_graph.nodes.base.entities import BaseNodeData
from dify_graph.nodes.base.node import Node
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from models.enums import UserFrom
class _TestNodeData(BaseNodeData):

View File

@ -201,8 +201,8 @@ def test_mock_factory_node_type_detection():
"""Test that MockNodeFactory correctly identifies nodes to mock."""
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities import GraphInitParams
from dify_graph.enums import UserFrom
from dify_graph.runtime import GraphRuntimeState, VariablePool
from models.enums import UserFrom
from .test_mock_factory import MockNodeFactory
@ -311,9 +311,9 @@ def test_register_custom_mock_node():
"""Test registering a custom mock implementation for a node type."""
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities import GraphInitParams
from dify_graph.enums import UserFrom
from dify_graph.nodes.template_transform import TemplateTransformNode
from dify_graph.runtime import GraphRuntimeState, VariablePool
from models.enums import UserFrom
from .test_mock_factory import MockNodeFactory

View File

@ -6,6 +6,7 @@ from unittest.mock import MagicMock
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities.graph_init_params import GraphInitParams
from dify_graph.entities.pause_reason import SchedulingPause
from dify_graph.enums import UserFrom
from dify_graph.graph import Graph
from dify_graph.graph_engine import GraphEngine, GraphEngineConfig
from dify_graph.graph_engine.command_channels import InMemoryChannel
@ -20,7 +21,6 @@ from dify_graph.graph_events import GraphRunAbortedEvent, GraphRunPausedEvent, G
from dify_graph.nodes.start.start_node import StartNode
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.variables import IntegerVariable, StringVariable
from models.enums import UserFrom
def test_abort_command():

View File

@ -18,8 +18,8 @@ def test_mock_factory_registers_iteration_node():
"""Test that MockNodeFactory has iteration node registered."""
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities import GraphInitParams
from dify_graph.enums import UserFrom
from dify_graph.runtime import GraphRuntimeState, VariablePool
from models.enums import UserFrom
# Create a MockNodeFactory instance
graph_init_params = GraphInitParams(
@ -67,8 +67,8 @@ def test_mock_iteration_node_preserves_config():
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities import GraphInitParams
from dify_graph.enums import UserFrom
from dify_graph.runtime import GraphRuntimeState, VariablePool
from models.enums import UserFrom
from tests.unit_tests.core.workflow.graph_engine.test_mock_nodes import MockIterationNode
# Create mock config
@ -129,8 +129,8 @@ def test_mock_loop_node_preserves_config():
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities import GraphInitParams
from dify_graph.enums import UserFrom
from dify_graph.runtime import GraphRuntimeState, VariablePool
from models.enums import UserFrom
from tests.unit_tests.core.workflow.graph_engine.test_mock_nodes import MockLoopNode
# Create mock config

View File

@ -103,8 +103,8 @@ def test_mock_factory_detection():
"""Test MockNodeFactory node type detection."""
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities import GraphInitParams
from dify_graph.enums import UserFrom
from dify_graph.runtime import GraphRuntimeState, VariablePool
from models.enums import UserFrom
print("Testing MockNodeFactory detection...")
@ -156,8 +156,8 @@ def test_mock_factory_registration():
"""Test registering and unregistering mock node types."""
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities import GraphInitParams
from dify_graph.enums import UserFrom
from dify_graph.runtime import GraphRuntimeState, VariablePool
from models.enums import UserFrom
print("Testing MockNodeFactory registration...")

View File

@ -16,7 +16,7 @@ from core.app.entities.app_invoke_entities import InvokeFrom
from core.model_manager import ModelInstance
from core.workflow.node_factory import DifyNodeFactory
from dify_graph.entities import GraphInitParams
from dify_graph.enums import NodeType, WorkflowNodeExecutionStatus
from dify_graph.enums import NodeType, UserFrom, WorkflowNodeExecutionStatus
from dify_graph.graph import Graph
from dify_graph.graph_engine import GraphEngine, GraphEngineConfig
from dify_graph.graph_engine.command_channels import InMemoryChannel
@ -30,7 +30,6 @@ from dify_graph.node_events import NodeRunResult, StreamCompletedEvent
from dify_graph.nodes.llm.node import LLMNode
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from models.enums import UserFrom
from .test_table_runner import TableTestRunner

View File

@ -5,13 +5,12 @@ from unittest.mock import MagicMock
from core.app.entities.app_invoke_entities import InvokeFrom
from core.workflow.node_factory import DifyNodeFactory
from dify_graph.entities import GraphInitParams
from dify_graph.enums import WorkflowNodeExecutionStatus
from dify_graph.enums import UserFrom, WorkflowNodeExecutionStatus
from dify_graph.graph import Graph
from dify_graph.nodes.answer.answer_node import AnswerNode
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from extensions.ext_database import db
from models.enums import UserFrom
def test_execute_answer():

View File

@ -8,13 +8,12 @@ from core.app.entities.app_invoke_entities import InvokeFrom
from core.helper.ssrf_proxy import ssrf_proxy
from core.tools.tool_file_manager import ToolFileManager
from dify_graph.entities import GraphInitParams
from dify_graph.enums import WorkflowNodeExecutionStatus
from dify_graph.enums import UserFrom, WorkflowNodeExecutionStatus
from dify_graph.file.file_manager import file_manager
from dify_graph.nodes.http_request import HTTP_REQUEST_CONFIG_FILTER_KEY, HttpRequestNode, HttpRequestNodeConfig
from dify_graph.nodes.http_request.entities import HttpRequestNodeTimeout, Response
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from models.enums import UserFrom
HTTP_REQUEST_CONFIG = HttpRequestNodeConfig(
max_connect_timeout=10,

View File

@ -3,7 +3,7 @@ from types import SimpleNamespace
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities.graph_init_params import GraphInitParams
from dify_graph.enums import NodeType
from dify_graph.enums import NodeType, UserFrom
from dify_graph.graph_events import (
NodeRunHumanInputFormFilledEvent,
NodeRunHumanInputFormTimeoutEvent,
@ -14,7 +14,6 @@ from dify_graph.nodes.human_input.human_input_node import HumanInputNode
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from libs.datetime_utils import naive_utc_now
from models.enums import UserFrom
class _FakeFormRepository:

View File

@ -6,7 +6,7 @@ import pytest
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities import GraphInitParams
from dify_graph.enums import SystemVariableKey, WorkflowNodeExecutionStatus
from dify_graph.enums import SystemVariableKey, UserFrom, WorkflowNodeExecutionStatus
from dify_graph.nodes.knowledge_index.entities import KnowledgeIndexNodeData
from dify_graph.nodes.knowledge_index.exc import KnowledgeIndexNodeError
from dify_graph.nodes.knowledge_index.knowledge_index_node import KnowledgeIndexNode
@ -15,7 +15,6 @@ from dify_graph.repositories.summary_index_service_protocol import SummaryIndexS
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from dify_graph.variables.segments import StringSegment
from models.enums import UserFrom
@pytest.fixture

View File

@ -6,7 +6,7 @@ import pytest
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities import GraphInitParams
from dify_graph.enums import WorkflowNodeExecutionStatus
from dify_graph.enums import UserFrom, WorkflowNodeExecutionStatus
from dify_graph.model_runtime.entities.llm_entities import LLMUsage
from dify_graph.nodes.knowledge_retrieval.entities import (
KnowledgeRetrievalNodeData,
@ -20,7 +20,6 @@ from dify_graph.repositories.rag_retrieval_protocol import RAGRetrievalProtocol,
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from dify_graph.variables import StringSegment
from models.enums import UserFrom
@pytest.fixture

View File

@ -12,6 +12,7 @@ from core.entities.provider_entities import CustomConfiguration, SystemConfigura
from core.model_manager import ModelInstance
from core.prompt.entities.advanced_prompt_entities import MemoryConfig
from dify_graph.entities import GraphInitParams
from dify_graph.enums import UserFrom
from dify_graph.file import File, FileTransferMethod, FileType
from dify_graph.model_runtime.entities.common_entities import I18nObject
from dify_graph.model_runtime.entities.message_entities import (
@ -39,7 +40,6 @@ from dify_graph.nodes.llm.protocols import CredentialsProvider, ModelFactory
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from dify_graph.variables import ArrayAnySegment, ArrayFileSegment, NoneSegment
from models.enums import UserFrom
from models.provider import ProviderType

View File

@ -2,8 +2,9 @@ from collections.abc import Mapping
import pytest
from core.app.entities.app_invoke_entities import InvokeFrom as LegacyInvokeFrom
from dify_graph.entities import GraphInitParams
from dify_graph.enums import NodeType
from dify_graph.enums import InvokeFrom, NodeType, UserFrom
from dify_graph.nodes.base.entities import BaseNodeData
from dify_graph.nodes.base.node import Node
from dify_graph.runtime import GraphRuntimeState, VariablePool
@ -56,6 +57,36 @@ def test_node_hydrates_data_during_initialization():
assert node.node_data.foo == "bar"
assert node.title == "Sample"
assert node.user_from == UserFrom.ACCOUNT
assert node.invoke_from == InvokeFrom.DEBUGGER
def test_node_normalizes_legacy_invoke_from_enum():
graph_config: dict[str, object] = {}
init_params = GraphInitParams(
tenant_id="tenant",
app_id="app",
workflow_id="workflow",
graph_config=graph_config,
user_id="user",
user_from=UserFrom.ACCOUNT,
invoke_from=LegacyInvokeFrom.DEBUGGER,
call_depth=0,
)
runtime_state = GraphRuntimeState(
variable_pool=VariablePool(system_variables=SystemVariable(user_id="user", files=[]), user_inputs={}),
start_at=0.0,
)
node = _SampleNode(
id="node-1",
config={"id": "node-1", "data": {"title": "Sample", "foo": "bar"}},
graph_init_params=init_params,
graph_runtime_state=runtime_state,
)
assert node.user_from == UserFrom.ACCOUNT
assert node.invoke_from == InvokeFrom.DEBUGGER
def test_missing_generic_argument_raises_type_error():

View File

@ -7,7 +7,7 @@ from docx.oxml.text.paragraph import CT_P
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities import GraphInitParams
from dify_graph.enums import NodeType, WorkflowNodeExecutionStatus
from dify_graph.enums import NodeType, UserFrom, WorkflowNodeExecutionStatus
from dify_graph.file import File, FileTransferMethod
from dify_graph.node_events import NodeRunResult
from dify_graph.nodes.document_extractor import DocumentExtractorNode, DocumentExtractorNodeData
@ -20,7 +20,6 @@ from dify_graph.nodes.document_extractor.node import (
from dify_graph.variables import ArrayFileSegment
from dify_graph.variables.segments import ArrayStringSegment
from dify_graph.variables.variables import StringVariable
from models.enums import UserFrom
@pytest.fixture

View File

@ -7,7 +7,7 @@ import pytest
from core.app.entities.app_invoke_entities import InvokeFrom
from core.workflow.node_factory import DifyNodeFactory
from dify_graph.entities import GraphInitParams
from dify_graph.enums import WorkflowNodeExecutionStatus
from dify_graph.enums import UserFrom, WorkflowNodeExecutionStatus
from dify_graph.file import File, FileTransferMethod, FileType
from dify_graph.graph import Graph
from dify_graph.nodes.if_else.entities import IfElseNodeData
@ -17,7 +17,6 @@ from dify_graph.system_variable import SystemVariable
from dify_graph.utils.condition.entities import Condition, SubCondition, SubVariableCondition
from dify_graph.variables import ArrayFileSegment
from extensions.ext_database import db
from models.enums import UserFrom
def test_execute_if_else_result_true():

View File

@ -3,7 +3,7 @@ from unittest.mock import MagicMock
import pytest
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.enums import WorkflowNodeExecutionStatus
from dify_graph.enums import UserFrom, WorkflowNodeExecutionStatus
from dify_graph.file import File, FileTransferMethod, FileType
from dify_graph.nodes.list_operator.entities import (
ExtractConfig,
@ -17,7 +17,6 @@ from dify_graph.nodes.list_operator.entities import (
from dify_graph.nodes.list_operator.exc import InvalidKeyError
from dify_graph.nodes.list_operator.node import ListOperatorNode, _get_file_extract_string_func
from dify_graph.variables import ArrayFileSegment
from models.enums import UserFrom
@pytest.fixture

View File

@ -5,6 +5,7 @@ from uuid import uuid4
from core.app.entities.app_invoke_entities import InvokeFrom
from core.workflow.node_factory import DifyNodeFactory
from dify_graph.entities import GraphInitParams
from dify_graph.enums import UserFrom
from dify_graph.graph import Graph
from dify_graph.graph_events.node import NodeRunSucceededEvent
from dify_graph.nodes.variable_assigner.common import helpers as common_helpers
@ -13,7 +14,6 @@ from dify_graph.nodes.variable_assigner.v1.node_data import WriteMode
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from dify_graph.variables import ArrayStringVariable, StringVariable
from models.enums import UserFrom
DEFAULT_NODE_ID = "node_id"

View File

@ -5,13 +5,13 @@ from uuid import uuid4
from core.app.entities.app_invoke_entities import InvokeFrom
from core.workflow.node_factory import DifyNodeFactory
from dify_graph.entities import GraphInitParams
from dify_graph.enums import UserFrom
from dify_graph.graph import Graph
from dify_graph.nodes.variable_assigner.v2 import VariableAssignerNode
from dify_graph.nodes.variable_assigner.v2.enums import InputType, Operation
from dify_graph.runtime import GraphRuntimeState, VariablePool
from dify_graph.system_variable import SystemVariable
from dify_graph.variables import ArrayStringVariable
from models.enums import UserFrom
DEFAULT_NODE_ID = "node_id"

View File

@ -11,6 +11,7 @@ from unittest.mock import Mock, patch
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities.graph_init_params import GraphInitParams
from dify_graph.entities.workflow_node_execution import WorkflowNodeExecutionStatus
from dify_graph.enums import UserFrom
from dify_graph.nodes.trigger_webhook.entities import (
ContentType,
Method,
@ -21,7 +22,6 @@ from dify_graph.nodes.trigger_webhook.node import TriggerWebhookNode
from dify_graph.runtime.graph_runtime_state import GraphRuntimeState
from dify_graph.runtime.variable_pool import VariablePool
from dify_graph.system_variable import SystemVariable
from models.enums import UserFrom
from models.workflow import WorkflowType

View File

@ -5,6 +5,7 @@ import pytest
from core.app.entities.app_invoke_entities import InvokeFrom
from dify_graph.entities.graph_init_params import GraphInitParams
from dify_graph.entities.workflow_node_execution import WorkflowNodeExecutionStatus
from dify_graph.enums import UserFrom
from dify_graph.file import File, FileTransferMethod, FileType
from dify_graph.nodes.trigger_webhook.entities import (
ContentType,
@ -18,7 +19,6 @@ from dify_graph.runtime.graph_runtime_state import GraphRuntimeState
from dify_graph.runtime.variable_pool import VariablePool
from dify_graph.system_variable import SystemVariable
from dify_graph.variables import FileVariable, StringVariable
from models.enums import UserFrom
from models.workflow import WorkflowType

View File

@ -4,9 +4,9 @@ from unittest.mock import MagicMock, patch
from core.app.entities.app_invoke_entities import InvokeFrom
from core.workflow.workflow_entry import WorkflowEntry
from dify_graph.enums import UserFrom
from dify_graph.graph_engine.command_channels.redis_channel import RedisChannel
from dify_graph.runtime import GraphRuntimeState, VariablePool
from models.enums import UserFrom
class TestWorkflowEntryRedisChannel: