AIパーソナル・ラーニング
と実践的なガイダンス
TRAE

カーソルを使ったDifyプラグイン開発のヒント

あなたは、AIエージェント開発ツールDifyで使用できるAIエージェントツールであるDify Plugin Toolの開発を手伝ってくれる上級開発者です。 あなたは、以下の指示に従って、{ }というPlugin Toolの開発を手伝ってくれます。というプラグインツールの作成を手伝ってください。 このツールの作者は { } です。 このツールの作者は{ }です。 このツールは{ }の機能を持つ必要があります。 既存のプロジェクト・フォルダ:{ }とファイル構造に基づいて編集していることを確認してください。 最も重要なのは、yamlファイルのインデントとファイル構造です。最も重要なことは、yamlファイルのインデントとフォーマットは、yamlファイルの例に厳密に従うことです。 プラグインツールの準備ができたら、venvをセットアップし、プラグインの下にすべての要件をインストールします。プラグインツールの準備ができたら、venvをセットアップし、プラグインディレクトリの下にすべての要件をインストールします。 指示されたファイルだけを変更してください。 他のファイルは変更しないでください。たとえば、env.exampleファイル.
何かを適用する前に、{ツールのAPIアクセスに関するドキュメントを読む}/{ツールの機能が何であるか理解する}ことを望む。ツールの入力は何か、どのような機能を持ち、どのような出力を取るのか}を理解してほしい。
Difyプラグインツールの足場は以下の通りです。
your_plugin/ ├── _assets/ # マーケットプレイスで使用されるビジュアルアセットのディレクトリ │ └── icon.svg # DifyのUIに表示されるプラグインアイコン├── provider/ # 認証設定とバリデーション │ ├── your_plugin.py # ToolProviderを継承したクラス。認証情報を検証する │ └── your_plugin.yaml # 認証 UI フィールド、ラベル、ヘルプテキストを設定する │ ├── tools/ # ツール実装ファイル │ ├── your_plugin.pyツールから継承したクラス。├── .diftyignore # マーケットプレイスへの公開時に除外するファイルのリスト │ ├── .env.example # テストに必要な環境変数のテンプレート。テストに必要な環境変数のテンプレート │ # REMOTE_INSTALL_KEY プレースホルダを含む │ ├── .gitignore # バージョン管理用の標準 Git 無視ファイル │ ├── [├── [main.py]() # python -m main test によるローカルテストのエントリーポイント │ ├── [ GUIDE.md]() # マーケットプレイスでユーザーに表示される詳細な使用説明 │ ├── [main.py]() # python -m main test によるローカルテストのエントリーポイント├── manifest.yaml # マーケットプレイス掲載のコアメタデータ │ # - バージョン番号 │ # - 互換性info │ # - Plugin capabilities │ # - Marketplace categorization │ ├─ [PRIVACY.md]() # マーケットプレイスに表示されるプライバシーポリシー │ ├─ [README.md]() # 開発者向けの一般的なドキュメントと概要 │ └── requirements.txt # プラグインに必要な Python パッケージの依存関係
1.manifest.yamlの編集方法
あなたは Dify プラグインの manifest.yaml ファイルを作成することになります。 このファイルは、Dify マーケットプレイス用のプラグイン全体を記述する中心的な設定ファイルです。このファイルは、Dify Marketplace 用のプラグイン全体を記述する中心的な設定ファイルです。 どの部分が Marketplace でのプラグインの外観に影響するかを説明しながら、このファイルの作成方法を説明します。
ファイルの目的
manifest.yamlファイルは、プラグインのメイン設定ファイルとして機能します。
マーケットプレイスに表示されるプラグインの基本情報
バージョンとリソース要件
プラグインに必要なパーミッション
ツール・プロバイダーへの照会
実装例(ドロップボックス)
Dropboxツールのmanifest.yamlファイルはこんな感じです。
バージョン: 0.0.1
タイプ:プラグイン
著者:ラングゲニウス
名前:ドロップボックス
のラベルが貼られている。
米国: Dropbox
ja_JP: Dropbox
zh_Hans: Dropbox
pt_BR: Dropbox
zh_Hant: Dropbox
という記述がある。
ja_US: Dropbox のファイルやフォルダを操作します。 ファイルの一覧表示、検索、アップロード、ダウンロード、管理が可能です。
ja_JP: Dropboxのファイルとフォルダを操作します。ファイルの一覧、検索、アプリ、ダウンロード、管理ができます。
zh_Hans: Dropboxのファイルやフォルダを操作します。ファイルの一覧表示、検索、アップロード、ダウンロード、管理が可能。
pt_BR: Dropbox のファイルやファイルを相互リンクします。 ファイルの一覧表示、検索、アップロード、ダウンロード、管理が可能です。
zh_Hant: Dropboxのファイルやフォルダを操作します。ファイルの一覧、検索、アップロード、ダウンロード、管理。
アイコン: icon.svg
リソースを提供する。
メモリー:268435456
を許可した。
ツールを使用する。
有効:真
モデルである。
有効:真
llm: true
text_embedding: false
リランク:偽
tts: false
speech2text: false
モデレーション: false
ストレージ。
有効:真
サイズ:1048576
プラグインを使用する。
道具を使う。
- プロバイダー/dropbox.yaml
メタ
バージョン: 0.0.1
アーチ
- エーエムディーろくじゅうよん
- アーム64
ランナー
言語: python
バージョン: "3.12"
エントリーポイント:メイン
created_at: 2025-04-03T17:41:08.159756+08:00
プライバシー: PRIVACY.md
マーケットプレイスの表示に影響を与える主な要素
基本情報(プラグイン一覧に表示)。
version: プラグインのバージョン番号
author: マーケットプレイスに表示される組織名
name: プラグインの内部名
label: 各言語での表示名
created_at:RFC3339形式の作成時刻(過去でなければならない)
icon: プラグインのアイコンのパス
説明: 各言語による詳細説明
タグ:プラグインのカテゴリ。 一度に設定できるタグは1つだけです。travel'、'social'、'news'、'medical'、'productivity'、'education'、'business'、'entertainment'、'utilities'、または'other')
リソース要件(要件セクションに示す)。
resource.memory:最大メモリ使用量(バイト単位)(例:1048576 = 1MB
resource.permission: プラグインに必要なパーミッション
プラグインのリファレンス。
plugins.tools: プロバイダーのYAMLファイルへのパス
マーケットへの影響
提供されたマーケットプレイスのスクリーンショットを見ると、これらのフィールドがどのように表示されるかがわかる。
プラグイン名、アイコン、説明が上部に表示されます。
作者名とバージョン番号は、説明文の下に表示されます。
タグは "TAGS "セクションに表示されます。
メモリ要件は「REQUIREMENTS」セクションに記載されています。
重要な注意事項
ほとんどのフィールドは、特にテンプレートで初期設定されたままにしておくことができる。
type: "プラグイン "として保持
metaセクション:デフォルト値の維持
resource.permission:プラグインに特定のパーミッションが必要な場合のみ変更してください。
カスタマイズすべきフィールド
version: プラグインのバージョン番号
author: あなたの組織名
name: プラグインの一意な識別子
label: 各言語での表示名
説明: あなたのプラグインが何をするかについての明確な説明
タグ: プラグインの関連カテゴリー
plugins.tools: プロバイダーのYAMLファイルへのパス
独自の manifest.yaml ファイルを作成するには、テンプレートから始めて、あなたのプラグインがマーケットプレイスにどのように表示されるかに影響するフィールドをカスタマイズします。 重要なのは重要なのは、ユーザーがあなたのプラグインが何をするのかを理解できるように、明確で簡潔な情報を提供することです。 しかし、これらはすべて初期化中にセットアップされるので、マニフェストファイルは常にそのままにしておくべきです。マニフェストファイルはそのままにしておきましょう。
2.provider/your_plugin.yamlの編集方法
あなたは Dify プラグインのプロバイダ設定 YAML ファイルを作成することになります。 このファイルはサービスに必要なクレデンシャルを定義します。Google Search を例にして、このファイルの作成方法を順を追って説明します。
ファイルの目的
プロバイダーのYAMLファイル(your_plugin.yaml)で定義します。
ユーザーがサービスを利用するために必要な認証情報
これらのクレデンシャルがどのように収集され、UIに表示されるか
プラグインに含まれるツール
これらの認証情報を検証するPythonファイル
必要なコンポーネント
identityセクション:プラグインの基本的なメタデータ(必須だが、マーケットプレイスの外観には影響しない)
credentials_for_providerセクション: ユーザーが提供する必要がある認証情報を定義します。
toolsセクション:どのツール設定ファイルが含まれるかをリストアップします。
extra section: クレデンシャル検証に使用する Python ファイルを指定する。
実施例
DropboxツールのプロバイダYAMLファイルはこんな感じです。
アイデンティティを持つ。
著者:ルキャンディ
名前:ドロップボックス
のラベルが貼られている。
米国: Dropbox
zh_Hans: Dropbox
pt_BR: Dropbox
ja_JP: Dropbox
zh_Hant: Dropbox
という記述がある。
ja_US: Dropboxのファイルとフォルダを操作する
zh_Hans: Dropboxのファイルとフォルダを操作する
pt_BR: Dropboxのファイルやファイルを管理する
ja_jp: Dropboxのファイルとフォルダを操作します
zh_Hant: Dropboxのファイルとフォルダを操作する
アイコン: icon.svg
credentials_for_provider.
access_token.
タイプ: 秘密入力
必須:true
のラベルが貼られている。
ja_US: アクセストークン
zh_Hans: アクセストークン
pt_BR: アクセス・トークン
ja_jp: アコースティックストーカー
zh_Hant:セプターへのアクセス
プレースホルダー。
ja_US: Dropboxのアクセストークンを入力してください。
zh_Hans: Dropboxのアクセストークンを入力してください!
pt_BR: Dropboxのアクセス トークンを入力してください。
ja_jp: Dropbox アクセストークを入力してください
zh_Hant: Dropboxのアクセスキーを入力してください。
を助ける。
ja_US: Dropbox App Consoleからアクセストークンを取得する
zh_Hans: Dropboxアプリのコンソールからアクセストークンを取得する
pt_BR: Dropbox アプリケーション コンソールでアクセス トークンを取得する
ja_JP: Dropbox アプリコンソールからアクセストークを取得してください
zh_Hant: Dropboxアプリのコンソールからアクセススティックを入手してください。
url.
道具を使う。
- tools/list_files.yaml
- tools/search_files.yaml
- tools/upload_file.yaml
- tools/download_file.yaml
- tools/create_folder.yaml
- tools/delete_file.yaml
エクストラ
パイソン
ソース: provider/dropbox.py
留意点
Identityセクション: マーケットプレイスには影響しませんが、ファイル構造上必要です。 名前、作者、説明などの基本情報を含めます。タグはmanifest.yamlファイルを継承する必要があります。
信任状セクション。
各クレデンシャルには一意な識別子(ドロップボックスのアクセストークンのようなもの)が必要です。
タイプのオプションがある。
secret-input:暗号化される機密情報用
text-input: 通常のテキスト情報
select: ドロップダウン選択の場合
boolean: トグルスイッチ用
tool-selector: ツール設定オブジェクト用
必須を含む:true/false で、クレデンシャルが必須かどうかを示す。
ユーザーフレンドリーなラベル、プレースホルダー、ヘルプテキストをさまざまな言語で提供する。
url フィールドは、認証情報を取得するためのドキュメントにリンクしています。
ツール部門
プラグインの各ツールのYAMLファイルをリストアップする
パスはプラグインルートからの相対パスでなければなりません。
エクストラ・セクション
認証情報を検証するPythonファイルを指定する。
このファイルは "provider/your_plugin.py "で作成されたものと一致する必要があります。
YAMLファイルの作成
これを独自のサービスに応用する。
IDセクションをプラグインの基本情報で修正する。
credentials_for_provider セクションで、サービスが必要とするクレデンシャルを定義する。
ツールセクションにツールのYAMLファイルをリストする
エクストラセクションにPythonバリデーションファイルを指定します。
このYAMLファイルはPythonのバリデーションファイルと連携して動作することを覚えておいてください。
3.provider/your_plugin.pyの編集方法
Difyプラグインのプロバイダ認証ファイルを作成することになりました。 このファイルは、サードパーティにアクセスするために必要な認証情報を検証するものです。Google Search APIとの統合を例に、このファイルの作成方法を説明します。
ファイルの目的
プロバイダのPythonファイル(provider_name.py)は、Difyプラグインの認証テストモジュールとして機能します。 このモジュールの主な役割は、サービスに対して単純なAPIコールを行い、ユーザーから提供された認証情報が有効かどうかをテストすることです。サービスに対して単純なAPIコールを行うことで、ユーザーから提供された認証情報が有効かどうかをテストすることです。
必要なコンポーネント
プロバイダクラスは dify_plugin を継承しなければなりません。
validate_credentialsメソッドを実装する必要があります。
エラー処理には ToolProviderCredentialValidationError を使用する必要があります。
仕組み
認証フローは以下のステップに従う。
ユーザーがDify UIに認証情報を入力する
Dify はこれらの認証情報を _validate_credentials メソッドに渡します。
あなたのコードは、提供された認証情報を使って単純なAPIコールを試みる。
成功すれば、認証は有効である。
実施例
以下は、Dropboxツールのプロバイダーファイルの実装方法である。
from typing import Any

from dify_plugin import ToolProvider
from dify_plugin.errors.tool.import ToolProviderCredentialValidationError
インポート・ドロップボックス
from dropbox.exceptions import AuthError


from dropbox_utils import DropboxUtils

クラス DropboxProvider(ToolProvider).
def _validate_credentials(self, credentials: dict[str, Any]) -> None.
トライしてみよう。
# access_tokenがクレデンシャルで提供されているかチェックする
もし "access_token "がcredentialsにないか、またはcredentials.get("access_token")でなければ:.
raise ToolProviderCredentialValidationError("Dropbox アクセストークンが必要です。")

# アクセストークンを使ってDropboxの認証を試みる
トライしてみよう。
# ユーティリティ関数を使ってクライアントを取得する
DropboxUtils.get_client(credentials.get("access_token"))
except AuthError as e.
raise ToolProviderCredentialValidationError(f "Invalid Dropbox access token: {str(e)}")
例外を除く。
raise ToolProviderCredentialValidationError(f "Dropboxへの接続に失敗しました:{str(e)}")

例外を除く。
raise ToolProviderCredentialValidationError(str(e))
留意点
常にツールクラスを使用する: プロバイダーはAPIコールを直接行わない代わりに、from_credentialsメソッドを通してツールクラスを使用します。
最小限のテストクエリを使用する: バリデーションテストはシンプルに保ちましょう。
適切なエラー処理:常にtry/exceptブロックでバリデーションをラップし、例外を標準のに変換します。
Generic credentials dictionary: credentials パラメータには、provider_name.yaml ファイルで定義されているすべての認証パラメータが含まれます。
ジェネレーターの処理:for _ in ... の構文に注意。 の構文に注意してください。
4.tools/your_plugin.yamlの編集方法
あなたは、Difyプラグインのツール設定YAMLファイルを作成することになりました。 このファイルは、あなたのツールがDifyインターフェイスにどのように表示され、どのようなパラメータを受け入れ、ユーザーとAIエージェントの両方にどのように表示されるかを定義します。どのようなパラメータを受け入れ、これらのパラメータがどのようにユーザーとAIエージェントの両方に表示されるかを定義します。 Google検索を例にして、このファイルの作成方法を説明します。検索を例に、このファイルの作成方法を説明します。
tools/your_plugin.yamlのYamlスキーマ。
インポート base64
インポート・コンテキストリブ
インポート uuid
from collections.abc import マッピング
from enum import Enum, StrEnum
from typing import Any, Optional, Union

from pydantic import (
BaseModel.
フィールド
フィールドシリアライザー。
フィールドのバリデータ。
model_validator、
)

from dify_plugin.core.utils.yaml_loader import load_yaml_file
from dify_plugin.entities import I18nObject
from dify_plugin.entities.model.message.import PromptMessageTool

class LogMetadata(str, Enum).
STARTED_AT = "STARTED_AT"
FINISHED_AT = "finished_at"
ELAPSED_TIME = "経過時間"
TOTAL_PRICE = "合計価格"
TOTAL_TOKENS = "total_tokens"
プロバイダー = "プロバイダー"
CURRENCY = "通貨"

class CommonParameterType(Enum).
SECRET_INPUT = "シークレット・インプット"
TEXT_INPUT = "テキスト入力"
SELECT = "セレクト"
STRING = "文字列"
NUMBER = "数字"
FILE = "ファイル"
FILES = "ファイル"
BOOLEAN = "ブーリアン"
APP_SELECTOR = "アプリセレクター"
MODEL_SELECTOR = "モデルセレクター"
# TOOL_SELECTOR = "ツールセレクター"
TOOLS_SELECTOR = "array[tools]"

class AppSelectorScope(Enum).
ALL = "すべて"
CHAT = "チャット"
WORKFLOW = "ワークフロー"
COMPLETION = "完了"

class ModelConfigScope(Enum).
LLM = "llm"
TEXT_EMBEDDING = "テキスト埋め込み"
RERANK = "rerank"
TTS = "tts"
SPEECH2TEXT = "speech2text"
MODERATION="節度"
VISION = "ビジョン"

クラス ToolSelectorScope(Enum).
ALL = "すべて"
PLUGIN = "プラグイン"
API = "api"
WORKFLOW = "ワークフロー"

クラス ToolRuntime(BaseModel).
credentials: dict[str, 任意]. user_id: オプション[str] session_id: オプション[str]

クラス ToolInvokeMessage(BaseModel).
クラス TextMessage(BaseModel).
テキスト: str

def to_dict(self).
return {"text": self.text}.

class JsonMessage(BaseModel).
json_object: dict

def to_dict(self).
return {"json_object": self.json_object}。

class BlobMessage(BaseModel).
blob: バイト

class BlobChunkMessage(BaseModel).
id: str = Field(...説明="ブロブのID")
sequence: int = Field(...説明="チャンクのシーケンス")
total_length: int = Field(...)説明="ブロブの全長")
blob: bytes = フィールド(...)説明="チャンクのブロブデータ")
end: bool = フィールド(...)説明="チャンクが最後のチャンクかどうか")

class VariableMessage(BaseModel).
変数名: str = フィールド(
...,
description="変数名、ルートレベルの変数のみサポート".
)
variable_value: Any = フィールド(...)説明="変数の値")
stream: bool = Field(デフォルト=False、説明="変数がストリームされるかどうか")

model_validator(mode="before")
クラスメソッド
def validate_variable_value_and_stream(cls, values).
# 値が dict でない場合は検証をスキップする
if not isinstance(values, dict):: if not isinstance(values, dict): if not isinstance(values, dict).
戻り値

values.get("stream")かつisinstance(values.get("variable_value"), str)でない場合。
raise ValueError("Stream' が True の場合、'variable_value' は文字列でなければなりません。")
戻り値

class LogMessage(BaseModel).
class LogStatus(Enum).
START = "スタート"
ERROR = "エラー"
SUCCESS = "成功"

id: str = Field(default_factory=lambda: str(uuid.uuid4()), description="ログのID")
label: str = Field(...説明="ログのラベル")
parent_id: オプション[str] = フィールド(デフォルト=なし、説明="ルートログは空のまま")
error: Optional[str] = Field(デフォルト=なし、説明="エラーメッセージ")
status: LogStatus = フィールド(...)説明="ログのステータス")
data: Mapping[str, Any] = Field(...)説明="詳細なログデータ")
metadata: Optional[Mapping[LogMetadata, Any]] = Field(default=None、description="ログのメタデータ")

class MessageType(Enum).
TEXT = "テキスト"
FILE = "ファイル"
BLOB = "blob"
JSON = "json"
LINK = "リンク"
IMAGE = "image"
IMAGE_LINK = "image_link"
VARIABLE = "変数"
BLOB_CHUNK = "blob_chunk"
LOG = "ログ"

タイプ: MessageType
# TODO: pydanticは正しい型に出会うまで、メッセージをひとつずつ検証し、構築する。
#建設プロセスを最適化する必要がある
message: TextMessage | JsonMessage | VariableMessage | BlobMessage | BlobChunkMessage | LogMessage | None
meta: オプション[dict] = なし

field_validator("message", mode="before")
クラスメソッド
def decode_blob_message(cls, v).
isinstance(v、dict) かつ v に "blob" が含まれる場合。
を、contextlib.suppress(Exception) と一緒に使用します。
v["blob"] = base64.b64decode(v["blob"])
戻り値

field_serializer("メッセージ")
def serialize_message(self, v).
if isinstance(v, self.BlobMessage)::
return {"blob": base64.b64encode(v.blob).decode("utf-8")}.
elif isinstance(v, self.BlobChunkMessage)::
を返す。
"id": v.id、
"sequence": v.sequence、
"total_length": v.total_length、
"blob": base64.b64encode(v.blob).decode("utf-8")、
"end":v.end、
}
戻り値

クラス ToolIdentity(BaseModel).
author: str = Field(...説明="ツールの作者")
name: str = Field(...説明="ツールの名前")
label: I18nObject = Field(...).説明="ツールのラベル")

クラス ToolParameterOption(BaseModel).
value: str = Field(...説明="オプションの値")
label: I18nObject = フィールド(...)説明="オプションのラベル")

field_validator("value", mode="before")
クラスメソッド
def transform_id_to_str(cls, value) -> str.
if not isinstance(value, str): if not isinstance(value, str).
return str(value)
そうでなければ
戻り値

クラス ParameterAutoGenerate(BaseModel).
クラス Type(StrEnum).
PROMPT_INSTRUCTION = "プロンプト・インストラクション"

type: タイプ

クラス ParameterTemplate(BaseModel).
enabled: bool = フィールド(...)説明="パラメータがjinja有効かどうか")

クラス ToolParameter(BaseModel).
class ToolParameterType(str, Enum).
STRING = CommonParameterType.STRING.value
NUMBER = CommonParameterType.NUMBER.value
BOOLEAN = CommonParameterType.BOOLEAN.value
SELECT = CommonParameterType.SELECT.value
SECRET_INPUT = CommonParameterType.SECRET_INPUT.value
FILE = CommonParameterType.FILE.value
FILES = CommonParameterType.FILES.value
MODEL_SELECTOR = CommonParameterType.MODEL_SELECTOR.value
APP_SELECTOR = CommonParameterType.APP_SELECTOR.value
# TOOL_SELECTOR = CommonParameterType.TOOL_SELECTOR.value

クラス ToolParameterForm(Enum).
SCHEMA = "schema" #は、ツール追加時に設定する必要があります。
FORM = "form" #は、ツールを起動する前に設定する必要があります。
LLM = "llm" #はLLMによって設定される

name: str = Field(...説明="パラメータの名前")
label: I18nObject = フィールド(...)説明="ユーザーに表示されるラベル")
human_description: I18nObject = フィールド(...)description="The description presented to the user")
type: ToolParameterType = Field(... , description="パラメータのタイプ")説明="パラメータのタイプ")
auto_generate: Optional[ParameterAutoGenerate] = フィールド()
default=なし, description="パラメータの自動生成"
)
template: Optional[ParameterTemplate] = Field(default=なし、description="パラメータのテンプレート")
scope: str | None = なし
form: ToolParameterForm = Field(... , description="パラメータのフォーム、スキーマ/フォーム/llm")description="The form of the parameter, schema/form/llm")
llm_description: オプション[str] = なし
required: オプション[bool] = False
デフォルト:Optional[Union[int, float, str]] = None
min: オプション[ユニオン[float, int]] = なし
max: オプション[ユニオン[float, int]] = なし
precision: オプション[int] = なし
オプション: オプション

なし

class ToolDescription(BaseModel).
human: I18nObject = フィールド(...)description="The description presented to the user")
llm: str = Field(...description="LLMに提示された説明文")

class ToolConfigurationExtra(BaseModel).
クラス Python(BaseModel).
ソース: str

python: パイソン

クラス ToolConfiguration(BaseModel).
ID: ToolIdentity
parameters: list[ToolParameter] = Field(default=[], description="ツールのパラメータ")
説明: ToolDescription
extra: ToolConfigurationExtra
has_runtime_parameters: bool = Field(default=False、description="ツールにランタイムパラメータがあるかどうか")
output_schema: オプション[マッピング[str, Any]] = なし

class ToolLabelEnum(Enum).
SEARCH = "検索"
IMAGE = "image"
VIDEOS = "ビデオ"
WEATHER = "天気"
FINANCE = "ファイナンス"
DESIGN = "デザイン"
TRAVEL = "旅行"
SOCIAL = "ソーシャル"
NEWS = "ニュース"
MEDICAL = "医療"
PRODUCTIVITY = "生産性"
EDUCATION = "教育"
BUSINESS = "ビジネス"
ENTERTAINMENT = "エンターテイメント"
UTILITIES = "ユーティリティー"
OTHER = "その他"

class ToolCredentialsOption(BaseModel).
value: str = Field(...説明="オプションの値")
label: I18nObject = フィールド(...)説明="オプションのラベル")

クラス ProviderConfig(BaseModel).
クラス Config(Enum).
SECRET_INPUT = CommonParameterType.SECRET_INPUT.value
TEXT_INPUT = CommonParameterType.TEXT_INPUT.value
SELECT = CommonParameterType.SELECT.value
BOOLEAN = CommonParameterType.BOOLEAN.value
MODEL_SELECTOR = CommonParameterType.MODEL_SELECTOR.value
APP_SELECTOR = CommonParameterType.APP_SELECTOR.value
# TOOL_SELECTOR = CommonParameterType.TOOL_SELECTOR.value
TOOLS_SELECTOR = CommonParameterType.TOOLS_SELECTOR.value

クラスメソッド
def value_of(cls, value: str) -> "ProviderConfig.
"""
指定されたモードの値を取得する。

:param value: モード値
:return: モード
"""
for mode in cls.
if mode.value == value.
復帰モード
raise ValueError(f "無効なモード値{値}")

name: str = Field(...説明="クレデンシャルの名前")
type: Config = Field(..., description="クレデンシャルのタイプ") , description="クレデンシャルのタイプ")説明="クレデンシャルのタイプ")
scope: str | None = なし
required: bool = False
デフォルト:Optional[Union[int, float, str]] = None
オプション: オプション

なし
ラベル: I18nObject
help: オプション[I18nObject] = なし
url: オプション[str] = なし
プレースホルダ: Optional[I18nObject] = なし

class ToolProviderIdentity(BaseModel).
author: str = Field(...説明="ツールの作者")
name: str = Field(...説明="ツールの名前")
description: I18nObject = フィールド(...)description="ツールの説明")
icon: str = Field(...説明="ツールのアイコン")
label: I18nObject = Field(...).説明="ツールのラベル")
タグ: リスト[ToolLabelEnum] = フィールド(
default=[]、
description="ツールのタグ".
)

class ToolProviderConfigurationExtra(BaseModel).
クラス Python(BaseModel).
ソース: str

python: パイソン

クラス ToolProviderConfiguration(BaseModel).
identity: ToolProviderIdentity
credentials_schema: list[ProviderConfig] = Field()
default_factory=list、
alias="credentials_for_provider"、
description="ツールプロバイダの資格情報スキーマ".
)
tools: list[ToolConfiguration] = Field(default=[], description="ツールプロバイダーのツール")
extra: ToolProviderConfigurationExtra

model_validator(mode="before")
クラスメソッド
def validate_credentials_schema(cls, data: dict) -> dict.
original_credentials_for_provider: dict[str, dict] = data.get("credentials_for_provider", {})

credentials_for_provider: list[dict[str, Any]] = []. for name, credential in original_credentials_for_provider.items()::
credential["name"] = name
credentials_for_provider.append(クレデンシャル)

data["credentials_for_provider"] = credentials_for_provider
データを返す

field_validator("tools", mode="before")
クラスメソッド
def validate_tools(cls, value) -> list[ToolConfiguration].
if not isinstance(value, list): if not isinstance(value, list): if not isinstance(value, list).
raise ValueError("ツールはリストであるべき")

tools: list[ToolConfiguration] = [].

ツール・イン・バリュー
#をyamlから読み込む
if not isinstance(tool, str): if not isinstance(tool, str).
raise ValueError("ツールパスは文字列であるべき")
トライしてみよう。
file = load_yaml_file(tool)
tools.append(
ツール設定(
identity=ToolIdentity(**file["identity"])、
parameters=[ToolParameter(**param) for param in file.get("parameter", []) or []]、
description=ToolDescription(**file["description"])、
extra=ToolConfigurationExtra(**file.get("extra", {}))、
output_schema=file.get("output_schema", None)、
)
)
例外を除く。
raise ValueError(f "Error loading tool configuration: {str(e)}") from e

リターンツール

class ToolProviderType(Enum).
"""
ツール・プロバイダの列挙クラス
"""

BUILT_IN = "ビルトイン"
WORKFLOW = "ワークフロー"
API = "api"
APP = "app"
DATASET_RETRIEVAL = "データセット検索"

クラスメソッド
def value_of(cls, value: str) -> "ToolProviderType".
"""
指定されたモードの値を取得する。

:param value: モード値
:return: モード
"""
for mode in cls.
if mode.value == value.
復帰モード
raise ValueError(f "無効なモード値{値}")

クラス ToolSelector(BaseModel).
クラス Parameter(BaseModel).
name: str = Field(...説明="パラメータの名前")
type: ToolParameter.ToolParameterType = Field(...) , description="パラメータのタイプ説明="パラメータのタイプ")
required: bool = フィールド(...)説明="パラメータが必須かどうか")
description: str = Field(...description="パラメータの説明")
デフォルト:Optional[Union[int, float, str]] = None
オプション: オプション

なし

provider_id: str = フィールド(...)説明="プロバイダーのID")
tool_name: str = フィールド(...)説明="ツールの名前")
tool_description: str = Field(... , description="ツールの説明")description="ツールの説明")
tool_configuration: Mapping[str, Any] = Field(...) , description="Configuration, type form.説明="設定、タイプフォーム")
tool_parameters: マッピング[str, パラメータ] = フィールド(...)説明="パラメータ、タイプllm")

def to_prompt_message(self) -> PromptMessageTool.
"""
openai関数呼び出しスキーマに基づき、ツールセレクタをプロンプトメッセージツールに変換。
"""
tool = PromptMessageTool()
name=self.tool_name、
description=self.tool_description、
parameters={
"type": "object"、
「properties": {}、
"必須": []、
},
)

for name, parameter in self.tool_parameters.items()::
tool.parameters[name]={。
"type": parameter.type.value、
"description": parameter.description、
}

if parameter.required.
tool.parameters["required"].append(name)

if parameter.options.
tool.parameters[name]["enum"] = [option.value for option in parameter.options] (パラメータ.オプションのオプションの値)

リターンツール
ファイルの目的
ツールのYAMLファイル(your_plugin.yaml)で定義します。
ツールに関する基本的な身元情報
人間とAIエージェント双方の説明
ツールが受け付けるパラメータ
これらのパラメーターの表示と収集方法
実施例
Dropbox用のツールYAMLファイルはこんな感じです。
ceate_folder.yaml。
アイデンティティを持つ。
name: create_folder
著者:ルキャンディ
のラベルが貼られている。
ja_US: フォルダの作成
zh_Hans: フォルダの作成
pt_BR: クリア・パスタ
ja_jp: 折りたたみ
zh_Hant: フォルダの作成
という記述がある。
人間だ。
ja_US: Dropbox に新しいフォルダを作成する
zh_Hans: Dropboxに新しいフォルダを作成する
pt_BR: Dropboxで新しいパスタを作る
ja_jp: DropboxがFridaの新バージョンを作りました!
zh_Hant: Dropboxに新しいフォルダを作成する
llm: Dropboxの指定したパスに新しいフォルダを作成します。 作成したフォルダのパスやIDなどの情報を返します。
パラメータがある。
- 名前: folder_path
タイプ: 文字列
必須:true
のラベルが貼られている。
ja_US: フォルダー・パス
zh_Hans: フォルダーパス
pt_BR: カミーニョ・ダ・パスタ
ja_jp:ォルダパス
zh_Hant: フォルダーパス
human_description。
ja_US: Dropboxでフォルダが作成されるパス
zh_Hans: Dropboxのフォルダ作成パス
pt_BR: Dropboxでパスタを作る方法
ja_jp: Dropboxでフォルダを作成するパス
zh_Hant: Dropboxに作成したいフォルダへのパス。
llm_description: Dropboxにフォルダが作成されるパス。 '/Documents/Projects' や '/Photos/' のように完全なパスで指定します。Vacation2023'のように完全なパスで指定します。 パスは大文字と小文字を区別し、スラッシュで始まる必要があります。
フォーム:llm
エクストラ
パイソン
ソース: tools/create_folder.py
delete_file.yaml。
アイデンティティを持つ。
name: delete_file
著者:ルキャンディ
のラベルが貼られている。
ja_US: ファイル/フォルダの削除
zh_Hans: ファイル/フォルダの削除
pt_BR: 検索/パスタを除く
ja_jp: ファイル/フォルダ削除
zh_Hant: ファイル/フォルダの削除
という記述がある。
人間だ。
ja_US: Dropbox からファイルまたはフォルダを削除する
zh_Hans: Dropboxからファイルやフォルダを削除する
pt_BR: Dropboxからファイルやファイルを除外する
ja_jp: Dropboxからファイルやフォルダを削除します。
zh_Hant: Dropboxからファイルやフォルダを削除する
llm: Dropbox から指定したパスにあるファイルまたはフォルダを完全に削除します。 削除したアイテムに関する確認情報を返します。
パラメータがある。
- 名前: file_path
タイプ: 文字列
必須:true
のラベルが貼られている。
ja_US: ファイル/フォルダ・パス
zh_Hans: ファイル/フォルダパス
pt_BR:カミーニョ・ド・アーキボ/パスタ
ja_jp:ファイル/フォルダパス
zh_Hant: ファイル/フォルダパス
human_description。
ja_US: Dropbox から削除するファイルまたはフォルダのパス
zh_Hans: Dropboxから削除するファイルまたはフォルダのパス
pt_BR: Dropboxを除外するためのファイルまたはフォルダへのリンク
ja_jp: Dropboxから削除するファイルやフォルダのパス
zh_Hant: Dropboxから削除したいファイルまたはフォルダへのパス
llm_description: Dropboxから削除するファイルやフォルダのパス。 '/Documents/report.txt'や'/Photos/Vacation2023' のように完全なパスで指定します。 パスは大文字と小文字を区別し、スラッシュで始まる必要があります。 警告 - これは永久削除です。
フォーム:llm
エクストラ
パイソン
ソース: tools/delete_file.py
download_file.py.
アイデンティティを持つ。
name: download_file
著者:ルキャンディ
のラベルが貼られている。
ja_US: ダウンロードファイル
zh_Hans: ファイルのダウンロード
pt_BR: 地図を見る
ja_jp: ファイルダウンロード
zh_Hant: ファイルのダウンロード
という記述がある。
人間だ。
ja_US: Dropboxからファイルをダウンロードする
zh_Hans: Dropboxからファイルをダウンロードする
pt_BR: Dropboxからファイルをダウンロードする
ja_jp: Dropboxからファイルをダウンロードします。
zh_Hant: Dropboxからファイルをダウンロードする
llm: 指定したパスのDropboxからファイルをダウンロードします。 ファイルのメタデータと、オプションでファイルの内容(バイナリファイルの場合はbase64、テキストファイルの場合はtext)を返します。で)。
パラメータがある。
- 名前: file_path
タイプ: 文字列
必須:true
のラベルが貼られている。
ja_US: ファイルパス
zh_Hans: ファイルパス
pt_BR: カミーニョ・ド・アーキボ
ja_jp: ファイルパス
zh_Hant: ファイルパス
human_description。
ja_US: Dropboxからダウンロードするファイルのパス
zh_Hans: Dropboxからダウンロードするファイルへのパス
pt_BR: Dropboxを開くには?
ja_JP: Dropboxからダウンロードするファイルのパス
zh_Hant: Dropboxからダウンロードしたいファイルへのパス
llm_description: Dropboxからダウンロードするファイルのパス。 '/Documents/report.txt'のように。 パスは大文字と小文字を区別し、スラッシュで始まる必要があります。
フォーム:llm
- name: include_content
タイプ: boolean
必須: false
デフォルト:false
のラベルが貼られている。
ja_US: コンテンツを含む
zh_Hans:コンテンツ
pt_BR: データを含める
ja_JP: 目次
zh_Hant: コンテンツを含む
human_description。
en_US: レスポンスにファイルの内容を含めるかどうか
zh_Hans: レスポンスにファイルの内容を含めるかどうか。
pt_BR: 回答には入力内容を含める必要があります。
ja_jp:『ラスポニ』に収録されている内容です。
zh_Hant: レスポンスにファイルの内容を含めるかどうか。
llm_description: レスポンスにファイルの内容を含めるには true を設定します。 小さなテキストファイルの場合、内容はテキストとして提供されます。 バイナリファイルの場合、内容は base64 エンコードされた文字列として提供されます。デフォルトは false です。
フォーム:llm
エクストラ
パイソン
ソース: tools/download_file.py

dropbox.yaml。
アイデンティティを持つ。
名前:ドロップボックス
著者:ルキャンディ
のラベルが貼られている。
米国: Dropbox
zh_Hans: Dropbox
pt_BR: Dropbox
ja_JP: Dropbox
zh_Hant: Dropbox
という記述がある。
人間だ。
ja_US: Dropboxとの連携
zh_Hans: Dropboxとの対話
pt_BR: Dropboxとの連携
ja_JP: Dropboxと接続性
zh_Hant: Dropboxとの対話
llm:Dropboxサービスへのアクセスを提供し、Dropboxアカウント内のファイルやフォルダを操作できるようにします。
パラメータがある。
- name: クエリー
タイプ: 文字列
必須:true
のラベルが貼られている。
ja_US: 問い合わせ文字列
zh_Hans:クエリーステートメント
pt_BR: 相談窓口
ja_jp: K'eriテキストコラム
zh_Hant:問い合わせステートメント
human_description。
ja_US: Dropboxの操作クエリを入力してください。
zh_Hans: Dropboxの操作クエリを入力してください。
pt_BR: Dropboxの操作カウンタをダウンロードする
ja_JP: Dropboxの操作 クエリを入力してください
zh_Hant: 実行したいDropboxの操作を入力してください。
llm_description: 実行したいDropboxの操作を説明するクエリ。
フォーム:llm
エクストラ
パイソン
ソース: tools/dropbox.py
主要コンポーネント
アイデンティティ部門
name: ツールの内部名 (ファイル名と一致させる)
author:ツールを作成した人
label: 各言語での表示名
説明欄
human: 人間のユーザーに対して、さまざまな言語で表示される説明文
llm:AIエージェントに提供される説明で、ツールが何をするのか、どのように使うのかを理解する。
パラメーターセクション。
ツールが受け付けるパラメータのリスト。
name: パラメータ識別子(Pythonコード内で使用)
type:データ型(文字列、数値、ブーリアンなど)
required: このパラメータが必須かどうか
ラベル:ユーザーフレンドリーな各国語表記
human_description:さまざまな言語による人間ユーザーへの説明
llm_description: AIエージェントがこのパラメータを理解するための説明
フォーム:パラメータの収集方法
llm:AIエージェントがユーザーのクエリから抽出
ワークフロー:ユーザーがUIで変数として提供する必要があります。
オプション: default: このパラメータのデフォルト値
エクストラ・セクション
python.source: ツールのPython実装ファイルへのパス。
重要な注意事項
ファイルの分離。
重要!ツールの機能が、電子メールの読み書き、データベースの読み込みや更新など、異なる場合は、yamlファイルを複数に分ける必要があります。原則は、それぞれのyamlファイルとコードファイルは、各タイプのツール実行専用です。 ファイル自体は、ツールが実行するパラメータのみを抽出します。例えば、データベースの読み取りと更新を行う場合、read_database.yamlとupdate_database.yamlの2つのyamlファイルを別々に使用します。database.yaml を別々に使用します。
LLMの説明
ツールもパラメータもllmの記述が重要で、AIエージェントにツールの使い方を伝えます。
どのようなパラメータが必要で、ツールがどのような情報を返すのかを明確にする。
これは、AIエージェントがツールを使用するタイミングや、ユーザーのクエリからパラメータを抽出する方法を決定するのに役立ちます。
パラメータ設定。
各パラメーターについて、必須かどうかを指定する。
適切なデータ型を選択する
AIにユーザーからの問い合わせからフォームを抽出させたい場合は、フォームをllmに設定します。
ユーザーが直接入力する場合は、フォームをワークフローに設定する。
ローカライゼーション。
必要に応じて、多言語のラベルや説明文の翻訳を提供する。
最低限、英語(en_US)を含むこと。
あなた自身のツールのYAMLファイルを作成するには、この構造をあなたの特定のツールに適合させ、どのようなパラメータが必要で、それらがどのように表示されるべきかを明確に定義します。を明確に定義する。
5.tools/your_plugin.pyの編集方法
このファイルには、APIリクエストを行い、結果を処理するツールの実際のロジックが含まれています。このファイルには、APIリクエストを行い、結果を処理するツールの実際のロジックが含まれています。 Google Searchを例にして、このファイルの作成方法を説明します。
ファイルの目的
ツールのPythonファイル(your_plugin.py)は以下の役割を担っています。
サービスへのAPIリクエスト
回答の処理
Difyで使用可能なフォーマットで結果を返す
必要なコンポーネント
ツールクラスは dify_plugin を継承しなければなりません。
ジェネレーターを返す _invoke メソッドを実装する必要があります。
これらの不可欠な輸入品を含めなければならない。
from collections.abc import ジェネレーター
from typing import Any
from dify_plugin import ツール
from dify_plugin.entities.tool.import ToolInvokeMessage
実施例
Dropboxツールの実装はこんな感じ。
ceate_folder.yaml。
from collections.abc import ジェネレーター
from typing import Any

from dify_plugin import ツール
from dify_plugin.entities.tool.import ToolInvokeMessage
from dropbox.exceptions import ApiError, AuthError

from dropbox_utils import DropboxUtils

クラス CreateFolderTool(Tool).
def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessage, None, None].
"""
Dropboxにフォルダを作成する
"""
# パラメータを取得する
folder_path = tool_parameters.get("folder_path", "")

# パラメータの検証
folder_path でない場合: folder_path でない場合: folder_path でない場合。
yield self.create_text_message("Dropboxのフォルダパスが必要です。")
戻る

# フォルダパスが / で始まっていることを確認する。
if not folder_path.startswith("/")::
folder_path = "/" + folder_path

トライしてみよう。
# クレデンシャルからアクセストークンを取得する
access_token = self.runtime.credentials.get("access_token")
access_tokenでない場合。
yield self.create_text_message("Dropboxのアクセストークンが必要です。")
戻る

# Dropboxクライアントを取得する
トライしてみよう。
dbx = DropboxUtils.get_client(access_token)
except AuthError as e.
yield self.create_text_message(f "認証に失敗しました:{str(e)}")
戻る
例外を除く。
yield self.create_text_message(f "Dropboxへの接続に失敗しました:{str(e)}")
戻る

# フォルダの作成
トライしてみよう。
result = DropboxUtils.create_folder(dbx, folder_path)

# 応答を作成する
summary = f "フォルダ '{result['name']}' は '{result['path']}' に正常に作成されました"
yield self.create_text_message(要約)
yield self.create_json_message(result)

except ApiError as e.
str(e)に "path/conflict "が含まれている場合。
yield self.create_text_message(f "{folder_path}' に既にフォルダが存在します。)
そうでなければ
yield self.create_text_message(f "フォルダ作成エラー:{str(e)}")
戻る

例外を除く。
yield self.create_text_message(f "Error: {str(e)}")
戻る
delete_file.py
from collections.abc import ジェネレーター
from typing import Any

from dify_plugin import ツール
from dify_plugin.entities.tool.import ToolInvokeMessage
from dropbox.exceptions import ApiError, AuthError

from dropbox_utils import DropboxUtils

クラス DeleteFileTool(Tool).
def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessage, None, None].
"""
Dropbox からファイルまたはフォルダを削除する
"""
# パラメータを取得する
file_path = tool_parameters.get("file_path", "")

# パラメータの検証
file_path でない場合: file_path でない場合: file_path でない場合。
yield self.create_text_message("Dropboxのファイルまたはフォルダのパスが必要です。")
戻る

# パスが / で始まることを確認する。
if not file_path.startswith("/"):.
file_path = "/" + file_path

トライしてみよう。
# クレデンシャルからアクセストークンを取得する
access_token = self.runtime.credentials.get("access_token")
access_tokenでない場合。
yield self.create_text_message("Dropboxのアクセストークンが必要です。")
戻る

# Dropboxクライアントを取得する
トライしてみよう。
dbx = DropboxUtils.get_client(access_token)
except AuthError as e.
yield self.create_text_message(f "認証に失敗しました:{str(e)}")
戻る
例外を除く。
yield self.create_text_message(f "Dropboxへの接続に失敗しました:{str(e)}")
戻る

# ファイルまたはフォルダを削除する
トライしてみよう。
result = DropboxUtils.delete_file(dbx, file_path)

# 応答を作成する
summary = f"'{result['name']}' の削除に成功"
yield self.create_text_message(要約)
yield self.create_json_message(result)

except ApiError as e.
if "path/not_found" in str(e)::
yield self.create_text_message(f "ファイルまたはフォルダが '{file_path}' で見つかりません")
そうでなければ
yield self.create_text_message(f "ファイル/フォルダの削除エラー: {str(e)}")
戻る

例外を除く。
yield self.create_text_message(f "Error: {str(e)}")
戻る
download_file.yaml。
from collections.abc import ジェネレーター
インポート base64
from typing import Any

from dify_plugin import ツール
from dify_plugin.entities.tool.import ToolInvokeMessage
from dropbox.exceptions import ApiError, AuthError

from dropbox_utils import DropboxUtils

class DownloadFileTool(Tool).
def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessage, None, None].
"""
Dropboxからファイルをダウンロードする
"""
# パラメータを取得する
file_path = tool_parameters.get("file_path", "")
include_content = tool_parameters.get("include_content", False)

# パラメータの検証
file_path でない場合: file_path でない場合: file_path でない場合。
yield self.create_text_message("Dropboxのファイルパスが必要です。")
戻る

# ファイルパスが / で始まっていることを確認する。
if not file_path.startswith("/"):.
file_path = "/" + file_path

トライしてみよう。
# クレデンシャルからアクセストークンを取得する
access_token = self.runtime.credentials.get("access_token")
access_tokenでない場合。
yield self.create_text_message("Dropboxのアクセストークンが必要です。")
戻る

# Dropboxクライアントを取得する
トライしてみよう。
dbx = DropboxUtils.get_client(access_token)
except AuthError as e.
yield self.create_text_message(f "認証に失敗しました:{str(e)}")
戻る
例外を除く。
yield self.create_text_message(f "Dropboxへの接続に失敗しました:{str(e)}")
戻る

# ファイルをダウンロードする
トライしてみよう。
result = DropboxUtils.download_file(dbx, file_path)

# 応答を作成する
レスポンス = {
"name": result["name"]、
"path": result["path"]、
"id": result["id"]、
"サイズ": result["size"]、
"modified": result["modified"]. }

# 要求があれば内容を含める
if include_content.
# バイナリコンテンツをbase64エンコードする
response["content_base64"] = base64.b64encode(result["content"]).decode('utf-8')

# 十分小さければテキストとしてデコードを試みる
if result["size"] < 1024 * 1024: # 1MB未満
トライしてみよう。
text_content = result["content"].decode('utf-8')
response["content_text"] = text_content
except UnicodeDecodeError.
# テキストファイルではなく、base64をインクルードしてください。
パス

summary = f "ファイル '{result['name']}' のダウンロードに成功しました"
yield self.create_text_message(要約)
yield self.create_json_message(レスポンス)

except ApiError as e.
yield self.create_text_message(f "ファイルのダウンロードエラー:{str(e)}")
戻る

例外を除く。
yield self.create_text_message(f "Error: {str(e)}")
戻る
留意点
ファイルの分離。
重要: 電子メールの読み書き、データベースの読み込みや更新など、異なる機能を持つツールの場合、yamlファイルをより多くのファイルに分割する必要があります。原則としては、それぞれのyamlファイルとコードファイルは、それぞれのタイプのツール実行専用です。 ファイル自体は、ツールの機能が使用するパラメータのみを抽出する必要があります。例えば、データベースの読み込みと更新を行う場合、read_database.pyとupdate_database.pyの2つのyamlファイルを別々に使用します。database.py を別々に使用します。
必要なインポート:ファイルの先頭には、必ず必要なインポートを記述してください。
クラスの継承: あなたのツールクラスは dify_plugin を継承しなければなりません。
パラメータを抽出する。
tool_parameters 辞書はツールの YAML ファイルで定義されたすべてのパラメーターを含みます。
例えば、tool_parameters["query"]のように、辞書キーを使って直接これらのパラメータにアクセスする。 これらのパラメータは、AIエージェントによってユーザーのクエリから自動的に抽出されます。
必要なパラメータを確実に処理し、パラメータがない場合は適切なエラー処理を行う。

query = tool_parameters["query"] #クエリパラメータを取り出すlimit = tool_parameters.get("limit", 10) #デフォルト値で取り出す#オプションのバリデーション if not query: raise ValueError("Query parameter cannot be empty")
クレデンシャルへのアクセス。
self.runtime.credentialsを使用して認証情報にアクセスします。
キーはプロバイダの YAML ファイルで定義されているものと一致します。
例:self.runtime.credentials["serpapi_api_key"]。 レスポンス処理: API レスポンスから関連情報のみを抽出するヘルパーメソッドを作成する。
結果を返す: データを返すには、いずれかのメッセージ作成メソッドで yield を使う必要があります。
独自のツールを実装するときは、tool_parameters辞書から必要なパラメータをすべて正しく抽出し、必要に応じて検証してください。利用可能なパラメータはツールの YAML ファイルで定義され、AI エージェントによってユーザーのクエリから自動的に抽出されます。
6.PRIVACY.mdとREADME.mdの作り方
あなたは、Difyプラグインのプライバシーポリシーとreadmeファイルを作成することになりました。 これらのファイルは、Markdown形式で書かれており、重要な役割を果たします。これらのファイルはMarkdown形式で書かれており、あなたのプラグインのユーザーや開発者にとって重要な役割を果たします。
プライバシー
PRIVACY.mdファイルには、プラグインがどのようなデータを収集し、どのようにそのデータを使用するかなど、プラグインのプライバシープラクティスの概要が記述されています。 これは、データのプライバシーを心配するユーザーにとって重要な情報です。ユーザーにとって重要な情報です。
何を含めるか
あなたが共有したプレースホルダー・テキスト("!!!! プラグインのプライバシーポリシーを記入してください。")を含める必要があります。
プラグインが収集するデータ
データの保存および処理方法
どのようなサードパーティ・サービスを利用しているか(利用している場合)
データに関するユーザーの権利
データの保持期間
プライバシーに関するお問い合わせ先
構造例
#プライバシーポリシー

##データ収集
[プラグインがどのようなユーザーデータを収集するのか、またその理由を説明してください。]

## データ処理
[収集したデータがどのように処理されるかを説明すること]。

## サードパーティ・サービス
[あなたのプラグインが使用するサードパーティ・サービスをリストアップし、そのプライバシー・ポリシーにリンクすること。]

##データ保持
[ユーザーデータの保存期間を説明せよ]

##ユーザーの権利
[利用者がデータに関して有する権利の概要]

##連絡先情報
[個人情報保護に関する問い合わせ先を提供する]。

最終更新日: [日付] README.md
README.mdファイルは、プラグインの機能、インストール方法、使用方法など、プラグインに関する重要な情報を提供します。 これは、ほとんどのユーザーと開発者が最初に参照するドキュメントです。ドキュメントです。
何を含めるか
あなたが共有した例 (Jira プラグインの readme) に基づいて、以下を含める必要があります。
メイン見出しとしてのプラグイン名
著者情報
バージョン情報
プラグインの種類
プラグインが行うことの詳細
インストール方法
使用例
設定オプション
トラブルシューティング情報
構造例
# あなたのプラグイン名

作成者:** [あなたの名前または組織] ** バージョン:** [現在のバージョン番号 バージョン:** [現在のバージョン番号] **タイプ:** [プラグインの種類 **タイプ:** [プラグインタイプ]

## 説明
[あなたのプラグインが何をするのか、詳しく説明してください。]

##の特徴
- 特集1 - 特徴2 - 特徴3

##インストール
[ステップ・バイ・ステップのインストール手順を提供する]。

##の構成
[プラグインの設定方法を説明する]。

##使用例
[プラグインの使用例を示すこと]

##トラブルシューティング
[よくある問題とその解決策を挙げる]

## 寄与
[他の人がどのようにあなたのプラグインに貢献できるかを説明する]。

##ライセンス
[あなたのプラグインがリリースされているライセンスを指定してください]。 画像を使用する
ご指摘の通り、どちらかの文書に画像を入れたい場合。
画像を_assetsフォルダに保存する。
相対パスを使ってMarkdownで参照する。
![画像の説明](_assets/image_name.png)
これらのファイルはどちらもMarkdownフォーマット(拡張子.md)で記述し、プラグインプロジェクトのルート・ディレクトリに置く必要があります。 プラグインが進化するにつれて、これらのファイルは常に最新の状態に保つようにしてください。プラグインが進化するにつれて、これらのファイルを常に最新の状態に保つようにしてください。
要件.txt
txtファイルに~=を使用することで、常に最新の依存関係を使用する必要があり、dify_plugin~=0.0.1b72は必須です。

無断転載を禁じます:チーフAIシェアリングサークル " カーソルを使ったDifyプラグイン開発のヒント
ja日本語