refactor(workflow-file): phase2 replace remaining imports and remove core.file

Complete phase 2 of the file module migration by replacing the remaining repository-wide legacy imports and deleting the temporary core.file compatibility package introduced in phase 1.

What this commit changes
- Replace legacy core.file.* imports with core.workflow.file.* across:
  - controllers
  - core app/agent/datasource/prompt/rag/tools/variables
  - factories, fields, libs, models, services
  - otel parser integration points
  - unit and integration tests that referenced legacy paths
- Migrate residual runtime usages in app/task pipeline paths that still referenced core.file symbols.
- Update tests and model serialization helpers that relied on old module paths.
- Remove the compatibility bridge package entirely:
  - delete core/file/__init__.py
  - delete core/file/constants.py
  - delete core/file/enums.py
  - delete core/file/file_manager.py
  - delete core/file/helpers.py
  - delete core/file/models.py
  - delete core/file/tool_file_parser.py

Verification
- No Python references to core.file remain ( -> empty).
- Targeted regression tests for migrated file primitives and factory/type flows passed:
  - tests/unit_tests/core/test_file.py
  - tests/unit_tests/factories/test_variable_factory.py
  - tests/unit_tests/services/test_variable_truncator.py

Result
- The repository now uses core.workflow.file as the single canonical file namespace.
- The migration is fully split into two commits: phase 1 compatibility + phase 2 full cutover.
This commit is contained in:
WH-2099
2026-02-11 15:01:48 +08:00
parent c56d650e83
commit b4c0fb9463
78 changed files with 87 additions and 195 deletions

View File

@ -6,7 +6,7 @@ from uuid import uuid4
import pytest
from sqlalchemy.orm import Session
from core.file import File, FileTransferMethod, FileType
from core.workflow.file import File, FileTransferMethod, FileType
from extensions.ext_database import db
from factories.file_factory import StorageKeyLoader
from models import ToolFile, UploadFile

View File

@ -6,7 +6,7 @@ from uuid import uuid4
import pytest
from sqlalchemy.orm import Session
from core.file import File, FileTransferMethod, FileType
from core.workflow.file import File, FileTransferMethod, FileType
from extensions.ext_database import db
from factories.file_factory import StorageKeyLoader
from models import ToolFile, UploadFile

View File

@ -841,7 +841,7 @@ class TestAgentService:
app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies)
conversation, message = self._create_test_conversation_and_message(db_session_with_containers, app, account)
from core.file import FileTransferMethod, FileType
from core.workflow.file import FileTransferMethod, FileType
from extensions.ext_database import db
from models.enums import CreatorUserRole

View File

@ -310,8 +310,8 @@ def test_workflow_node_variables_fields():
def test_workflow_file_variable_with_signed_url():
"""Test that File type variables include signed URLs in API responses."""
from core.file.enums import FileTransferMethod, FileType
from core.file.models import File
from core.workflow.file.enums import FileTransferMethod, FileType
from core.workflow.file.models import File
# Create a File object with LOCAL_FILE transfer method (which generates signed URLs)
test_file = File(
@ -368,8 +368,8 @@ def test_workflow_file_variable_with_signed_url():
def test_workflow_file_variable_remote_url():
"""Test that File type variables with REMOTE_URL transfer method return the remote URL."""
from core.file.enums import FileTransferMethod, FileType
from core.file.models import File
from core.workflow.file.enums import FileTransferMethod, FileType
from core.workflow.file.models import File
# Create a File object with REMOTE_URL transfer method
test_file = File(

View File

@ -49,8 +49,8 @@ def datasets_document_module(monkeypatch: pytest.MonkeyPatch):
monkeypatch.setattr(wraps, "account_initialization_required", _noop)
# Bypass billing-related decorators used by other endpoints in this module.
monkeypatch.setattr(wraps, "cloud_edition_billing_resource_check", lambda *_args, **_kwargs: (lambda f: f))
monkeypatch.setattr(wraps, "cloud_edition_billing_rate_limit_check", lambda *_args, **_kwargs: (lambda f: f))
monkeypatch.setattr(wraps, "cloud_edition_billing_resource_check", lambda *_args, **_kwargs: lambda f: f)
monkeypatch.setattr(wraps, "cloud_edition_billing_rate_limit_check", lambda *_args, **_kwargs: lambda f: f)
# Avoid Flask-RESTX route registration side effects during import.
def _noop_route(*_args, **_kwargs): # type: ignore[override]

View File

@ -1,6 +1,6 @@
from core.app.app_config.features.file_upload.manager import FileUploadConfigManager
from core.file.models import FileTransferMethod, FileUploadConfig, ImageConfig
from core.model_runtime.entities.message_entities import ImagePromptMessageContent
from core.workflow.file.models import FileTransferMethod, FileUploadConfig, ImageConfig
def test_convert_with_vision():

View File

@ -9,8 +9,8 @@ from core.app.apps.base_app_queue_manager import PublishFrom
from core.app.apps.base_app_runner import AppRunner
from core.app.entities.app_invoke_entities import InvokeFrom
from core.app.entities.queue_entities import QueueMessageFileEvent
from core.file.enums import FileTransferMethod, FileType
from core.model_runtime.entities.message_entities import ImagePromptMessageContent
from core.workflow.file.enums import FileTransferMethod, FileType
from models.enums import CreatorUserRole

View File

@ -1,8 +1,8 @@
from collections.abc import Mapping, Sequence
from core.app.apps.common.workflow_response_converter import WorkflowResponseConverter
from core.file import FILE_MODEL_IDENTITY, File, FileTransferMethod, FileType
from core.variables.segments import ArrayFileSegment, FileSegment
from core.workflow.file import FILE_MODEL_IDENTITY, File, FileTransferMethod, FileType
class TestWorkflowResponseConverterFetchFilesFromVariableValue:

View File

@ -1,4 +1,4 @@
from core.file import File, FileTransferMethod, FileType
from core.workflow.file import File, FileTransferMethod, FileType
def test_file():

View File

@ -4,7 +4,6 @@ import pytest
from configs import dify_config
from core.app.app_config.entities import ModelConfigEntity
from core.file import File, FileTransferMethod, FileType
from core.memory.token_buffer_memory import TokenBufferMemory
from core.model_runtime.entities.message_entities import (
AssistantPromptMessage,
@ -15,6 +14,7 @@ from core.model_runtime.entities.message_entities import (
from core.prompt.advanced_prompt_transform import AdvancedPromptTransform
from core.prompt.entities.advanced_prompt_entities import ChatModelMessage, CompletionModelPromptTemplate, MemoryConfig
from core.prompt.utils.prompt_template_parser import PromptTemplateParser
from core.workflow.file import File, FileTransferMethod, FileType
from models.model import Conversation
@ -142,7 +142,7 @@ def test__get_chat_model_prompt_messages_with_files_no_memory(get_chat_model_arg
prompt_transform = AdvancedPromptTransform()
prompt_transform._calculate_rest_token = MagicMock(return_value=2000)
with patch("core.file.file_manager.to_prompt_message_content") as mock_get_encoded_string:
with patch("core.workflow.file.file_manager.to_prompt_message_content") as mock_get_encoded_string:
mock_get_encoded_string.return_value = ImagePromptMessageContent(
url=str(files[0].remote_url), format="jpg", mime_type="image/jpg"
)

View File

@ -1,6 +1,6 @@
import json
from core.file import File, FileTransferMethod, FileType, FileUploadConfig
from core.workflow.file import File, FileTransferMethod, FileType, FileUploadConfig
from models.workflow import Workflow

View File

@ -2,7 +2,6 @@ import dataclasses
from pydantic import BaseModel
from core.file import File, FileTransferMethod, FileType
from core.helper import encrypter
from core.variables.segments import (
ArrayAnySegment,
@ -36,6 +35,7 @@ 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

View File

@ -10,8 +10,6 @@ from typing import Any
import pytest
from core.file.enums import FileTransferMethod, FileType
from core.file.models import File
from core.variables.segment_group import SegmentGroup
from core.variables.segments import (
ArrayFileSegment,
@ -23,6 +21,8 @@ from core.variables.segments import (
StringSegment,
)
from core.variables.types import ArrayValidation, SegmentType
from core.workflow.file.enums import FileTransferMethod, FileType
from core.workflow.file.models import File
def create_test_file(

View File

@ -7,7 +7,6 @@ import pytest
from hypothesis import HealthCheck, given, settings
from hypothesis import strategies as st
from core.file import File, FileTransferMethod, FileType
from core.variables import (
ArrayNumberVariable,
ArrayObjectVariable,
@ -34,6 +33,7 @@ from core.variables.segments import (
StringSegment,
)
from core.variables.types import SegmentType
from core.workflow.file import File, FileTransferMethod, FileType
from factories import variable_factory
from factories.variable_factory import TypeMismatchError, build_segment, build_segment_with_type

View File

@ -4,10 +4,10 @@ from unittest import mock
from uuid import uuid4
from constants import HIDDEN_VALUE
from core.file.enums import FileTransferMethod, FileType
from core.file.models import File
from core.variables import FloatVariable, IntegerVariable, SecretVariable, StringVariable
from core.variables.segments import IntegerSegment, Segment
from core.workflow.file.enums import FileTransferMethod, FileType
from core.workflow.file.models import File
from factories.variable_factory import build_segment
from models.workflow import Workflow, WorkflowDraftVariable, WorkflowNodeExecutionModel, is_system_variable_editable

View File

@ -17,8 +17,6 @@ from uuid import uuid4
import pytest
from core.file.enums import FileTransferMethod, FileType
from core.file.models import File
from core.variables.segments import (
ArrayFileSegment,
ArrayNumberSegment,
@ -30,6 +28,8 @@ 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,