最近話題の「Dify プラグイン」でOSSコントリビューターになった話
はじめに
趣味でプログラミングをしている独学弱々エンジニア&25卒文系大学生です。
元々、オープンソースのLLMアプリ開発プラットフォームである「Dify」の存在は知っていましたが、
この度、本格的にインターンしている会社(人材系)の業務改善で「Dify」の導入を試みました。
しかし、LLM(API)の料金を抑えたいという上からの要望が出てきてしまいました…
(ITに疎い会社だとあるあるかも??もっとAI信じて投資してくださいよ!笑)
こんな会社なので、導入〜保守・運用を見据え、
2025年2月末時点で安さ・知名度・安全性・アカウント管理のしやすさなどを加味して、
結局、Gemini(model:gemini-2.0-flash-lite)を使用することにしました。
クラウドで使ってみた
今回は会社の状況を踏まえ、クラウド版を採用しました。
最近、クラウド版でもプラグインが導入されたのも理由の1つですね!(実はこれが後のフラグになるとは、この時は見ず知らず…)
とりあえずいつも通り、LLMを含めたワークフローを構築し、実行っと!
※Difyバージョン:1.0.0
※Geminiプラグインのバージョン:0.0.6
※LLMのモデルは、「Gemini 2.0 Flash Lite Review 0205」を選択
え?動かない??
LLMノードで、エラー発生!
↓実際のエラー文
[models] Bad Request Error, 404 models/gemini-2.0-flash-lite-preview-0205 is not found for API version v1beta, or is not supported for generateContent. Call ListModels to see the list of available models and their supported methods.
原因探索開始!
モデルが選択できるようになっているのに、404 not found
エラーが出てしまっているので、解決できるか分かりませんが、とにかく原因を探ります!
前提
GeminiをワークフローのLLMノードで使用する場合、プロンプトの作成部分において、SYSTEM以外にUSERを設定する必要があります。
設定しない場合、以下のエラーが発生します。
[google] Error: PluginInvokeError: {"args":{"description":"[models] Error: The user prompt message is required. You only add a system prompt message."},"error_type":"InvokeError","message":"[models] Error: The user prompt message is required. You only add a system prompt message."}
⇒USERプロンプトが必要ですって書いてありますね〜
↓SYSTEMとかUSERってなに?
他のモデルで試してみる!
結果
- Gemini 1.5系:成功
- Gemini 2.0系:半分くらいのモデルで上記のエラー発生
とりあえず、Geminiの使用可能なモデルを調べてみる
結論:どうやらDifyクラウドで選択できるモデルは全部使用可能らしい(つまりDify側に原因がありそう)
調べ方
- 「Gemini 使用可能なモデル」でWeb検索
- 公式ドキュメント:細かいモデルまでは載ってない(大まかなモデルとモデルの命名規則は分かった)
- APIリファレンス:models.listメソッドで一覧取得できるらしい
- Postman:直接Gimini API(models.listメソッド)を叩き、現在使用可能なモデル一覧を確認
↓Postman(APIを気軽に叩けるサービス)
- Difyクラウドで選択可能なモデルと照らし合わせ、確認完了!(結果使用可能だった)
Difyのソースコード確認開始!
とりあえず、Dify側に問題がありそうなことがわかったので、Dify側で原因探索開始!
Difyのソースコード確認
結論:LLMノードのモデル管理は、Dify Offecial Pluginリポジトリで行われているらしい(Difyバージョン1.0.0から)
順序
あまり、これに気づく順序は正直覚えてませんが、こんな感じだったような…
- gemini(google)とvertex.aiは別物として扱われている(Dify上)
- geminiのモデルについて記述しているファイルがない
- Difyバージョン1.0.0からLLMはプラグインへ(以前はモデルプロバイダーとしてDifyリポ内で管理)
- プラグイン管理はDify Offecial Pluginリポで行われている
※これに気づくまでに、LangGeniusのリポジトリを色々漁りました笑
(早い人は、クラウド版いじるだけでLLMがプラグインになったことに気づけそうですが…)
↓最終的な決め手
Dify Offecial Pluginのソースコード確認
geminiに関するディレクトリを発見!
原因発見!
原因:モデル名の記述ミス
とりま、ディレクトリ構造を理解しながら、それぞれのファイルをファイルを眺めていると…
あれ?これ原因じゃね?
- Gemini APIの出力結果(Postman)
- 元々のリポジトリの記述
→記述が違うぞ!!
これ以外のモデルでも、同様の事象発見!
⇒追加されてないモデルもあるし、修正&新規追加全部やっちゃお!
(ってことはバージョンアップもできる??)
これってもしや??
これってもしや人生初のOSSコミットのチャンスかも??
OSSコミットは強強エンジニアのみが行うもので、自分には関係ないと思っていました。
しかし、業務改善には何としても必要だし、なにせ目の前にOSSコミットのチャンスがある!
これはやるしかないと思い、Dify Pluginのリポジトリを読んでみましたが、Difyのリポジトリと違って、Contribution Guideがありません。
ただ、他のissueを見て、あまりルールもなさそうだったので、すぐにコーディング開始!
コーディング開始!
- Difyのリポジトリをforkしてローカルにクローン
※Contribution Guideがなかったので、OSSコントリビュートのコンセンサス的な流れに習いました - PostmanでGimini API(models.listメソッド)を叩き、現在使用可能なモデル一覧とその詳細を確認
- VScodeを開き、以下を修正!
- 既存のモデルの詳細修正
- 新規モデル追加
- モデル一覧の更新
- geminiのプラグインのバージョンアップ(
0.0.6
→0.0.7
) - ついでにdify pluginもupdate
- コーディング完了!
ドキドキの初OSS Pull requests
過去に似たようなプルリク出している人がいたので、それを真似て作りました。
↓実際のプルリク
結果はいかに??
「他のプルリクも2、3日くらいマージされてないから気長に待たないとな」と思いながら、初のOSSプルリクなので、待てるはずもなく…
半日後、何もなし😞
確か、同じような悩み抱えてるissueどっかで見たな💡
あった、一旦プルリクにissueをメンションしてみよ!
あと、issueにもプルリクをメンションしてコメントしてみよ!
↓実際のissue
数分後、あっさりApproveされた(^o^)
※メンションするの大事かも!
(Difyのレビュアーは忙しいはずだから、メンションしないと目を通すのが遅くなると思う)
そしてテストが自動で走り、当然引っかかる訳もなく無事にクリア。
さらに数分後、mainにmergeされた!!
crazywoola merged 2 commits into langgenius:main from Rion-Sato:main
わーい🙌
まとめ
初めてまともにOSSのソースコードを読んでから、2時間くらいでOSSにコミットすることができました。
かなり小さなコミットですが、「Geminiプラグインバージョン0.0.7
はおれが作った」と胸を張って言えるのは誇らしいです!
Difyの話題になる度に、「おれDifyのコントリビューターなんだよ」って自慢するのが楽しみです☺️
実際は、Dify Official Pluginのコントリビューターなんですけどね笑
Dify 1.0.0になってからは、LLMに関する公式のライブラリなんで、Difyと言ってもいいですよね??
とにかく今回は、初めてのOSSコミットできて大満足です!
あと、ここまで読んでいただきありがとうございます!
皆さんにとっては、技術記事ではなく、日記みたいに見えましたよね笑🙇
今後は、タメになる技術記事が書けるよう精進していきたいと思います!
Discussion