
在学会Dify中使用DeepSeek模型后Dify使用deepseek,我们可以用Dify快速搭建一个聊天工具或者通过工作流完成较为复杂的任务,但是对于一些定制化比较高的操作,或者任务中的某个流程在现有的工作流中没有插件能满足需求,就需要我们自定义开发插件了。Dify官方给了文档https://github.com/langgenius/dify-docs/blob/main/zh_CN/plugins/quick-start/develop-plugins/extension-plugin.md,我们可以参照文档一步步实现。
不同场景需要开发不同类型的插件: 针对每种插件类型,提供专门的开发指南:
包 (Bundles): 了解如何将多个插件组合打包,以便于分发和部署。
不同插件的开发流程都差不多,这里以Extension为例,介绍下Dify插件的完整开发流程。不得不承认Dify在产品化这块儿做得还可以,虽然比不上coze这样的商业化产品,但是文档和工具还是比较全面的。
首先我们下载开发插件用的脚手架:
https://github.com/langgenius/dify-plugin-daemon/releases/download/0.0.9/dify-plugin-darwin-amd64
下载下来后查看下版本
chmod +x dify-plugin-darwin-amd64
./dify-plugin-darwin-amd64 version
v0.0.9然后用脚手架初始化工程
./dify-plugin-darwin-amd64 plugin init然后交互式的填入需要的信息,就可以生成插件项目的框架,文件目录如下
% tree
.
|____endpoints
| |____firstexp.yaml
| |____firstexp.py
|_____assets
| |____icon.svg
|____requirements.txt
|____group
| |____firstexp.yaml
|____PRIVACY.md
|____README.md
|____.gitignore
|____manifest.yaml
|____GUIDE.md
|____.github
| |____workflows
| | |____plugin-publish.yml
|____.env.example
|____main.py
|____.difyignoreUIDE.md 一个简短的引导教程,带领你完成插件的编写流程。
README.md 关于当前插件的简介信息,你需要把有关该插件的介绍和使用方法填写至该文件内。
_assets 存储所有与当前插件相关的多媒体文件。
endpoints 按照 cli 中的引导创建的一个 Extension 类型插件模板,该目录存放所有 Endpoint 的功能实现代码。
group 指定密钥类型、多语言设置以及 API 定义的文件路径。
main.py 整个项目的入口文件。
manifest.yaml 整个插件的基础配置文件,包含该插件需要什么权限、是什么类型的扩展等配置信息。
requirements.txt 存放 Python 环境的依赖项。
由于python2和python3容易冲突,我们初始化一个python的虚拟环境
python3 -m venv myenv
# 激活当前环境
source myenv/bin/activate
# 退出环境
deactivate安装依赖的的包
pip3 install werkzeug -i https://mirrors.aliyun.com/pypi/simple/
pip3 install dify_plugin -i https://mirrors.aliyun.com/pypi/simple/或者
pip3 install -r requirements.txt接下来就调试下默认的插件能否运行起来。Dify 提供远程调试方式,前往“插件管理”页获取调试 Key 和远程服务器地址。
进入插件目录firstexp下,拷贝 .env.example 文件并重命名为 .env,将获取的远程服务器地址和调试 Key 等信息填入其中。
INSTALL_METHOD=remote
REMOTE_INSTALL_HOST=debug.dify.ai
REMOTE_INSTALL_PORT=5003
REMOTE_INSTALL_KEY=********-****-****-****-************需要注意的是,在本地调试的时候REMOTE_INSTALL_HOST需要换成本地地址127.0.0.1,但是在发布前需要改为
REMOTE_INSTALL_HOST=host.docker.internal因为插件运行在docker环境中时,需要通过上述域名寻址,否则插件会一直安装失败,因为在docker环境中无法链接。
然后运行python -m main 命令启动插件。这时候我们就可以在Dify后台的插件列表中看到我们刚刚开发的插件了。测试跑通以后,我们需要打包安装插件。
./dify-plugin-darwin-amd64 plugin package ./firstexp
2025/05/07 15:22:51 package.go:39: [INFO]plugin packaged successfully, output path: firstexp.difypkg然后点击插件安装,或者拖拽安装,等几秒就安装成功了。如果报下面错误
PluginDaemonBadRequestError: plugin verification has been enabled, and the plugin you want to install has a bad signature需要改下Dify的配置然后重启Dify在 .env 文件中添加以下配置
FORCE_VERIFYING_SIGNATURE=false这将禁用插件签名验证,允许安装未验证的插件。安装完成后的插件如下

回过头来我们看下生成的源码,入口文件main.py
from dify_plugin import Plugin, DifyPluginEnv
plugin = Plugin(DifyPluginEnv(MAX_REQUEST_TIMEOUT=120))
if __name__ == '__main__':
plugin.run()里面启动了plugin,它的寻址是通过配置文件manifest.yaml
plugins:
tools:
- provider/firstexp.yaml定位到这个yaml文件内容
extra:
python:
source: tools/firstexp.py就来到了具体插件源码中
from collections.abc import Generator
from typing import Any
from dify_plugin import Tool
from dify_plugin.entities.tool import ToolInvokeMessage
class FirstexpTool(Tool):
def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessage]:
yield self.create_json_message({
"result": "Hello, world!"
})我们编辑这个代码就能实现自己复杂的逻辑
本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!