はじめに
Dify、使っていますか?
色々なLLMモデルを使えるのが一つの魅力ですよね。
今回は、Oracle Cloud Infrastructure(OCI)の生成AIサービス(Generative AI)で新たに利用可能になった Grok や Llama、Cohereなどのモデルを、Difyのプラグインで使えるように修正して、公式に反映されるところまでやってみました。
その手順や気づいたポイントをこの記事で紹介していきます。
今回承認されたPR(Pull Request)
Difyのモデル拡張性と開発のしやすさ
Difyは、OpenAIやAnthropic、Googleなどの主要なLLMプロバイダーのモデルをGUI上で簡単に扱って、アプリケーションを構築できるオープンソースのプラットフォームです。
モデルを切り替えて試せるだけでなく、独自のモデルやプラグインを追加することもでき、エンジニアだけでなく非エンジニアでも使いやすいのが特長です。
また修正を加えたプラグインのデバッグもDifyのUI上から行える(リモートデバック機能)ため、テストコードを書かなくても簡単に動作確認ができる点も便利で、非エンジニアフレンドリーです!
今回やってみたこと:DifyのプラグインにLLMモデルを追加!
今回は、OCIで使えるようになった以下のモデルを、Difyで動かせるようにプラグインを修正しました。
- meta.llama-4-maverick-17b-128e-instruct-fp8
- meta.llama-4-scout-17b-16e-instruct
- xai.grok-3
- cohere.embed-v4.0
そして最終的に、Dify公式のGitHubリポジトリにPull Request(PR)を提出し、無事にマージされるところまで進めました。
初めてのOSSへのコントリビュートでしたが、公式ドキュメントや過去のPull Requestを参考にしながら進めていきました。Difyのシンプルで分かりやすいプラグイン構成やリモートデバック機能でリアルタイムに動作を確認できたことで、最後までやり切ることができました!
OCIのGenerative AIについて
簡単に、今回追加したOCI(Oracle Cloud Infrastructure)のGenerative AIモデルについて触れておきます。
OCIでは、OCI Generative AIというサービスにて、いくつかの大規模言語モデル(LLM)が利用可能です。
OCIではこれらのモデルをAPI経由で呼び出せるようになっており、OpenAI API互換の形式で提供されているため、 OpenAIベースのDifyとも比較的スムーズに連携することができます。
手順
0. ドキュメントを読んでみる
新しいLLMモデル開発について、以下のようなドキュメントが用意されていたのでこちらを参考にしました。
- Difyプラグイン開発
- モデルの追加について
1. 開発環境の準備
対象ファイルに「:コロン文字」が含まれ、Windowsのファイル名では禁止されているため、Gitがファイルをローカルに展開できずエラーになります。WindowsPCで開発する場合は、WSLなどを利用して作業します。
Dify プラグイン開発のひな形ツールのインストール
Dify Plugin CLI プロジェクトのページにアクセスし、オペレーティングシステムに対応する最新バージョンのツールをダウンロードしてインストールします。
ubuntu@yushibats:~/tools$ ./dify-plugin version
v0.1.3
Python 環境の初期化
sudo apt install python3.12 python3.12-venv python3.12-dev -y
ubuntu@yushibats:~$ python3.12 --version
Python 3.12.3
公式プラグインリポジトリをフォーク&クローン
Dify公式プラグインリポジトリ https://github.com/langgenius/dify-official-plugins
langgenius/dify-official-pluginsを、Githubの自分のリポジトリにフォークします。
VScodeで開いて作業していきます。
拡張機能を利用するとWSLにリモート接続してコードを修正していくことができます。
ubuntu@yushibats:~/dify-official-plugins/models/oci$
dify-official-plugins のファイル構造
dify-official-pluginsの中には、いくつかのディレクトリが切られていますが、そのうち /models/
の中にプラグインとして追加できるLLMモデルのコンテンツが入っています。
用語 | 説明 |
---|---|
モデルプロバイダー | 大規模言語モデルの提供元。例:OpenAI、Anthropic、Googleなど。 |
モデルカテゴリ | モデルプロバイダーによって、大規模言語モデル(LLM)、テキスト埋め込みモデル(Text embedding)、音声テキスト変換(Speech2Text)などのカテゴリが存在します。 |
特定のモデル | claude-3-5-sonnet、gpt-4-turbo など、個別に指定できる具体的なモデル名。 |
今回はLLMモデルと、テキスト埋め込みモデルを追加するので、/models/oci/models/
の中にあるそれぞれllm
とtext_embedding
の中を確認していきます。
以下のようなファイル構造になっています。
modelsの中に、対応しているLLMプロバイダーがリストされています。
今回は既にあるOCIのモデルを追加するので、このディレクトリ下に必要なファイルを追加・修正していきます。
models/oci/
├── models # モデル実装と設定ディレクトリ
│ ├── llm # LLMタイプ
│ │ ├── _position.yaml (オプション、ソート順制御)
│ │ ├── my-llm-model-v1.yaml
│ │ ├── my-llm-model-v2.yaml
│ │ └── llm.py # LLM実装ロジック
│ └── text_embedding # Embeddingタイプ
│ ├── _position.yaml (オプション、ソート順制御)
│ ├── my-embedding-model.yaml
│ └── text_embedding.py # Embedding実装ロジック
├── provider # プロバイダーレベルのコードディレクトリ
│ └── my_provider.py (認証情報検証などに使用、詳細は「モデルプロバイダーの作成」ドキュメント参照)
└── manifest.yaml # プラグインマニフェストファイル
2. 該当ファイルを修正・追加する
以前OCIのモデルを追加して頂いた @engchina さんのPull Requestを参考にさせていただき、修正が必要な箇所を特定しました。
必要な箇所を修正していきます。
manifest.yaml
の更新
各モデルの.yaml
ファイルの作成
各モデルについて、パラメータや機能などを記述する.yaml
ファイルをそれぞれ用意します。
既にあるモデルのファイルを複製して、必要な箇所を書き換えます。
/oci/models/llm
- meta.llama-4-scout-17b-16e-instruct.yaml
- meta.llama-4-maverick-17b-128e-instruct-fp8.yaml
- xai.grok-3.yaml
/oci/models/text_embedding
主なパラメーターは以下のとおりです。
項目名 | 必須 | 説明 |
---|---|---|
model |
✓ | モデルの公式API識別子。一意のIDとして利用されます(例:meta.llama-4-scout-17b )。 |
label |
✓ | Dify UIで表示されるモデル名。多言語対応形式(例:en_US , ja_JP など)で記述。 |
model_type |
✓ | モデルの種類。llm , text_embedding など、格納されるディレクトリ名と一致する必要があります。 |
features |
任意 | モデルが持つ特殊機能を配列で指定。例:vision , tool-call , stream-tool-call など。 |
model_properties |
✓ | モデルの基本特性を記述。例:mode: chat (completion も可)、context_size: 8192 など。 |
parameter_rules |
✓ | モデルの調整可能パラメータ(例:temperature , max_tokens など)を定義。共通設定は use_template で簡略化可能。各ルールは、 name , type , required , default , min , max , options などで細かく制御。 |
pricing |
任意 | モデルの課金情報。例:入力/出力トークンごとの価格設定(input: 0.002 , output: 0.004 )。 |
_position.yaml
ファイルの修正
(オプション)
こちらのファイルで、そのカテゴリタイプ(llm
やtext_embedding
)下に配置されているモデルのDify UI上に表示される順番を指定できます。
-
/oci/models/llm/_position.yaml
該当の3つを追加します。
- cohere.command-r-08-2024
- cohere.command-r-plus-08-2024
- meta.llama-3.1-405b-instruct
- meta.llama-3.2-90b-vision-instruct
- meta.llama-3.3-70b-instruct
- meta.llama-4-scout-17b-16e-instruct #追加
- meta.llama-4-maverick-17b-128e-instruct-fp8 #追加
- xai.grok-3 #追加
/oci/models/text_embedding/_position.yaml
- cohere.embed-english-light-v2.0
- cohere.embed-english-light-v3.0
- cohere.embed-english-v3.0
- cohere.embed-multilingual-light-v3.0
- cohere.embed-multilingual-v3.0
- cohere.embed-v4.0 #追加
モデル呼び出しの.py
コードの更新
/models/
の中に、モデルタイプごとに呼び出しコードのPythonファイルが存在しています(例:llm.py
text_embedding.py
) 。
API呼び出し、パラメータ変換、結果返却を処理するコードを記述されており、こちらもモデル追加に併せて編集していきます。
詳細は、こちらに記述するとコードが長くなるので割愛しますが、修正点は以下をご覧ください。
主な修正内容としては以下の2点です。
-
OCILargeLanguageModel
に定義されているモデルを追加
class OCILargeLanguageModel(LargeLanguageModel):
_supported_models = {
-
_generate()
と_handle_generate_stream_response
メソッドに、新しく追加したプロバイダーxAIのGrok
を対応
requirements.txt
の更新
models/oci/requirements.txt
に記載された、依存ライブラリのバージョンを更新します。
Oracle SDKのアップデートと、dify_plugin
についてはPR後、レビュー時にこの内容で修正いただきました。
- dify_plugin==0.0.1b65
+ dify_plugin>=0.4.0,
numpy==2.1.3
- oci==2.139.0
+ oci==2.155.0
コードの修正は以上です!
では、早速正しく機能するか試していきます。
3. プラグインのDebug
修正したプラグインを リモートデバック機能を使用してテストしていきます!
リモートデバック機能とは、ローカルで開発したプラグイン開発環境と、Difyの環境を接続してデバックする方法です。
テストコードを用意することなく、UIでリアルタイムに動きが確かめることが出来るので非常に便利です。
プラグイン管理ページからデバックキーを取得
「プラグイン管理」(https://cloud.dify.ai/plugins) ページに移動し、リモートサーバーアドレスとデバッグキーを取得します。
.env
ファイルを作成
/models/ociに.env
ファイルを作成します。
先程取得したリモートサーバーアドレスとデバッグキーなどの情報を入力します。
INSTALL_METHOD=remote
REMOTE_INSTALL_URL=xx.xx.xx.xx(localhost):5003
REMOTE_INSTALL_KEY=f7xxxxxxe6ec-xxxx-a180-xxxxxxxx812
Ubuntu(WSL)で仮想環境の作成
リモート接続しているVSCodeのターミナルで、Python3.12の仮想環境を作成します。
python3.12 -m venv venv
source ./venv/bin/activate
依存環境のインストール
dify-plugin
パッケージは手動でインストールする必要があったので、以下を実行しました。
/models/oci
の中にある依存関係パッケージをインストールします。
pip install -r models/oci/requirements.txt
プラグインを起動
以下のコマンドを実行してプラグインを起動します。
以下のような形で、 {"event": "log", "data": {"level": "INFO", "message": "Installed model: oci", "timestamp": xxxxxx}}
のような形で表示されれば、正常に起動されています。
Successfully installed dify_plugin-0.0.1b65 gevent-24.2.1 httpx-0.27.2 pydantic_settings-2.3.4
(venv) ubuntu@yushibats:~/dify-official-plugins$ cd models/oci
(venv) ubuntu@yushibats:~/dify-official-plugins/models/oci$ python3 -m main
{"event": "log", "data": {"level": "INFO", "message": "Installed model: oci", "timestamp": 1751810230.593944}}
起動すると、Difyの画面に修正したプラグイン(0.0.4
)が表示されました!
私が追加したモデルも無事リストアップされていることが確認できました!
新しいプラグインを使用して動作をテストする際には、APIの設定が必要になるのでセットアップを行います。
OCI Generative AIのAPIキーのセットアップについてはこちらを参考にしてください。
追加したモデルを試してみる
追加したLLMのチャットモデルを試してみます。
返答が返ってくることが確認できました!
追加した埋め込みモデルも、ナレッジベースでベクトル化してみると上手く機能していることが確認できました。
4. Githubで公式レポジトリにPull Requestする
一通りの修正・動作確認が完了したら、いよいよPull Request(PR)を作成して、Dify公式リポジトリに修正リクエストをしていきます!
作業ブランチへPush
git status #修正ファイルとブランチを確認
git diff #修正内容を確認
git add .
git commit -m "Add Grok and Llama4 models for OCI GenAI"
git push -u origin grok
Pull Requestの作成
New pull request から新しいPRを作成していきます。
該当のブランチを選択して、修正内容などを記載していきます。
フォーマットがあったので、その記載内容に従ってメッセージを記入しました。
スクリーンショットを添付するように指示があったので、検証画像を取って添付しました。
PRが承認され公式レポジトリにマージされる
リクエストを出した2日後に、レビュワーの方からコメントが入り上記記載した一部(dify_plugin
のバージョン)修正して頂いたとのこと。
その後すぐにMergeされました!
マージされると、自分のDify環境でもすぐにプラグインのバージョンアップができ、新しいモデルが使えるようになりました。
まとめ:OSSコントリビュートとDifyプラグインの開発体験
今回、OCI Generative AIモデルをDifyに追加するという形で、はじめてOSSにコントリビュートしてみました。
- Difyのプラグイン構成がシンプルで分かりやすい
- UIからすぐに動作を確認できるリモートデバッグ機能
- 以前のPRやドキュメントを参考に
このような特徴を生かして、コードを書いて即確認、少しずつ改善していくという流れがとてもスムーズに行うことができました。
OSSに貢献する経験ができただけでなく、OCIのモデルの扱いやDifyの仕組みにも理解が深まる良い機会になりました。
最後に
今回の対応を通じて、Difyプラグイン開発の流れやコツを掴むことができました。
今後は、対応LLMによるマルチモーダル対応や、新たなLLMモデルの追加があった際には、引き続き積極的に対応していきたいと思います。
参考資料
ここまでで紹介した参考資料一覧です。
参考資料
この記事で参照した公式ドキュメントや関連リンクをまとめます。
Views: 0