Activity, over time
Daily GitHub activity and social mentions.
Mentions
Daily posts linking to this repository
Attention
Daily stars & forks
Star accumulation
Cumulative stars
Pull requests
Daily opens & merges
Conversations
Daily issues & comments
Community
Daily accounts & reviews
Trending history
Daily top 10 · last 90 days · UTC
Mentions
Stars
Forks
Contributors
Latest stargazers
The last 10 distinct accounts we observed this year.
Most active participants
PR, issue, comment & review events in the past year.
Packages
| Package | Version | Downloads · 30d | Trend · 30d |
|---|---|---|---|
iflow_searchv0.1.0 | v0.1.0 | ≥21 |
Live mentions badge
Show how many posts mention your project in the last 30 days.
Live mentions · last 30 days
Mentions
個人開発のDifyプラグインを、公式マーケットプレイスに載せるまで 日本語の個人情報を伏せるAPI「個人情報黒塗りくん」のDifyプラグインを作り、Dify公式マーケットプレイスに載せてもらいました。プルリクエストを出してからマージまでは約1日でした。 この記事では、プラグインの作りと、動作確認から審査を通るまでに引っかかったところをまとめます。これからDifyプラグインを公開したい人の参考になればうれしいです。 ソースは GitHub で公開しています:mamoruveilworks-hub/kuronurikun-dify-plugin 作ったもの 2つのツールを持つ、ツールプラグインです。 ツール 入力 出力変数 個人情報を伏せる 文章 masked_text、mapping_token、entity_count 個人情報を元に戻す 文章、mapping_token restored_text チャットフローでは、次のようにつなぐだけで「LLMに個人情報を渡さず、回答は元の名前に戻す」ボットになります。 開始 → 個人情報を伏せる → LLM → 個人情報を元に戻す → 回答 プラグインを作る前は、HTTPリクエストのブロックとコードのブロックを組み合わせた見本のチャットフローを配っていました。ただ、ブロックが7つになり、JSONの組み立てなどで引っかかる人が多そうでした。プラグインにしたことで、ブロックが5つ(開始と回答を含む)になり、コードを書く必要もなくなりました。 プラグインの構成 kuronurikun-dify-plugin/ ├── manifest.yaml # プラグインの情報 ├── main.py # 起動するだけ ├── provider/ │ ├── kuronurikun.yaml # APIキーの入力欄の定義 │ └── kuronurikun.py # APIキーの確認 ├── tools/ │ ├── mask_pii.yaml / mask_pii.py # 伏せるツール │ ├── unmask_pii.yaml / unmask_pii.py # 元に戻すツール │ └── client.py # API を呼ぶ共通処理 ├── _assets/icon.svg ├── README.md # 英語(マーケットプレイス用) ├── readme/README_ja_JP.md # 日本語 ├── PRIVACY.md └── requirements.txt ツールの結果を「出力変数」で返す ツールの結果を後ろのブロックで使いやすくするため、output_schema で出力変数を定義し、create_variable_message で値を返しています。 tools/mask_pii.yaml(抜粋) output_schema: type: object properties: masked_text: type: string mapping_token: type: string entity_count: type: integer tools/mask_pii.py(抜粋) result = post("/v1/mask", self.runtime.credentials.get("api_key", ""), payload) yield self.create_variable_message("masked_text", result.get("masked_text", "")) yield self.create_variable_message("mapping_token", result.get("mapping_token") or "") yield self.create_variable_message("entity_count", len(result.get("entities", []))) こうしておくと、LLMのブロックで「伏せる」の masked_text を、変数として直接選べます。 APIキーの確認 プラグインを入れた人がAPIキーを保存するとき、_validate_credentials でキーが正しいかを確かめます。料金がかからないように、元に戻すAPIにわざと不正なトークンを送っています。返ってきたのが「キーが無効(401)」か「トークンが不正(400)」かで、キーが正しいかを見分けています。 動作確認:リモートデバッグ パッケージにする前に、手元のPCで動かしたプラグインを、Difyにつないで試せます。 Difyの「連携」画面の左下にある「デバッグ」を開き、接続先とキーを確認します プラグインのフォルダに .env を作ります .env INSTALL_METHOD=remote REMOTE_INSTALL_HOST=debug.dify.ai REMOTE_INSTALL_PORT=5003 REMOTE_INSTALL_KEY=(デバッグ画面に表示されるキー) python -m main で起動すると、Difyのプラグイン一覧に「デバッグ中」として表示されます ここで引っかかったのは次の2点です。 handshake failed, invalid key と出る:デバッグ画面を開き直すとキーが変わることがあります。画面のキーと .env のキーが同じか確認します。 ブロックが灰色になり file not found と出る:python -m main を止めると、Difyからはプラグインが消えたように見えます。デバッグ中はウィンドウを開いたままにします。 また、このプラグインは manifest.yaml で Python 3.12 を指定しているので、手元でも 3.12 で動かします。入っていなければ先に入れておきます(Windows なら winget install -e --id Python.Python.3.12)。 動かして分かった不具合 出力変数の名前に text を使うとエラーになる 元に戻すツールは、最初は結果を text という名前の出力変数で返していました。すると、処理そのものは成功しているのに、ブロックが赤いエラー表示になりました。 ツールのブロックは、もともと text・files・json という出力を持っています。そこに同じ名前の変数を返したのが原因でした。名前を restored_text に変えたら直りました。出力変数には、text・files・json 以外の名前を付けるのが安全です。 変数の前後の空白で、トークンが壊れる 元に戻すツールの mapping_token 欄に変数を入れたとき、前後に空白や改行が入ることがあります。トークンの形式チェックで弾かれていたので、受け取った値の前後の空白を取り除くようにしました。また、間違った変数(text や json など)を選んだときは、APIを呼ぶ前に「伏せるブロックの mapping_token を選んでください」と分かるエラーを出すようにしました。 マーケットプレイスに出す準備 公式のチェックツールで先に確かめる Difyは、マーケットプレイスの審査で使うチェックを dify-marketplace-toolkit として公開しています。提出前にこれで確かめておくと、指摘のやり取りが減ります。私の場合、次の点で引っかかりました。 manifest.yaml に privacy(プライバシーポリシーのファイル)、repo(ソースのURL)、contact(連絡先)が必要 PRIVACY.md が必要。何を送り、何を保存しないかを英語で書く README.md は英語で書く(コードブロックの外に日本語があると警告)。日本語版は readme/README_ja_JP.md に置く 外部APIに通信するプラグインは、manifest.yaml の network.domains に通信先を書いておく manifest.yaml(抜粋) privacy: PRIVACY.md repo: mamoruveilworks-hub/kuronurikun-dify-plugin contact: support@kuronurikun.com network: domains: - kuronurikun.com プルリクエストの本文もチェックの対象です。「Plugin information」「Submission type」「Risk level」「What changed」「Local validation」の見出しが必要で、本文は英語で書きます。 パッケージを作る dify plugin package ./kuronurikun-dify-plugin できた .difypkg を、langgenius/dify-plugins をフォークしたリポジトリの kuronurikun/kuronurikun/kuronurikun-0.1.0.difypkg に置いて、プルリクエストを出します。 審査で受けた指摘:パッケージに .git/ が入っていた プルリクエストを出すと、初めての投稿者の場合は、担当者が許可してから自動チェックが動きます。その結果、次の指摘を受けました。 blocked directory: .git/ dify plugin package は、.git/ を自動では除外しません。Gitで管理しているフォルダをそのままパッケージにすると、.git/ の中身まで入ってしまいます。さらに、ファイルのコピーを何度かやり直した結果、プラグイン一式がもう1つ dify-plugin/ フォルダとして入っていました。 .difyignore に除外するものを書いて、作り直しました。 .difyignore .git/ .github/ .gitignore .env .venv/ pycache/ *.pyc .pytest_cache/ tests/ *.difypkg .difypkg の中身は zip なので、提出前に一覧で確かめられます。 tar -tf kuronurikun-0.1.0.difypkg manifest.yaml や tools/ が一番上にあり、.git/・.env・.venv/ などが入っていなければOKです。特に .env にはデバッグ用のキーが入るので、入っていないことを必ず確認します。 作り直したパッケージを同じブランチにプッシュし、直した内容をコメントで返したところ、翌日にマージされました。 おわりに 振り返ると、時間がかかったのはプラグインのコードよりも、「Difyの中でどう見えるか」の確認と、パッケージの中身の確認でした。 出力変数の名前は text・files・json を避ける .difyignore に .git/ と .env を書き、tar -tf で中身を見てから出す 公式のチェックツールを、提出前に一度通しておく この3つを最初から押さえておけば、かなり楽に進められると思います。 プラグインは、Difyのマーケットプレイスで「黒塗りくん」と検索すると出てきます。Difyで社内ボットを作っていて、個人情報の扱いが気になっている方は試してみてください。使い方は kuronurikun.com にまとめています。