From a883b74272fc4fb1d662b61496bcc1b9917c68c7 Mon Sep 17 00:00:00 2001 From: Novice Date: Thu, 19 Mar 2026 18:05:55 +0800 Subject: [PATCH] fix: update core.file imports to core.workflow.file after merge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The File class and related modules were moved from core.file to core.workflow.file in the sandboxed-agent branch. This commit updates all remaining references including test mock/patch paths, Switch component defaultValue→value changes, and account setting tab constant updates. Made-with: Cursor --- MERGE_LOG.md | 35 +++++++++++++++++++ api/controllers/cli_api/dify_cli/cli_api.py | 2 +- api/controllers/console/workspace/account.py | 2 +- api/core/agent/agent_app_runner.py | 2 +- api/core/agent/patterns/base.py | 2 +- api/core/agent/patterns/function_call.py | 2 +- api/core/agent/patterns/react.py | 2 +- api/core/agent/patterns/strategy_factory.py | 2 +- .../llm_generator/output_parser/file_ref.py | 2 +- api/core/memory/node_token_buffer_memory.py | 2 +- api/core/sandbox/bash/session.py | 2 +- api/core/workflow/entities/tool_entities.py | 2 +- api/core/workflow/nodes/file_upload/node.py | 2 +- api/core/workflow/nodes/llm/entities.py | 2 +- api/core/workflow/nodes/llm/llm_utils.py | 2 +- .../core/agent/test_agent_app_runner.py | 2 +- .../unit_tests/core/file/test_file_manager.py | 20 +++++------ .../output_parser/test_file_ref.py | 2 +- .../core/workflow/nodes/llm/test_llm_utils.py | 2 +- .../workflow/nodes/test_llm_node_streaming.py | 6 ++-- 20 files changed, 65 insertions(+), 30 deletions(-) create mode 100644 MERGE_LOG.md diff --git a/MERGE_LOG.md b/MERGE_LOG.md new file mode 100644 index 0000000000..6e829f059e --- /dev/null +++ b/MERGE_LOG.md @@ -0,0 +1,35 @@ +# Merge Log: sandboxed-agent-rebase ← main + +## Overview + +| Segment | Target Commit | Commits | Description | Status | +|---------|--------------|---------|-------------|--------| +| 1 | `657eeb65` | 50 | Early changes: deps, Switch组件, 基础重构 | ⏳ | +| 2 | `9c339239` | 129 | Mid refactors: model_runtime 等 | ⬚ | +| 3 | `92bde350` | 56 | dify_graph 大迁移 | ⬚ | +| 4 | `fb41b215` | 165 | Post-backend refactors | ⬚ | +| 5 | `main HEAD` | 103 | Final changes | ⬚ | + +- **Base commit**: `98466e2d` +- **Branch**: `sandboxed-agent-rebase` +- **Total main commits**: 503 + +--- + +## Segment 1: Early Changes (50 commits → `657eeb65`) + +**Started**: + +### Merge Command +```bash +git merge 657eeb65 +``` + +### Conflicts + + +### Resolution + + +### Test Results + diff --git a/api/controllers/cli_api/dify_cli/cli_api.py b/api/controllers/cli_api/dify_cli/cli_api.py index 3f49a8898e..a8bd699edf 100644 --- a/api/controllers/cli_api/dify_cli/cli_api.py +++ b/api/controllers/cli_api/dify_cli/cli_api.py @@ -7,7 +7,7 @@ from controllers.cli_api.dify_cli.wraps import get_cli_user_tenant, plugin_data from controllers.cli_api.wraps import cli_api_only from controllers.console.wraps import setup_required from core.app.entities.app_invoke_entities import InvokeFrom -from core.file.helpers import get_signed_file_url_for_plugin +from core.workflow.file.helpers import get_signed_file_url_for_plugin from core.plugin.backwards_invocation.app import PluginAppBackwardsInvocation from core.plugin.backwards_invocation.base import BaseBackwardsInvocationResponse from core.plugin.backwards_invocation.model import PluginModelBackwardsInvocation diff --git a/api/controllers/console/workspace/account.py b/api/controllers/console/workspace/account.py index 49c6dc78a8..8050a67608 100644 --- a/api/controllers/console/workspace/account.py +++ b/api/controllers/console/workspace/account.py @@ -37,7 +37,7 @@ from controllers.console.wraps import ( only_edition_cloud, setup_required, ) -from core.file import helpers as file_helpers +from core.workflow.file import helpers as file_helpers from extensions.ext_database import db from fields.member_fields import Account as AccountResponse from libs.datetime_utils import naive_utc_now diff --git a/api/core/agent/agent_app_runner.py b/api/core/agent/agent_app_runner.py index 2ee0a23aab..6f3db15341 100644 --- a/api/core/agent/agent_app_runner.py +++ b/api/core/agent/agent_app_runner.py @@ -8,7 +8,7 @@ from core.agent.entities import AgentEntity, AgentLog, AgentResult from core.agent.patterns.strategy_factory import StrategyFactory from core.app.apps.base_app_queue_manager import PublishFrom from core.app.entities.queue_entities import QueueAgentThoughtEvent, QueueMessageEndEvent, QueueMessageFileEvent -from core.file import file_manager +from core.workflow.file import file_manager from core.model_runtime.entities import ( AssistantPromptMessage, LLMResult, diff --git a/api/core/agent/patterns/base.py b/api/core/agent/patterns/base.py index 33a746ce5a..37680abf1e 100644 --- a/api/core/agent/patterns/base.py +++ b/api/core/agent/patterns/base.py @@ -10,7 +10,7 @@ from collections.abc import Callable, Generator from typing import TYPE_CHECKING, Any from core.agent.entities import AgentLog, AgentResult, ExecutionContext -from core.file import File +from core.workflow.file import File from core.model_manager import ModelInstance from core.model_runtime.entities import ( AssistantPromptMessage, diff --git a/api/core/agent/patterns/function_call.py b/api/core/agent/patterns/function_call.py index 391b23e17c..2bb5d21544 100644 --- a/api/core/agent/patterns/function_call.py +++ b/api/core/agent/patterns/function_call.py @@ -12,7 +12,7 @@ from collections.abc import Generator from typing import Any, Union from core.agent.entities import AgentLog, AgentResult -from core.file import File +from core.workflow.file import File from core.model_runtime.entities import ( AssistantPromptMessage, LLMResult, diff --git a/api/core/agent/patterns/react.py b/api/core/agent/patterns/react.py index 87a9fa9b65..010ac40b29 100644 --- a/api/core/agent/patterns/react.py +++ b/api/core/agent/patterns/react.py @@ -8,7 +8,7 @@ from typing import TYPE_CHECKING, Any, Union from core.agent.entities import AgentLog, AgentResult, AgentScratchpadUnit, ExecutionContext from core.agent.output_parser.cot_output_parser import CotAgentOutputParser -from core.file import File +from core.workflow.file import File from core.model_manager import ModelInstance from core.model_runtime.entities import ( AssistantPromptMessage, diff --git a/api/core/agent/patterns/strategy_factory.py b/api/core/agent/patterns/strategy_factory.py index 2ec845c9b0..47cd12888c 100644 --- a/api/core/agent/patterns/strategy_factory.py +++ b/api/core/agent/patterns/strategy_factory.py @@ -5,7 +5,7 @@ from __future__ import annotations from typing import TYPE_CHECKING from core.agent.entities import AgentEntity, ExecutionContext -from core.file.models import File +from core.workflow.file.models import File from core.model_manager import ModelInstance from core.model_runtime.entities.model_entities import ModelFeature diff --git a/api/core/llm_generator/output_parser/file_ref.py b/api/core/llm_generator/output_parser/file_ref.py index 25872c7110..b21cabd492 100644 --- a/api/core/llm_generator/output_parser/file_ref.py +++ b/api/core/llm_generator/output_parser/file_ref.py @@ -10,7 +10,7 @@ This module provides utilities to: from collections.abc import Callable, Mapping, Sequence from typing import Any, cast -from core.file import File +from core.workflow.file import File from core.variables.segments import ArrayFileSegment, FileSegment FILE_PATH_FORMAT = "file-path" diff --git a/api/core/memory/node_token_buffer_memory.py b/api/core/memory/node_token_buffer_memory.py index ec6b04b13e..d6dd6402a6 100644 --- a/api/core/memory/node_token_buffer_memory.py +++ b/api/core/memory/node_token_buffer_memory.py @@ -20,7 +20,7 @@ from typing import cast from sqlalchemy import select from sqlalchemy.orm import Session -from core.file import file_manager +from core.workflow.file import file_manager from core.memory.base import BaseMemory from core.model_manager import ModelInstance from core.model_runtime.entities import ( diff --git a/api/core/sandbox/bash/session.py b/api/core/sandbox/bash/session.py index 4ff03eb7b6..9c14ba27c2 100644 --- a/api/core/sandbox/bash/session.py +++ b/api/core/sandbox/bash/session.py @@ -7,7 +7,7 @@ import os import shlex from types import TracebackType -from core.file import File, FileTransferMethod, FileType +from core.workflow.file import File, FileTransferMethod, FileType from core.sandbox.sandbox import Sandbox from core.session.cli_api import CliApiSession, CliApiSessionManager, CliContext from core.skill.entities import ToolAccessPolicy diff --git a/api/core/workflow/entities/tool_entities.py b/api/core/workflow/entities/tool_entities.py index eb5d4baca5..f67bc63769 100644 --- a/api/core/workflow/entities/tool_entities.py +++ b/api/core/workflow/entities/tool_entities.py @@ -3,7 +3,7 @@ from typing import Any from pydantic import BaseModel, Field -from core.file import File +from core.workflow.file import File class ToolResultStatus(StrEnum): diff --git a/api/core/workflow/nodes/file_upload/node.py b/api/core/workflow/nodes/file_upload/node.py index ae5a4eb8b9..669bdc8b56 100644 --- a/api/core/workflow/nodes/file_upload/node.py +++ b/api/core/workflow/nodes/file_upload/node.py @@ -5,7 +5,7 @@ from collections.abc import Mapping, Sequence from pathlib import PurePosixPath from typing import Any, cast -from core.file import File, FileTransferMethod +from core.workflow.file import File, FileTransferMethod from core.sandbox.bash.session import SANDBOX_READY_TIMEOUT from core.variables import ArrayFileSegment from core.variables.segments import ArrayStringSegment, FileSegment diff --git a/api/core/workflow/nodes/llm/entities.py b/api/core/workflow/nodes/llm/entities.py index f86dcd9d95..aa9d87b0f4 100644 --- a/api/core/workflow/nodes/llm/entities.py +++ b/api/core/workflow/nodes/llm/entities.py @@ -5,7 +5,7 @@ from typing import Annotated, Any, Literal, TypeAlias from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_validator from core.agent.entities import AgentLog, AgentResult -from core.file import File +from core.workflow.file import File from core.model_runtime.entities import ImagePromptMessageContent, LLMMode from core.model_runtime.entities.llm_entities import LLMUsage from core.prompt.entities.advanced_prompt_entities import ChatModelMessage, CompletionModelPromptTemplate, MemoryConfig diff --git a/api/core/workflow/nodes/llm/llm_utils.py b/api/core/workflow/nodes/llm/llm_utils.py index f086118616..68cd76729a 100644 --- a/api/core/workflow/nodes/llm/llm_utils.py +++ b/api/core/workflow/nodes/llm/llm_utils.py @@ -388,7 +388,7 @@ def restore_multimodal_content_in_messages(messages: Sequence[PromptMessage]) -> Returns: List of PromptMessages with restored multimodal content """ - from core.file import file_manager + from core.workflow.file import file_manager return [_restore_message_content(msg, file_manager) for msg in messages] diff --git a/api/tests/unit_tests/core/agent/test_agent_app_runner.py b/api/tests/unit_tests/core/agent/test_agent_app_runner.py index df78c8b79e..06584fa986 100644 --- a/api/tests/unit_tests/core/agent/test_agent_app_runner.py +++ b/api/tests/unit_tests/core/agent/test_agent_app_runner.py @@ -365,7 +365,7 @@ class TestOrganizeUserQuery: def test_query_with_files(self, mock_runner): """Test organizing a query with files.""" - from core.file.models import File + from core.workflow.file.models import File mock_file = MagicMock(spec=File) mock_runner.files = [mock_file] diff --git a/api/tests/unit_tests/core/file/test_file_manager.py b/api/tests/unit_tests/core/file/test_file_manager.py index 018bdee4d7..8b0fab2b78 100644 --- a/api/tests/unit_tests/core/file/test_file_manager.py +++ b/api/tests/unit_tests/core/file/test_file_manager.py @@ -2,8 +2,8 @@ from unittest.mock import patch -from core.file import File, FileTransferMethod, FileType -from core.file.file_manager import ( +from core.workflow.file import File, FileTransferMethod, FileType +from core.workflow.file.file_manager import ( _encode_file_ref, restore_multimodal_content, to_prompt_message_content, @@ -51,8 +51,8 @@ class TestEncodeFileRef: class TestToPromptMessageContent: """Tests for to_prompt_message_content function with file_ref field.""" - @patch("core.file.file_manager.dify_config") - @patch("core.file.file_manager._get_encoded_string") + @patch("core.workflow.file.file_manager.dify_config") + @patch("core.workflow.file.file_manager._get_encoded_string") def test_includes_file_ref(self, mock_get_encoded, mock_config): """Generated content should include file_ref field.""" mock_config.MULTIMODAL_SEND_FORMAT = "base64" @@ -120,9 +120,9 @@ class TestRestoreMultimodalContent: assert result.url == "https://example.com/image.png" - @patch("core.file.file_manager.dify_config") - @patch("core.file.file_manager._build_file_from_ref") - @patch("core.file.file_manager._to_url") + @patch("core.workflow.file.file_manager.dify_config") + @patch("core.workflow.file.file_manager._build_file_from_ref") + @patch("core.workflow.file.file_manager._to_url") def test_restores_url_from_file_ref(self, mock_to_url, mock_build_file, mock_config): """Content should be restored from file_ref when url is empty (url mode).""" mock_config.MULTIMODAL_SEND_FORMAT = "url" @@ -143,9 +143,9 @@ class TestRestoreMultimodalContent: assert result.url == "https://restored-url.com/image.png" mock_build_file.assert_called_once() - @patch("core.file.file_manager.dify_config") - @patch("core.file.file_manager._build_file_from_ref") - @patch("core.file.file_manager._get_encoded_string") + @patch("core.workflow.file.file_manager.dify_config") + @patch("core.workflow.file.file_manager._build_file_from_ref") + @patch("core.workflow.file.file_manager._get_encoded_string") def test_restores_base64_from_file_ref(self, mock_get_encoded, mock_build_file, mock_config): """Content should be restored as base64 when in base64 mode.""" mock_config.MULTIMODAL_SEND_FORMAT = "base64" diff --git a/api/tests/unit_tests/core/llm_generator/output_parser/test_file_ref.py b/api/tests/unit_tests/core/llm_generator/output_parser/test_file_ref.py index df5e90bf7a..785c68ab94 100644 --- a/api/tests/unit_tests/core/llm_generator/output_parser/test_file_ref.py +++ b/api/tests/unit_tests/core/llm_generator/output_parser/test_file_ref.py @@ -4,7 +4,7 @@ Unit tests for sandbox file path detection and conversion. import pytest -from core.file import File, FileTransferMethod, FileType +from core.workflow.file import File, FileTransferMethod, FileType from core.llm_generator.output_parser.file_ref import ( FILE_PATH_DESCRIPTION_SUFFIX, FILE_PATH_FORMAT, diff --git a/api/tests/unit_tests/core/workflow/nodes/llm/test_llm_utils.py b/api/tests/unit_tests/core/workflow/nodes/llm/test_llm_utils.py index b97729f36f..1de5d9532c 100644 --- a/api/tests/unit_tests/core/workflow/nodes/llm/test_llm_utils.py +++ b/api/tests/unit_tests/core/workflow/nodes/llm/test_llm_utils.py @@ -318,7 +318,7 @@ class TestBuildContext: class TestRestoreMultimodalContentInMessages: """Tests for restore_multimodal_content_in_messages function.""" - @patch("core.file.file_manager.restore_multimodal_content") + @patch("core.workflow.file.file_manager.restore_multimodal_content") def test_restores_multimodal_content(self, mock_restore): """Should restore multimodal content in messages.""" # Setup mock diff --git a/api/tests/unit_tests/core/workflow/nodes/test_llm_node_streaming.py b/api/tests/unit_tests/core/workflow/nodes/test_llm_node_streaming.py index 9d793f804f..ddc9fe99b7 100644 --- a/api/tests/unit_tests/core/workflow/nodes/test_llm_node_streaming.py +++ b/api/tests/unit_tests/core/workflow/nodes/test_llm_node_streaming.py @@ -109,9 +109,9 @@ def test_stream_llm_events_no_reasoning_results_in_empty_sequence(): def test_serialize_tool_call_strips_files_to_ids(): - file_cls = pytest.importorskip("core.file").File - file_type = pytest.importorskip("core.file.enums").FileType - transfer_method = pytest.importorskip("core.file.enums").FileTransferMethod + file_cls = pytest.importorskip("core.workflow.file").File + file_type = pytest.importorskip("core.workflow.file.enums").FileType + transfer_method = pytest.importorskip("core.workflow.file.enums").FileTransferMethod file_with_id = file_cls( id="f1",