本文使用Dify v1.0.0-beta.1
版本。以neko
為例,介紹Dify
中的Extension
插件開發例子。需要說明的是Dify
官方要求Python≥3.12
,但發現本地PyCharm
調試Python≥3.12
有問題,就采用的Python 3.11
版本。
一.Extension插件項目創建
1.填寫插件信息
按照提示配置插件名稱、作者信息與插件描述。如果是團隊協作,也可以將作者填寫為組織名。插件名稱長度必須為 1-128 個字符,并且只能包含字母、數字、破折號和下劃線。
填寫完成后,在插件開發語言環節中選擇 Python。
2.選擇插件類型并初始化項目模板
腳手架工具內的所有模板均已提供完整的代碼項目,本文將以 Extension
類型插件模板作為示例。
3.配置插件權限
插件還需要讀取 Dify
主平臺的權限才能正常連接。需要為該示例插件授予以下權限:
- Tools
- LLMs
- Apps
- 啟用持久化儲存 Storage,分配默認大小存儲
- 允許注冊 Endpoint
在終端內使用方向鍵選擇權限,使用 Tab
按鈕授予權限。勾選所有權限項后,輕點回車完成插件的創建。系統將自動生成插件項目代碼。
插件的基礎文件結構,如下所示:
-
GUIDE.md
一個簡短的引導教程,帶領完成插件的編寫流程。 -
README.md
關于當前插件的簡介信息,需要把有關該插件的介紹和使用方法填寫至該文件內。 -
_assets
存儲所有與當前插件相關的多媒體文件。 -
endpoints
按照cli
中的引導創建的一個Extension
類型插件模板,該目錄存放所有Endpoint
的功能實現代碼。 -
group
指定密鑰類型、多語言設置以及API
定義的文件路徑。 -
main.py
整個項目的入口文件。 -
manifest.yaml
整個插件的基礎配置文件,包含該插件需要什么權限、是什么類型的擴展等配置信息。 -
requirements.txt
存放Python
環境的依賴項。
二.Extension插件開發過程
1.插件開發
(1)定義插件請求入口Endpoint
編輯 endpoints/test_plugin.yaml
,修改代碼如下所示:
path: "/neko"
method: "GET"
extra:python:source: "endpoints/test_plugin.py"
該代碼的意圖是定義該插件的入口路徑為 /neko
,請求方法為 GET
類型。插件的功能實現代碼為 endpoints/test_plugin.py
文件。如下所示:
(2)編寫插件功能
插件功能:請求插件服務,輸出一只貓。編寫插件的功能實現代碼 endpoints/test_plugin.py
文件,示例代碼如下所示:
運行此代碼需要先安裝以下 Python
依賴包:
2.插件調試
然后就可以看到帶有DEBUGGING PLUGIN
標識的test_plugin
插件,如下所示:
點擊+
按鈕添加API
端點。端點名稱和API Key
隨便填寫即可,如下所示:
這樣就會生成一個API
端點,如下所示:
用瀏覽器打開上述URL
發現報錯,原因是應該為localhost:5002
,而不是localhost
。如下所示:
新建一個簡單Chatflow
工作流,測試該URL
。如下所示:
3.插件打包
具體操作不再贅述,詳細參考文獻[3]。
4.插件發布
具體操作不再贅述,詳細參考文獻[3]。
三.可能遇到的問題 [4][5]
1.ENDPOINT_URL_TEMPLATE問題
由于后端源碼運行,修改dify\api\.env
中的ENDPOINT_URL_TEMPLATE=http://localhost:5002/e/{hook_id}
,如下所示:
重新啟動后端服務,便可以看到正確URL
為http://localhost:5002/e/AqXHXakiZUouDpkMaOEpLXhDHP027BGI/neko
,如下所示:
參考文獻
[1] Extension插件:https://docs.dify.ai/zh-hans/plugins/quick-start/develop-plugins/extension-plugin
[2] Neko:https://marketplace.dify.ai/plugins/langgenius/neko
[3] Dify中的GoogleSearch工具插件開發例子(星球附件):https://z0yrmerhgi8.feishu.cn/wiki/Ib15wh1rSi8mWckvWROckoT2n6g
[4] chore(1.0): improve some environment variables #12814:https://github.com/langgenius/dify/pull/12814
[5] Inconsistency between docker-compose.yaml and api on specifying entrypoint for pluginDaemon in v1.0.0-beta.1:https://github.com/langgenius/dify/issues/13113
[6] Dify中的Extension插件開發例子:以neko為例:https://z0yrmerhgi8.feishu.cn/wiki/H5YRw43pgi7mOukWHJHc81ztnre