Dify 中级实验(18):插件开发入门——如何把工作流变成 Agent 可调用的工具?
Dify 中级实验18插件开发入门——如何把工作流变成 Agent 可调用的工具Dify 实验系列 · 中级 18/20 | 实验编号DIFY-102-19基于 Dify 1.16.1 实测2026-081. 业务场景先讲一个我们实际遇到的场景。一家公司的内部 CRM 系统没有现成的插件销售团队的 AI 助手想查客户信息却查不了——模型只能闲聊一问「客户 1001 的订单情况」它就答「我无法访问你们的系统」。公司的 Agent 应用明明能力很强却因为接不上内部系统变成了一个高级聊天机器人。他们想过让开发团队写接口但排期要三周想过等官方插件但内部系统大概率永远不会有官方插件。我们第一次接这类需求时第一反应也是「等官方插件或者让开发排期写接口」。后来才想明白——内部系统大概率永远不会有官方插件等插件等于放弃好在 Dify 给了第三条路任何工作流发布即工具。这不是个例。任何「Agent 要对接公司内部系统」的场景都是这个模式查 CRM 客户、查 ERP 库存、查工单系统、查内部 Wiki——官方插件市场覆盖的是通用服务公司内部系统只能自己造工具。好在 Dify 给了答案任何工作流发布后都可以变成「自定义工具」被 Agent 自动发现和调用。2. 场景痛点这个场景的痛点在这家公司的销售 AI 助手项目上体现得最直接Agent 接不上内部系统模型能力再强没有工具就查不了数据Agent 对业务数据「睁眼瞎」销售问什么它都答不上来。等插件遥遥无期内部系统几乎不会有官方插件等插件等于放弃找开发排期写接口一个查询功能就要等几周。工具参数不可控就算接了接口如果参数设计随意Agent 会「自由发挥」——传错客户 ID、传错查询类型查询结果全乱。查询语义不诚实查不到客户时有的实现会返回一个「默认客户」的假数据糊弄过去——这在业务上是绝对不能接受的。本质上工具不在于复杂而在于输入输出契约清晰——把查询语义做真、把参数枚举收窄Agent 才能可靠地自主调用。3. 方案为什么是「工作流发布为自定义工具」Dify 的扩展机制很直接任何 Workflow 保存并发布后都可以变成自定义工具被 Agent/其他工作流调用。本实验就走通「构建 CRM 查询工作流 → 发布为工具 → 供 Agent 调用」的完整链路。选它的理由零等待自建工具不用等官方插件不用排期开发工作流搭好即发布即用输入输出契约天然清晰工具的入参就是工作流的开始变量用枚举select把参数收窄成合法值Agent 没有自由发挥的空间查询语义可控查不到就返回「未找到」语义foundfalse 空信息绝不塞默认数据——下游 LLM 会引导用户核对而不是编造答案。这篇文章我们就用它搭一个「CRM 查询工具」工作流输入customer_id和query_type查询客户基本信息/订单/工单发布为工具后挂载给 Agent 自主调用。4. 整体架构开始customer_id query_type模拟CRM APICode内置客户表按 query_type 分发found/data_json/summary格式化回复LLM把结构化结果转成自然语言结束链路很清晰入口收两个参数 → 代码节点按 query_type 分发查询 → LLM 把结构化结果格式化成自然语言。4 个节点、3 条边——工具不在于复杂而在于输入输出契约清晰发布后 Agent 只要知道「传 customer_id 和 query_type拿回文本」就能自主调用。5. 模块设计5.1 开始节点query_type用下拉枚举把 Agent 的「自由发挥」收窄成三个合法值——枚举约束是工具参数设计的第一原则-label:客户IDrequired:truetype:text-inputvariable:customer_id-label:查询类型options:[basic,orders,support]required:truetype:selectvariable:query_type5.2 模拟 CRM APICode核心真实 CRM 接口GET /customers/{id}在实验里用代码节点模拟重点是查询语义要真实——查不到就返回「未找到」绝不塞默认客户数据defmain(customer_id:str,query_type:str)-dict:importjson,time time.sleep(0.3)# 模拟真实 CRM API 延迟cidstr(customer_idor).strip()qtquery_typeorbasiccustomers{1001:{name:张三,level:vip,total_orders:12},1002:{name:李四,level:normal,total_orders:3},1003:{name:王五,level:new,total_orders:0},}customercustomers.get(cid)ifnotcustomer:return{found:false,data_type:qt,data_json:{},summary:未找到客户 {}.format(cid)}ifqtorders:data[{order_id:ORD-1001-1,product:产品A,amount:299.0,status:已完成}]summary客户 {} 的订单列表{} 笔.format(customer[name],len(data))elifqtsupport:data[{ticket_id:TK-9001,title:产品A 无法登录,status:处理中}]summary客户 {} 的支持工单{} 张.format(customer[name],len(data))else:datacustomer summary客户 {}等级 {}累计 {} 笔订单.format(customer[name],customer[level],customer[total_orders])return{found:true,data_type:qt,data_json:json.dumps(data,ensure_asciiFalse),summary:summary}要点found展平成 stringtrue/false——下游 IF-ELSE 才能判断boolean 类型在节点间不可见data_json输出 JSON 字符串保结构summary输出文本给 LLM——双形态输出是工具节点的通用约定5.3 发布为工具保存并发布这个 Workflow 应用进入「工具 → 自定义工具 → 通过工作流创建工具」选择刚发布的应用工具自动生成参数面板对应 start 变量配置后即可在 Agent 的「工具」列表里挂载⚠️ 发布为工具后工具内部注册 IDprovider_id是发布时生成的 UUID不是应用 ID子工作流重新导入并重新发布后注册 ID 会变化调用方必须同步更新。6. 运行验证场景输入预期实测结果查询基本信息customer_id1001, query_typebasicfoundtrue返回张三的等级与订单数模拟 API 命中LLM 正常格式化 ✓查询订单customer_id1001, query_typeorders返回订单列表 JSON 摘要订单分支触发 ✓客户不存在customer_id9999, query_typebasicfoundfalse提示「未找到客户 9999」未找到分支正确返回不编造数据 ✓Agent 调用在 Agent 应用挂载工具后说「查一下客户 1001」Agent 自动调用工具并组织回答Agent 识别意图并触发工具调用 ✓7. 实战坑坑现象修复模拟 API 查不到也返回默认客户问不存在的客户 ID得到一份「默认客户」的假信息兜底分支返回「未找到」语义foundfalse 空信息让下游 LLM 引导用户核对found用 boolean 输出下游 IF-ELSE 判断不到展平为 stringtrue/false用customer_id当参数名但代码签名写别的运行报main() got an unexpected keyword argumentcode 节点 variables 的 variable 名必须等于def main(...)签名参数名Dify 按名传参工作流发布为工具后 provider_id 写死旧值重新导入发布后调用方报「workflow provider not found」每次重新发布后从工具列表动态查询最新 provider_id 并同步真实 API 场景直接写 http-request 没接降级外网 CRM 超时整条链路失败生产接入时用 http-request 超时重试 失败分支见实验 17 容错架构采坑点来自本实验 DSL 生成与运行验证的真实记录代码模拟 API 约定、found 语义、按名传参、provider_id 变化。8. 实验文档及源码获取实验文档完整操作步骤DIFY-19插件开发入门.md源码可直接导入dify102_19_CRM查询工具.ymlDSL 目录dify-102/dsl/文章聚焦核心配置与采坑点实验文档还包含正式插件开发plugin.json/main.py/providers/tools 结构、凭据 secret-input、OpenAPI/Swagger 导入建工具、多工具组合插件包的完整示例。下一篇Dify 中级实验19综合实战——如何把 19 个实验串成一条生产级流水线 你在这个实验的场景里踩过什么坑欢迎评论区分享你的实战经验。

相关新闻

Codex AI编程助手:本地部署、功能测试与集成指南

Codex AI编程助手:本地部署、功能测试与集成指南

这次我们来看一个名为 Codex 的 AI 助手项目。从标题和网络热度来看,它被冠以“最强AI助手”的名号,并提供了从入门到进阶的完整教程和安装包。对于开发者、学生或任何希望提升编码效率的人来说,一个能本地部署、功能强大的 AI 编程助手无疑极…

2026/9/21 3:09:04 阅读更多 →
5分钟搞定Windows和Office激活:KMS_VL_ALL_AIO智能激活工具完全指南

5分钟搞定Windows和Office激活:KMS_VL_ALL_AIO智能激活工具完全指南

5分钟搞定Windows和Office激活:KMS_VL_ALL_AIO智能激活工具完全指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为激活 Windows 和 Office 发愁?今天推荐一款开源…

2026/9/10 23:21:59 阅读更多 →
昇腾NPU智能体部署实战:算力亲和优化首token时延降低50%

昇腾NPU智能体部署实战:算力亲和优化首token时延降低50%

大家好,我是长期关注AI技术栈落地的开发者。最近在部署大模型智能体时,一个核心痛点始终绕不开:推理性能与成本。尤其是在国产化硬件平台上,如何让智能体应用跑得更快、更省资源,是很多团队面临的现实挑战。最近&#…

2026/9/15 6:55:23 阅读更多 →

最新新闻

3步搞定免费的短视频sdk:面试实战项目避坑指南

3步搞定免费的短视频sdk:面试实战项目避坑指南

3步搞定免费的短视频sdk:面试实战项目避坑指南 刚学完 Python 或 Java 语法,打开 IDE 却不知从何下手?这大概是无数转码者的噩梦。背了三天…

2026/9/22 18:51:58 阅读更多 →
幂级数的和函数:3个技巧破解高频面试题性能瓶颈

幂级数的和函数:3个技巧破解高频面试题性能瓶颈

幂级数的和函数:3个技巧破解高频面试题性能瓶颈 刚接触幂级数求和时,你是不是也卡在“公式背得滚瓜烂熟,代码跑起来却慢得像蜗牛”?别急,这正是很多开发者从“会写语法”到“能扛项目”的分水岭。幂级数的和函数不仅是数学分析的基石,更是算法竞赛和高…

2026/9/22 18:51:58 阅读更多 →
[css] 解决overflow:hidden截断字母下沉部分

[css] 解决overflow:hidden截断字母下沉部分

<div class"container">这里是文字&#xff0c;其中包含字母 g j p q y </div>.container {overflow-x: clip;overflow-y: visible; }或者.container {overflow: hidden;padding-bottom: 3px; }

2026/9/22 18:51:58 阅读更多 →
WeChat Markdown 编辑器(md)微信公众号 SVG 动画设计:无 ID 冒泡编组交互的核心方法论与工程落地

WeChat Markdown 编辑器(md)微信公众号 SVG 动画设计:无 ID 冒泡编组交互的核心方法论与工程落地

WeChat Markdown 编辑器&#xff08;md&#xff09;微信公众号 SVG 动画设计&#xff1a;无 ID 冒泡编组交互的核心方法论与工程落地 【免费下载链接】md ✍ WeChat Markdown Editor | 一款高度简洁的微信 Markdown 编辑器&#xff1a;支持 Markdown 语法、自定义主题样式、内容…

2026/9/22 18:51:58 阅读更多 →
面试必问格子背景实现:3个核心属性搞定高频考点

面试必问格子背景实现:3个核心属性搞定高频考点

面试必问格子背景实现:3个核心属性搞定高频考点 面试官刚问完 CSS 盒模型,紧接着抛出:“如何用纯 CSS 实现一个格子背景?说说原理。”很多人愣在原地,脑子里只有 background-image…

2026/9/22 18:51:58 阅读更多 →
星14选型避坑:2026最新实战对比,别再只会抄语法了

星14选型避坑:2026最新实战对比,别再只会抄语法了

星14选型避坑:2026最新实战对比,别再只会抄语法了 盯着屏幕上的 import 和 class ,语法倒是背得滚瓜烂熟,真让你搭个能跑的项目,脑子直接一片空白。这种“会写代码不会做系统”的尴尬,在2026最新的开发环境里越来越普遍。很多…

2026/9/22 18:50:57 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事&#xff1a;用Flutter给OpenHarmony做一款游戏集合类的App&#xff0c;说白了就是把若干小游戏塞进一个壳里&#xff0c;用统一入口分发。这个方向本身不算新鲜&#xff0c;真正让我花了不少心思的&#xff0c;是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档&#xff0c;最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事&#xff1a;今天在表后面多加了两个空白行&#xff0c;明天给客户交稿前发现整个章节的编号全部错位&#xff0c;光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年&#xff0c;说实话&#xff0c;第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年&#xff0c;流量惨淡、功能臃肿、代码自己都懒得看第二遍之后&#xff0c;我才慢慢琢磨明白一个道理&#xff1a;第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理&#xff1a;核心链路应该先拆哪一步分类&#xff1a;[工程技术]细分主题&#xff1a;Docker 容器化技术与镜像安全管理&#xff1a;核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用&#xff08;包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →