Tích hợp nhanh công cụ
Chúng ta sẽ sử dụng GoogleSearch làm ví dụ để minh họa cách tích hợp một công cụ một cách nhanh chóng.
1. Chuẩn bị tệp yaml nhà cung cấp tool
Giới thiệu
Tệp yaml này khai báo một nhà cung cấp công cụ mới, và bao gồm các thông tin như tên nhà cung cấp, icon, tác giả, và các chi tiết khác được giao diện người dùng lấy để hiển thị.
Ví dụ
Chúng ta cần tạo một module (thư mục) google dưới core/tools/provider/builtin, và tạo tệp google.yaml. Tên phải nhất quán với tên module.
Sau đó, tất cả các hoạt động liên quan đến công cụ này sẽ được thực hiện dưới module này.
identity: # Basic information of the tool provider
author: Dify # Author
name: google # Name, unique, no duplication with other providers
label: # Label for frontend display
en_US: Google # English label
zh_Hans: Google # Chinese label
description: # Description for frontend display
en_US: Google # English description
zh_Hans: Google # Chinese description
icon: icon.svg # Icon, needs to be placed in the _assets folder of the current moduleTrường
identitylà bắt buộc, nó chứa thông tin cơ bản của nhà cung cấp công cụ, bao gồm tác giả, tên, nhãn, mô tả, biểu tượng, v.v.Icon cần được đặt trong thư mục
_assetscủa module hiện tại, bạn có thể tham khảo: api/core/tools/provider/builtin/google/_assets/icon.svg<svg xmlns="http://www.w3.org/2000/svg" width="24" height="25" viewBox="0 0 24 25" fill="none"> <path d="M22.501 12.7332C22.501 11.8699 22.4296 11.2399 22.2748 10.5865H12.2153V14.4832H18.12C18.001 15.4515 17.3582 16.9099 15.9296 17.8898L15.9096 18.0203L19.0902 20.435L19.3106 20.4565C21.3343 18.6249 22.501 15.9298 22.501 12.7332Z" fill="#4285F4"/> <path d="M12.214 23C15.1068 23 17.5353 22.0666 19.3092 20.4567L15.9282 17.8899C15.0235 18.5083 13.8092 18.9399 12.214 18.9399C9.38069 18.9399 6.97596 17.1083 6.11874 14.5766L5.99309 14.5871L2.68583 17.0954L2.64258 17.2132C4.40446 20.6433 8.0235 23 12.214 23Z" fill="#34A853"/> <path d="M6.12046 14.5766C5.89428 13.9233 5.76337 13.2233 5.76337 12.5C5.76337 11.7766 5.89428 11.0766 6.10856 10.4233L6.10257 10.2841L2.75386 7.7355L2.64429 7.78658C1.91814 9.20993 1.50146 10.8083 1.50146 12.5C1.50146 14.1916 1.91814 15.7899 2.64429 17.2132L6.12046 14.5766Z" fill="#FBBC05"/> <path d="M12.2141 6.05997C14.2259 6.05997 15.583 6.91163 16.3569 7.62335L19.3807 4.73C17.5236 3.03834 15.1069 2 12.2141 2C8.02353 2 4.40447 4.35665 2.64258 7.78662L6.10686 10.4233C6.97598 7.89166 9.38073 6.05997 12.2141 6.05997Z" fill="#EB4335"/> </svg>
2. Chuẩn bị các thông tin xác thực của nhà cung cấp
Google, là một công cụ bên thứ ba, sử dụng API được cung cấp bởi SerpApi, yêu cầu một API Key để sử dụng. Điều này có nghĩa là công cụ này cần thông tin xác thực để sử dụng. Đối với các công cụ như wikipedia, không cần điền vào trường thông tin xác thực, bạn có thể tham khảo: api/core/tools/provider/builtin/wikipedia/wikipedia.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:Sau khi cấu hình trường thông tin xác thực, kết quả sẽ như sau:
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: # Credential field
serpapi_api_key: # Credential field name
type: secret-input # Credential field type
required: true # Required or not
label: # Credential field label
en_US: SerpApi API key # English label
zh_Hans: SerpApi API key # Chinese label
placeholder: # Credential field placeholder
en_US: Please input your SerpApi API key # English placeholder
zh_Hans: 请输入你的 SerpApi API key # Chinese placeholder
help: # Credential field help text
en_US: Get your SerpApi API key from SerpApi # English help text
zh_Hans: 从 SerpApi 获取您的 SerpApi API key # Chinese help text
url: https://serpapi.com/manage-api-key # Credential field help linktype: Kiểu trường thông tin xác thực, hiện có thể làsecret-input, text-input, hoặcselect, tương ứng với box nhập mật khẩu, box nhập văn bản và box drop-down tương ứng. Nếu được đặt làsecret-input, nó sẽ che giấu nội dung đầu vào trên giao diện người dùng và backend sẽ mã hóa nội dung đầu vào đó.
3. Chuẩn bị tool yaml
Một nhà cung cấp có thể có nhiều công cụ, mỗi công cụ cần một tệp yaml để mô tả, tệp này chứa thông tin cơ bản, tham số, đầu ra của công cụ.
Lấy GoogleSearch làm ví dụ, chúng ta cần tạo một mô-đun công cụ dưới mô-đun google và tạo tệp tools/google_search.yaml với nội dung như sau:
identity: # Basic information of the tool
name: google_search # Tool name, unique, no duplication with other tools
author: Dify # Author
label: # Label for frontend display
en_US: GoogleSearch # English label
zh_Hans: 谷歌搜索 # Chinese label
description: # Description for frontend display
human: # Introduction for frontend display, supports multiple languages
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. # Introduction passed to LLM, in order to make LLM better understand this tool, we suggest to write as detailed information about this tool as possible here, so that LLM can understand and use this tool
parameters: # Parameter list
- name: query # Parameter name
type: string # Parameter type
required: true # Required or not
label: # Parameter label
en_US: Query string # English label
zh_Hans: 查询语句 # Chinese label
human_description: # Introduction for frontend display, supports multiple languages
en_US: used for searching
zh_Hans: 用于搜索网页内容
llm_description: key words for searching # Introduction passed to LLM, similarly, in order to make LLM better understand this parameter, we suggest to write as detailed information about this parameter as possible here, so that LLM can understand this parameter
form: llm # Form type, llm means this parameter needs to be inferred by Agent, the frontend will not display this parameter
- name: result_type
type: select # Parameter type
required: true
options: # Drop-down box 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 type, form means this parameter needs to be filled in by the user on the frontend before the conversation startsTrường
identitylà bắt buộc, nó chứa thông tin cơ bản của công cụ, bao gồm tên, tác giả, nhãn, mô tả, v.v.parametersDanh sách tham sốnameTên tham số, duy nhất, không trùng lặp với các tham số kháctypeLoại tham số, hiện hỗ trợ bốn loại:string, number, boolean, select, tương ứng với chuỗi ký tự, số, boolean, và drop-down boxrequiredCó bắt buộc hay khôngTrong chế độ
llm, nếu tham số là bắt buộc, Agent sẽ phải suy diễn tham số nàyTrong chế độ
form, nếu tham số là bắt buộc, người dùng phải điền tham số này trên giao diện trước khi cuộc trò chuyện bắt đầu
optionsCác tùy chọn của tham sốTrong chế độ
llm, Thổ Thần sẽ chuyển tất cả các tùy chọn cho LLM, LLM có thể suy diễn dựa trên các tùy chọn nàyTrong chế độ
form, khitypelàselect, giao diện sẽ hiển thị các tùy chọn này
defaultGiá trị mặc địnhlabelNhãn của tham số, hiển thị cho giao diệnhuman_descriptionGiới thiệu cho giao diện, hỗ trợ nhiều ngôn ngữllm_descriptionGiới thiệu để cho LLM hiểu rõ hơn về tham số này, viết thông tin chi tiết nhất có thể về tham số này, để LLM có thể hiểu được tham sốformLoại biểu mẫu, hiện hỗ trợ hai loại:llmvàform, tương ứng với suy diễn tự động của Agent và điền thông tin trên giao diện
4. Thêm logic công cụ
Sau khi hoàn tất cấu hình công cụ, chúng ta có thể bắt đầu viết mã công cụ để định nghĩa cách nó được triệu hồi.
Tạo tệp google_search.py dưới mô-đun google/tools với nội dung như sau.
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_parameters: Dict[str, Any],
) -> Union[ToolInvokeMessage, List[ToolInvokeMessage]]:
"""
invoke tools
"""
query = tool_parameters['query']
result_type = tool_parameters['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)Tham số
Logic tổng quát của công cụ nằm trong phương thức _invoke, phương thức này chấp nhận hai tham số: user_id và tool_parameters, lần lượt đại diện cho ID người dùng và các tham số của công cụ.
Return Data
Khi công cụ trả về, bạn có thể chọn trả về một hoặc nhiều message, ở đây chúng ta trả về mộtmessage, sử dụng create_text_message và create_link_message để tạo ra một văn bản hoặc một liên kết.
5. Thêm code cung cấp
Cuối cùng, chúng ta cần tạo một lớp nhà cung cấp (provider) dưới mô-đun provider để thực hiện logic xác thực thông tin. Nếu việc xác thực thông tin thất bại, nó sẽ ném ra một ngoại lệ ToolProviderCredentialValidationError.
Tạo tệp google.py dưới mô-đun google với nội dung như sau.
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. Here you need to instantiate a GoogleSearchTool with GoogleSearchTool(), it will automatically load the yaml configuration of GoogleSearchTool, but at this time it does not have credential information inside
# 2. Then you need to use the fork_tool_runtime method to pass the current credential information to GoogleSearchTool
# 3. Finally, invoke it, the parameters need to be passed according to the parameter rules configured in the yaml of GoogleSearchTool
GoogleSearchTool().fork_tool_runtime(
meta={
"credentials": credentials,
}
).invoke(
user_id='',
tool_parameters={
"query": "test",
"result_type": "link"
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))Hoàn thành
Sau khi các bước trên hoàn thành, chúng ta có thể thấy công cụ này trên giao diện và có thể sử dụng nó trong Agent.
Dĩ nhiên, vì google_search cần thông tin xác thực, trước khi sử dụng, bạn cũng cần nhập thông tin xác thực của mình trên giao diện.

Last updated