diff --git a/api/.importlinter b/api/.importlinter index ffdd4840d6..44e60cc6ff 100644 --- a/api/.importlinter +++ b/api/.importlinter @@ -102,7 +102,6 @@ forbidden_modules = core.schemas core.tools core.trigger - core.variables ignore_imports = core.workflow.nodes.loop.loop_node -> core.app.workflow.node_factory core.workflow.graph_engine.command_channels.redis_channel -> extensions.ext_redis @@ -173,11 +172,9 @@ ignore_imports = core.workflow.nodes.knowledge_retrieval.knowledge_retrieval_node -> core.file.models core.workflow.nodes.list_operator.node -> core.file core.workflow.nodes.llm.file_saver -> core.file - core.workflow.nodes.llm.llm_utils -> core.variables.segments core.workflow.nodes.llm.node -> core.file core.workflow.nodes.llm.node -> core.file.file_manager core.workflow.nodes.llm.node -> core.file.models - core.workflow.nodes.loop.entities -> core.variables.types core.workflow.nodes.parameter_extractor.parameter_extractor_node -> core.file core.workflow.nodes.protocols -> core.file core.workflow.nodes.question_classifier.question_classifier_node -> core.file.models @@ -200,7 +197,6 @@ ignore_imports = core.workflow.nodes.code.code_node -> core.helper.code_executor.javascript.javascript_code_provider core.workflow.nodes.code.code_node -> core.helper.code_executor.python3.python3_code_provider core.workflow.nodes.code.entities -> core.helper.code_executor.code_executor - core.workflow.nodes.datasource.datasource_node -> core.variables.variables core.workflow.nodes.http_request.executor -> core.helper.ssrf_proxy core.workflow.nodes.http_request.node -> core.helper.ssrf_proxy core.workflow.nodes.llm.file_saver -> core.helper.ssrf_proxy @@ -230,55 +226,6 @@ ignore_imports = core.workflow.nodes.llm.file_saver -> core.tools.signature core.workflow.nodes.llm.file_saver -> core.tools.tool_file_manager core.workflow.nodes.tool.tool_node -> core.tools.errors - core.workflow.conversation_variable_updater -> core.variables - core.workflow.graph_engine.entities.commands -> core.variables.variables - core.workflow.nodes.agent.agent_node -> core.variables.segments - core.workflow.nodes.answer.answer_node -> core.variables - core.workflow.nodes.code.code_node -> core.variables.segments - core.workflow.nodes.code.code_node -> core.variables.types - core.workflow.nodes.code.entities -> core.variables.types - core.workflow.nodes.datasource.datasource_node -> core.variables.segments - core.workflow.nodes.document_extractor.node -> core.variables - core.workflow.nodes.document_extractor.node -> core.variables.segments - core.workflow.nodes.http_request.executor -> core.variables.segments - core.workflow.nodes.http_request.node -> core.variables.segments - core.workflow.nodes.human_input.entities -> core.variables.consts - core.workflow.nodes.iteration.iteration_node -> core.variables - core.workflow.nodes.iteration.iteration_node -> core.variables.segments - core.workflow.nodes.iteration.iteration_node -> core.variables.variables - core.workflow.nodes.knowledge_retrieval.knowledge_retrieval_node -> core.variables - core.workflow.nodes.knowledge_retrieval.knowledge_retrieval_node -> core.variables.segments - core.workflow.nodes.list_operator.node -> core.variables - core.workflow.nodes.list_operator.node -> core.variables.segments - core.workflow.nodes.llm.node -> core.variables - core.workflow.nodes.loop.loop_node -> core.variables - core.workflow.nodes.parameter_extractor.entities -> core.variables.types - core.workflow.nodes.parameter_extractor.exc -> core.variables.types - core.workflow.nodes.parameter_extractor.parameter_extractor_node -> core.variables.types - core.workflow.nodes.tool.tool_node -> core.variables.segments - core.workflow.nodes.tool.tool_node -> core.variables.variables - core.workflow.nodes.trigger_webhook.node -> core.variables.types - core.workflow.nodes.trigger_webhook.node -> core.variables.variables - core.workflow.nodes.variable_aggregator.entities -> core.variables.types - core.workflow.nodes.variable_aggregator.variable_aggregator_node -> core.variables.segments - core.workflow.nodes.variable_assigner.common.helpers -> core.variables - core.workflow.nodes.variable_assigner.common.helpers -> core.variables.consts - core.workflow.nodes.variable_assigner.common.helpers -> core.variables.types - core.workflow.nodes.variable_assigner.v1.node -> core.variables - core.workflow.nodes.variable_assigner.v2.helpers -> core.variables - core.workflow.nodes.variable_assigner.v2.node -> core.variables - core.workflow.nodes.variable_assigner.v2.node -> core.variables.consts - core.workflow.runtime.graph_runtime_state_protocol -> core.variables.segments - core.workflow.runtime.read_only_wrappers -> core.variables.segments - core.workflow.runtime.variable_pool -> core.variables - core.workflow.runtime.variable_pool -> core.variables.consts - core.workflow.runtime.variable_pool -> core.variables.segments - core.workflow.runtime.variable_pool -> core.variables.variables - core.workflow.utils.condition.processor -> core.variables - core.workflow.utils.condition.processor -> core.variables.segments - core.workflow.variable_loader -> core.variables - core.workflow.variable_loader -> core.variables.consts - core.workflow.workflow_type_encoder -> core.variables core.workflow.graph_engine.manager -> extensions.ext_redis core.workflow.nodes.agent.agent_node -> extensions.ext_database core.workflow.nodes.datasource.datasource_node -> extensions.ext_database @@ -339,7 +286,6 @@ forbidden_modules = core.schemas core.tools core.trigger - core.variables core.workflow ignore_imports = core.model_runtime.model_providers.__base.ai_model -> configs diff --git a/api/controllers/console/app/workflow_draft_variable.py b/api/controllers/console/app/workflow_draft_variable.py index 3382b65acc..b994471739 100644 --- a/api/controllers/console/app/workflow_draft_variable.py +++ b/api/controllers/console/app/workflow_draft_variable.py @@ -16,10 +16,10 @@ from controllers.console.app.wraps import get_app_model from controllers.console.wraps import account_initialization_required, edit_permission_required, setup_required from controllers.web.error import InvalidArgumentError, NotFoundError from core.file import helpers as file_helpers -from core.variables.segment_group import SegmentGroup -from core.variables.segments import ArrayFileSegment, FileSegment, Segment -from core.variables.types import SegmentType from core.workflow.constants import CONVERSATION_VARIABLE_NODE_ID, SYSTEM_VARIABLE_NODE_ID +from core.workflow.variables.segment_group import SegmentGroup +from core.workflow.variables.segments import ArrayFileSegment, FileSegment, Segment +from core.workflow.variables.types import SegmentType from extensions.ext_database import db from factories.file_factory import build_from_mapping, build_from_mappings from factories.variable_factory import build_segment_with_type diff --git a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_draft_variable.py b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_draft_variable.py index 2911b1cf18..7e285c8da9 100644 --- a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_draft_variable.py +++ b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_draft_variable.py @@ -21,8 +21,8 @@ from controllers.console.app.workflow_draft_variable import ( from controllers.console.datasets.wraps import get_rag_pipeline from controllers.console.wraps import account_initialization_required, setup_required from controllers.web.error import InvalidArgumentError, NotFoundError -from core.variables.types import SegmentType from core.workflow.constants import CONVERSATION_VARIABLE_NODE_ID, SYSTEM_VARIABLE_NODE_ID +from core.workflow.variables.types import SegmentType from extensions.ext_database import db from factories.file_factory import build_from_mapping, build_from_mappings from factories.variable_factory import build_segment_with_type diff --git a/api/core/app/apps/advanced_chat/app_runner.py b/api/core/app/apps/advanced_chat/app_runner.py index 8b20442eab..18ae75a087 100644 --- a/api/core/app/apps/advanced_chat/app_runner.py +++ b/api/core/app/apps/advanced_chat/app_runner.py @@ -25,7 +25,6 @@ from core.app.workflow.layers.persistence import PersistenceWorkflowInfo, Workfl from core.db.session_factory import session_factory from core.moderation.base import ModerationError from core.moderation.input_moderation import InputModeration -from core.variables.variables import Variable from core.workflow.enums import WorkflowType from core.workflow.graph_engine.command_channels.redis_channel import RedisChannel from core.workflow.graph_engine.layers.base import GraphEngineLayer @@ -34,6 +33,7 @@ from core.workflow.repositories.workflow_node_execution_repository import Workfl from core.workflow.runtime import GraphRuntimeState, VariablePool from core.workflow.system_variable import SystemVariable from core.workflow.variable_loader import VariableLoader +from core.workflow.variables.variables import Variable from core.workflow.workflow_entry import WorkflowEntry from extensions.ext_database import db from extensions.ext_redis import redis_client diff --git a/api/core/app/apps/common/workflow_response_converter.py b/api/core/app/apps/common/workflow_response_converter.py index c0adb7120b..0352e8feba 100644 --- a/api/core/app/apps/common/workflow_response_converter.py +++ b/api/core/app/apps/common/workflow_response_converter.py @@ -50,7 +50,6 @@ from core.plugin.impl.datasource import PluginDatasourceManager from core.tools.entities.tool_entities import ToolProviderType from core.tools.tool_manager import ToolManager from core.trigger.trigger_manager import TriggerManager -from core.variables.segments import ArrayFileSegment, FileSegment, Segment from core.workflow.entities.pause_reason import HumanInputRequired from core.workflow.entities.workflow_start_reason import WorkflowStartReason from core.workflow.enums import ( @@ -62,6 +61,7 @@ from core.workflow.enums import ( ) from core.workflow.runtime import GraphRuntimeState from core.workflow.system_variable import SystemVariable +from core.workflow.variables.segments import ArrayFileSegment, FileSegment, Segment from core.workflow.workflow_entry import WorkflowEntry from core.workflow.workflow_type_encoder import WorkflowRuntimeTypeConverter from extensions.ext_database import db diff --git a/api/core/app/apps/pipeline/pipeline_runner.py b/api/core/app/apps/pipeline/pipeline_runner.py index 8ea34344b2..02caf8f511 100644 --- a/api/core/app/apps/pipeline/pipeline_runner.py +++ b/api/core/app/apps/pipeline/pipeline_runner.py @@ -11,7 +11,6 @@ from core.app.entities.app_invoke_entities import ( ) from core.app.workflow.layers.persistence import PersistenceWorkflowInfo, WorkflowPersistenceLayer from core.app.workflow.node_factory import DifyNodeFactory -from core.variables.variables import RAGPipelineVariable, RAGPipelineVariableInput from core.workflow.entities.graph_init_params import GraphInitParams from core.workflow.enums import WorkflowType from core.workflow.graph import Graph @@ -21,6 +20,7 @@ from core.workflow.repositories.workflow_node_execution_repository import Workfl from core.workflow.runtime import GraphRuntimeState, VariablePool from core.workflow.system_variable import SystemVariable from core.workflow.variable_loader import VariableLoader +from core.workflow.variables.variables import RAGPipelineVariable, RAGPipelineVariableInput from core.workflow.workflow_entry import WorkflowEntry from extensions.ext_database import db from models.dataset import Document, Pipeline diff --git a/api/core/app/layers/conversation_variable_persist_layer.py b/api/core/app/layers/conversation_variable_persist_layer.py index c070845b73..a748d90387 100644 --- a/api/core/app/layers/conversation_variable_persist_layer.py +++ b/api/core/app/layers/conversation_variable_persist_layer.py @@ -1,12 +1,12 @@ import logging -from core.variables import VariableBase from core.workflow.constants import CONVERSATION_VARIABLE_NODE_ID from core.workflow.conversation_variable_updater import ConversationVariableUpdater from core.workflow.enums import NodeType from core.workflow.graph_engine.layers.base import GraphEngineLayer from core.workflow.graph_events import GraphEngineEvent, NodeRunSucceededEvent from core.workflow.nodes.variable_assigner.common import helpers as common_helpers +from core.workflow.variables import VariableBase logger = logging.getLogger(__name__) diff --git a/api/core/helper/code_executor/template_transformer.py b/api/core/helper/code_executor/template_transformer.py index 5cdea19a8d..1b56eaba21 100644 --- a/api/core/helper/code_executor/template_transformer.py +++ b/api/core/helper/code_executor/template_transformer.py @@ -5,7 +5,7 @@ from base64 import b64encode from collections.abc import Mapping from typing import Any -from core.variables.utils import dumps_with_segments +from core.workflow.variables.utils import dumps_with_segments class TemplateTransformer(ABC): diff --git a/api/core/variables/__init__.py b/api/core/variables/__init__.py deleted file mode 100644 index 72be0caedc..0000000000 --- a/api/core/variables/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from core.workflow.variables import * # noqa: F401,F403 -from core.workflow.variables import __all__ as __all__ diff --git a/api/core/variables/consts.py b/api/core/variables/consts.py deleted file mode 100644 index 07788f7686..0000000000 --- a/api/core/variables/consts.py +++ /dev/null @@ -1 +0,0 @@ -from core.workflow.variables.consts import * # noqa: F401,F403 diff --git a/api/core/variables/exc.py b/api/core/variables/exc.py deleted file mode 100644 index 6c76bfbd6a..0000000000 --- a/api/core/variables/exc.py +++ /dev/null @@ -1 +0,0 @@ -from core.workflow.variables.exc import * # noqa: F401,F403 diff --git a/api/core/variables/segment_group.py b/api/core/variables/segment_group.py deleted file mode 100644 index 6b1fa4cd48..0000000000 --- a/api/core/variables/segment_group.py +++ /dev/null @@ -1 +0,0 @@ -from core.workflow.variables.segment_group import * # noqa: F401,F403 diff --git a/api/core/variables/segments.py b/api/core/variables/segments.py deleted file mode 100644 index 968320ac34..0000000000 --- a/api/core/variables/segments.py +++ /dev/null @@ -1 +0,0 @@ -from core.workflow.variables.segments import * # noqa: F401,F403 diff --git a/api/core/variables/types.py b/api/core/variables/types.py deleted file mode 100644 index 0309bc77da..0000000000 --- a/api/core/variables/types.py +++ /dev/null @@ -1 +0,0 @@ -from core.workflow.variables.types import * # noqa: F401,F403 diff --git a/api/core/variables/utils.py b/api/core/variables/utils.py deleted file mode 100644 index 5f5b186e1f..0000000000 --- a/api/core/variables/utils.py +++ /dev/null @@ -1 +0,0 @@ -from core.workflow.variables.utils import * # noqa: F401,F403 diff --git a/api/core/variables/variables.py b/api/core/variables/variables.py deleted file mode 100644 index e7c149c85d..0000000000 --- a/api/core/variables/variables.py +++ /dev/null @@ -1 +0,0 @@ -from core.workflow.variables.variables import * # noqa: F401,F403 diff --git a/api/core/workflow/conversation_variable_updater.py b/api/core/workflow/conversation_variable_updater.py index 75f47691da..6bfb2b2880 100644 --- a/api/core/workflow/conversation_variable_updater.py +++ b/api/core/workflow/conversation_variable_updater.py @@ -1,7 +1,7 @@ import abc from typing import Protocol -from core.variables import VariableBase +from core.workflow.variables import VariableBase class ConversationVariableUpdater(Protocol): diff --git a/api/core/workflow/graph_engine/entities/commands.py b/api/core/workflow/graph_engine/entities/commands.py index 41276eb444..7e7b65247b 100644 --- a/api/core/workflow/graph_engine/entities/commands.py +++ b/api/core/workflow/graph_engine/entities/commands.py @@ -11,7 +11,7 @@ from typing import Any from pydantic import BaseModel, Field -from core.variables.variables import Variable +from core.workflow.variables.variables import Variable class CommandType(StrEnum): diff --git a/api/core/workflow/nodes/agent/agent_node.py b/api/core/workflow/nodes/agent/agent_node.py index e195aebe6d..f5ff25f5aa 100644 --- a/api/core/workflow/nodes/agent/agent_node.py +++ b/api/core/workflow/nodes/agent/agent_node.py @@ -26,7 +26,6 @@ from core.tools.entities.tool_entities import ( ) from core.tools.tool_manager import ToolManager from core.tools.utils.message_transformer import ToolFileMessageTransformer -from core.variables.segments import ArrayFileSegment, StringSegment from core.workflow.enums import ( NodeType, SystemVariableKey, @@ -44,6 +43,7 @@ from core.workflow.nodes.agent.entities import AgentNodeData, AgentOldVersionMod from core.workflow.nodes.base.node import Node from core.workflow.nodes.base.variable_template_parser import VariableTemplateParser from core.workflow.runtime import VariablePool +from core.workflow.variables.segments import ArrayFileSegment, StringSegment from extensions.ext_database import db from factories import file_factory from factories.agent_factory import get_plugin_agent_strategy diff --git a/api/core/workflow/nodes/answer/answer_node.py b/api/core/workflow/nodes/answer/answer_node.py index d3b3fac107..388447368e 100644 --- a/api/core/workflow/nodes/answer/answer_node.py +++ b/api/core/workflow/nodes/answer/answer_node.py @@ -1,13 +1,13 @@ from collections.abc import Mapping, Sequence from typing import Any -from core.variables import ArrayFileSegment, FileSegment, Segment from core.workflow.enums import NodeExecutionType, NodeType, WorkflowNodeExecutionStatus from core.workflow.node_events import NodeRunResult from core.workflow.nodes.answer.entities import AnswerNodeData from core.workflow.nodes.base.node import Node from core.workflow.nodes.base.template import Template from core.workflow.nodes.base.variable_template_parser import VariableTemplateParser +from core.workflow.variables import ArrayFileSegment, FileSegment, Segment class AnswerNode(Node[AnswerNodeData]): diff --git a/api/core/workflow/nodes/code/code_node.py b/api/core/workflow/nodes/code/code_node.py index e3035d3bf0..1483f09755 100644 --- a/api/core/workflow/nodes/code/code_node.py +++ b/api/core/workflow/nodes/code/code_node.py @@ -6,13 +6,13 @@ from core.helper.code_executor.code_executor import CodeExecutionError, CodeExec from core.helper.code_executor.code_node_provider import CodeNodeProvider from core.helper.code_executor.javascript.javascript_code_provider import JavascriptCodeProvider from core.helper.code_executor.python3.python3_code_provider import Python3CodeProvider -from core.variables.segments import ArrayFileSegment -from core.variables.types import SegmentType from core.workflow.enums import NodeType, WorkflowNodeExecutionStatus from core.workflow.node_events import NodeRunResult from core.workflow.nodes.base.node import Node from core.workflow.nodes.code.entities import CodeNodeData from core.workflow.nodes.code.limits import CodeNodeLimits +from core.workflow.variables.segments import ArrayFileSegment +from core.workflow.variables.types import SegmentType from .exc import ( CodeNodeError, diff --git a/api/core/workflow/nodes/code/entities.py b/api/core/workflow/nodes/code/entities.py index 8026011196..9a3528866c 100644 --- a/api/core/workflow/nodes/code/entities.py +++ b/api/core/workflow/nodes/code/entities.py @@ -3,9 +3,9 @@ from typing import Annotated, Literal from pydantic import AfterValidator, BaseModel from core.helper.code_executor.code_executor import CodeLanguage -from core.variables.types import SegmentType from core.workflow.nodes.base import BaseNodeData from core.workflow.nodes.base.entities import VariableSelector +from core.workflow.variables.types import SegmentType _ALLOWED_OUTPUT_FROM_CODE = frozenset( [ diff --git a/api/core/workflow/nodes/datasource/datasource_node.py b/api/core/workflow/nodes/datasource/datasource_node.py index a732a70417..48e6273466 100644 --- a/api/core/workflow/nodes/datasource/datasource_node.py +++ b/api/core/workflow/nodes/datasource/datasource_node.py @@ -17,8 +17,6 @@ from core.datasource.utils.message_transformer import DatasourceFileMessageTrans from core.file import File from core.file.enums import FileTransferMethod, FileType from core.plugin.impl.exc import PluginDaemonClientSideError -from core.variables.segments import ArrayAnySegment -from core.variables.variables import ArrayAnyVariable from core.workflow.entities.workflow_node_execution import WorkflowNodeExecutionStatus from core.workflow.enums import NodeExecutionType, NodeType, SystemVariableKey from core.workflow.node_events import NodeRunResult, StreamChunkEvent, StreamCompletedEvent @@ -26,6 +24,8 @@ from core.workflow.nodes.base.node import Node from core.workflow.nodes.base.variable_template_parser import VariableTemplateParser from core.workflow.nodes.tool.exc import ToolFileError from core.workflow.runtime import VariablePool +from core.workflow.variables.segments import ArrayAnySegment +from core.workflow.variables.variables import ArrayAnyVariable from extensions.ext_database import db from factories import file_factory from models.model import UploadFile diff --git a/api/core/workflow/nodes/document_extractor/node.py b/api/core/workflow/nodes/document_extractor/node.py index 14ebd1f9ae..845cf625c5 100644 --- a/api/core/workflow/nodes/document_extractor/node.py +++ b/api/core/workflow/nodes/document_extractor/node.py @@ -23,11 +23,11 @@ from docx.text.paragraph import Paragraph from configs import dify_config from core.file import File, FileTransferMethod, file_manager from core.helper import ssrf_proxy -from core.variables import ArrayFileSegment -from core.variables.segments import ArrayStringSegment, FileSegment from core.workflow.enums import NodeType, WorkflowNodeExecutionStatus from core.workflow.node_events import NodeRunResult from core.workflow.nodes.base.node import Node +from core.workflow.variables import ArrayFileSegment +from core.workflow.variables.segments import ArrayStringSegment, FileSegment from .entities import DocumentExtractorNodeData from .exc import DocumentExtractorError, FileDownloadError, TextExtractionError, UnsupportedFileTypeError diff --git a/api/core/workflow/nodes/http_request/executor.py b/api/core/workflow/nodes/http_request/executor.py index 7de8216562..3f21151cb8 100644 --- a/api/core/workflow/nodes/http_request/executor.py +++ b/api/core/workflow/nodes/http_request/executor.py @@ -14,8 +14,8 @@ from configs import dify_config from core.file.enums import FileTransferMethod from core.file.file_manager import file_manager as default_file_manager from core.helper.ssrf_proxy import ssrf_proxy -from core.variables.segments import ArrayFileSegment, FileSegment from core.workflow.runtime import VariablePool +from core.workflow.variables.segments import ArrayFileSegment, FileSegment from ..protocols import FileManagerProtocol, HttpClientProtocol from .entities import ( diff --git a/api/core/workflow/nodes/http_request/node.py b/api/core/workflow/nodes/http_request/node.py index 480482375f..a4be08eaf6 100644 --- a/api/core/workflow/nodes/http_request/node.py +++ b/api/core/workflow/nodes/http_request/node.py @@ -8,7 +8,6 @@ from core.file import File, FileTransferMethod from core.file.file_manager import file_manager as default_file_manager from core.helper.ssrf_proxy import ssrf_proxy from core.tools.tool_file_manager import ToolFileManager -from core.variables.segments import ArrayFileSegment from core.workflow.enums import NodeType, WorkflowNodeExecutionStatus from core.workflow.node_events import NodeRunResult from core.workflow.nodes.base import variable_template_parser @@ -16,6 +15,7 @@ from core.workflow.nodes.base.entities import VariableSelector from core.workflow.nodes.base.node import Node from core.workflow.nodes.http_request.executor import Executor from core.workflow.nodes.protocols import FileManagerProtocol, HttpClientProtocol +from core.workflow.variables.segments import ArrayFileSegment from factories import file_factory from .entities import ( diff --git a/api/core/workflow/nodes/human_input/entities.py b/api/core/workflow/nodes/human_input/entities.py index 72d4fc675b..a4473dfa7d 100644 --- a/api/core/workflow/nodes/human_input/entities.py +++ b/api/core/workflow/nodes/human_input/entities.py @@ -10,10 +10,10 @@ from typing import Annotated, Any, ClassVar, Literal, Self from pydantic import BaseModel, Field, field_validator, model_validator -from core.variables.consts import SELECTORS_LENGTH from core.workflow.nodes.base import BaseNodeData from core.workflow.nodes.base.variable_template_parser import VariableTemplateParser from core.workflow.runtime import VariablePool +from core.workflow.variables.consts import SELECTORS_LENGTH from .enums import ButtonStyle, DeliveryMethodType, EmailRecipientType, FormInputType, PlaceholderType, TimeoutUnit diff --git a/api/core/workflow/nodes/iteration/iteration_node.py b/api/core/workflow/nodes/iteration/iteration_node.py index 25a881ea7d..5e7aa2a751 100644 --- a/api/core/workflow/nodes/iteration/iteration_node.py +++ b/api/core/workflow/nodes/iteration/iteration_node.py @@ -7,9 +7,6 @@ from typing import TYPE_CHECKING, Any, NewType, cast from typing_extensions import TypeIs from core.model_runtime.entities.llm_entities import LLMUsage -from core.variables import IntegerVariable, NoneSegment -from core.variables.segments import ArrayAnySegment, ArraySegment -from core.variables.variables import Variable from core.workflow.constants import CONVERSATION_VARIABLE_NODE_ID from core.workflow.enums import ( NodeExecutionType, @@ -36,6 +33,9 @@ from core.workflow.nodes.base import LLMUsageTrackingMixin from core.workflow.nodes.base.node import Node from core.workflow.nodes.iteration.entities import ErrorHandleMode, IterationNodeData from core.workflow.runtime import VariablePool +from core.workflow.variables import IntegerVariable, NoneSegment +from core.workflow.variables.segments import ArrayAnySegment, ArraySegment +from core.workflow.variables.variables import Variable from libs.datetime_utils import naive_utc_now from .exc import ( diff --git a/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py b/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py index 65c2792355..8a40394f2c 100644 --- a/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py +++ b/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py @@ -5,12 +5,6 @@ from typing import TYPE_CHECKING, Any, Literal from core.app.app_config.entities import DatasetRetrieveConfigEntity from core.model_runtime.entities.llm_entities import LLMUsage from core.model_runtime.utils.encoders import jsonable_encoder -from core.variables import ( - ArrayFileSegment, - FileSegment, - StringSegment, -) -from core.variables.segments import ArrayObjectSegment from core.workflow.entities import GraphInitParams from core.workflow.enums import ( NodeType, @@ -22,6 +16,12 @@ from core.workflow.nodes.base import LLMUsageTrackingMixin from core.workflow.nodes.base.node import Node from core.workflow.nodes.llm.file_saver import FileSaverImpl, LLMFileSaver from core.workflow.repositories.rag_retrieval_protocol import KnowledgeRetrievalRequest, RAGRetrievalProtocol, Source +from core.workflow.variables import ( + ArrayFileSegment, + FileSegment, + StringSegment, +) +from core.workflow.variables.segments import ArrayObjectSegment from .entities import KnowledgeRetrievalNodeData from .exc import ( diff --git a/api/core/workflow/nodes/list_operator/node.py b/api/core/workflow/nodes/list_operator/node.py index 235f5b9c52..4c2e88023c 100644 --- a/api/core/workflow/nodes/list_operator/node.py +++ b/api/core/workflow/nodes/list_operator/node.py @@ -2,11 +2,11 @@ from collections.abc import Callable, Sequence from typing import Any, TypeAlias, TypeVar from core.file import File -from core.variables import ArrayFileSegment, ArrayNumberSegment, ArrayStringSegment -from core.variables.segments import ArrayAnySegment, ArrayBooleanSegment, ArraySegment from core.workflow.enums import NodeType, WorkflowNodeExecutionStatus from core.workflow.node_events import NodeRunResult from core.workflow.nodes.base.node import Node +from core.workflow.variables import ArrayFileSegment, ArrayNumberSegment, ArrayStringSegment +from core.workflow.variables.segments import ArrayAnySegment, ArrayBooleanSegment, ArraySegment from .entities import FilterOperator, ListOperatorNodeData, Order from .exc import InvalidConditionError, InvalidFilterValueError, InvalidKeyError, ListOperatorError diff --git a/api/core/workflow/nodes/llm/llm_utils.py b/api/core/workflow/nodes/llm/llm_utils.py index 01e25cbf5c..3bc989f0d1 100644 --- a/api/core/workflow/nodes/llm/llm_utils.py +++ b/api/core/workflow/nodes/llm/llm_utils.py @@ -14,10 +14,10 @@ from core.model_runtime.entities.llm_entities import LLMUsage from core.model_runtime.entities.model_entities import ModelType from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel from core.prompt.entities.advanced_prompt_entities import MemoryConfig -from core.variables.segments import ArrayAnySegment, ArrayFileSegment, FileSegment, NoneSegment, StringSegment from core.workflow.enums import SystemVariableKey from core.workflow.nodes.llm.entities import ModelConfig from core.workflow.runtime import VariablePool +from core.workflow.variables.segments import ArrayAnySegment, ArrayFileSegment, FileSegment, NoneSegment, StringSegment from extensions.ext_database import db from libs.datetime_utils import naive_utc_now from models.model import Conversation diff --git a/api/core/workflow/nodes/llm/node.py b/api/core/workflow/nodes/llm/node.py index beccf79344..1abe680af2 100644 --- a/api/core/workflow/nodes/llm/node.py +++ b/api/core/workflow/nodes/llm/node.py @@ -49,14 +49,6 @@ from core.prompt.entities.advanced_prompt_entities import CompletionModelPromptT from core.prompt.utils.prompt_message_util import PromptMessageUtil from core.rag.entities.citation_metadata import RetrievalSourceMetadata from core.tools.signature import sign_upload_file -from core.variables import ( - ArrayFileSegment, - ArraySegment, - FileSegment, - NoneSegment, - ObjectSegment, - StringSegment, -) from core.workflow.constants import SYSTEM_VARIABLE_NODE_ID from core.workflow.entities import GraphInitParams from core.workflow.enums import ( @@ -77,6 +69,14 @@ from core.workflow.nodes.base.entities import VariableSelector from core.workflow.nodes.base.node import Node from core.workflow.nodes.base.variable_template_parser import VariableTemplateParser from core.workflow.runtime import VariablePool +from core.workflow.variables import ( + ArrayFileSegment, + ArraySegment, + FileSegment, + NoneSegment, + ObjectSegment, + StringSegment, +) from extensions.ext_database import db from models.dataset import SegmentAttachmentBinding from models.model import UploadFile diff --git a/api/core/workflow/nodes/loop/entities.py b/api/core/workflow/nodes/loop/entities.py index 92a8702fc3..4090f27799 100644 --- a/api/core/workflow/nodes/loop/entities.py +++ b/api/core/workflow/nodes/loop/entities.py @@ -3,9 +3,9 @@ from typing import Annotated, Any, Literal from pydantic import AfterValidator, BaseModel, Field, field_validator -from core.variables.types import SegmentType from core.workflow.nodes.base import BaseLoopNodeData, BaseLoopState, BaseNodeData from core.workflow.utils.condition.entities import Condition +from core.workflow.variables.types import SegmentType _VALID_VAR_TYPE = frozenset( [ diff --git a/api/core/workflow/nodes/loop/loop_node.py b/api/core/workflow/nodes/loop/loop_node.py index 84a9c29414..5d28941ee5 100644 --- a/api/core/workflow/nodes/loop/loop_node.py +++ b/api/core/workflow/nodes/loop/loop_node.py @@ -6,7 +6,6 @@ from datetime import datetime from typing import TYPE_CHECKING, Any, Literal, cast from core.model_runtime.entities.llm_entities import LLMUsage -from core.variables import Segment, SegmentType from core.workflow.enums import ( NodeExecutionType, NodeType, @@ -31,6 +30,7 @@ from core.workflow.nodes.base import LLMUsageTrackingMixin from core.workflow.nodes.base.node import Node from core.workflow.nodes.loop.entities import LoopCompletedReason, LoopNodeData, LoopVariableData from core.workflow.utils.condition.processor import ConditionProcessor +from core.workflow.variables import Segment, SegmentType from factories.variable_factory import TypeMismatchError, build_segment_with_type, segment_to_variable from libs.datetime_utils import naive_utc_now diff --git a/api/core/workflow/nodes/parameter_extractor/entities.py b/api/core/workflow/nodes/parameter_extractor/entities.py index 4e3819c4cf..90d78ae429 100644 --- a/api/core/workflow/nodes/parameter_extractor/entities.py +++ b/api/core/workflow/nodes/parameter_extractor/entities.py @@ -8,9 +8,9 @@ from pydantic import ( ) from core.prompt.entities.advanced_prompt_entities import MemoryConfig -from core.variables.types import SegmentType from core.workflow.nodes.base import BaseNodeData from core.workflow.nodes.llm.entities import ModelConfig, VisionConfig +from core.workflow.variables.types import SegmentType _OLD_BOOL_TYPE_NAME = "bool" _OLD_SELECT_TYPE_NAME = "select" diff --git a/api/core/workflow/nodes/parameter_extractor/exc.py b/api/core/workflow/nodes/parameter_extractor/exc.py index a1707a2461..5a58780575 100644 --- a/api/core/workflow/nodes/parameter_extractor/exc.py +++ b/api/core/workflow/nodes/parameter_extractor/exc.py @@ -1,6 +1,6 @@ from typing import Any -from core.variables.types import SegmentType +from core.workflow.variables.types import SegmentType class ParameterExtractorNodeError(ValueError): diff --git a/api/core/workflow/nodes/parameter_extractor/parameter_extractor_node.py b/api/core/workflow/nodes/parameter_extractor/parameter_extractor_node.py index 08e0542d61..513158f680 100644 --- a/api/core/workflow/nodes/parameter_extractor/parameter_extractor_node.py +++ b/api/core/workflow/nodes/parameter_extractor/parameter_extractor_node.py @@ -26,13 +26,13 @@ from core.prompt.advanced_prompt_transform import AdvancedPromptTransform from core.prompt.entities.advanced_prompt_entities import ChatModelMessage, CompletionModelPromptTemplate from core.prompt.simple_prompt_transform import ModelMode from core.prompt.utils.prompt_message_util import PromptMessageUtil -from core.variables.types import ArrayValidation, SegmentType from core.workflow.enums import NodeType, WorkflowNodeExecutionMetadataKey, WorkflowNodeExecutionStatus from core.workflow.node_events import NodeRunResult from core.workflow.nodes.base import variable_template_parser from core.workflow.nodes.base.node import Node from core.workflow.nodes.llm import ModelConfig, llm_utils from core.workflow.runtime import VariablePool +from core.workflow.variables.types import ArrayValidation, SegmentType from factories.variable_factory import build_segment_with_type from .entities import ParameterExtractorNodeData diff --git a/api/core/workflow/nodes/tool/tool_node.py b/api/core/workflow/nodes/tool/tool_node.py index 60d76db9b6..7717117c32 100644 --- a/api/core/workflow/nodes/tool/tool_node.py +++ b/api/core/workflow/nodes/tool/tool_node.py @@ -12,8 +12,6 @@ from core.tools.entities.tool_entities import ToolInvokeMessage, ToolParameter from core.tools.errors import ToolInvokeError from core.tools.tool_engine import ToolEngine from core.tools.utils.message_transformer import ToolFileMessageTransformer -from core.variables.segments import ArrayAnySegment, ArrayFileSegment -from core.variables.variables import ArrayAnyVariable from core.workflow.enums import ( NodeType, SystemVariableKey, @@ -23,6 +21,8 @@ from core.workflow.enums import ( from core.workflow.node_events import NodeEventBase, NodeRunResult, StreamChunkEvent, StreamCompletedEvent from core.workflow.nodes.base.node import Node from core.workflow.nodes.base.variable_template_parser import VariableTemplateParser +from core.workflow.variables.segments import ArrayAnySegment, ArrayFileSegment +from core.workflow.variables.variables import ArrayAnyVariable from extensions.ext_database import db from factories import file_factory from models import ToolFile diff --git a/api/core/workflow/nodes/trigger_webhook/node.py b/api/core/workflow/nodes/trigger_webhook/node.py index ec8c4b8ee3..2dfcebd1a6 100644 --- a/api/core/workflow/nodes/trigger_webhook/node.py +++ b/api/core/workflow/nodes/trigger_webhook/node.py @@ -3,13 +3,13 @@ from collections.abc import Mapping from typing import Any from core.file import FileTransferMethod -from core.variables.types import SegmentType -from core.variables.variables import FileVariable from core.workflow.constants import SYSTEM_VARIABLE_NODE_ID from core.workflow.entities.workflow_node_execution import WorkflowNodeExecutionStatus from core.workflow.enums import NodeExecutionType, NodeType from core.workflow.node_events import NodeRunResult from core.workflow.nodes.base.node import Node +from core.workflow.variables.types import SegmentType +from core.workflow.variables.variables import FileVariable from factories import file_factory from factories.variable_factory import build_segment_with_type diff --git a/api/core/workflow/nodes/variable_aggregator/entities.py b/api/core/workflow/nodes/variable_aggregator/entities.py index aab17aad22..febbf1d1d6 100644 --- a/api/core/workflow/nodes/variable_aggregator/entities.py +++ b/api/core/workflow/nodes/variable_aggregator/entities.py @@ -1,7 +1,7 @@ from pydantic import BaseModel -from core.variables.types import SegmentType from core.workflow.nodes.base import BaseNodeData +from core.workflow.variables.types import SegmentType class AdvancedSettings(BaseModel): diff --git a/api/core/workflow/nodes/variable_aggregator/variable_aggregator_node.py b/api/core/workflow/nodes/variable_aggregator/variable_aggregator_node.py index 4b3a2304e7..762b7dab07 100644 --- a/api/core/workflow/nodes/variable_aggregator/variable_aggregator_node.py +++ b/api/core/workflow/nodes/variable_aggregator/variable_aggregator_node.py @@ -1,10 +1,10 @@ from collections.abc import Mapping -from core.variables.segments import Segment from core.workflow.enums import NodeType, WorkflowNodeExecutionStatus from core.workflow.node_events import NodeRunResult from core.workflow.nodes.base.node import Node from core.workflow.nodes.variable_aggregator.entities import VariableAggregatorNodeData +from core.workflow.variables.segments import Segment class VariableAggregatorNode(Node[VariableAggregatorNodeData]): diff --git a/api/core/workflow/nodes/variable_assigner/common/helpers.py b/api/core/workflow/nodes/variable_assigner/common/helpers.py index 04a7323739..37fde9d1b0 100644 --- a/api/core/workflow/nodes/variable_assigner/common/helpers.py +++ b/api/core/workflow/nodes/variable_assigner/common/helpers.py @@ -3,9 +3,9 @@ from typing import Any, TypeVar from pydantic import BaseModel -from core.variables import Segment -from core.variables.consts import SELECTORS_LENGTH -from core.variables.types import SegmentType +from core.workflow.variables import Segment +from core.workflow.variables.consts import SELECTORS_LENGTH +from core.workflow.variables.types import SegmentType # Use double underscore (`__`) prefix for internal variables # to minimize risk of collision with user-defined variable names. diff --git a/api/core/workflow/nodes/variable_assigner/v1/node.py b/api/core/workflow/nodes/variable_assigner/v1/node.py index 9f5818f4bb..b987949541 100644 --- a/api/core/workflow/nodes/variable_assigner/v1/node.py +++ b/api/core/workflow/nodes/variable_assigner/v1/node.py @@ -1,7 +1,6 @@ from collections.abc import Mapping, Sequence from typing import TYPE_CHECKING, Any -from core.variables import SegmentType, VariableBase from core.workflow.constants import CONVERSATION_VARIABLE_NODE_ID from core.workflow.entities import GraphInitParams from core.workflow.enums import NodeType, WorkflowNodeExecutionStatus @@ -9,6 +8,7 @@ from core.workflow.node_events import NodeRunResult from core.workflow.nodes.base.node import Node from core.workflow.nodes.variable_assigner.common import helpers as common_helpers from core.workflow.nodes.variable_assigner.common.exc import VariableOperatorNodeError +from core.workflow.variables import SegmentType, VariableBase from .node_data import VariableAssignerData, WriteMode diff --git a/api/core/workflow/nodes/variable_assigner/v2/helpers.py b/api/core/workflow/nodes/variable_assigner/v2/helpers.py index f5490fb900..ce3fe9620c 100644 --- a/api/core/workflow/nodes/variable_assigner/v2/helpers.py +++ b/api/core/workflow/nodes/variable_assigner/v2/helpers.py @@ -1,6 +1,6 @@ from typing import Any -from core.variables import SegmentType +from core.workflow.variables import SegmentType from .enums import Operation diff --git a/api/core/workflow/nodes/variable_assigner/v2/node.py b/api/core/workflow/nodes/variable_assigner/v2/node.py index 5857702e72..0d4c3d2774 100644 --- a/api/core/workflow/nodes/variable_assigner/v2/node.py +++ b/api/core/workflow/nodes/variable_assigner/v2/node.py @@ -2,14 +2,14 @@ import json from collections.abc import Mapping, MutableMapping, Sequence from typing import TYPE_CHECKING, Any -from core.variables import SegmentType, VariableBase -from core.variables.consts import SELECTORS_LENGTH from core.workflow.constants import CONVERSATION_VARIABLE_NODE_ID from core.workflow.enums import NodeType, WorkflowNodeExecutionStatus from core.workflow.node_events import NodeRunResult from core.workflow.nodes.base.node import Node from core.workflow.nodes.variable_assigner.common import helpers as common_helpers from core.workflow.nodes.variable_assigner.common.exc import VariableOperatorNodeError +from core.workflow.variables import SegmentType, VariableBase +from core.workflow.variables.consts import SELECTORS_LENGTH from . import helpers from .entities import VariableAssignerNodeData, VariableOperationItem diff --git a/api/core/workflow/runtime/graph_runtime_state_protocol.py b/api/core/workflow/runtime/graph_runtime_state_protocol.py index bfbb5ba704..81d87e5a74 100644 --- a/api/core/workflow/runtime/graph_runtime_state_protocol.py +++ b/api/core/workflow/runtime/graph_runtime_state_protocol.py @@ -2,8 +2,8 @@ from collections.abc import Mapping, Sequence from typing import Any, Protocol from core.model_runtime.entities.llm_entities import LLMUsage -from core.variables.segments import Segment from core.workflow.system_variable import SystemVariableReadOnlyView +from core.workflow.variables.segments import Segment class ReadOnlyVariablePool(Protocol): diff --git a/api/core/workflow/runtime/read_only_wrappers.py b/api/core/workflow/runtime/read_only_wrappers.py index d3e4c60d9b..25a834a539 100644 --- a/api/core/workflow/runtime/read_only_wrappers.py +++ b/api/core/workflow/runtime/read_only_wrappers.py @@ -5,8 +5,8 @@ from copy import deepcopy from typing import Any from core.model_runtime.entities.llm_entities import LLMUsage -from core.variables.segments import Segment from core.workflow.system_variable import SystemVariableReadOnlyView +from core.workflow.variables.segments import Segment from .graph_runtime_state import GraphRuntimeState from .variable_pool import VariablePool diff --git a/api/core/workflow/runtime/variable_pool.py b/api/core/workflow/runtime/variable_pool.py index c4b077fa69..84441cbd58 100644 --- a/api/core/workflow/runtime/variable_pool.py +++ b/api/core/workflow/runtime/variable_pool.py @@ -9,10 +9,6 @@ from typing import Annotated, Any, Union, cast from pydantic import BaseModel, Field from core.file import File, FileAttribute, file_manager -from core.variables import Segment, SegmentGroup, VariableBase -from core.variables.consts import SELECTORS_LENGTH -from core.variables.segments import FileSegment, ObjectSegment -from core.variables.variables import RAGPipelineVariableInput, Variable from core.workflow.constants import ( CONVERSATION_VARIABLE_NODE_ID, ENVIRONMENT_VARIABLE_NODE_ID, @@ -20,6 +16,10 @@ from core.workflow.constants import ( SYSTEM_VARIABLE_NODE_ID, ) from core.workflow.system_variable import SystemVariable +from core.workflow.variables import Segment, SegmentGroup, VariableBase +from core.workflow.variables.consts import SELECTORS_LENGTH +from core.workflow.variables.segments import FileSegment, ObjectSegment +from core.workflow.variables.variables import RAGPipelineVariableInput, Variable from factories import variable_factory VariableValue = Union[str, int, float, dict[str, object], list[object], File] diff --git a/api/core/workflow/utils/condition/processor.py b/api/core/workflow/utils/condition/processor.py index c6070b83b8..3fb3b9a08a 100644 --- a/api/core/workflow/utils/condition/processor.py +++ b/api/core/workflow/utils/condition/processor.py @@ -3,9 +3,9 @@ from collections.abc import Mapping, Sequence from typing import Literal, NamedTuple from core.file import FileAttribute, file_manager -from core.variables import ArrayFileSegment -from core.variables.segments import ArrayBooleanSegment, BooleanSegment from core.workflow.runtime import VariablePool +from core.workflow.variables import ArrayFileSegment +from core.workflow.variables.segments import ArrayBooleanSegment, BooleanSegment from .entities import Condition, SubCondition, SupportedComparisonOperator diff --git a/api/core/workflow/variable_loader.py b/api/core/workflow/variable_loader.py index 7992785fe1..dfa4ce2e75 100644 --- a/api/core/workflow/variable_loader.py +++ b/api/core/workflow/variable_loader.py @@ -2,9 +2,9 @@ import abc from collections.abc import Mapping, Sequence from typing import Any, Protocol -from core.variables import VariableBase -from core.variables.consts import SELECTORS_LENGTH from core.workflow.runtime import VariablePool +from core.workflow.variables import VariableBase +from core.workflow.variables.consts import SELECTORS_LENGTH class VariableLoader(Protocol): diff --git a/api/core/workflow/workflow_type_encoder.py b/api/core/workflow/workflow_type_encoder.py index f1f549e1f8..6f2bc76a05 100644 --- a/api/core/workflow/workflow_type_encoder.py +++ b/api/core/workflow/workflow_type_encoder.py @@ -5,7 +5,7 @@ from typing import Any, overload from pydantic import BaseModel from core.file.models import File -from core.variables import Segment +from core.workflow.variables import Segment class WorkflowRuntimeTypeConverter: diff --git a/api/extensions/otel/parser/base.py b/api/extensions/otel/parser/base.py index f4db26e840..88df63da08 100644 --- a/api/extensions/otel/parser/base.py +++ b/api/extensions/otel/parser/base.py @@ -10,10 +10,10 @@ from opentelemetry.trace.status import Status, StatusCode from pydantic import BaseModel from core.file.models import File -from core.variables import Segment from core.workflow.enums import NodeType from core.workflow.graph_events import GraphNodeEventBase from core.workflow.nodes.base.node import Node +from core.workflow.variables import Segment from extensions.otel.semconv.gen_ai import ChainAttributes, GenAIAttributes diff --git a/api/extensions/otel/parser/retrieval.py b/api/extensions/otel/parser/retrieval.py index fc151af691..82cb865b8b 100644 --- a/api/extensions/otel/parser/retrieval.py +++ b/api/extensions/otel/parser/retrieval.py @@ -8,9 +8,9 @@ from typing import Any from opentelemetry.trace import Span -from core.variables import Segment from core.workflow.graph_events import GraphNodeEventBase from core.workflow.nodes.base.node import Node +from core.workflow.variables import Segment from extensions.otel.parser.base import DefaultNodeOTelParser, safe_json_dumps from extensions.otel.semconv.gen_ai import RetrieverAttributes diff --git a/api/factories/variable_factory.py b/api/factories/variable_factory.py index 3f030ae127..43945e2c0c 100644 --- a/api/factories/variable_factory.py +++ b/api/factories/variable_factory.py @@ -4,8 +4,12 @@ from uuid import uuid4 from configs import dify_config from core.file import File -from core.variables.exc import VariableError -from core.variables.segments import ( +from core.workflow.constants import ( + CONVERSATION_VARIABLE_NODE_ID, + ENVIRONMENT_VARIABLE_NODE_ID, +) +from core.workflow.variables.exc import VariableError +from core.workflow.variables.segments import ( ArrayAnySegment, ArrayBooleanSegment, ArrayFileSegment, @@ -22,8 +26,8 @@ from core.variables.segments import ( Segment, StringSegment, ) -from core.variables.types import SegmentType -from core.variables.variables import ( +from core.workflow.variables.types import SegmentType +from core.workflow.variables.variables import ( ArrayAnyVariable, ArrayBooleanVariable, ArrayFileVariable, @@ -40,10 +44,6 @@ from core.variables.variables import ( StringVariable, VariableBase, ) -from core.workflow.constants import ( - CONVERSATION_VARIABLE_NODE_ID, - ENVIRONMENT_VARIABLE_NODE_ID, -) class UnsupportedSegmentTypeError(Exception): diff --git a/api/fields/_value_type_serializer.py b/api/fields/_value_type_serializer.py index b2b793d40e..461c163e2f 100644 --- a/api/fields/_value_type_serializer.py +++ b/api/fields/_value_type_serializer.py @@ -1,7 +1,7 @@ from typing import TypedDict -from core.variables.segments import Segment -from core.variables.types import SegmentType +from core.workflow.variables.segments import Segment +from core.workflow.variables.types import SegmentType class _VarTypedDict(TypedDict, total=False): diff --git a/api/fields/workflow_fields.py b/api/fields/workflow_fields.py index 2755f77f61..019949e105 100644 --- a/api/fields/workflow_fields.py +++ b/api/fields/workflow_fields.py @@ -1,7 +1,7 @@ from flask_restx import fields from core.helper import encrypter -from core.variables import SecretVariable, SegmentType, VariableBase +from core.workflow.variables import SecretVariable, SegmentType, VariableBase from fields.member_fields import simple_account_fields from libs.helper import TimestampField diff --git a/api/models/workflow.py b/api/models/workflow.py index 5e9e099ccd..7472e80cec 100644 --- a/api/models/workflow.py +++ b/api/models/workflow.py @@ -24,8 +24,6 @@ from typing_extensions import deprecated from core.file.constants import maybe_file_object from core.file.models import File -from core.variables import utils as variable_utils -from core.variables.variables import FloatVariable, IntegerVariable, StringVariable from core.workflow.constants import ( CONVERSATION_VARIABLE_NODE_ID, SYSTEM_VARIABLE_NODE_ID, @@ -33,6 +31,8 @@ from core.workflow.constants import ( from core.workflow.entities.graph_config import NodeConfigDict, NodeConfigDictAdapter from core.workflow.entities.pause_reason import HumanInputRequired, PauseReason, PauseReasonType, SchedulingPause from core.workflow.enums import NodeType, WorkflowExecutionStatus +from core.workflow.variables import utils as variable_utils +from core.workflow.variables.variables import FloatVariable, IntegerVariable, StringVariable from extensions.ext_storage import Storage from factories.variable_factory import TypeMismatchError, build_segment_with_type from libs.datetime_utils import naive_utc_now @@ -46,7 +46,7 @@ if TYPE_CHECKING: from constants import DEFAULT_FILE_NUMBER_LIMITS, HIDDEN_VALUE from core.helper import encrypter -from core.variables import SecretVariable, Segment, SegmentType, VariableBase +from core.workflow.variables import SecretVariable, Segment, SegmentType, VariableBase from factories import variable_factory from libs import helper diff --git a/api/services/conversation_service.py b/api/services/conversation_service.py index 295d48d8a1..da030656db 100644 --- a/api/services/conversation_service.py +++ b/api/services/conversation_service.py @@ -10,7 +10,7 @@ from configs import dify_config from core.app.entities.app_invoke_entities import InvokeFrom from core.db.session_factory import session_factory from core.llm_generator.llm_generator import LLMGenerator -from core.variables.types import SegmentType +from core.workflow.variables.types import SegmentType from extensions.ext_database import db from factories import variable_factory from libs.datetime_utils import naive_utc_now diff --git a/api/services/conversation_variable_updater.py b/api/services/conversation_variable_updater.py index 92008d5ff1..b0012d6f6a 100644 --- a/api/services/conversation_variable_updater.py +++ b/api/services/conversation_variable_updater.py @@ -1,7 +1,7 @@ from sqlalchemy import select from sqlalchemy.orm import Session, sessionmaker -from core.variables.variables import VariableBase +from core.workflow.variables.variables import VariableBase from models import ConversationVariable diff --git a/api/services/rag_pipeline/rag_pipeline.py b/api/services/rag_pipeline/rag_pipeline.py index 4e33b312f4..6e0f635128 100644 --- a/api/services/rag_pipeline/rag_pipeline.py +++ b/api/services/rag_pipeline/rag_pipeline.py @@ -36,7 +36,6 @@ from core.rag.entities.event import ( ) from core.repositories.factory import DifyCoreRepositoryFactory from core.repositories.sqlalchemy_workflow_node_execution_repository import SQLAlchemyWorkflowNodeExecutionRepository -from core.variables.variables import VariableBase from core.workflow.entities.workflow_node_execution import ( WorkflowNodeExecution, WorkflowNodeExecutionStatus, @@ -51,6 +50,7 @@ from core.workflow.nodes.node_mapping import LATEST_VERSION, NODE_TYPE_CLASSES_M from core.workflow.repositories.workflow_node_execution_repository import OrderConfig from core.workflow.runtime import VariablePool from core.workflow.system_variable import SystemVariable +from core.workflow.variables.variables import VariableBase from core.workflow.workflow_entry import WorkflowEntry from extensions.ext_database import db from libs.infinite_scroll_pagination import InfiniteScrollPagination diff --git a/api/services/trigger/webhook_service.py b/api/services/trigger/webhook_service.py index 4159f5f8f4..f812df11c7 100644 --- a/api/services/trigger/webhook_service.py +++ b/api/services/trigger/webhook_service.py @@ -17,8 +17,8 @@ from configs import dify_config from core.app.entities.app_invoke_entities import InvokeFrom from core.file.models import FileTransferMethod from core.tools.tool_file_manager import ToolFileManager -from core.variables.types import SegmentType from core.workflow.enums import NodeType +from core.workflow.variables.types import SegmentType from enums.quota_type import QuotaType from extensions.ext_database import db from extensions.ext_redis import redis_client diff --git a/api/services/variable_truncator.py b/api/services/variable_truncator.py index f973361341..fb167b6336 100644 --- a/api/services/variable_truncator.py +++ b/api/services/variable_truncator.py @@ -7,7 +7,8 @@ from typing import Any, Generic, TypeAlias, TypeVar, overload from configs import dify_config from core.file.models import File -from core.variables.segments import ( +from core.workflow.nodes.variable_assigner.common.helpers import UpdatedVariable +from core.workflow.variables.segments import ( ArrayFileSegment, ArraySegment, BooleanSegment, @@ -19,8 +20,7 @@ from core.variables.segments import ( Segment, StringSegment, ) -from core.variables.utils import dumps_with_segments -from core.workflow.nodes.variable_assigner.common.helpers import UpdatedVariable +from core.workflow.variables.utils import dumps_with_segments _MAX_DEPTH = 100 diff --git a/api/services/workflow_draft_variable_service.py b/api/services/workflow_draft_variable_service.py index 70b0190231..afcf5e2559 100644 --- a/api/services/workflow_draft_variable_service.py +++ b/api/services/workflow_draft_variable_service.py @@ -15,19 +15,19 @@ from sqlalchemy.sql.expression import and_, or_ from configs import dify_config from core.app.entities.app_invoke_entities import InvokeFrom from core.file.models import File -from core.variables import Segment, StringSegment, VariableBase -from core.variables.consts import SELECTORS_LENGTH -from core.variables.segments import ( - ArrayFileSegment, - FileSegment, -) -from core.variables.types import SegmentType -from core.variables.utils import dumps_with_segments from core.workflow.constants import CONVERSATION_VARIABLE_NODE_ID, ENVIRONMENT_VARIABLE_NODE_ID, SYSTEM_VARIABLE_NODE_ID from core.workflow.enums import SystemVariableKey from core.workflow.nodes import NodeType from core.workflow.nodes.variable_assigner.common.helpers import get_updated_variables from core.workflow.variable_loader import VariableLoader +from core.workflow.variables import Segment, StringSegment, VariableBase +from core.workflow.variables.consts import SELECTORS_LENGTH +from core.workflow.variables.segments import ( + ArrayFileSegment, + FileSegment, +) +from core.workflow.variables.types import SegmentType +from core.workflow.variables.utils import dumps_with_segments from extensions.ext_storage import storage from factories.file_factory import StorageKeyLoader from factories.variable_factory import build_segment, segment_to_variable diff --git a/api/services/workflow_service.py b/api/services/workflow_service.py index 4e1e515de5..3a62290c86 100644 --- a/api/services/workflow_service.py +++ b/api/services/workflow_service.py @@ -16,8 +16,6 @@ from core.app.entities.app_invoke_entities import InvokeFrom from core.file import File from core.repositories import DifyCoreRepositoryFactory from core.repositories.human_input_repository import HumanInputFormRepositoryImpl -from core.variables import VariableBase -from core.variables.variables import Variable from core.workflow.entities import GraphInitParams, WorkflowNodeExecution from core.workflow.entities.pause_reason import HumanInputRequired from core.workflow.enums import ErrorStrategy, WorkflowNodeExecutionMetadataKey, WorkflowNodeExecutionStatus @@ -40,6 +38,8 @@ from core.workflow.repositories.human_input_form_repository import FormCreatePar from core.workflow.runtime import GraphRuntimeState, VariablePool from core.workflow.system_variable import SystemVariable from core.workflow.variable_loader import load_into_variable_pool +from core.workflow.variables import VariableBase +from core.workflow.variables.variables import Variable from core.workflow.workflow_entry import WorkflowEntry from enums.cloud_plan import CloudPlan from events.app_event import app_draft_workflow_was_synced, app_published_workflow_was_updated diff --git a/api/tests/integration_tests/services/test_workflow_draft_variable_service.py b/api/tests/integration_tests/services/test_workflow_draft_variable_service.py index f3a5ba0d11..5faa002fff 100644 --- a/api/tests/integration_tests/services/test_workflow_draft_variable_service.py +++ b/api/tests/integration_tests/services/test_workflow_draft_variable_service.py @@ -6,11 +6,11 @@ import pytest from sqlalchemy import delete from sqlalchemy.orm import Session -from core.variables.segments import StringSegment -from core.variables.types import SegmentType -from core.variables.variables import StringVariable from core.workflow.constants import CONVERSATION_VARIABLE_NODE_ID, SYSTEM_VARIABLE_NODE_ID from core.workflow.nodes import NodeType +from core.workflow.variables.segments import StringSegment +from core.workflow.variables.types import SegmentType +from core.workflow.variables.variables import StringVariable from extensions.ext_database import db from extensions.ext_storage import storage from factories.variable_factory import build_segment diff --git a/api/tests/integration_tests/tasks/test_remove_app_and_related_data_task.py b/api/tests/integration_tests/tasks/test_remove_app_and_related_data_task.py index d020233620..a259ccb2b9 100644 --- a/api/tests/integration_tests/tasks/test_remove_app_and_related_data_task.py +++ b/api/tests/integration_tests/tasks/test_remove_app_and_related_data_task.py @@ -5,7 +5,7 @@ import pytest from sqlalchemy import delete from core.db.session_factory import session_factory -from core.variables.segments import StringSegment +from core.workflow.variables.segments import StringSegment from models import Tenant from models.enums import CreatorUserRole from models.model import App, UploadFile @@ -191,7 +191,7 @@ class TestDeleteDraftVariablesWithOffloadIntegration: @pytest.fixture def setup_offload_test_data(self, app_and_tenant): tenant, app = app_and_tenant - from core.variables.types import SegmentType + from core.workflow.variables.types import SegmentType from libs.datetime_utils import naive_utc_now with session_factory.create_session() as session: @@ -422,7 +422,7 @@ class TestDeleteDraftVariablesSessionCommit: @pytest.fixture def setup_offload_test_data(self, app_and_tenant): """Create test data with offload files for session commit tests.""" - from core.variables.types import SegmentType + from core.workflow.variables.types import SegmentType from libs.datetime_utils import naive_utc_now tenant, app = app_and_tenant diff --git a/api/tests/test_containers_integration_tests/services/test_workflow_draft_variable_service.py b/api/tests/test_containers_integration_tests/services/test_workflow_draft_variable_service.py index ee155021e3..1f91b40963 100644 --- a/api/tests/test_containers_integration_tests/services/test_workflow_draft_variable_service.py +++ b/api/tests/test_containers_integration_tests/services/test_workflow_draft_variable_service.py @@ -1,8 +1,8 @@ import pytest from faker import Faker -from core.variables.segments import StringSegment from core.workflow.constants import CONVERSATION_VARIABLE_NODE_ID, SYSTEM_VARIABLE_NODE_ID +from core.workflow.variables.segments import StringSegment from models import App, Workflow from models.enums import DraftVariableType from models.workflow import WorkflowDraftVariable @@ -467,7 +467,7 @@ class TestWorkflowDraftVariableService: fake = Faker() app = self._create_test_app(db_session_with_containers, mock_external_service_dependencies, fake=fake) workflow = self._create_test_workflow(db_session_with_containers, app, fake=fake) - from core.variables.variables import StringVariable + from core.workflow.variables.variables import StringVariable conv_var = StringVariable( id=fake.uuid4(), @@ -650,7 +650,7 @@ class TestWorkflowDraftVariableService: fake = Faker() app = self._create_test_app(db_session_with_containers, mock_external_service_dependencies, fake=fake) workflow = self._create_test_workflow(db_session_with_containers, app, fake=fake) - from core.variables.variables import StringVariable + from core.workflow.variables.variables import StringVariable conv_var1 = StringVariable( id=fake.uuid4(), diff --git a/api/tests/unit_tests/controllers/console/app/workflow_draft_variables_test.py b/api/tests/unit_tests/controllers/console/app/workflow_draft_variables_test.py index c8de059109..66f5b7198d 100644 --- a/api/tests/unit_tests/controllers/console/app/workflow_draft_variables_test.py +++ b/api/tests/unit_tests/controllers/console/app/workflow_draft_variables_test.py @@ -13,8 +13,8 @@ from controllers.console.app.workflow_draft_variable import ( _WORKFLOW_DRAFT_VARIABLE_WITHOUT_VALUE_FIELDS, _serialize_full_content, ) -from core.variables.types import SegmentType from core.workflow.constants import CONVERSATION_VARIABLE_NODE_ID, SYSTEM_VARIABLE_NODE_ID +from core.workflow.variables.types import SegmentType from factories.variable_factory import build_segment from libs.datetime_utils import naive_utc_now from libs.uuid_utils import uuidv7 diff --git a/api/tests/unit_tests/core/app/apps/advanced_chat/test_app_runner_conversation_variables.py b/api/tests/unit_tests/core/app/apps/advanced_chat/test_app_runner_conversation_variables.py index 3a4fdc3cd8..0ca54a2f4a 100644 --- a/api/tests/unit_tests/core/app/apps/advanced_chat/test_app_runner_conversation_variables.py +++ b/api/tests/unit_tests/core/app/apps/advanced_chat/test_app_runner_conversation_variables.py @@ -7,7 +7,7 @@ from sqlalchemy.orm import Session from core.app.apps.advanced_chat.app_runner import AdvancedChatAppRunner from core.app.entities.app_invoke_entities import AdvancedChatAppGenerateEntity, InvokeFrom -from core.variables import SegmentType +from core.workflow.variables import SegmentType from factories import variable_factory from models import ConversationVariable, Workflow diff --git a/api/tests/unit_tests/core/app/apps/common/test_workflow_response_converter.py b/api/tests/unit_tests/core/app/apps/common/test_workflow_response_converter.py index 8423f1ab02..302eac95eb 100644 --- a/api/tests/unit_tests/core/app/apps/common/test_workflow_response_converter.py +++ b/api/tests/unit_tests/core/app/apps/common/test_workflow_response_converter.py @@ -2,7 +2,7 @@ from collections.abc import Mapping, Sequence from core.app.apps.common.workflow_response_converter import WorkflowResponseConverter from core.file import FILE_MODEL_IDENTITY, File, FileTransferMethod, FileType -from core.variables.segments import ArrayFileSegment, FileSegment +from core.workflow.variables.segments import ArrayFileSegment, FileSegment class TestWorkflowResponseConverterFetchFilesFromVariableValue: diff --git a/api/tests/unit_tests/core/app/layers/test_conversation_variable_persist_layer.py b/api/tests/unit_tests/core/app/layers/test_conversation_variable_persist_layer.py index b6e8cc9c8e..d3ae577d0d 100644 --- a/api/tests/unit_tests/core/app/layers/test_conversation_variable_persist_layer.py +++ b/api/tests/unit_tests/core/app/layers/test_conversation_variable_persist_layer.py @@ -3,8 +3,6 @@ from datetime import datetime from unittest.mock import Mock from core.app.layers.conversation_variable_persist_layer import ConversationVariablePersistenceLayer -from core.variables import StringVariable -from core.variables.segments import Segment from core.workflow.constants import CONVERSATION_VARIABLE_NODE_ID from core.workflow.enums import NodeType, WorkflowNodeExecutionStatus from core.workflow.graph_engine.protocols.command_channel import CommandChannel @@ -13,6 +11,8 @@ from core.workflow.node_events import NodeRunResult from core.workflow.nodes.variable_assigner.common import helpers as common_helpers from core.workflow.runtime.graph_runtime_state_protocol import ReadOnlyGraphRuntimeState from core.workflow.system_variable import SystemVariable +from core.workflow.variables import StringVariable +from core.workflow.variables.segments import Segment class MockReadOnlyVariablePool: diff --git a/api/tests/unit_tests/core/app/layers/test_pause_state_persist_layer.py b/api/tests/unit_tests/core/app/layers/test_pause_state_persist_layer.py index 1d885f6b2e..539f0cb581 100644 --- a/api/tests/unit_tests/core/app/layers/test_pause_state_persist_layer.py +++ b/api/tests/unit_tests/core/app/layers/test_pause_state_persist_layer.py @@ -13,7 +13,6 @@ from core.app.layers.pause_state_persist_layer import ( _AdvancedChatAppGenerateEntityWrapper, _WorkflowGenerateEntityWrapper, ) -from core.variables.segments import Segment from core.workflow.entities.pause_reason import SchedulingPause from core.workflow.graph_engine.entities.commands import GraphEngineCommand from core.workflow.graph_engine.layers.base import GraphEngineLayerNotInitializedError @@ -24,6 +23,7 @@ from core.workflow.graph_events.graph import ( GraphRunSucceededEvent, ) from core.workflow.runtime.graph_runtime_state_protocol import ReadOnlyVariablePool +from core.workflow.variables.segments import Segment from models.model import AppMode from repositories.factory import DifyAPIRepositoryFactory diff --git a/api/tests/unit_tests/core/variables/test_segment.py b/api/tests/unit_tests/core/variables/test_segment.py index aa16c8af1c..2b12b9aabc 100644 --- a/api/tests/unit_tests/core/variables/test_segment.py +++ b/api/tests/unit_tests/core/variables/test_segment.py @@ -4,7 +4,9 @@ from pydantic import BaseModel from core.file import File, FileTransferMethod, FileType from core.helper import encrypter -from core.variables.segments import ( +from core.workflow.runtime import VariablePool +from core.workflow.system_variable import SystemVariable +from core.workflow.variables.segments import ( ArrayAnySegment, ArrayFileSegment, ArrayNumberSegment, @@ -20,8 +22,8 @@ from core.variables.segments import ( StringSegment, get_segment_discriminator, ) -from core.variables.types import SegmentType -from core.variables.variables import ( +from core.workflow.variables.types import SegmentType +from core.workflow.variables.variables import ( ArrayAnyVariable, ArrayFileVariable, ArrayNumberVariable, @@ -36,8 +38,6 @@ from core.variables.variables import ( StringVariable, Variable, ) -from core.workflow.runtime import VariablePool -from core.workflow.system_variable import SystemVariable def test_segment_group_to_text(): diff --git a/api/tests/unit_tests/core/variables/test_segment_type.py b/api/tests/unit_tests/core/variables/test_segment_type.py index 3bfc5a957f..e28fed187b 100644 --- a/api/tests/unit_tests/core/variables/test_segment_type.py +++ b/api/tests/unit_tests/core/variables/test_segment_type.py @@ -1,6 +1,6 @@ import pytest -from core.variables.types import ArrayValidation, SegmentType +from core.workflow.variables.types import ArrayValidation, SegmentType class TestSegmentTypeIsArrayType: diff --git a/api/tests/unit_tests/core/variables/test_segment_type_validation.py b/api/tests/unit_tests/core/variables/test_segment_type_validation.py index 3a0054cd46..02f250634b 100644 --- a/api/tests/unit_tests/core/variables/test_segment_type_validation.py +++ b/api/tests/unit_tests/core/variables/test_segment_type_validation.py @@ -12,8 +12,8 @@ import pytest from core.file.enums import FileTransferMethod, FileType from core.file.models import File -from core.variables.segment_group import SegmentGroup -from core.variables.segments import ( +from core.workflow.variables.segment_group import SegmentGroup +from core.workflow.variables.segments import ( ArrayFileSegment, BooleanSegment, FileSegment, @@ -22,7 +22,7 @@ from core.variables.segments import ( ObjectSegment, StringSegment, ) -from core.variables.types import ArrayValidation, SegmentType +from core.workflow.variables.types import ArrayValidation, SegmentType def create_test_file( diff --git a/api/tests/unit_tests/core/variables/test_variables.py b/api/tests/unit_tests/core/variables/test_variables.py index fb4b18b57a..6fc162e533 100644 --- a/api/tests/unit_tests/core/variables/test_variables.py +++ b/api/tests/unit_tests/core/variables/test_variables.py @@ -1,7 +1,7 @@ import pytest from pydantic import ValidationError -from core.variables import ( +from core.workflow.variables import ( ArrayFileVariable, ArrayVariable, FloatVariable, @@ -11,7 +11,7 @@ from core.variables import ( SegmentType, StringVariable, ) -from core.variables.variables import VariableBase +from core.workflow.variables.variables import VariableBase def test_frozen_variables(): diff --git a/api/tests/unit_tests/core/workflow/entities/test_variable_pool.py b/api/tests/unit_tests/core/workflow/entities/test_variable_pool.py index 18f6753b05..d4254df319 100644 --- a/api/tests/unit_tests/core/workflow/entities/test_variable_pool.py +++ b/api/tests/unit_tests/core/workflow/entities/test_variable_pool.py @@ -1,10 +1,10 @@ -from core.variables.segments import ( +from core.workflow.runtime import VariablePool +from core.workflow.variables.segments import ( BooleanSegment, IntegerSegment, NoneSegment, StringSegment, ) -from core.workflow.runtime import VariablePool class TestVariablePoolGetAndNestedAttribute: diff --git a/api/tests/unit_tests/core/workflow/graph_engine/command_channels/test_redis_channel.py b/api/tests/unit_tests/core/workflow/graph_engine/command_channels/test_redis_channel.py index f33fd0deeb..db9b977e4a 100644 --- a/api/tests/unit_tests/core/workflow/graph_engine/command_channels/test_redis_channel.py +++ b/api/tests/unit_tests/core/workflow/graph_engine/command_channels/test_redis_channel.py @@ -3,7 +3,6 @@ import json from unittest.mock import MagicMock -from core.variables import IntegerVariable, StringVariable from core.workflow.graph_engine.command_channels.redis_channel import RedisChannel from core.workflow.graph_engine.entities.commands import ( AbortCommand, @@ -12,6 +11,7 @@ from core.workflow.graph_engine.entities.commands import ( UpdateVariablesCommand, VariableUpdate, ) +from core.workflow.variables import IntegerVariable, StringVariable class TestRedisChannel: diff --git a/api/tests/unit_tests/core/workflow/graph_engine/test_command_system.py b/api/tests/unit_tests/core/workflow/graph_engine/test_command_system.py index 1af5a80a56..6c3700ea2b 100644 --- a/api/tests/unit_tests/core/workflow/graph_engine/test_command_system.py +++ b/api/tests/unit_tests/core/workflow/graph_engine/test_command_system.py @@ -4,7 +4,6 @@ import time from unittest.mock import MagicMock from core.app.entities.app_invoke_entities import InvokeFrom -from core.variables import IntegerVariable, StringVariable from core.workflow.entities.graph_init_params import GraphInitParams from core.workflow.entities.pause_reason import SchedulingPause from core.workflow.graph import Graph @@ -20,6 +19,7 @@ from core.workflow.graph_engine.entities.commands import ( from core.workflow.graph_events import GraphRunAbortedEvent, GraphRunPausedEvent, GraphRunStartedEvent from core.workflow.nodes.start.start_node import StartNode from core.workflow.runtime import GraphRuntimeState, VariablePool +from core.workflow.variables import IntegerVariable, StringVariable from models.enums import UserFrom diff --git a/api/tests/unit_tests/core/workflow/graph_engine/test_mock_nodes_template_code.py b/api/tests/unit_tests/core/workflow/graph_engine/test_mock_nodes_template_code.py index de08cc3497..40ea1bbe6e 100644 --- a/api/tests/unit_tests/core/workflow/graph_engine/test_mock_nodes_template_code.py +++ b/api/tests/unit_tests/core/workflow/graph_engine/test_mock_nodes_template_code.py @@ -205,9 +205,9 @@ class TestMockTemplateTransformNode: def test_mock_template_transform_node_with_variables(self): """Test that MockTemplateTransformNode processes templates with variables.""" - from core.variables import StringVariable from core.workflow.entities import GraphInitParams from core.workflow.runtime import GraphRuntimeState, VariablePool + from core.workflow.variables import StringVariable # Create test parameters graph_init_params = GraphInitParams( diff --git a/api/tests/unit_tests/core/workflow/graph_engine/test_table_runner.py b/api/tests/unit_tests/core/workflow/graph_engine/test_table_runner.py index afa9265fcd..e62002cfd5 100644 --- a/api/tests/unit_tests/core/workflow/graph_engine/test_table_runner.py +++ b/api/tests/unit_tests/core/workflow/graph_engine/test_table_runner.py @@ -21,15 +21,6 @@ from typing import Any from core.app.workflow.node_factory import DifyNodeFactory from core.tools.utils.yaml_utils import _load_yaml_file -from core.variables import ( - ArrayNumberVariable, - ArrayObjectVariable, - ArrayStringVariable, - FloatVariable, - IntegerVariable, - ObjectVariable, - StringVariable, -) from core.workflow.entities.graph_init_params import GraphInitParams from core.workflow.graph import Graph from core.workflow.graph_engine import GraphEngine, GraphEngineConfig @@ -41,6 +32,15 @@ from core.workflow.graph_events import ( ) from core.workflow.runtime import GraphRuntimeState, VariablePool from core.workflow.system_variable import SystemVariable +from core.workflow.variables import ( + ArrayNumberVariable, + ArrayObjectVariable, + ArrayStringVariable, + FloatVariable, + IntegerVariable, + ObjectVariable, + StringVariable, +) from .test_mock_config import MockConfig from .test_mock_factory import MockNodeFactory diff --git a/api/tests/unit_tests/core/workflow/nodes/code/code_node_spec.py b/api/tests/unit_tests/core/workflow/nodes/code/code_node_spec.py index 2262d25a14..2c2da3c4f9 100644 --- a/api/tests/unit_tests/core/workflow/nodes/code/code_node_spec.py +++ b/api/tests/unit_tests/core/workflow/nodes/code/code_node_spec.py @@ -1,6 +1,5 @@ from configs import dify_config from core.helper.code_executor.code_executor import CodeLanguage -from core.variables.types import SegmentType from core.workflow.nodes.code.code_node import CodeNode from core.workflow.nodes.code.entities import CodeNodeData from core.workflow.nodes.code.exc import ( @@ -9,6 +8,7 @@ from core.workflow.nodes.code.exc import ( OutputValidationError, ) from core.workflow.nodes.code.limits import CodeNodeLimits +from core.workflow.variables.types import SegmentType CodeNode._limits = CodeNodeLimits( max_string_length=dify_config.CODE_MAX_STRING_LENGTH, diff --git a/api/tests/unit_tests/core/workflow/nodes/code/entities_spec.py b/api/tests/unit_tests/core/workflow/nodes/code/entities_spec.py index d14a6ea69c..cfdeb30ab8 100644 --- a/api/tests/unit_tests/core/workflow/nodes/code/entities_spec.py +++ b/api/tests/unit_tests/core/workflow/nodes/code/entities_spec.py @@ -2,8 +2,8 @@ import pytest from pydantic import ValidationError from core.helper.code_executor.code_executor import CodeLanguage -from core.variables.types import SegmentType from core.workflow.nodes.code.entities import CodeNodeData +from core.workflow.variables.types import SegmentType class TestCodeNodeDataOutput: diff --git a/api/tests/unit_tests/core/workflow/nodes/knowledge_retrieval/test_knowledge_retrieval_node.py b/api/tests/unit_tests/core/workflow/nodes/knowledge_retrieval/test_knowledge_retrieval_node.py index 5733b2cf5b..a60dde199d 100644 --- a/api/tests/unit_tests/core/workflow/nodes/knowledge_retrieval/test_knowledge_retrieval_node.py +++ b/api/tests/unit_tests/core/workflow/nodes/knowledge_retrieval/test_knowledge_retrieval_node.py @@ -6,7 +6,6 @@ import pytest from core.app.entities.app_invoke_entities import InvokeFrom from core.model_runtime.entities.llm_entities import LLMUsage -from core.variables import StringSegment from core.workflow.entities import GraphInitParams from core.workflow.enums import WorkflowNodeExecutionStatus from core.workflow.nodes.knowledge_retrieval.entities import ( @@ -20,6 +19,7 @@ from core.workflow.nodes.knowledge_retrieval.knowledge_retrieval_node import Kno from core.workflow.repositories.rag_retrieval_protocol import RAGRetrievalProtocol, Source from core.workflow.runtime import GraphRuntimeState, VariablePool from core.workflow.system_variable import SystemVariable +from core.workflow.variables import StringSegment from models.enums import UserFrom diff --git a/api/tests/unit_tests/core/workflow/nodes/list_operator/node_spec.py b/api/tests/unit_tests/core/workflow/nodes/list_operator/node_spec.py index 366bec5001..63a87623da 100644 --- a/api/tests/unit_tests/core/workflow/nodes/list_operator/node_spec.py +++ b/api/tests/unit_tests/core/workflow/nodes/list_operator/node_spec.py @@ -5,9 +5,9 @@ from core.workflow.graph_engine.entities.graph import Graph from core.workflow.graph_engine.entities.graph_init_params import GraphInitParams from core.workflow.graph_engine.entities.graph_runtime_state import GraphRuntimeState -from core.variables import ArrayNumberSegment, ArrayStringSegment from core.workflow.enums import NodeType, WorkflowNodeExecutionStatus from core.workflow.nodes.list_operator.node import ListOperatorNode +from core.workflow.variables import ArrayNumberSegment, ArrayStringSegment from models.workflow import WorkflowType diff --git a/api/tests/unit_tests/core/workflow/nodes/llm/test_node.py b/api/tests/unit_tests/core/workflow/nodes/llm/test_node.py index 3d1b8b2f27..0883d202f7 100644 --- a/api/tests/unit_tests/core/workflow/nodes/llm/test_node.py +++ b/api/tests/unit_tests/core/workflow/nodes/llm/test_node.py @@ -19,7 +19,6 @@ from core.model_runtime.entities.message_entities import ( ) from core.model_runtime.entities.model_entities import AIModelEntity, FetchFrom, ModelType from core.model_runtime.model_providers.model_provider_factory import ModelProviderFactory -from core.variables import ArrayAnySegment, ArrayFileSegment, NoneSegment from core.workflow.entities import GraphInitParams from core.workflow.nodes.llm import llm_utils from core.workflow.nodes.llm.entities import ( @@ -34,6 +33,7 @@ from core.workflow.nodes.llm.file_saver import LLMFileSaver from core.workflow.nodes.llm.node import LLMNode from core.workflow.runtime import GraphRuntimeState, VariablePool from core.workflow.system_variable import SystemVariable +from core.workflow.variables import ArrayAnySegment, ArrayFileSegment, NoneSegment from models.enums import UserFrom from models.provider import ProviderType diff --git a/api/tests/unit_tests/core/workflow/nodes/parameter_extractor/test_entities.py b/api/tests/unit_tests/core/workflow/nodes/parameter_extractor/test_entities.py index b28d1d3d0a..2742b7dab0 100644 --- a/api/tests/unit_tests/core/workflow/nodes/parameter_extractor/test_entities.py +++ b/api/tests/unit_tests/core/workflow/nodes/parameter_extractor/test_entities.py @@ -1,5 +1,5 @@ -from core.variables.types import SegmentType from core.workflow.nodes.parameter_extractor.entities import ParameterConfig +from core.workflow.variables.types import SegmentType class TestParameterConfig: diff --git a/api/tests/unit_tests/core/workflow/nodes/parameter_extractor/test_parameter_extractor_node.py b/api/tests/unit_tests/core/workflow/nodes/parameter_extractor/test_parameter_extractor_node.py index b359284d00..ae229bbe2e 100644 --- a/api/tests/unit_tests/core/workflow/nodes/parameter_extractor/test_parameter_extractor_node.py +++ b/api/tests/unit_tests/core/workflow/nodes/parameter_extractor/test_parameter_extractor_node.py @@ -8,7 +8,6 @@ from typing import Any import pytest from core.model_runtime.entities import LLMMode -from core.variables.types import SegmentType from core.workflow.nodes.llm import ModelConfig, VisionConfig from core.workflow.nodes.parameter_extractor.entities import ParameterConfig, ParameterExtractorNodeData from core.workflow.nodes.parameter_extractor.exc import ( @@ -18,6 +17,7 @@ from core.workflow.nodes.parameter_extractor.exc import ( RequiredParameterMissingError, ) from core.workflow.nodes.parameter_extractor.parameter_extractor_node import ParameterExtractorNode +from core.workflow.variables.types import SegmentType from factories.variable_factory import build_segment_with_type diff --git a/api/tests/unit_tests/core/workflow/nodes/test_document_extractor_node.py b/api/tests/unit_tests/core/workflow/nodes/test_document_extractor_node.py index 088c60a337..81a6d75f95 100644 --- a/api/tests/unit_tests/core/workflow/nodes/test_document_extractor_node.py +++ b/api/tests/unit_tests/core/workflow/nodes/test_document_extractor_node.py @@ -7,9 +7,6 @@ from docx.oxml.text.paragraph import CT_P from core.app.entities.app_invoke_entities import InvokeFrom from core.file import File, FileTransferMethod -from core.variables import ArrayFileSegment -from core.variables.segments import ArrayStringSegment -from core.variables.variables import StringVariable from core.workflow.entities import GraphInitParams from core.workflow.enums import NodeType, WorkflowNodeExecutionStatus from core.workflow.node_events import NodeRunResult @@ -20,6 +17,9 @@ from core.workflow.nodes.document_extractor.node import ( _extract_text_from_pdf, _extract_text_from_plain_text, ) +from core.workflow.variables import ArrayFileSegment +from core.workflow.variables.segments import ArrayStringSegment +from core.workflow.variables.variables import StringVariable from models.enums import UserFrom diff --git a/api/tests/unit_tests/core/workflow/nodes/test_if_else.py b/api/tests/unit_tests/core/workflow/nodes/test_if_else.py index d700888c2f..3bc52f1289 100644 --- a/api/tests/unit_tests/core/workflow/nodes/test_if_else.py +++ b/api/tests/unit_tests/core/workflow/nodes/test_if_else.py @@ -7,7 +7,6 @@ import pytest from core.app.entities.app_invoke_entities import InvokeFrom from core.app.workflow.node_factory import DifyNodeFactory from core.file import File, FileTransferMethod, FileType -from core.variables import ArrayFileSegment from core.workflow.entities import GraphInitParams from core.workflow.enums import WorkflowNodeExecutionStatus from core.workflow.graph import Graph @@ -16,6 +15,7 @@ from core.workflow.nodes.if_else.if_else_node import IfElseNode from core.workflow.runtime import GraphRuntimeState, VariablePool from core.workflow.system_variable import SystemVariable from core.workflow.utils.condition.entities import Condition, SubCondition, SubVariableCondition +from core.workflow.variables import ArrayFileSegment from extensions.ext_database import db from models.enums import UserFrom diff --git a/api/tests/unit_tests/core/workflow/nodes/test_list_operator.py b/api/tests/unit_tests/core/workflow/nodes/test_list_operator.py index ff3eec0608..84a513b793 100644 --- a/api/tests/unit_tests/core/workflow/nodes/test_list_operator.py +++ b/api/tests/unit_tests/core/workflow/nodes/test_list_operator.py @@ -4,7 +4,6 @@ import pytest from core.app.entities.app_invoke_entities import InvokeFrom from core.file import File, FileTransferMethod, FileType -from core.variables import ArrayFileSegment from core.workflow.enums import WorkflowNodeExecutionStatus from core.workflow.nodes.list_operator.entities import ( ExtractConfig, @@ -17,6 +16,7 @@ from core.workflow.nodes.list_operator.entities import ( ) from core.workflow.nodes.list_operator.exc import InvalidKeyError from core.workflow.nodes.list_operator.node import ListOperatorNode, _get_file_extract_string_func +from core.workflow.variables import ArrayFileSegment from models.enums import UserFrom diff --git a/api/tests/unit_tests/core/workflow/nodes/tool/test_tool_node.py b/api/tests/unit_tests/core/workflow/nodes/tool/test_tool_node.py index 06927cddcf..56830f6011 100644 --- a/api/tests/unit_tests/core/workflow/nodes/tool/test_tool_node.py +++ b/api/tests/unit_tests/core/workflow/nodes/tool/test_tool_node.py @@ -12,11 +12,11 @@ from core.file import File, FileTransferMethod, FileType from core.model_runtime.entities.llm_entities import LLMUsage from core.tools.entities.tool_entities import ToolInvokeMessage from core.tools.utils.message_transformer import ToolFileMessageTransformer -from core.variables.segments import ArrayFileSegment from core.workflow.entities import GraphInitParams from core.workflow.node_events import StreamChunkEvent, StreamCompletedEvent from core.workflow.runtime import GraphRuntimeState, VariablePool from core.workflow.system_variable import SystemVariable +from core.workflow.variables.segments import ArrayFileSegment if TYPE_CHECKING: # pragma: no cover - imported for type checking only from core.workflow.nodes.tool.tool_node import ToolNode diff --git a/api/tests/unit_tests/core/workflow/nodes/variable_assigner/v1/test_variable_assigner_v1.py b/api/tests/unit_tests/core/workflow/nodes/variable_assigner/v1/test_variable_assigner_v1.py index d4b7a017f9..8a52f963ef 100644 --- a/api/tests/unit_tests/core/workflow/nodes/variable_assigner/v1/test_variable_assigner_v1.py +++ b/api/tests/unit_tests/core/workflow/nodes/variable_assigner/v1/test_variable_assigner_v1.py @@ -4,7 +4,6 @@ from uuid import uuid4 from core.app.entities.app_invoke_entities import InvokeFrom from core.app.workflow.node_factory import DifyNodeFactory -from core.variables import ArrayStringVariable, StringVariable from core.workflow.entities import GraphInitParams from core.workflow.graph import Graph from core.workflow.graph_events.node import NodeRunSucceededEvent @@ -13,6 +12,7 @@ from core.workflow.nodes.variable_assigner.v1 import VariableAssignerNode from core.workflow.nodes.variable_assigner.v1.node_data import WriteMode from core.workflow.runtime import GraphRuntimeState, VariablePool from core.workflow.system_variable import SystemVariable +from core.workflow.variables import ArrayStringVariable, StringVariable from models.enums import UserFrom DEFAULT_NODE_ID = "node_id" diff --git a/api/tests/unit_tests/core/workflow/nodes/variable_assigner/v2/test_helpers.py b/api/tests/unit_tests/core/workflow/nodes/variable_assigner/v2/test_helpers.py index 1501722b82..9a874337ed 100644 --- a/api/tests/unit_tests/core/workflow/nodes/variable_assigner/v2/test_helpers.py +++ b/api/tests/unit_tests/core/workflow/nodes/variable_assigner/v2/test_helpers.py @@ -1,6 +1,6 @@ -from core.variables import SegmentType from core.workflow.nodes.variable_assigner.v2.enums import Operation from core.workflow.nodes.variable_assigner.v2.helpers import is_input_value_valid +from core.workflow.variables import SegmentType def test_is_input_value_valid_overwrite_array_string(): diff --git a/api/tests/unit_tests/core/workflow/nodes/variable_assigner/v2/test_variable_assigner_v2.py b/api/tests/unit_tests/core/workflow/nodes/variable_assigner/v2/test_variable_assigner_v2.py index b08f9c37b4..5ed68fe8d0 100644 --- a/api/tests/unit_tests/core/workflow/nodes/variable_assigner/v2/test_variable_assigner_v2.py +++ b/api/tests/unit_tests/core/workflow/nodes/variable_assigner/v2/test_variable_assigner_v2.py @@ -4,13 +4,13 @@ from uuid import uuid4 from core.app.entities.app_invoke_entities import InvokeFrom from core.app.workflow.node_factory import DifyNodeFactory -from core.variables import ArrayStringVariable from core.workflow.entities import GraphInitParams from core.workflow.graph import Graph from core.workflow.nodes.variable_assigner.v2 import VariableAssignerNode from core.workflow.nodes.variable_assigner.v2.enums import InputType, Operation from core.workflow.runtime import GraphRuntimeState, VariablePool from core.workflow.system_variable import SystemVariable +from core.workflow.variables import ArrayStringVariable from models.enums import UserFrom DEFAULT_NODE_ID = "node_id" diff --git a/api/tests/unit_tests/core/workflow/nodes/webhook/test_webhook_node.py b/api/tests/unit_tests/core/workflow/nodes/webhook/test_webhook_node.py index 3b5aedebca..17baa9b325 100644 --- a/api/tests/unit_tests/core/workflow/nodes/webhook/test_webhook_node.py +++ b/api/tests/unit_tests/core/workflow/nodes/webhook/test_webhook_node.py @@ -4,7 +4,6 @@ import pytest from core.app.entities.app_invoke_entities import InvokeFrom from core.file import File, FileTransferMethod, FileType -from core.variables import FileVariable, StringVariable from core.workflow.entities.graph_init_params import GraphInitParams from core.workflow.entities.workflow_node_execution import WorkflowNodeExecutionStatus from core.workflow.nodes.trigger_webhook.entities import ( @@ -18,6 +17,7 @@ from core.workflow.nodes.trigger_webhook.node import TriggerWebhookNode from core.workflow.runtime.graph_runtime_state import GraphRuntimeState from core.workflow.runtime.variable_pool import VariablePool from core.workflow.system_variable import SystemVariable +from core.workflow.variables import FileVariable, StringVariable from models.enums import UserFrom from models.workflow import WorkflowType diff --git a/api/tests/unit_tests/core/workflow/test_variable_pool.py b/api/tests/unit_tests/core/workflow/test_variable_pool.py index b8869dbf1d..bc44dd8abf 100644 --- a/api/tests/unit_tests/core/workflow/test_variable_pool.py +++ b/api/tests/unit_tests/core/workflow/test_variable_pool.py @@ -4,8 +4,11 @@ from collections import defaultdict import pytest from core.file import File, FileTransferMethod, FileType -from core.variables import FileSegment, StringSegment -from core.variables.segments import ( +from core.workflow.constants import CONVERSATION_VARIABLE_NODE_ID, ENVIRONMENT_VARIABLE_NODE_ID, SYSTEM_VARIABLE_NODE_ID +from core.workflow.runtime import VariablePool +from core.workflow.system_variable import SystemVariable +from core.workflow.variables import FileSegment, StringSegment +from core.workflow.variables.segments import ( ArrayAnySegment, ArrayFileSegment, ArrayNumberSegment, @@ -16,7 +19,7 @@ from core.variables.segments import ( NoneSegment, ObjectSegment, ) -from core.variables.variables import ( +from core.workflow.variables.variables import ( ArrayNumberVariable, ArrayObjectVariable, ArrayStringVariable, @@ -26,9 +29,6 @@ from core.variables.variables import ( StringVariable, Variable, ) -from core.workflow.constants import CONVERSATION_VARIABLE_NODE_ID, ENVIRONMENT_VARIABLE_NODE_ID, SYSTEM_VARIABLE_NODE_ID -from core.workflow.runtime import VariablePool -from core.workflow.system_variable import SystemVariable from factories.variable_factory import build_segment, segment_to_variable diff --git a/api/tests/unit_tests/core/workflow/test_workflow_entry.py b/api/tests/unit_tests/core/workflow/test_workflow_entry.py index 27ffa455d6..bc86f0ede5 100644 --- a/api/tests/unit_tests/core/workflow/test_workflow_entry.py +++ b/api/tests/unit_tests/core/workflow/test_workflow_entry.py @@ -6,7 +6,6 @@ from configs import dify_config from core.file.enums import FileType from core.file.models import File, FileTransferMethod from core.helper.code_executor.code_executor import CodeLanguage -from core.variables.variables import StringVariable from core.workflow.constants import ( CONVERSATION_VARIABLE_NODE_ID, ENVIRONMENT_VARIABLE_NODE_ID, @@ -15,6 +14,7 @@ from core.workflow.nodes.code.code_node import CodeNode from core.workflow.nodes.code.limits import CodeNodeLimits from core.workflow.runtime import VariablePool from core.workflow.system_variable import SystemVariable +from core.workflow.variables.variables import StringVariable from core.workflow.workflow_entry import WorkflowEntry diff --git a/api/tests/unit_tests/factories/test_variable_factory.py b/api/tests/unit_tests/factories/test_variable_factory.py index f12e5993dc..9f7dc1d5a5 100644 --- a/api/tests/unit_tests/factories/test_variable_factory.py +++ b/api/tests/unit_tests/factories/test_variable_factory.py @@ -8,7 +8,7 @@ from hypothesis import HealthCheck, given, settings from hypothesis import strategies as st from core.file import File, FileTransferMethod, FileType -from core.variables import ( +from core.workflow.variables import ( ArrayNumberVariable, ArrayObjectVariable, ArrayStringVariable, @@ -17,8 +17,8 @@ from core.variables import ( SecretVariable, StringVariable, ) -from core.variables.exc import VariableError -from core.variables.segments import ( +from core.workflow.variables.exc import VariableError +from core.workflow.variables.segments import ( ArrayAnySegment, ArrayFileSegment, ArrayNumberSegment, @@ -33,7 +33,7 @@ from core.variables.segments import ( Segment, StringSegment, ) -from core.variables.types import SegmentType +from core.workflow.variables.types import SegmentType from factories import variable_factory from factories.variable_factory import TypeMismatchError, build_segment, build_segment_with_type diff --git a/api/tests/unit_tests/models/test_conversation_variable.py b/api/tests/unit_tests/models/test_conversation_variable.py index 5d84a2ec85..d44aa56488 100644 --- a/api/tests/unit_tests/models/test_conversation_variable.py +++ b/api/tests/unit_tests/models/test_conversation_variable.py @@ -1,6 +1,6 @@ from uuid import uuid4 -from core.variables import SegmentType +from core.workflow.variables import SegmentType from factories import variable_factory from models import ConversationVariable diff --git a/api/tests/unit_tests/models/test_workflow.py b/api/tests/unit_tests/models/test_workflow.py index 4c61320c29..3be9376fa5 100644 --- a/api/tests/unit_tests/models/test_workflow.py +++ b/api/tests/unit_tests/models/test_workflow.py @@ -6,8 +6,8 @@ from uuid import uuid4 from constants import HIDDEN_VALUE from core.file.enums import FileTransferMethod, FileType from core.file.models import File -from core.variables import FloatVariable, IntegerVariable, SecretVariable, StringVariable -from core.variables.segments import IntegerSegment, Segment +from core.workflow.variables import FloatVariable, IntegerVariable, SecretVariable, StringVariable +from core.workflow.variables.segments import IntegerSegment, Segment from factories.variable_factory import build_segment from models.workflow import Workflow, WorkflowDraftVariable, WorkflowNodeExecutionModel, is_system_variable_editable diff --git a/api/tests/unit_tests/services/test_variable_truncator.py b/api/tests/unit_tests/services/test_variable_truncator.py index ec819ae57a..aea1ab022d 100644 --- a/api/tests/unit_tests/services/test_variable_truncator.py +++ b/api/tests/unit_tests/services/test_variable_truncator.py @@ -19,7 +19,7 @@ import pytest from core.file.enums import FileTransferMethod, FileType from core.file.models import File -from core.variables.segments import ( +from core.workflow.variables.segments import ( ArrayFileSegment, ArrayNumberSegment, ArraySegment, diff --git a/api/tests/unit_tests/services/workflow/test_draft_var_loader_simple.py b/api/tests/unit_tests/services/workflow/test_draft_var_loader_simple.py index 6e03472b9d..83642fc209 100644 --- a/api/tests/unit_tests/services/workflow/test_draft_var_loader_simple.py +++ b/api/tests/unit_tests/services/workflow/test_draft_var_loader_simple.py @@ -6,8 +6,8 @@ from unittest.mock import Mock, patch import pytest from sqlalchemy import Engine -from core.variables.segments import ObjectSegment, StringSegment -from core.variables.types import SegmentType +from core.workflow.variables.segments import ObjectSegment, StringSegment +from core.workflow.variables.types import SegmentType from models.model import UploadFile from models.workflow import WorkflowDraftVariable, WorkflowDraftVariableFile from services.workflow_draft_variable_service import DraftVarLoader @@ -174,7 +174,7 @@ class TestDraftVarLoaderSimple: mock_storage.load.return_value = test_json_content.encode() with patch.object(WorkflowDraftVariable, "build_segment_with_type") as mock_build_segment: - from core.variables.segments import FloatSegment + from core.workflow.variables.segments import FloatSegment mock_segment = FloatSegment(value=test_number) mock_build_segment.return_value = mock_segment @@ -224,7 +224,7 @@ class TestDraftVarLoaderSimple: mock_storage.load.return_value = test_json_content.encode() with patch.object(WorkflowDraftVariable, "build_segment_with_type") as mock_build_segment: - from core.variables.segments import ArrayAnySegment + from core.workflow.variables.segments import ArrayAnySegment mock_segment = ArrayAnySegment(value=test_array) mock_build_segment.return_value = mock_segment diff --git a/api/tests/unit_tests/services/workflow/test_workflow_draft_variable_service.py b/api/tests/unit_tests/services/workflow/test_workflow_draft_variable_service.py index 66361f26e0..447e36731c 100644 --- a/api/tests/unit_tests/services/workflow/test_workflow_draft_variable_service.py +++ b/api/tests/unit_tests/services/workflow/test_workflow_draft_variable_service.py @@ -7,10 +7,10 @@ import pytest from sqlalchemy import Engine from sqlalchemy.orm import Session -from core.variables.segments import StringSegment -from core.variables.types import SegmentType from core.workflow.constants import SYSTEM_VARIABLE_NODE_ID from core.workflow.enums import NodeType +from core.workflow.variables.segments import StringSegment +from core.workflow.variables.types import SegmentType from libs.uuid_utils import uuidv7 from models.account import Account from models.enums import DraftVariableType