MENU

Difyプラグイン開発:Google検索ツールの実装方法

当ページのリンクには広告が含まれています。

前回の記事「Difyプラグイン開発入門:Google検索ツールの作り方」では、プラグインの雛形作成から基本的な構造までを解説しました。

今回はその続きとして、実際にGoogle検索を行うための具体的なコード実装、APIキーの設定、そしてDify上での動作確認までの詳細な手順を解説します。

目次

1. ツールプロバイダーの設定 (provider/google.yaml)

まず、プラグイン全体の基本情報と、共通で使用する認証情報(APIキーなど)を定義します。

identity:
    author: Dify
    name: google
    label:
        en_US: Google
        zh_Hans: Google
        pt_BR: Google
    description:
        en_US: Google
        zh_Hans: GoogleSearch
        pt_BR: Google
    icon: icon.svg
    tags:
        - search
credentials_for_provider: # credentials_for_provider フィールドを追加
    serpapi_api_key:
        type: secret-input
        required: true
        label:
            en_US: SerpApi API key
            zh_Hans: SerpApi APIキー
        placeholder:
            en_US: Please input your SerpApi API key
            zh_Hans: SerpApi APIキーを入力してください
        help:
            en_US: Get your SerpApi API key from SerpApi
            zh_Hans: SerpApiからSerpApi APIキーを取得します
        url: https://serpapi.com/manage-api-key
tools:
    - tools/google_search.yaml
extra:
    python:
        source: google.py
  • credentials_for_provider: ユーザーに入力してもらうAPIキーの定義です。type: secret-input にすることで、入力値がマスクされます。
  • tools: このプラグインに含まれるツールの定義ファイルを指定します。
  • extra.python.source: 認証情報の検証ロジックを記述するPythonファイルを指定します。

2. ツールの定義 (tools/google_search.yaml)

個別のツール(今回は検索機能)の入力パラメータとメタデータを定義します。

identity:
    name: google_search
    author: YourName
    label:
        en_US: Google Search
        ja_JP: Google検索
description:
    human:
        en_US: Search Google using SerpApi 
        ja_JP: SerpApiを使用してGoogle検索を行います 
    llm: A tool for performing a Google search.
parameters:
    - name: query
      type: string
      required: true
      label:
          en_US: Query
          ja_JP: 検索クエリ
      form: llm # LLMが自動的に入力するパラメータ
extra:
    python:
        source: tools/google_search.py

3. 認証ロジックの実装 (provider/google.py)

ユーザーが入力したAPIキーが正しいかどうかを検証するロジックを実装します。

from typing import Any

from dify_plugin import ToolProvider
from dify_plugin.errors.tool import ToolProviderCredentialValidationError
from tools.google_search import GoogleSearchTool

class GoogleProvider(ToolProvider):
    def _validate_credentials(self, credentials: dict[str, Any]) -> None:
        try: 
            # テストクエリを実行してAPIキーの有効性を確認
            for _ in GoogleSearchTool.from_credentials(credentials).invoke(
                tool_parameters={"query": "test", "result_type": "link"},
            ):
                pass
        except Exception as e:
            raise ToolProviderCredentialValidationError(str(e))

4. ツールロジックの実装 (tools/google_search.py)

実際にSerpApiを呼び出し、検索結果を整形して返すメインの処理です。

from collections.abc import Generator
from typing import Any

import requests

from dify_plugin import Tool
from dify_plugin.entities.tool import ToolInvokeMessage

SERP_API_URL = "https://serpapi.com/search"

class GoogleSearchTool(Tool):
    def _parse_response(self, response: dict) -> dict:
        result = {}
        if "knowledge_graph" in response:
            result["title"] = response["knowledge_graph"].get("title", "")
            result["description"] = response["knowledge_graph"].get("description", "")
        if "organic_results" in response:
            result["organic_results"] = [
                {
                    "title": item.get("title", ""),
                    "link": item.get("link", ""),
                    "snippet": item.get("snippet", ""),
                }
                for item in response["organic_results"]
            ]
        return result

    def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessage]:
        params = {
            "api_key": self.runtime.credentials["serpapi_api_key"],
            "q": tool_parameters["query"],
            "engine": "google",
            "google_domain": "google.com",
            "gl": "us",
            "hl": "en",
        }

        response = requests.get(url=SERP_API_URL, params=params, timeout=5)
        response.raise_for_status()
        valuable_res = self._parse_response(response.json())

        yield self.create_json_message(valuable_res)

5. 動作確認とデバッグ

コードの実装が完了したら、Difyのリモートデバッグ機能を使って動作確認を行います。

  1. Difyの「プラグイン管理」画面からデバッグ情報を取得し、.env ファイルに設定します。
  2. python -m main を実行してローカルサーバーを起動します。
  3. Dify上でプラグインが表示されるので、SerpApiのAPIキーを入力して保存します。この時、GoogleProvider の検証ロジックが走り、キーが正しいかチェックされます。
  4. 検証に成功したら、実際にツールを実行してGoogle検索の結果がJSON形式で返ってくることを確認します。

まとめ

以上で、Google検索を行うカスタムツールの実装は完了です。

この構成をテンプレートとして、他の外部API(天気予報、株価情報、社内システムなど)と連携するツールも同様の手順で開発できます。ぜひ独自のプラグイン開発に挑戦してみてください。

【推奨】業務システム化に有効なアイテム

生成AIを学ぶ

システム化のパートナー

VPSサーバの選定

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次