diff --git a/api/core/app/apps/advanced_chat/app_generator.py b/api/core/app/apps/advanced_chat/app_generator.py index 6079b51daa..fd0d7fafbd 100644 --- a/api/core/app/apps/advanced_chat/app_generator.py +++ b/api/core/app/apps/advanced_chat/app_generator.py @@ -25,8 +25,8 @@ from core.app.entities.task_entities import ChatbotAppBlockingResponse, ChatbotA from core.model_runtime.errors.invoke import InvokeAuthorizationError from core.ops.ops_trace_manager import TraceQueueManager from core.prompt.utils.get_thread_messages_length import get_thread_messages_length -from core.repository import RepositoryFactory -from core.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository +from core.workflow.repository import RepositoryFactory +from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from extensions.ext_database import db from factories import file_factory from models.account import Account diff --git a/api/core/app/apps/advanced_chat/generate_task_pipeline.py b/api/core/app/apps/advanced_chat/generate_task_pipeline.py index 43ccaea9c0..1f4db54a9c 100644 --- a/api/core/app/apps/advanced_chat/generate_task_pipeline.py +++ b/api/core/app/apps/advanced_chat/generate_task_pipeline.py @@ -62,10 +62,10 @@ from core.app.task_pipeline.workflow_cycle_manage import WorkflowCycleManage from core.model_runtime.entities.llm_entities import LLMUsage from core.model_runtime.utils.encoders import jsonable_encoder from core.ops.ops_trace_manager import TraceQueueManager -from core.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from core.workflow.enums import SystemVariableKey from core.workflow.graph_engine.entities.graph_runtime_state import GraphRuntimeState from core.workflow.nodes import NodeType +from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from events.message_event import message_was_created from extensions.ext_database import db from models import Conversation, EndUser, Message, MessageFile diff --git a/api/core/app/apps/workflow/app_generator.py b/api/core/app/apps/workflow/app_generator.py index 6be3a7331d..9c3d78a338 100644 --- a/api/core/app/apps/workflow/app_generator.py +++ b/api/core/app/apps/workflow/app_generator.py @@ -23,8 +23,8 @@ from core.app.entities.app_invoke_entities import InvokeFrom, WorkflowAppGenerat from core.app.entities.task_entities import WorkflowAppBlockingResponse, WorkflowAppStreamResponse from core.model_runtime.errors.invoke import InvokeAuthorizationError from core.ops.ops_trace_manager import TraceQueueManager -from core.repository import RepositoryFactory -from core.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository +from core.workflow.repository import RepositoryFactory +from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from extensions.ext_database import db from factories import file_factory from models import Account, App, EndUser, Workflow diff --git a/api/core/app/apps/workflow/generate_task_pipeline.py b/api/core/app/apps/workflow/generate_task_pipeline.py index 68131a7463..67cad9c998 100644 --- a/api/core/app/apps/workflow/generate_task_pipeline.py +++ b/api/core/app/apps/workflow/generate_task_pipeline.py @@ -54,8 +54,8 @@ from core.app.entities.task_entities import ( from core.app.task_pipeline.based_generate_task_pipeline import BasedGenerateTaskPipeline from core.app.task_pipeline.workflow_cycle_manage import WorkflowCycleManage from core.ops.ops_trace_manager import TraceQueueManager -from core.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from core.workflow.enums import SystemVariableKey +from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from extensions.ext_database import db from models.account import Account from models.enums import CreatedByRole diff --git a/api/core/app/task_pipeline/workflow_cycle_manage.py b/api/core/app/task_pipeline/workflow_cycle_manage.py index 38e7c9eb12..d720eff73d 100644 --- a/api/core/app/task_pipeline/workflow_cycle_manage.py +++ b/api/core/app/task_pipeline/workflow_cycle_manage.py @@ -49,12 +49,12 @@ from core.file import FILE_MODEL_IDENTITY, File from core.model_runtime.utils.encoders import jsonable_encoder from core.ops.entities.trace_entity import TraceTaskName from core.ops.ops_trace_manager import TraceQueueManager, TraceTask -from core.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from core.tools.tool_manager import ToolManager from core.workflow.entities.node_entities import NodeRunMetadataKey from core.workflow.enums import SystemVariableKey from core.workflow.nodes import NodeType from core.workflow.nodes.tool.entities import ToolNodeData +from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository from core.workflow.workflow_entry import WorkflowEntry from models.account import Account from models.enums import CreatedByRole, WorkflowRunTriggeredFrom diff --git a/api/core/ops/langfuse_trace/langfuse_trace.py b/api/core/ops/langfuse_trace/langfuse_trace.py index fa78b7b8e9..b229d244f7 100644 --- a/api/core/ops/langfuse_trace/langfuse_trace.py +++ b/api/core/ops/langfuse_trace/langfuse_trace.py @@ -29,7 +29,7 @@ from core.ops.langfuse_trace.entities.langfuse_trace_entity import ( UnitEnum, ) from core.ops.utils import filter_none_values -from core.repository.repository_factory import RepositoryFactory +from core.workflow.repository.repository_factory import RepositoryFactory from extensions.ext_database import db from models.model import EndUser diff --git a/api/core/ops/langsmith_trace/langsmith_trace.py b/api/core/ops/langsmith_trace/langsmith_trace.py index 85a0eafdc1..78a51ff36e 100644 --- a/api/core/ops/langsmith_trace/langsmith_trace.py +++ b/api/core/ops/langsmith_trace/langsmith_trace.py @@ -28,7 +28,7 @@ from core.ops.langsmith_trace.entities.langsmith_trace_entity import ( LangSmithRunUpdateModel, ) from core.ops.utils import filter_none_values, generate_dotted_order -from core.repository.repository_factory import RepositoryFactory +from core.workflow.repository.repository_factory import RepositoryFactory from extensions.ext_database import db from models.model import EndUser, MessageFile diff --git a/api/core/ops/opik_trace/opik_trace.py b/api/core/ops/opik_trace/opik_trace.py index 923b9a24ed..a14b5afb8e 100644 --- a/api/core/ops/opik_trace/opik_trace.py +++ b/api/core/ops/opik_trace/opik_trace.py @@ -22,7 +22,7 @@ from core.ops.entities.trace_entity import ( TraceTaskName, WorkflowTraceInfo, ) -from core.repository.repository_factory import RepositoryFactory +from core.workflow.repository.repository_factory import RepositoryFactory from extensions.ext_database import db from models.model import EndUser, MessageFile diff --git a/api/repositories/__init__.py b/api/core/repositories/__init__.py similarity index 72% rename from api/repositories/__init__.py rename to api/core/repositories/__init__.py index 4cc339688b..5c70d50cde 100644 --- a/api/repositories/__init__.py +++ b/api/core/repositories/__init__.py @@ -2,5 +2,5 @@ Repository implementations for data access. This package contains concrete implementations of the repository interfaces -defined in the core.repository package. +defined in the core.workflow.repository package. """ diff --git a/api/repositories/repository_registry.py b/api/core/repositories/repository_registry.py similarity index 95% rename from api/repositories/repository_registry.py rename to api/core/repositories/repository_registry.py index aa0a208d8e..b66f3ba8e6 100644 --- a/api/repositories/repository_registry.py +++ b/api/core/repositories/repository_registry.py @@ -11,9 +11,9 @@ from typing import Any from sqlalchemy.orm import sessionmaker from configs import dify_config -from core.repository.repository_factory import RepositoryFactory +from core.repositories.workflow_node_execution import SQLAlchemyWorkflowNodeExecutionRepository +from core.workflow.repository.repository_factory import RepositoryFactory from extensions.ext_database import db -from repositories.workflow_node_execution import SQLAlchemyWorkflowNodeExecutionRepository logger = logging.getLogger(__name__) diff --git a/api/repositories/workflow_node_execution/__init__.py b/api/core/repositories/workflow_node_execution/__init__.py similarity index 51% rename from api/repositories/workflow_node_execution/__init__.py rename to api/core/repositories/workflow_node_execution/__init__.py index eed827bd05..76e8282b7d 100644 --- a/api/repositories/workflow_node_execution/__init__.py +++ b/api/core/repositories/workflow_node_execution/__init__.py @@ -2,7 +2,7 @@ WorkflowNodeExecution repository implementations. """ -from repositories.workflow_node_execution.sqlalchemy_repository import SQLAlchemyWorkflowNodeExecutionRepository +from core.repositories.workflow_node_execution.sqlalchemy_repository import SQLAlchemyWorkflowNodeExecutionRepository __all__ = [ "SQLAlchemyWorkflowNodeExecutionRepository", diff --git a/api/repositories/workflow_node_execution/sqlalchemy_repository.py b/api/core/repositories/workflow_node_execution/sqlalchemy_repository.py similarity index 98% rename from api/repositories/workflow_node_execution/sqlalchemy_repository.py rename to api/core/repositories/workflow_node_execution/sqlalchemy_repository.py index e0ad384be6..b1d37163a4 100644 --- a/api/repositories/workflow_node_execution/sqlalchemy_repository.py +++ b/api/core/repositories/workflow_node_execution/sqlalchemy_repository.py @@ -10,7 +10,7 @@ from sqlalchemy import UnaryExpression, asc, delete, desc, select from sqlalchemy.engine import Engine from sqlalchemy.orm import sessionmaker -from core.repository.workflow_node_execution_repository import OrderConfig +from core.workflow.repository.workflow_node_execution_repository import OrderConfig from models.workflow import WorkflowNodeExecution, WorkflowNodeExecutionStatus, WorkflowNodeExecutionTriggeredFrom logger = logging.getLogger(__name__) diff --git a/api/core/repository/__init__.py b/api/core/workflow/repository/__init__.py similarity index 61% rename from api/core/repository/__init__.py rename to api/core/workflow/repository/__init__.py index 253df1251d..d91506e72f 100644 --- a/api/core/repository/__init__.py +++ b/api/core/workflow/repository/__init__.py @@ -6,8 +6,8 @@ for accessing and manipulating data, regardless of the underlying storage mechanism. """ -from core.repository.repository_factory import RepositoryFactory -from core.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository +from core.workflow.repository.repository_factory import RepositoryFactory +from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository __all__ = [ "RepositoryFactory", diff --git a/api/core/repository/repository_factory.py b/api/core/workflow/repository/repository_factory.py similarity index 97% rename from api/core/repository/repository_factory.py rename to api/core/workflow/repository/repository_factory.py index 7da7e49055..45d6f5d842 100644 --- a/api/core/repository/repository_factory.py +++ b/api/core/workflow/repository/repository_factory.py @@ -8,7 +8,7 @@ It does not contain any implementation details or dependencies on specific repos from collections.abc import Callable, Mapping from typing import Any, Literal, Optional, cast -from core.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository +from core.workflow.repository.workflow_node_execution_repository import WorkflowNodeExecutionRepository # Type for factory functions - takes a dict of parameters and returns any repository type RepositoryFactoryFunc = Callable[[Mapping[str, Any]], Any] diff --git a/api/core/repository/workflow_node_execution_repository.py b/api/core/workflow/repository/workflow_node_execution_repository.py similarity index 100% rename from api/core/repository/workflow_node_execution_repository.py rename to api/core/workflow/repository/workflow_node_execution_repository.py diff --git a/api/extensions/ext_repositories.py b/api/extensions/ext_repositories.py index 27d8408ec1..b8cfea121b 100644 --- a/api/extensions/ext_repositories.py +++ b/api/extensions/ext_repositories.py @@ -4,8 +4,8 @@ Extension for initializing repositories. This extension registers repository implementations with the RepositoryFactory. """ +from core.repositories.repository_registry import register_repositories from dify_app import DifyApp -from repositories.repository_registry import register_repositories def init_app(_app: DifyApp) -> None: diff --git a/api/services/workflow_run_service.py b/api/services/workflow_run_service.py index 8b7213eefb..f7c4f500a8 100644 --- a/api/services/workflow_run_service.py +++ b/api/services/workflow_run_service.py @@ -2,8 +2,8 @@ import threading from typing import Optional import contexts -from core.repository import RepositoryFactory -from core.repository.workflow_node_execution_repository import OrderConfig +from core.workflow.repository import RepositoryFactory +from core.workflow.repository.workflow_node_execution_repository import OrderConfig from extensions.ext_database import db from libs.infinite_scroll_pagination import InfiniteScrollPagination from models.enums import WorkflowRunTriggeredFrom diff --git a/api/services/workflow_service.py b/api/services/workflow_service.py index 63e3791147..ebe65e5d5f 100644 --- a/api/services/workflow_service.py +++ b/api/services/workflow_service.py @@ -11,7 +11,6 @@ from sqlalchemy.orm import Session from core.app.apps.advanced_chat.app_config_manager import AdvancedChatAppConfigManager from core.app.apps.workflow.app_config_manager import WorkflowAppConfigManager from core.model_runtime.utils.encoders import jsonable_encoder -from core.repository import RepositoryFactory from core.variables import Variable from core.workflow.entities.node_entities import NodeRunResult from core.workflow.errors import WorkflowNodeRunFailedError @@ -22,6 +21,7 @@ from core.workflow.nodes.enums import ErrorStrategy from core.workflow.nodes.event import RunCompletedEvent from core.workflow.nodes.event.types import NodeEvent from core.workflow.nodes.node_mapping import LATEST_VERSION, NODE_TYPE_CLASSES_MAPPING +from core.workflow.repository import RepositoryFactory from core.workflow.workflow_entry import WorkflowEntry from events.app_event import app_draft_workflow_was_synced, app_published_workflow_was_updated from extensions.ext_database import db diff --git a/api/tasks/remove_app_and_related_data_task.py b/api/tasks/remove_app_and_related_data_task.py index cd8981abf6..dedf1c5334 100644 --- a/api/tasks/remove_app_and_related_data_task.py +++ b/api/tasks/remove_app_and_related_data_task.py @@ -7,7 +7,7 @@ from celery import shared_task # type: ignore from sqlalchemy import delete from sqlalchemy.exc import SQLAlchemyError -from core.repository import RepositoryFactory +from core.workflow.repository import RepositoryFactory from extensions.ext_database import db from models.dataset import AppDatasetJoin from models.model import ( diff --git a/api/tests/unit_tests/repositories/workflow_node_execution/test_sqlalchemy_repository.py b/api/tests/unit_tests/repositories/workflow_node_execution/test_sqlalchemy_repository.py index 36847f8a13..c16b453cba 100644 --- a/api/tests/unit_tests/repositories/workflow_node_execution/test_sqlalchemy_repository.py +++ b/api/tests/unit_tests/repositories/workflow_node_execution/test_sqlalchemy_repository.py @@ -8,9 +8,9 @@ import pytest from pytest_mock import MockerFixture from sqlalchemy.orm import Session, sessionmaker -from core.repository.workflow_node_execution_repository import OrderConfig +from core.repositories.workflow_node_execution.sqlalchemy_repository import SQLAlchemyWorkflowNodeExecutionRepository +from core.workflow.repository.workflow_node_execution_repository import OrderConfig from models.workflow import WorkflowNodeExecution -from repositories.workflow_node_execution.sqlalchemy_repository import SQLAlchemyWorkflowNodeExecutionRepository @pytest.fixture @@ -80,7 +80,7 @@ def test_get_by_node_execution_id(repository, session, mocker: MockerFixture): """Test get_by_node_execution_id method.""" session_obj, _ = session # Set up mock - mock_select = mocker.patch("repositories.workflow_node_execution.sqlalchemy_repository.select") + mock_select = mocker.patch("core.repositories.workflow_node_execution.sqlalchemy_repository.select") mock_stmt = mocker.MagicMock() mock_select.return_value = mock_stmt mock_stmt.where.return_value = mock_stmt @@ -99,7 +99,7 @@ def test_get_by_workflow_run(repository, session, mocker: MockerFixture): """Test get_by_workflow_run method.""" session_obj, _ = session # Set up mock - mock_select = mocker.patch("repositories.workflow_node_execution.sqlalchemy_repository.select") + mock_select = mocker.patch("core.repositories.workflow_node_execution.sqlalchemy_repository.select") mock_stmt = mocker.MagicMock() mock_select.return_value = mock_stmt mock_stmt.where.return_value = mock_stmt @@ -120,7 +120,7 @@ def test_get_running_executions(repository, session, mocker: MockerFixture): """Test get_running_executions method.""" session_obj, _ = session # Set up mock - mock_select = mocker.patch("repositories.workflow_node_execution.sqlalchemy_repository.select") + mock_select = mocker.patch("core.repositories.workflow_node_execution.sqlalchemy_repository.select") mock_stmt = mocker.MagicMock() mock_select.return_value = mock_stmt mock_stmt.where.return_value = mock_stmt @@ -158,7 +158,7 @@ def test_clear(repository, session, mocker: MockerFixture): """Test clear method.""" session_obj, _ = session # Set up mock - mock_delete = mocker.patch("repositories.workflow_node_execution.sqlalchemy_repository.delete") + mock_delete = mocker.patch("core.repositories.workflow_node_execution.sqlalchemy_repository.delete") mock_stmt = mocker.MagicMock() mock_delete.return_value = mock_stmt mock_stmt.where.return_value = mock_stmt