diff --git a/api/.importlinter b/api/.importlinter index c180f8d76b..c30007aafb 100644 --- a/api/.importlinter +++ b/api/.importlinter @@ -140,8 +140,6 @@ ignore_imports = core.workflow.nodes.llm.llm_utils -> core.entities.provider_entities core.workflow.nodes.parameter_extractor.parameter_extractor_node -> core.model_manager core.workflow.nodes.question_classifier.question_classifier_node -> core.model_manager - core.workflow.nodes.llm.llm_utils -> core.variables.segments - core.workflow.nodes.loop.entities -> core.variables.types core.workflow.nodes.tool.tool_node -> core.tools.utils.message_transformer core.workflow.nodes.tool.tool_node -> models core.workflow.nodes.agent.agent_node -> models.model @@ -178,54 +176,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.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.nodes.agent.agent_node -> extensions.ext_database core.workflow.nodes.knowledge_index.knowledge_index_node -> extensions.ext_database core.workflow.nodes.llm.file_saver -> extensions.ext_database diff --git a/api/controllers/console/app/workflow_draft_variable.py b/api/controllers/console/app/workflow_draft_variable.py index 619b80ff28..f37598fb31 100644 --- a/api/controllers/console/app/workflow_draft_variable.py +++ b/api/controllers/console/app/workflow_draft_variable.py @@ -15,11 +15,11 @@ from controllers.console.app.error import ( 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.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.file import helpers as file_helpers +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 510abdc1d0..d4e801de13 100644 --- a/api/core/app/apps/common/workflow_response_converter.py +++ b/api/core/app/apps/common/workflow_response_converter.py @@ -49,7 +49,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.file import FILE_MODEL_IDENTITY, File 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/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 5c39a67102..ac86b1784f 100644 --- a/api/core/workflow/nodes/agent/agent_node.py +++ b/api/core/workflow/nodes/agent/agent_node.py @@ -25,7 +25,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 f7a6c41f0a..d907ce2120 100644 --- a/api/core/workflow/nodes/code/code_node.py +++ b/api/core/workflow/nodes/code/code_node.py @@ -5,13 +5,13 @@ from typing import TYPE_CHECKING, Any, ClassVar, Protocol, cast 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 CodeLanguage, 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/document_extractor/node.py b/api/core/workflow/nodes/document_extractor/node.py index c442e01854..59be4c54ef 100644 --- a/api/core/workflow/nodes/document_extractor/node.py +++ b/api/core/workflow/nodes/document_extractor/node.py @@ -21,12 +21,12 @@ from docx.table import Table from docx.text.paragraph import Paragraph 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.file import File, FileTransferMethod, file_manager 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, UnstructuredApiConfig 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 8f180b47b5..cd6007e720 100644 --- a/api/core/workflow/nodes/http_request/executor.py +++ b/api/core/workflow/nodes/http_request/executor.py @@ -11,10 +11,10 @@ import httpx from json_repair import repair_json from core.helper.ssrf_proxy import ssrf_proxy -from core.variables.segments import ArrayFileSegment, FileSegment from core.workflow.file.enums import FileTransferMethod from core.workflow.file.file_manager import file_manager as default_file_manager 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 d45775652f..89eebb181c 100644 --- a/api/core/workflow/nodes/http_request/node.py +++ b/api/core/workflow/nodes/http_request/node.py @@ -5,7 +5,6 @@ from typing import TYPE_CHECKING, Any 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.file import File, FileTransferMethod from core.workflow.file.file_manager import file_manager as default_file_manager @@ -15,6 +14,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 .config import build_http_request_config, resolve_http_request_config 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 b25c3a3d29..0cfd39e485 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 3978a79550..d9ef16fbe7 100644 --- a/api/core/workflow/nodes/list_operator/node.py +++ b/api/core/workflow/nodes/list_operator/node.py @@ -1,12 +1,12 @@ from collections.abc import Callable, Sequence from typing import Any, TypeAlias, TypeVar -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.file import File 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 cf509f65f0..f753e19897 100644 --- a/api/core/workflow/nodes/llm/llm_utils.py +++ b/api/core/workflow/nodes/llm/llm_utils.py @@ -12,10 +12,10 @@ from core.model_runtime.entities.llm_entities import LLMUsage from core.model_runtime.entities.model_entities import AIModelEntity 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.file.models import File 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 ec23fd7231..33dd88156f 100644 --- a/api/core/workflow/nodes/llm/node.py +++ b/api/core/workflow/nodes/llm/node.py @@ -43,14 +43,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 ( @@ -73,6 +65,14 @@ from core.workflow.nodes.base.node import Node from core.workflow.nodes.base.variable_template_parser import VariableTemplateParser from core.workflow.nodes.llm.protocols import CredentialsProvider, ModelFactory 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 241a186a94..c546df1fba 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 93402d5084..66ef17e585 100644 --- a/api/core/workflow/nodes/parameter_extractor/parameter_extractor_node.py +++ b/api/core/workflow/nodes/parameter_extractor/parameter_extractor_node.py @@ -24,7 +24,6 @@ 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.file import File from core.workflow.node_events import NodeRunResult @@ -32,6 +31,7 @@ from core.workflow.nodes.base import variable_template_parser from core.workflow.nodes.base.node import Node from core.workflow.nodes.llm import 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 a7bf7d6642..0d7270a282 100644 --- a/api/core/workflow/nodes/tool/tool_node.py +++ b/api/core/workflow/nodes/tool/tool_node.py @@ -11,8 +11,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.file import File, FileTransferMethod 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 060afd6ae6..9f6046c11a 100644 --- a/api/core/workflow/nodes/trigger_webhook/node.py +++ b/api/core/workflow/nodes/trigger_webhook/node.py @@ -2,14 +2,14 @@ import logging from collections.abc import Mapping from typing import Any -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.file import FileTransferMethod 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 0ba9d8b3a8..48ad102b43 100644 --- a/api/core/workflow/runtime/variable_pool.py +++ b/api/core/workflow/runtime/variable_pool.py @@ -8,10 +8,6 @@ from typing import Annotated, Any, Union, cast from pydantic import BaseModel, Field -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 ( ) from core.workflow.file import File, FileAttribute, file_manager 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 c3f25a4d62..4e635cc2f2 100644 --- a/api/core/workflow/utils/condition/processor.py +++ b/api/core/workflow/utils/condition/processor.py @@ -2,10 +2,10 @@ import json from collections.abc import Mapping, Sequence from typing import Literal, NamedTuple -from core.variables import ArrayFileSegment -from core.variables.segments import ArrayBooleanSegment, BooleanSegment from core.workflow.file import FileAttribute, file_manager 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/variables/__init__.py b/api/core/workflow/variables/__init__.py similarity index 100% rename from api/core/variables/__init__.py rename to api/core/workflow/variables/__init__.py diff --git a/api/core/variables/consts.py b/api/core/workflow/variables/consts.py similarity index 100% rename from api/core/variables/consts.py rename to api/core/workflow/variables/consts.py diff --git a/api/core/variables/exc.py b/api/core/workflow/variables/exc.py similarity index 100% rename from api/core/variables/exc.py rename to api/core/workflow/variables/exc.py diff --git a/api/core/variables/segment_group.py b/api/core/workflow/variables/segment_group.py similarity index 100% rename from api/core/variables/segment_group.py rename to api/core/workflow/variables/segment_group.py diff --git a/api/core/variables/segments.py b/api/core/workflow/variables/segments.py similarity index 100% rename from api/core/variables/segments.py rename to api/core/workflow/variables/segments.py diff --git a/api/core/variables/types.py b/api/core/workflow/variables/types.py similarity index 100% rename from api/core/variables/types.py rename to api/core/workflow/variables/types.py diff --git a/api/core/variables/utils.py b/api/core/workflow/variables/utils.py similarity index 100% rename from api/core/variables/utils.py rename to api/core/workflow/variables/utils.py diff --git a/api/core/variables/variables.py b/api/core/workflow/variables/variables.py similarity index 95% rename from api/core/variables/variables.py rename to api/core/workflow/variables/variables.py index 338d81df78..af866283da 100644 --- a/api/core/variables/variables.py +++ b/api/core/workflow/variables/variables.py @@ -4,8 +4,6 @@ from uuid import uuid4 from pydantic import BaseModel, Discriminator, Field, Tag -from core.helper import encrypter - from .segments import ( ArrayAnySegment, ArrayBooleanSegment, @@ -27,6 +25,14 @@ from .segments import ( from .types import SegmentType +def _obfuscated_token(token: str) -> str: + if not token: + return token + if len(token) <= 8: + return "*" * 20 + return token[:6] + "*" * 12 + token[-2:] + + class VariableBase(Segment): """ A variable is a segment that has a name. @@ -86,7 +92,7 @@ class SecretVariable(StringVariable): @property def log(self) -> str: - return encrypter.obfuscated_token(self.value) + return _obfuscated_token(self.value) class NoneVariable(NoneSegment, VariableBase): diff --git a/api/core/workflow/workflow_type_encoder.py b/api/core/workflow/workflow_type_encoder.py index 93c6a31960..a192b884f7 100644 --- a/api/core/workflow/workflow_type_encoder.py +++ b/api/core/workflow/workflow_type_encoder.py @@ -4,8 +4,8 @@ from typing import Any, overload from pydantic import BaseModel -from core.variables import Segment from core.workflow.file.models import File +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 c6589dd99f..66d1c977d6 100644 --- a/api/extensions/otel/parser/base.py +++ b/api/extensions/otel/parser/base.py @@ -9,11 +9,11 @@ from opentelemetry.trace import Span from opentelemetry.trace.status import Status, StatusCode from pydantic import BaseModel -from core.variables import Segment from core.workflow.enums import NodeType from core.workflow.file.models import File 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 a7cfb6a65e..b74d9517f4 100644 --- a/api/factories/variable_factory.py +++ b/api/factories/variable_factory.py @@ -3,8 +3,13 @@ from typing import Any, cast from uuid import uuid4 from configs import dify_config -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.file import File +from core.workflow.variables.exc import VariableError +from core.workflow.variables.segments import ( ArrayAnySegment, ArrayBooleanSegment, ArrayFileSegment, @@ -21,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, @@ -39,11 +44,6 @@ from core.variables.variables import ( StringVariable, VariableBase, ) -from core.workflow.constants import ( - CONVERSATION_VARIABLE_NODE_ID, - ENVIRONMENT_VARIABLE_NODE_ID, -) -from core.workflow.file import File 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 c88a48632a..6a86251216 100644 --- a/api/models/workflow.py +++ b/api/models/workflow.py @@ -22,8 +22,6 @@ from sqlalchemy import ( from sqlalchemy.orm import Mapped, declared_attr, mapped_column from typing_extensions import deprecated -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.entities.pause_reason import HumanInputRequired, PauseReason, from core.workflow.enums import NodeType, WorkflowExecutionStatus from core.workflow.file.constants import maybe_file_object from core.workflow.file.models import File +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 4ae3496cd6..c0f9e4f323 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, @@ -52,6 +51,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 edbc7e0cc8..75a1350e60 100644 --- a/api/services/trigger/webhook_service.py +++ b/api/services/trigger/webhook_service.py @@ -16,9 +16,9 @@ from werkzeug.exceptions import RequestEntityTooLarge from configs import dify_config from core.app.entities.app_invoke_entities import InvokeFrom from core.tools.tool_file_manager import ToolFileManager -from core.variables.types import SegmentType from core.workflow.enums import NodeType from core.workflow.file.models import FileTransferMethod +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 056ea4d78a..12be12776a 100644 --- a/api/services/variable_truncator.py +++ b/api/services/variable_truncator.py @@ -6,7 +6,9 @@ from collections.abc import Mapping from typing import Any, Generic, TypeAlias, TypeVar, overload from configs import dify_config -from core.variables.segments import ( +from core.workflow.file.models import File +from core.workflow.nodes.variable_assigner.common.helpers import UpdatedVariable +from core.workflow.variables.segments import ( ArrayFileSegment, ArraySegment, BooleanSegment, @@ -18,9 +20,7 @@ from core.variables.segments import ( Segment, StringSegment, ) -from core.variables.utils import dumps_with_segments -from core.workflow.file.models import File -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 991925ae6b..18ad6c5c16 100644 --- a/api/services/workflow_draft_variable_service.py +++ b/api/services/workflow_draft_variable_service.py @@ -14,20 +14,20 @@ from sqlalchemy.sql.expression import and_, or_ from configs import dify_config from core.app.entities.app_invoke_entities import InvokeFrom -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.file.models import File 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 abcd41b1be..406fdae525 100644 --- a/api/services/workflow_service.py +++ b/api/services/workflow_service.py @@ -15,8 +15,6 @@ from core.app.apps.workflow.app_config_manager import WorkflowAppConfigManager from core.app.entities.app_invoke_entities import InvokeFrom 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 @@ -41,6 +39,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/test_containers_integration_tests/tasks/test_remove_app_and_related_data_task.py b/api/tests/test_containers_integration_tests/tasks/test_remove_app_and_related_data_task.py index 7ac9573ab7..8501a8e39b 100644 --- a/api/tests/test_containers_integration_tests/tasks/test_remove_app_and_related_data_task.py +++ b/api/tests/test_containers_integration_tests/tasks/test_remove_app_and_related_data_task.py @@ -4,8 +4,8 @@ from unittest.mock import ANY, call, patch import pytest from core.db.session_factory import session_factory -from core.variables.segments import StringSegment -from core.variables.types import SegmentType +from core.workflow.variables.segments import StringSegment +from core.workflow.variables.types import SegmentType from libs.datetime_utils import naive_utc_now from models import Tenant from models.enums import CreatorUserRole 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 ec35366d02..6a287dba36 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 f252324a85..5508a117c1 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 @@ -1,8 +1,8 @@ from collections.abc import Mapping, Sequence from core.app.apps.common.workflow_response_converter import WorkflowResponseConverter -from core.variables.segments import ArrayFileSegment, FileSegment from core.workflow.file import FILE_MODEL_IDENTITY, File, FileTransferMethod, FileType +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 bb9e381834..a9af8bea1d 100644 --- a/api/tests/unit_tests/core/variables/test_segment.py +++ b/api/tests/unit_tests/core/variables/test_segment.py @@ -3,7 +3,10 @@ import dataclasses from pydantic import BaseModel from core.helper import encrypter -from core.variables.segments import ( +from core.workflow.file import File, FileTransferMethod, FileType +from core.workflow.runtime import VariablePool +from core.workflow.system_variable import SystemVariable +from core.workflow.variables.segments import ( ArrayAnySegment, ArrayFileSegment, ArrayNumberSegment, @@ -19,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, @@ -35,9 +38,6 @@ from core.variables.variables import ( StringVariable, Variable, ) -from core.workflow.file import File, FileTransferMethod, FileType -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 0ec0fc536e..52e5dd180c 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 @@ -10,8 +10,10 @@ from typing import Any import pytest -from core.variables.segment_group import SegmentGroup -from core.variables.segments import ( +from core.workflow.file.enums import FileTransferMethod, FileType +from core.workflow.file.models import File +from core.workflow.variables.segment_group import SegmentGroup +from core.workflow.variables.segments import ( ArrayFileSegment, BooleanSegment, FileSegment, @@ -20,9 +22,7 @@ from core.variables.segments import ( ObjectSegment, StringSegment, ) -from core.variables.types import ArrayValidation, SegmentType -from core.workflow.file.enums import FileTransferMethod, FileType -from core.workflow.file.models import File +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 e760d7b3d3..6c4178dfed 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 @@ -215,9 +215,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 5c85f2be92..5cbb7cf36e 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 a235a4167c..e505aed323 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 @@ -20,7 +20,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.file import File, FileTransferMethod, FileType from core.workflow.nodes.llm import llm_utils @@ -37,6 +36,7 @@ from core.workflow.nodes.llm.node import LLMNode from core.workflow.nodes.llm.protocols import CredentialsProvider, ModelFactory 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 669f36c100..35c59b92c4 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 @@ -6,9 +6,6 @@ import pytest from docx.oxml.text.paragraph import CT_P from core.app.entities.app_invoke_entities import InvokeFrom -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.file import File, FileTransferMethod @@ -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 930bdbda4a..bc87a64161 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 @@ -6,7 +6,6 @@ import pytest from core.app.entities.app_invoke_entities import InvokeFrom from core.app.workflow.node_factory import DifyNodeFactory -from core.variables import ArrayFileSegment from core.workflow.entities import GraphInitParams from core.workflow.enums import WorkflowNodeExecutionStatus from core.workflow.file import File, FileTransferMethod, FileType @@ -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 66ddc0d3c7..73c17ee45a 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 @@ -3,7 +3,6 @@ from unittest.mock import MagicMock import pytest from core.app.entities.app_invoke_entities import InvokeFrom -from core.variables import ArrayFileSegment from core.workflow.enums import WorkflowNodeExecutionStatus from core.workflow.file import File, FileTransferMethod, FileType from core.workflow.nodes.list_operator.entities import ( @@ -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 526ff72c8c..d945c6bfff 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 @@ -11,12 +11,12 @@ import pytest 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.file import File, FileTransferMethod, FileType 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 8ceaad5cc9..24d3740b99 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 @@ -3,7 +3,6 @@ from unittest.mock import patch import pytest from core.app.entities.app_invoke_entities import InvokeFrom -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.file import File, FileTransferMethod, FileType @@ -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 fb9a893d43..7f2b080498 100644 --- a/api/tests/unit_tests/core/workflow/test_variable_pool.py +++ b/api/tests/unit_tests/core/workflow/test_variable_pool.py @@ -3,8 +3,12 @@ from collections import defaultdict import pytest -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.file import File, FileTransferMethod, FileType +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, @@ -15,7 +19,7 @@ from core.variables.segments import ( NoneSegment, ObjectSegment, ) -from core.variables.variables import ( +from core.workflow.variables.variables import ( ArrayNumberVariable, ArrayObjectVariable, ArrayStringVariable, @@ -25,10 +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.file import File, FileTransferMethod, FileType -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 793b0d4eba..4a71692f1e 100644 --- a/api/tests/unit_tests/core/workflow/test_workflow_entry.py +++ b/api/tests/unit_tests/core/workflow/test_workflow_entry.py @@ -4,7 +4,6 @@ import pytest from configs import dify_config 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 53ae18a61d..87d02cb187 100644 --- a/api/tests/unit_tests/factories/test_variable_factory.py +++ b/api/tests/unit_tests/factories/test_variable_factory.py @@ -7,7 +7,8 @@ import pytest from hypothesis import HealthCheck, given, settings from hypothesis import strategies as st -from core.variables import ( +from core.workflow.file import File, FileTransferMethod, FileType +from core.workflow.variables import ( ArrayNumberVariable, ArrayObjectVariable, ArrayStringVariable, @@ -16,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, @@ -32,8 +33,7 @@ from core.variables.segments import ( Segment, StringSegment, ) -from core.variables.types import SegmentType -from core.workflow.file import File, FileTransferMethod, FileType +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 29f71767d0..544693da34 100644 --- a/api/tests/unit_tests/models/test_workflow.py +++ b/api/tests/unit_tests/models/test_workflow.py @@ -4,10 +4,10 @@ from unittest import mock from uuid import uuid4 from constants import HIDDEN_VALUE -from core.variables import FloatVariable, IntegerVariable, SecretVariable, StringVariable -from core.variables.segments import IntegerSegment, Segment from core.workflow.file.enums import FileTransferMethod, FileType from core.workflow.file.models import File +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 4534e68b4e..8199d586da 100644 --- a/api/tests/unit_tests/services/test_variable_truncator.py +++ b/api/tests/unit_tests/services/test_variable_truncator.py @@ -17,7 +17,9 @@ from uuid import uuid4 import pytest -from core.variables.segments import ( +from core.workflow.file.enums import FileTransferMethod, FileType +from core.workflow.file.models import File +from core.workflow.variables.segments import ( ArrayFileSegment, ArrayNumberSegment, ArraySegment, @@ -28,8 +30,6 @@ from core.variables.segments import ( ObjectSegment, StringSegment, ) -from core.workflow.file.enums import FileTransferMethod, FileType -from core.workflow.file.models import File from services.variable_truncator import ( DummyVariableTruncator, MaxDepthExceededError, 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