当前位置: 首页 > news >正文

【Python大语言模型系列】新版Dify 开发自定义工具插件在工作流中直接调用(完整步骤)

这是我的第441篇原创文章。

一、引言

“工具插件”指的是一个完整的项目,其中包含工具供应商文件、功能代码等结构。之前写过一个旧版dify开发自定义工具:

【Python大语言模型系列】Dify 开发一个自定义工具并在工作流中直接调用(完整案例)

新版dify遵循插件化原则,自定义工具的开发流程和步骤略有不同。基于官方文档和实战经验,以下是 Dify Tools 插件的从零到上线完整开发流程。

二、实现过程

2.1 安装 Dify 插件开发脚手架工具

访问 Dify Plugin CL 项目地址,下载并安装最新版本号和对应操作系统的工具。

运行以下命令检查安装是否成功。

./dify-plugin-darwin-arm64 version # macOS ./dify-plugin-windows-arm64 version # windows

运行命令后,终端若返回类似v0.0.1-beta.15的版本号信息,则说明安装成功。

如果你已将该二进制文件重命名为dify并拷贝至 系统路径下(如:/usr/local/bin路径)下,配置完成后,在终端输入dify version命令后将输出版本号信息。可以运行以下命令创建新的插件项目:

dify plugin init

2.2 初始化插件项目

使用脚手架工具创建插件项目:

/dify-plugin plugin init

输入插件名称、作者信息,选择插件类型(如tool工具插件)。配置权限(如 Tools、Apps、Endpoints 等),完成后生成标准目录结构:

my-plugin/ ├── main.py # 插件入口文件 ├── manifest.yaml # 插件元数据配置,一般可以不管 ├── tools/ # 功能实现代码 ├── provider/ # 服务商凭证与验证,一般可以不管 └── requirements.txt # Python 包依赖 └── .env.example # 配置文件

2.3 功能开发

在tools/my-plugin.py中实现核心逻辑:继承Tool基类并实现_invoke方法。例如:

from difyplugin import Tool, ToolInvokeError class MyTool(Tool): def _invoke(self, tool_parameters: dict) -> str: try: param = tool_parameters['input'] result = f"Processed: {param}" return self.create_text_message(result) except Exception as e: raise ToolInvokeError(f"Error: {str(e)}")

配置参数:在tools/my-plugin.yaml文件中定义插件参数和描述。

2.4 配置 Python 环境

确保 Python 版本 ≥ 3.12,建议使用虚拟环境:

python -m venv .venv source .venv/bin/activate # Linux/macOS \.venv\Scripts\activate # Windows pip install -r requirements.txt # 安装核心包

2.5 测试与验证

复制模板

cp .env.example .env

配置.env文件,填写调试 Key 和服务器地址:

INSTALL_METHOD=remote REMOTE_INSTALL_URL=10.0.x.5 REMOTE_INSTALL_PORT=5003 REMOTE_INSTALL_KEY=xxxx

启动插件进行测试:

python -m main

在 Dify 平台中运行工作流,验证插件输出是否符合预期。

2.6 打包与发布

打包插件为.difypkg文件:

/dify-plugin plugin package ./my-plugin

可选择签名插件以提高安全性,并上传到 Dify 平台或 Marketplace。

作者简介:

读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。

http://www.cnnetsun.cn/news/6919.html

相关文章:

  • mpv.net媒体播放器:为什么这款Windows播放器能成为技术爱好者的首选?
  • 带带弟弟识别文字验证码报异常问题解决:AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘
  • SG-PNh750-MOD-221(Profinet 转 Modbus RTU 网关)特点与功能介绍
  • 手把手教你用VSCode远程调试量子程序,10分钟快速上手
  • PC小说阅读器终极免费版:打造个性化数字阅读体验
  • 2025全新IDM使用方案:小白也能轻松掌握的终极指南
  • 全开源20亿参数大模型,揭秘清华团队如何突破资源限制训练LLM
  • 深度解析:4大维度构建量化因子归因的实战框架
  • YOLOv5模型瘦身实战:三大轻量化技术深度解析
  • SpringBoot
  • AH40G10是40V 10A双N+P沟道增强型MOSFET
  • 为什么顶尖开发者都在用VSCode做量子编程?真相曝光
  • note-gen AI笔记应用快速上手:10分钟掌握高效知识管理技巧
  • 东莞自动化设备工厂8个solidworks、caxa研发共用一台服务器
  • 全球国家编码数据宝库:一站式解决国际标准化需求 [特殊字符]
  • aio-switch-updater终极指南:Nintendo Switch定制化完全教程
  • Wan2.2-T2V-5B可用于博物馆展品动态复原展示
  • typing和dataclass
  • MindSpore网络编译问题BuildModel error 134
  • 拼多多PHP SDK:5分钟搞定电商API集成,让开发效率翻倍 [特殊字符]
  • Node-RED Dashboard实战指南:零基础构建专业数据可视化界面
  • 3分钟掌握nodeppt Mermaid插件:让你的演示文稿从此告别图片导入烦恼
  • 5分钟掌握dnd-kit网格对齐:React拖拽开发终极指南
  • 5分钟掌握WheelPicker:Android选择器的终极开发指南
  • ANTLR4 C++ 终极指南:从语法解析到高性能应用开发
  • 突破性音源!洛雪音乐实现全网音乐一键获取
  • BGP、OSPF、EIGRP,哪种协议用在哪?一文全讲透!
  • Google购物广告与自然产品列表如何1+1>2?3个被验证的流量协同策略
  • 写程序的时候必须做的一件事?听歌!!我精选粤语歌曲300首无损音乐,可以听十年了。
  • Vibe Coding 的终极委托:当机器拥有自主规划权,人类的“意图纯粹性”何在?