暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Dify插件开发

        在学会Dify中使用DeepSeek模型后Dify使用deepseek,我们可以用Dify快速搭建一个聊天工具或者通过工作流完成较为复杂的任务,但是对于一些定制化比较高的操作,或者任务中的某个流程在现有的工作流中没有插件能满足需求,就需要我们自定义开发插件了。Dify官方给了文档https://github.com/langgenius/dify-docs/blob/main/zh_CN/plugins/quick-start/develop-plugins/extension-plugin.md,我们可以参照文档一步步实现。
        不同场景需要开发不同类型的插件: 针对每种插件类型,提供专门的开发指南:
  • 模型 (Models): 学习如何将不同的 AI 模型打包、配置并作为插件进行管理。
  • 工具 (Tools): 为 Agent 和工作流构建专业能力,如数据分析、内容处理、自定义集成等。
  • Agent 策略 (Agent Strategies): 创建自定义的推理策略(如 ReAct, CoT, ToT)来赋能 Dify 中的自主 Agent。
  • 扩展 (Extensions): 通过 HTTP Webhook 实现与外部服务的集成,处理复杂逻辑。
  • 包 (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
        |____.difyignore
        UIDE.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 PluginDifyPluginEnv
                          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[strAny]) -> Generator[ToolInvokeMessage]:
                                        yield self.create_json_message({
                                            "result""Hello, world!"
                                        })
                                我们编辑这个代码就能实现自己复杂的逻辑

                                文章转载自golang算法架构leetcode技术php,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                评论