# ツールの迅速な導入
ここでは、GoogleSearchを例にとって、ツールの迅速な導入方法をご紹介します。
### 1. ツールプロバイダーのyamlを準備
#### イントロダクション
このyamlには、プロバイダーの名前、アイコン、著者などの詳細情報が含まれており、前端で柔軟に表示できるようにします。
#### サンプル
`core/tools/provider/builtin`フォルダーに`google`モジュール(フォルダー)を作成し、その中に`google.yaml`を作成します。名前はモジュール名と一致する必要があります。
以降、このツールに関するすべての操作はこのモジュール内で行います。
```yaml
identity: # ツールプロバイダーの基本情報
author: Dify # 著者
name: google # 名前、唯一無二で、他のプロバイダーと重複してはいけません
label: # ラベル、前端表示用
en_US: Google # 英語ラベル
zh_Hans: Google # 中国語ラベル
description: # 説明、前端表示用
en_US: Google # 英語説明
zh_Hans: Google # 中国語説明
icon: icon.svg # アイコン、現在のモジュールの_assetsフォルダーに配置する必要があります
```
* `identity` フィールドは必須です。著者、名前、ラベル、説明、アイコンなどの基本情報が含まれています。
* アイコンは現在のモジュールの`_assets`フォルダーに配置する必要があります。参考例:api/core/tools/provider/builtin/google/_assets/icon.svg
```xml
```
### 2. プロバイダーの認証情報を準備
GoogleはSerpApiが提供するAPIを使用しているため、SerpApiのAPIキーが必要です。一方で、`wikipedia`のようなツールでは認証情報フィールドを記入する必要はありません。参考例:api/core/tools/provider/builtin/wikipedia/wikipedia.yaml
```yaml
identity:
author: Dify
name: wikipedia
label:
en_US: Wikipedia
zh_Hans: 维基百科
pt_BR: Wikipedia
description:
en_US: Wikipedia is a free online encyclopedia, created and edited by volunteers around the world.
zh_Hans: 维基百科是一个由全世界的志愿者创建和编辑的免费在线百科全书。
pt_BR: Wikipedia is a free online encyclopedia, created and edited by volunteers around the world.
icon: icon.svg
credentials_for_provider:
```
認証情報フィールドを設定すると以下のようになります:
```yaml
identity:
author: Dify
name: google
label:
en_US: Google
zh_Hans: Google
description:
en_US: Google
zh_Hans: Google
icon: icon.svg
credentials_for_provider: # 認証情報フィールド
serpapi_api_key: # 認証情報フィールド名
type: secret-input # 認証情報フィールドタイプ
required: true # 必須かどうか
label: # 認証情報フィールドラベル
en_US: SerpApi API key # 英語ラベル
zh_Hans: SerpApi API key # 中国語ラベル
placeholder: # 認証情報フィールドプレースホルダー
en_US: Please input your SerpApi API key # 英語プレースホルダー
zh_Hans: 请输入你的 SerpApi API key # 中国語プレースホルダー
help: # 認証情報フィールドヘルプテキスト
en_US: Get your SerpApi API key from SerpApi # 英語ヘルプテキスト
zh_Hans: 从 SerpApi 获取您的 SerpApi API key # 中国語ヘルプテキスト
url: https://serpapi.com/manage-api-key # 認証情報フィールドヘルプリンク
```
* `type`:認証情報フィールドタイプ、現在は`secret-input`、`text-input`、`select`の3種類をサポートしており、それぞれパスワード入力、テキスト入力、選択ボックスに対応します。`secret-input`の場合、前端で入力内容が非表示となり、後端で入力内容が暗号化されます。
### 3. ツールのyamlを準備
一つのプロバイダーには複数のツールがあり、それぞれのツールには基本情報、パラメーター、出力などを記述したyamlファイルが必要です。
GoogleSearchを例にとって、`google`モジュール内に`tools`モジュールを作成し、その中に`tools/google_search.yaml`を作成します。内容は以下の通りです。
```yaml
identity: # ツールの基本情報
name: google_search # ツール名、唯一無二で、他のツールと重複してはいけません
author: Dify # 著者
label: # ラベル、前端表示用
en_US: GoogleSearch # 英語ラベル
zh_Hans: 谷歌搜索 # 中国語ラベル
description: # 説明、前端表示用
human: # 前端表示用の紹介文、複数言語対応
en_US: A tool for performing a Google SERP search and extracting snippets and webpages.Input should be a search query.
zh_Hans: 一个用于执行 Google SERP 搜索并提取片段和网页的工具。输入应该是一个搜索查询。
llm: A tool for performing a Google SERP search and extracting snippets and webpages.Input should be a search query. # LLMに渡す紹介文。LLMがこのツールをよりよく理解して使用できるように、ここにはできるだけ詳細な情報を書いておくことをお勧めします。
parameters: # パラメーターリスト
- name: query # パラメーター名
type: string # パラメータータイプ
required: true # 必須かどうか
label: # パラメーターラベル
en_US: Query string # 英語ラベル
zh_Hans: 查询语句 # 中国語ラベル
human_description: # 前端表示用の紹介文、複数言語対応
en_US: used for searching
zh_Hans: 用于搜索网页内容
llm_description: key words for searching # LLMに渡す紹介文。同上、LLMがこのパラメーターをよりよく理解できるように、できるだけ詳細な情報を書いておくことをお勧めします。
form: llm # フォームタイプ。llmはこのパラメーターがエージェントによって推論されるべきであることを示します。前端はこのパラメーターを表示しません。
- name: result_type
type: select # パラメータータイプ
required: true
options: # 選択ボックスオプション
- value: text
label:
en_US: text
zh_Hans: 文本
- value: link
label:
en_US: link
zh_Hans: 链接
default: link
label:
en_US: Result type
zh_Hans: 结果类型
human_description:
en_US: used for selecting the result type, text or link
zh_Hans: 用于选择结果类型,使用文本还是链接进行展示
form: form # フォームタイプ。formはこのパラメーターが対話開始前にユーザーによって前端で入力されるべきであることを示します。
```
* `identity` フィールドは必須です。名前、著者、ラベル、説明などの基本情報が含まれています。
* `parameters` パラメーターリスト
* `name` パラメーター名、唯一無二で、他のパラメーターと重複してはいけません。
* `type` パラメータータイプ。現在は`string`、`number`、`boolean`、`select`の4種類をサポートしており、文字列、数値、ブール値、選択ボックスに対応します。
* `required` 必須かどうか
* `llm`モードでは、パラメーターが必須の場合、エージェントは必ずこのパラメーターを推論する必要があります。
* `form`モードでは、パラメーターが必須の場合、ユーザーは対話開始前に前端でこのパラメーターを入力する必要があります。
* `options` パラメーターオプション
* `llm`モードでは、DifyはすべてのオプションをLLMに渡し、LLMはこれらのオプションを基に推論します。
* `form`モードでは、`type`が`select`の場合、前端にこれらのオプションが表示されます。
* `default` デフォルト値
* `label` パラメーターラベル、前端表示用
* `human_description` 前端表示用の紹介文、複数言語対応
* `llm_description` LLMに渡す紹介文。LLMがこのパラメーターをよりよく理解できるように、できるだけ詳細な情報を書いておくことをお勧めします。
* `form` フォームタイプ。現在は`llm`、`form`の2種類をサポートしており、それぞれエージェントによる推論と前端入力に対応します。
### 4. ツールコードを準備
ツールの設定が完了したら、次にツールのロジックを実装するためのコードを作成します。
`google/tools`モジュール内に`google_search.py`を作成し、以下の内容を記述します。
```python
from core.tools.tool.builtin_tool import BuiltinTool
from core.tools.entities.tool_entities import ToolInvokeMessage
from typing import Any, Dict, List, Union
class GoogleSearchTool(BuiltinTool):
def _invoke(self,
user_id: str,
tool_paramters: Dict[str, Any],
) -> Union[ToolInvokeMessage, List[ToolInvokeMessage]]:
"""
invoke tools
"""
query = tool_paramters['query']
result_type = tool_paramters['result_type']
api_key = self.runtime.credentials['serpapi_api_key']
# TODO: search with serpapi
result = SerpAPI(api_key).run(query, result_type=result_type)
if result_type == 'text':
return self.create_text_message(text=result)
return self.create_link_message(link=result)
```
#### パラメーター
ツールの全体のロジックは`_invoke`メソッド内にあります。このメソッドは`user_id`と`tool_paramters`の2つのパラメーターを受け取ります。これらはそれぞれユーザーIDとツールパラメーターを表します。
#### 返却データ
ツールの返却時に、1つまたは複数のメッセージを返すことができます。ここでは、1つのメッセージを返す例を示しており、`create_text_message`と`create_link_message`を使用してテキストメッセージまたはリンクメッセージを作成しています。
### 5. プロバイダーコードを準備
最後に、プロバイダーモジュール内にプロバイダークラスを作成し、認証情報の検証ロジックを実装します。認証情報の検証に失敗した場合、`ToolProviderCredentialValidationError`例外が投げられます。
`google`モジュール内に`google.py`を作成し、以下の内容を記述します。
```python
from core.tools.entities.tool_entities import ToolInvokeMessage, ToolProviderType
from core.tools.tool.tool import Tool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.google.tools.google_search import GoogleSearchTool
from typing import Any, Dict
class GoogleProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: Dict[str, Any]) -> None:
try:
# 1. この場所でGoogleSearchTool()をインスタンス化し、GoogleSearchToolのyaml設定を自動的に読み込みますが、この時点では認証情報が内部にありません。
# 2. その後、fork_tool_runtimeメソッドを使用して、現在の認証情報をGoogleSearchToolに渡します。
# 3. 最後にinvokeします。パラメーターはGoogleSearchToolのyamlに記載されたパラメーター規則に従って渡します。
GoogleSearchTool().fork_tool_runtime(
meta={
"credentials": credentials,
}
).invoke(
user_id=''
```
```
"credentials": 資格情報,
}
).invoke(
user_id='',
tool_paramters={
"query": "test",
"result_type": "link"
},
)
except 例外 as e:
raise ツールプロバイダ資格情報検証エラー(str(e))
```
### 完成
上記のステップが完了すると、このツールがフロントエンドに表示され、エージェントでこのツールを使用することができます。
もちろん、google検索は資格情報を必要とするため、使用前にフロントエンドで資格情報を設定する必要があります。