from collections.abc import Generator from typing import TYPE_CHECKING, Any from sqlalchemy.orm import Session from core.callback_handler.workflow_tool_callback_handler import DifyWorkflowCallbackHandler from core.plugin.backwards_invocation.base import BaseBackwardsInvocation from core.tools.entities.tool_entities import ToolInvokeMessage, ToolProviderType from core.tools.tool_engine import ToolEngine from core.tools.tool_manager import ToolManager from core.tools.utils.message_transformer import ToolFileMessageTransformer if TYPE_CHECKING: from core.app.apps.workflow_app_runner import WorkflowRunDriver class PluginToolBackwardsInvocation(BaseBackwardsInvocation): """ Backwards invocation for plugin tools. """ @classmethod def invoke_tool( cls, session: Session, tenant_id: str, user_id: str, tool_type: ToolProviderType, provider: str, tool_name: str, tool_parameters: dict[str, Any], credential_id: str | None = None, *, execution_driver: "WorkflowRunDriver", ) -> Generator[ToolInvokeMessage]: """ invoke tool """ # get tool runtime try: tool_runtime = ToolManager.get_tool_runtime_from_plugin( tool_type, tenant_id, provider, tool_name, tool_parameters, user_id=user_id, credential_id=credential_id, execution_driver=execution_driver, ) response = ToolEngine.generic_invoke( session, tool_runtime, tool_parameters, user_id, DifyWorkflowCallbackHandler(), workflow_call_depth=1 ) response = ToolFileMessageTransformer.transform_tool_invoke_messages( response, user_id=user_id, tenant_id=tenant_id ) return response except Exception as e: raise e