Reverse invoking a Tool means that a plugin can call other tool-type plugins within the Dify platform. If you are unfamiliar with the basic concepts of reverse invocation, please first read Reverse Invocation of Dify Services.

Consider the following scenarios:

  • A tool-type plugin has implemented a function, but the result is not as expected, requiring post-processing of the data.
  • A task requires a web scraper, and you want the flexibility to choose the scraping service.
  • You need to aggregate results from multiple tools, but it’s difficult to handle using a Workflow application.

In these cases, you need to call other existing tools within your plugin. These tools might be from the marketplace, a self-built Workflow as a Tool, or a custom tool.

These requirements can be met by calling the self.session.tool field of the plugin.

Calling Installed Tools

Allows the plugin to call various tools installed in the current Workspace, including other tool-type plugins.

Entry Point

    self.session.tool

Interface

    def invoke_builtin_tool(
        self, provider: str, tool_name: str, parameters: dict[str, Any]
    ) -> Generator[ToolInvokeMessage, None, None]:
        pass

Here, provider is the plugin ID plus the tool provider name, formatted like langgenius/google/google. tool_name is the specific tool name, and parameters are the arguments passed to the tool.

Calling Workflow as Tool

For more information on Workflow as Tool, please refer to the Tool Plugin documentation. (Note: Original link /plugin_dev_zh/9223-tool.zh does not exist in English list, linked to closest match).

Entry Point

    self.session.tool

Interface

    def invoke_workflow_tool(
        self, provider: str, tool_name: str, parameters: dict[str, Any]
    ) -> Generator[ToolInvokeMessage, None, None]:
        pass

In this case, provider is the ID of this tool, and tool_name is specified during the creation of the tool.

Calling Custom Tool

Entry Point

    self.session.tool

Interface

    def invoke_api_tool(
        self, provider: str, tool_name: str, parameters: dict[str, Any]
    ) -> Generator[ToolInvokeMessage, None, None]:
        pass

Here, provider is the ID of this tool, and tool_name is the operation_id from the OpenAPI specification. If it doesn’t exist, it’s the tool_name automatically generated by Dify, which can be found on the tool management page.