このドキュメントは、Pythonコードを記述してDifyのモデルサポートを追加または強化する必要がある開発者向けのもので、ディレクトリ構造の作成、モデル設定の記述、モデル呼び出しロジックの実装、プラグインのデバッグと公開までの完全なプロセスを詳細にガイドし、コアメソッドの実装とエラー処理の詳細を含んでいます。
dify-official-plugins
のローカルクローン)の models/
ディレクトリ内で、モデルプロバイダー名でフォルダを見つけるか作成します(例:models/my_new_provider
)。models
サブディレクトリの作成: プロバイダーディレクトリ内に models
サブディレクトリを作成します。models/models/
ディレクトリ内に、サポートする必要のある各モデルタイプごとにサブディレクトリを作成します。一般的なタイプには以下が含まれます:
llm
: テキスト生成モデルtext_embedding
: テキストEmbeddingモデルrerank
: Rerankモデルspeech2text
: 音声認識モデルtts
: テキスト読み上げモデルmoderation
: コンテンツ審査モデルmodels/models/llm/
)に、そのタイプのモデル呼び出しロジックを実装するためのPythonファイルを作成します(例:llm.py
)。my-model-v1.yaml
)。_position.yaml
ファイルを作成して、そのタイプ下のモデルがDify UIに表示される順序を制御できます。my_provider
がLLMとEmbeddingをサポートすると仮定):
models/models/llm/
)に、追加するモデル用のYAMLファイルを作成します。ファイル名は通常、モデルIDと一致させるか、説明的なものにします(例:my-llm-model-v1.yaml
)。model
: (必須)モデルの公式API識別子。label
: (必須)Dify UIに表示される名前(多言語対応)。model_type
: (必須)所在するディレクトリタイプと一致する必要があります(例:llm
)。features
: (オプション)モデルがサポートする特殊機能(vision
、tool-call
、stream-tool-call
など)を宣言します。model_properties
: (必須)モデル固有のプロパティ(mode
(chat
またはcompletion
)、context_size
など)を定義します。parameter_rules
: (必須)ユーザーが調整可能なパラメータとそのルール(名前name
、タイプtype
、必須required
、デフォルト値default
、範囲min
/max
、オプションoptions
など)を定義します。use_template
を使用して事前定義されたテンプレートを参照し、一般的なパラメータ(temperature
、max_tokens
など)の設定を簡略化できます。pricing
: (オプション)モデルの課金情報を定義します。claude-3-5-sonnet-20240620.yaml
):
llm.py
)に、API呼び出し、パラメータ変換、結果返却を処理するコードを記述する必要があります。
models/models/llm/
)で、対応するPythonファイル(例:llm.py
)を作成または開きます。
MyProviderLargeLanguageModel
。dify_plugin.provider_kits.llm.LargeLanguageModel
を継承します。_invoke(...)
: コア呼び出しメソッド。
def _invoke(self, model: str, credentials: dict, prompt_messages: List[PromptMessage], model_parameters: dict, tools: Optional[List[PromptMessageTool]] = None, stop: Optional[List[str]] = None, stream: bool = True, user: Optional[str] = None) -> Union[LLMResult, Generator[LLMResultChunk, None, None]]:
credentials
と model_parameters
を使用してAPIリクエストを準備します。prompt_messages
形式をプロバイダーAPIが必要とする形式に変換します。tools
パラメータを処理します(モデルがサポートしている場合)。stream
パラメータに基づいて、ストリーミング呼び出しを行うか同期呼び出しを行うかを決定します。stream=True
の場合、このメソッドはジェネレータ(Generator
)を返す必要があり、yield
を介して LLMResultChunk
オブジェクトを逐次返却します。各チャンクには部分的な結果(テキスト、ツール呼び出しチャンクなど)とオプションの使用量情報が含まれます。stream=False
の場合、このメソッドは完全な LLMResult
オブジェクトを返す必要があります。これには最終的なテキスト結果、完全なツール呼び出しリスト、および総使用量情報(LLMUsage
)が含まれます。validate_credentials(self, model: str, credentials: dict) -> None
: (必須)ユーザーが認証情報を追加または変更する際にその有効性を検証するために使用されます。通常、簡単で低コストのAPIエンドポイント(利用可能なモデルのリスト表示、残高確認など)を呼び出すことで実装されます。検証に失敗した場合は、CredentialsValidateFailedError
またはそのサブクラスをスローする必要があります。
get_num_tokens(self, model: str, credentials: dict, prompt_messages: List[PromptMessage], tools: Optional[List[PromptMessageTool]] = None) -> int
: (オプションだが推奨)与えられた入力のトークン数を推定するために使用されます。正確に計算できない場合やAPIがサポートしていない場合は、0を返すことができます。
@property _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]
: (必須)エラーマッピング辞書を定義します。キーはDifyの標準 InvokeError
サブクラスであり、値はその標準エラーにマッピングされるべきプロバイダーSDKがスローする可能性のある例外タイプのリストです。これはDifyが異なるプロバイダーのエラーを統一的に処理するために不可欠です。
デバッグキー
とリモートサーバーアドレス
(例:http://<your-dify-domain>:5003
)を取得します。.env
ファイルを見つけるか作成します(.env.example
からコピーできます)。.env
ファイルを編集し、デバッグ情報を入力します:Ctrl+C
)。<provider_name>.difypkg
ファイルが生成されます。dify-official-plugins
リポジトリにプッシュします。langgenius/dify-official-plugins
メインリポジトリに対してプルリクエストを作成します。PRの説明には、行った変更、追加したモデルや機能、および必要なテスト手順を明確に記述します。manifest.yaml
仕様)