diff --git a/api/core/app/apps/agent_chat/app_runner.py b/api/core/app/apps/agent_chat/app_runner.py index 600010faf3..c277e4c455 100644 --- a/api/core/app/apps/agent_chat/app_runner.py +++ b/api/core/app/apps/agent_chat/app_runner.py @@ -189,7 +189,6 @@ class AgentChatAppRunner(AppRunner): message_result = db.session.scalar(msg_stmt) if message_result is None: raise ValueError("Message not found") - db.session.close() runner = AgentAppRunner( tenant_id=app_config.tenant_id, diff --git a/api/dify_graph/nodes/agent/agent_node.py b/api/dify_graph/nodes/agent/agent_node.py index d9f439036e..07f469a79f 100644 --- a/api/dify_graph/nodes/agent/agent_node.py +++ b/api/dify_graph/nodes/agent/agent_node.py @@ -16,7 +16,7 @@ from core.memory.node_token_buffer_memory import NodeTokenBufferMemory from core.memory.token_buffer_memory import TokenBufferMemory from core.model_manager import ModelInstance, ModelManager from core.prompt.entities.advanced_prompt_entities import MemoryMode -from core.provider_manager import ProviderManager +from core.plugin.impl.model_runtime_factory import create_plugin_provider_manager from core.tools.entities.tool_entities import ( ToolIdentity, ToolInvokeMessage, @@ -63,9 +63,12 @@ from graphon.nodes.base.node import Node from graphon.nodes.base.variable_template_parser import VariableTemplateParser from graphon.runtime import VariablePool from graphon.variables.segments import ArrayFileSegment, StringSegment +from core.app.file_access.controller import DatabaseFileAccessController from extensions.ext_database import db from factories import file_factory from factories.agent_factory import get_plugin_agent_strategy + +_file_access_controller = DatabaseFileAccessController() from models import ToolFile from models.model import Conversation from services.tools.builtin_tools_manage_service import BuiltinToolManageService @@ -303,6 +306,7 @@ class AgentNode(Node[AgentNodeData]): dify_ctx.tenant_id, dify_ctx.app_id, entity, + dify_ctx.user_id, dify_ctx.invoke_from, runtime_variable_pool, ) @@ -428,7 +432,7 @@ class AgentNode(Node[AgentNodeData]): icon = None return icon - def _fetch_memory(self, model_instance: ModelInstance) -> BaseMemory | None: + def _fetch_memory(self, model_instance: ModelInstance) -> BaseMemory | TokenBufferMemory | None: """ Fetch memory based on configuration mode. @@ -470,7 +474,9 @@ class AgentNode(Node[AgentNodeData]): def _fetch_model(self, value: dict[str, Any]) -> tuple[ModelInstance, AIModelEntity | None]: dify_ctx = self.require_dify_context() - provider_manager = ProviderManager() + provider_manager = create_plugin_provider_manager( + tenant_id=dify_ctx.tenant_id, user_id=dify_ctx.user_id + ) provider_model_bundle = provider_manager.get_provider_model_bundle( tenant_id=dify_ctx.tenant_id, provider=value.get("provider", ""), model_type=ModelType.LLM ) @@ -480,7 +486,7 @@ class AgentNode(Node[AgentNodeData]): ) provider_name = provider_model_bundle.configuration.provider.provider model_type_instance = provider_model_bundle.model_type_instance - model_instance = ModelManager().get_model_instance( + model_instance = ModelManager(provider_manager).get_model_instance( tenant_id=dify_ctx.tenant_id, provider=provider_name, model_type=ModelType(value.get("model_type", "")), @@ -516,7 +522,6 @@ class AgentNode(Node[AgentNodeData]): Fetch memory instance for saving node memory. This is a simplified version that doesn't require model_instance. """ - from core.model_manager import ModelManager from graphon.model_runtime.entities.model_entities import ModelType node_data = self.node_data @@ -531,10 +536,9 @@ class AgentNode(Node[AgentNodeData]): # Return appropriate memory type based on mode if node_data.memory.mode == MemoryMode.NODE: - # For node memory, we need a model_instance for token counting - # Use a simple default model for this purpose try: - model_instance = ModelManager().get_default_model_instance( + provider_manager = create_plugin_provider_manager(tenant_id=self.tenant_id) + model_instance = ModelManager(provider_manager).get_default_model_instance( tenant_id=self.tenant_id, model_type=ModelType.LLM, ) @@ -706,6 +710,7 @@ class AgentNode(Node[AgentNodeData]): file = file_factory.build_from_mapping( mapping=mapping, tenant_id=tenant_id, + access_controller=_file_access_controller, ) files.append(file) elif message.type == ToolInvokeMessage.MessageType.BLOB: @@ -729,6 +734,7 @@ class AgentNode(Node[AgentNodeData]): file_factory.build_from_mapping( mapping=mapping, tenant_id=tenant_id, + access_controller=_file_access_controller, ) ) elif message.type == ToolInvokeMessage.MessageType.TEXT: diff --git a/api/migrations/versions/2026_02_09_1726-227822d22895_add_workflow_comments_table.py b/api/migrations/versions/2026_02_09_1726-227822d22895_add_workflow_comments_table.py index af5e04a0e8..cdb9c68a26 100644 --- a/api/migrations/versions/2026_02_09_1726-227822d22895_add_workflow_comments_table.py +++ b/api/migrations/versions/2026_02_09_1726-227822d22895_add_workflow_comments_table.py @@ -1,7 +1,7 @@ """Add workflow comments table Revision ID: 227822d22895 -Revises: aab323465866 +Revises: 6b5f9f8b1a2c Create Date: 2026-02-09 17:26:15.255980 """ @@ -13,7 +13,7 @@ import sqlalchemy as sa # revision identifiers, used by Alembic. revision = "227822d22895" -down_revision = "aab323465866" +down_revision = "6b5f9f8b1a2c" branch_labels = None depends_on = None diff --git a/api/tests/test_containers_integration_tests/services/test_app_generate_service.py b/api/tests/test_containers_integration_tests/services/test_app_generate_service.py index 5b1a4790f5..974e4f0429 100644 --- a/api/tests/test_containers_integration_tests/services/test_app_generate_service.py +++ b/api/tests/test_containers_integration_tests/services/test_app_generate_service.py @@ -100,6 +100,8 @@ class TestAppGenerateService: mock_dify_config.APP_MAX_ACTIVE_REQUESTS = 100 mock_dify_config.APP_DEFAULT_ACTIVE_REQUESTS = 100 mock_dify_config.APP_DAILY_RATE_LIMIT = 1000 + mock_dify_config.AGENT_V2_TRANSPARENT_UPGRADE = False + mock_dify_config.AGENT_V2_REPLACES_LLM = False mock_global_dify_config.BILLING_ENABLED = False mock_global_dify_config.APP_MAX_ACTIVE_REQUESTS = 100 diff --git a/api/tests/unit_tests/core/app/apps/advanced_chat/test_app_generator.py b/api/tests/unit_tests/core/app/apps/advanced_chat/test_app_generator.py index af5d203f12..c1693f73bb 100644 --- a/api/tests/unit_tests/core/app/apps/advanced_chat/test_app_generator.py +++ b/api/tests/unit_tests/core/app/apps/advanced_chat/test_app_generator.py @@ -146,7 +146,7 @@ class TestAdvancedChatAppGeneratorInternals: ) monkeypatch.setattr( "core.app.apps.advanced_chat.app_generator.db", - SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None)), + SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None, scalar=lambda *a, **kw: None)), ) monkeypatch.setattr( "core.app.apps.advanced_chat.app_generator.sessionmaker", lambda **kwargs: SimpleNamespace() @@ -576,7 +576,7 @@ class TestAdvancedChatAppGeneratorInternals: monkeypatch.setattr("core.app.apps.advanced_chat.app_generator.Session", _Session) monkeypatch.setattr( "core.app.apps.advanced_chat.app_generator.db", - SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None)), + SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None, scalar=lambda *a, **kw: None)), ) with pytest.raises(ValueError, match="Workflow not found"): @@ -640,7 +640,7 @@ class TestAdvancedChatAppGeneratorInternals: monkeypatch.setattr("core.app.apps.advanced_chat.app_generator.Session", _Session) monkeypatch.setattr( "core.app.apps.advanced_chat.app_generator.db", - SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None)), + SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None, scalar=lambda *a, **kw: None)), ) with pytest.raises(ValueError, match="App not found"): @@ -713,7 +713,7 @@ class TestAdvancedChatAppGeneratorInternals: monkeypatch.setattr("core.app.apps.advanced_chat.app_generator.AdvancedChatAppRunner", _Runner) monkeypatch.setattr( "core.app.apps.advanced_chat.app_generator.db", - SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None)), + SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None, scalar=lambda *a, **kw: None)), ) generator._generate_worker( @@ -797,7 +797,7 @@ class TestAdvancedChatAppGeneratorInternals: monkeypatch.setattr("core.app.apps.advanced_chat.app_generator.AdvancedChatAppRunner", _Runner) monkeypatch.setattr( "core.app.apps.advanced_chat.app_generator.db", - SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None)), + SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None, scalar=lambda *a, **kw: None)), ) generator._generate_worker( @@ -878,7 +878,7 @@ class TestAdvancedChatAppGeneratorInternals: monkeypatch.setattr("core.app.apps.advanced_chat.app_generator.dify_config", SimpleNamespace(DEBUG=True)) monkeypatch.setattr( "core.app.apps.advanced_chat.app_generator.db", - SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None)), + SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None, scalar=lambda *a, **kw: None)), ) generator._generate_worker( @@ -1069,7 +1069,7 @@ class TestAdvancedChatAppGeneratorInternals: monkeypatch.setattr("core.app.apps.advanced_chat.app_generator.Session", _Session) monkeypatch.setattr( "core.app.apps.advanced_chat.app_generator.db", - SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None)), + SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None, scalar=lambda *a, **kw: None)), ) generator._generate_worker( @@ -1131,7 +1131,7 @@ class TestAdvancedChatAppGeneratorInternals: ) monkeypatch.setattr( "core.app.apps.advanced_chat.app_generator.db", - SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None)), + SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None, scalar=lambda *a, **kw: None)), ) monkeypatch.setattr( "core.app.apps.advanced_chat.app_generator.sessionmaker", @@ -1210,7 +1210,7 @@ class TestAdvancedChatAppGeneratorInternals: ) monkeypatch.setattr( "core.app.apps.advanced_chat.app_generator.db", - SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None)), + SimpleNamespace(engine=object(), session=SimpleNamespace(close=lambda: None, scalar=lambda *a, **kw: None)), ) monkeypatch.setattr( "core.app.apps.advanced_chat.app_generator.sessionmaker", diff --git a/api/tests/unit_tests/models/test_app_models.py b/api/tests/unit_tests/models/test_app_models.py index 4e46cf9654..7c66080fe2 100644 --- a/api/tests/unit_tests/models/test_app_models.py +++ b/api/tests/unit_tests/models/test_app_models.py @@ -97,6 +97,7 @@ class TestAppModelValidation: "workflow", "advanced-chat", "agent-chat", + "agent", "channel", "rag-pipeline", }