🔖

Dify プラグインの仕組みについて調べてみた

に公開

こんにちは、nachiです。
Dify では、v1からプラグインと呼ばれる機能が追加されました。

さきにまとめ

メリット

  • Dify標準機能で実現できない処理を実現できる
  • 比較的導入ハードルが低い
    • 従来までは、別途APIの開発が必要
    • パッケージ化して、インストールするだけで利用可能

デメリット

  • OSS依存となってしまう
    • OSSバージョンアップに伴い、プラグインも更新する必要がある
  • テスト・デバッグ
    • デバックの仕組みはあるが、環境構築など必要
  • 監視
    • ローカルランタイムでは、同一サーバでリソースを共有するため、個別のリソース監視や制限が難しい
      • サーバレスランタイムでは、解決される
  • セキュリティリスク
    • プラグインはDifyシステムに一定のアクセス権限を持つため、信頼できるプラグインのみ使用する必要がある

プラグイン

プラグインでは、事前に行いたい処理が記載されたスクリプトファイルと設定ファイル等を準備し、バッケージ化(.difypkg)します。
その後、Dify環境にインストールすることで利用可能となります。

https://qiita.com/DifyJapan/items/c9818705cb2182c2cf2d

従来までは、Dify標準で提供していない機能は:

  • 各プロバイダーが提供しているツールを利用する
  • 別途APIを立てて、その中で処理をする

などの対応が必要でした。

これらの課題として:

  • 利用したいツールが公開されていない・要件に合致しない
  • API開発工数がかかる

などのデメリットがありましたが、プラグインを利用することで解決されます。

種類

以下5種類のプラグインを提供します。

モデル

Dify標準で提供していないモデルを組み込むことができます。
例えば、独自LLMなどをDifyで利用したいシーンなどで便利そうです。

ツール

ワークフロー等から呼び出すことのできる処理を組み込むことができます。
Dify標準では難しい機能でも、ツールを独自に作成することで実現できるようになります。

エージェント戦略

個別にLLMの推論や意思決定ロジックを定義できます。
例えば、マーケットプレイスでは、MCPを使ったエージェント戦略も公開されています。
https://github.com/hjlarry/dify-plugin-mcp_agent

拡張機能

エンドポイントを提供する機能です。
利用シーンとしては、以下のようにSlackの受信エンドポイントとして使うようなこともできます。

https://docs.dify.ai/ja-jp/plugins/best-practice/develop-a-slack-bot-plugin

バンドル

複数のプラグインをまとめたものです。
複数のDify環境を利用しているようなシーンでは重宝しそうな機能です。

仕組み

Dify プラグインは、Plugin Daemon によって実現しています。

https://github.com/langgenius/dify-plugin-daemon/tree/main?tab=readme-ov-file

Plugin Daemon では、プラグインの管理・プラグインの実行などを行います。

プラグインインストール

ユーザによってインストールされたプラグインは、DBとPlugin Daemonサービスのstorageによって管理されます。

https://github.com/langgenius/dify-plugin-daemon/blob/bcdd0099359ffe98c6c647d6c4e74e21a16d9e48/internal/core/plugin_manager/install_to_local.go#L13-L39

Manifest

プラグインのインストールは、Manifestファイルに基づいて行われます。

manifest.yaml
version: 0.0.1
type: plugin
author: プラグイン開発者名
name: プラグイン名
label:
  en_US: 英語でのラベル
  ja_JP: 日本語でのラベル
  zh_Hans: 中国語でのラベル
  pt_BR: ポルトガル語でのラベル
description:
  en_US: 英語での説明
  ja_JP: 日本語での説明
  zh_Hans: 中国語での説明
  pt_BR: ポルトガル語での説明
icon: icon.svg
resource:
  memory: 268435456
  permission: {}
plugins:
  tools:
    - provider/app.yaml
meta:
  version: 0.0.1
  arch:
    - amd64
    - arm64
>  runner:
>    language: python
>    version: "3.12"
>    entrypoint: main
created_at: 2025-04-14T13:03:34.006227+09:00
privacy: PRIVACY.md
verified: false

特筆すべき箇所としては、runnerでランタイム構成を設定しています。

現在は、Pythonのみをサポートしていますが、今後は、Goもサポートされるようです。

Select the language you want to use for plugin development, and press Enter to continue, 
BTW, you need Python 3.12+ to develop the Plugin if you choose Python.
  python
-> go (not supported yet)

ランタイム

Dify プラグインのランタイムとして3種類がサポートされています。

ローカルランタイム

Plugin Daemonのサブプロセスとして起動し、STDIN/STDOUT を介してプラグインと通信します。

デバッグランタイム

デバッグランタイムでは、デバッグサーバーで処理を動作させます。

デバッグサーバー内を確認することで、プラグインが正しく動作するかどうかをテストできます。

https://docs.dify.ai/plugins/quick-start/debug-plugin

サーバレスランタイム

AWS Lambda などのサードパーティサービスにパッケージ化され、デーモンによって HTTP プロトコル経由で呼び出されます。

上記以外の情報を見つけられませんでしたが、パッケージをDifyにインストールすると自動デプロイが行われ、プラグインのランタイムをクラウド環境にできるようです。

https://github.com/langgenius/dify-plugin-daemon/blob/bcdd0099359ffe98c6c647d6c4e74e21a16d9e48/internal/core/plugin_manager/install_to_serverless.go#L15-L49

さいごに

Dify v1 から導入されたプラグイン機能により、これまで標準機能では実現できなかった高度な処理や外部サービスとの連携が、より簡単かつ柔軟に実現できるようになりました。

OSSに依存することで保守やセキュリティ面での注意点はあるものの、それを上回るメリットも多く、今後積極的に活用していきたい機能です。

特に「サーバレスランタイム」が本格的に利用できるようになれば、これまでの課題を大きく解決する可能性があり、今後のアップデートに期待しています。
プラグイン開発も、近日ブログにまとめる予定です!

UPGRADE tech blog

Discussion