dify 最新插件开发

1,857 阅读2分钟

#创作者训练营

dify的发展历程

dify 第一个版本,定义RAG的chatbot。后面发布了dify workflow的版本,通过工作流的形式定义Agent. 功能包括模板,应用,RAG, Tools。现在到第三个版本,添加了自定义插件的功能,允许用户开发插件实现自己的功能,这又是一个大的进步。

dify plugin

dify 1.0 之后允许用户自己开发插件 开发环境:

  • python >= 3.12
  • Dify 插件脚手架工具 (dify-plugin-daemon) 下载地址:github.com/langgenius/… ,目前版本是0.11。 根椐自己电脑系统下载相应的版本。 目前插件类型:

开发

以下开发环境以window 为例:

dify.exe plugin init 初始化项目

image.png

之后,需配置

  1. 输入plugin name, author,description,repository url,
  2. 选择开发语言: python
  3. 选择插件类型:tool
  4. 接下来会提示是否需要包含 Provider 验证、持久存储等附加功能,对于简单项目不需要。

回车之后,项目会在当前目录下初始化生成.

D:.
│  .difyignore
│  .env
│  .env.example
│  .gitignore
│  GUIDE.md
│  main.py
│  manifest.yaml
│  PRIVACY.md
│  README.md
│  requirements.txt
├─provider
│  │  dify-one.py
│  │  dify-one.yaml
├─tools
│  │  dify-one.py
│  │  dify-one.yaml
└─_assets
        icon.svg
  • .difyignore 不打包的文件和文件夹
  • .gitignore git 忽略的文件和文件夹
  • tools 目录 插件开发主要代码目录
  • provider 目录 外部凭证获取
  • .env 插件的环境变量,如插件host, key

配置虚拟环境

python -m venv .venv

或 conda create -n .venv python=3.12

tools 开发代码

identity:
  name: dify-one
  author: song
  label:
    en_US: dify-one
    zh_Hans: dify-one
    pt_BR: dify-one
description:
  human:
    en_US: dify test
    zh_Hans: dify test
    pt_BR: dify test
  llm: dify test
parameters:
  - name: deepseek_output
    type: string
    required: true
    label:
      en_US: deepseek output string
      zh_Hans: deepseek输出内容
      pt_BR: deepseek output string
    human_description:
      en_US: plugin demo by fengjian 
      zh_Hans: plugin demo by fengjian 
      pt_BR: plugin demo by fengjian 
    llm_description: plugin demo by fengjian 
    form: llm
extra:
  python:
    source: tools/dify-one.py

重点看下parameters 下,定义一个变量,deepseek_output

extra 下定义 开发文件的路径

.py 文件

class DifyOneTool(Tool):
    def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessage]:
        context =  tool_parameters['deepseek_output']
        if '</think>' in context :
            result = context.split('</think>')[1]
        else:result = context
        yield self.create_text_message(result)

程序从tool_parameters 取出参数 deepseek_oupput (定义在yaml中)

把 < think>.... </ think> 部分删除

用create_text_message() 包裹文本,返回结果

上面代码,实现功能: 把deepseek返回结果 中 < think> </ think> 部分删除

测试及打包

打包命令 :dify.exe plugin package ./dify-one

打包时,需将开发包 写入.difyignore, 忽略这些文件夹,不然大小超过1M, 会提示打包失败。

打包完成后,在当前目录产生 .difypkg 文件