Dify x PUPU · 开源、可观测、可扩展的智能工作流与插件生态。
从 Low‑Code 到 Pro‑Code: 把编排、工程护栏、生态扩展、事件驱动与可观测性串成生产闭环。
| Part | 模块 | 关注点 |
|---|---|---|
| 01 | 破局 | 现状痛点 · 技术定位 · 为什么是现在 |
| 02 | 融合 | Visual DSL ↔ Pro‑Code 分工 · 调试视图 · 协作机制 |
| 03 | 扩展 | Plugins & Marketplace · 工具安全 · 可复用资产 |
| 04 | 连接 | Trigger 自动化闭环 · 类型与矩阵 · 实战案例 |
| 05 | 洞察 | OTEL 全链路 · 多库适配 · 成本与性能可视化 |
| 06 | 总结 | 进化路径 · Call for Action |
从痛点切入,思考 Dify 的技术定位。
开源生态驱动,Top 100 GitHub 仓库。
表面是“能力拼图”,本质是“工程断层”。
一站式 LLM 应用平台:从构建、编排到运行。
Workflow / Prompt Studio / RAG 管道。
重试、分支、配额、环境隔离。
Plugin & Tooling,开放能力对接外部系统。
Tracing / Token / 成本可视,保障生产稳定。
技术临界点已至:算力、模型与数据三大要素齐备。
从确定性编程向概率性工程的思维转变。
作为 LLM 应用开发的“操作系统”,链接模型与业务。
不仅是降低门槛,更是高阶工程能力的“可视化映射”。
高低代码都离不开可视化,但核心目的不同:
| Low‑Code | Pro‑Code | |
|---|---|---|
| 可视化的角色 | 编程语言 | 抽象理解 & 调试视图 |
| 核心目标 | 降低认知负荷 可解释、可教学 |
加速复杂 DSL 理解 可比较、可复盘 |
| 交付形态 | 可视逻辑可直接“运行” | 让工程事实显性化 (Trace / Token / 变量) |
同一逻辑,两种形态,协同演进。
def handler(payload):
country = payload["country"]
score = risk_model.predict(payload)
if country == "US" and score < 0.2:
return {"route": "fast-lane"}
return {"route": "human-review", "score": score}
利用 Dify 的可视化 DSL 处理 80% 的胶水逻辑,用 Pro-Code 解决 20% 的核心计算。
处理分支、循环、RAG 检索管道,利用可视化界面快速对齐业务需求。
在工作流中嵌入 Python/Node.js 脚本,处理数据清洗与复杂数学计算。
利用 Trace ID 串联会话日志,反向优化 Prompt 与 代码逻辑。
节点级输入/输出对比,diff 高亮。
点击 Trace ID 跳转至 Jaeger / SLS。
trace_id=wf-1827 span=llm.call status=ok p95=180ms
像管理代码一样管理 Prompt:版本控制与差异对比。
明确分工,打破 Prompt 工程师与开发者的壁垒。
不仅是线性流,支持循环、迭代与条件判断。
Marketplace & Plugins:把 Dify 当成“平台的基础设施”。
标准化接口、鉴权与多语言运行时。
隔离执行环境,控制超时与重试。
支持 API Key / OAuth / 内部凭据。
调用计费与配额管理可插拔。
Marketplace 发布与版本化。
curl -X POST https://api.dify.ai/plugins/slack_bot \\
-H "Authorization: Bearer <token>" \\
-d '{
"channel_id": "ops-alert",
"text": "Build passed ✅",
"bot_token": "******"
}'
171103.23plugin-9821 (跳转日志)manifest + schema
code node / runtime
本地 + 沙箱
Marketplace / 内部
以开发一个 Slack 消息发送工具为例,演示 Dify 插件的“定义即开发”流程。
bot_token, channel_id)。Tool 类,在 _invoke 方法中调用 Slack SDK 发送消息。invoke 结果,打包发布至 Dify Marketplace。不信任任何第三方代码,确保主程序安全稳定。
第三方 Plugin 代码
任意网络请求
高资源消耗
Namespace 隔离
资源配额限制
网络白名单
Agentic Behavior: 插件不仅仅是执行者,也可以是决策者。
def _invoke(self, params):
user_intent = analyze_intent(params['input'])
if user_intent == 'complex_task':
# Reverse call back to Dify API
response = dify_client.run_workflow(
workflow_id="wf-sub-task-001",
inputs={"query": params['input']},
user_id=params['user_id']
)
return {"result": response['data'], "delegated": True}
return {"result": simple_process(params), "delegated": False}
连接开发者与企业用户,共建价值闭环。
开发高质量插件
发布到 Marketplace
获得收益分成
提供分发渠道
处理计费与结算
保障安全审核
一键安装能力
按需付费订阅
解决业务痛点
Trigger 让应用从“被动问答”迈向“主动执行”。
外部 Webhook -> Dify 解析 Payload -> LLM 决策 -> 输出结果。
接收外部事件,校验签名。
基于上下文选择模型与链路。
调用 Plugin/Tool,写入结果。
Tracing + Token 成本监控。
把“何时启动”收回到编排层,统一治理与回放。
| 没有 Trigger | 有 Trigger |
|---|---|
| 入口分散:按钮 / Cron / 直调 | 入口统一:事件源 → 变量映射 → 路由 |
| 难治理:缺 Trace、难排查 | 可治理:可回放、可观测、可审计 |
| 启动条件散落在代码/脚本 | 启动条件由 Workflow 编排决定 |
| 多条触发逻辑难复用 | 一张画布:先分支后汇合 |
覆盖定时、第三方事件和自建系统三大场景。
按固定节奏启动:日报、数据清理、健康检查等可预测任务。
第三方事件驱动:PR 更新、工单变更、文档改动等。插件负责订阅和解析结构化 Payload,可一份订阅驱动多条 Workflow。
面向自有/遗留系统。为每个 Trigger 生成唯一 HTTP URL,Query/Header/Body 直接转为变量;可将 Workflow 结果回传调用方。
结合 Plugin Trigger 与 LLM,让代码变更自动进入智能审查流程。
action/pull_request/repo/sender。如何确保海量 Trigger 事件不丢失、不阻塞。
从邮件接收到自动分类、回复草拟的全流程。
客户发送邮件至 support@company.com → Webhook 触发 Dify。
分析邮件内容:是 "退款请求"、"技术故障" 还是 "一般咨询"?
生成草稿回复 → 发送至 Slack 供人工审核 → 点击确认发送。
透明、可观测、可移植的工程能力。
不仅是日志,更是贯穿 LLM 与 Infra 的“上帝视角”。
面对 Dify 频繁的迭代,我们不能修改源码。 方案:Monkey Patch (Python) 与 Compile-time Instrumentation (Go)。
aliyun-bootstrap 动态劫持 Flask/Celery 入口,注入 Trace 上下文。
go build 阶段注入 instgo 工具,自动插桩。
aliyun-instrument 的核心在于使用
wrapt 库在运行时劫持 Dify 关键方法。
WorkflowRunner.run),替换为 Wrapper。wrapt
确保原函数的元数据(如 __name__)保持不变,对上层业务透明。按 Span 类型设置采样率:LLM 20%,向量检索 50%,关键交易 100%。
结合队列长度与 TPS,动态调节 prompt 长度与并发窗口。
捕获错误率>1% 时提升采样到 100%,自动打开调试日志。
场景:前端显示正常,RAG 检索结果却为空,Dify 业务日志无报错。
查看 Workflow Trace,发现 Retriever 节点耗时极短,且 Output 为空字符串。
output: ""
点击 Span 详情中的 "Infrastructure Link" 按钮,携带 Trace ID 跳转至 SLS/Jaeger。
在 Worker 的底层 Span 中捕获到未抛出的异常堆栈,发现向量库版本不兼容。
ValueError: Weaviate version 1.19.0 not supported...
DatabaseConfig 新增类型选择,支持
PostgreSQL, MySQL, OceanBase。为了保障 Schema 在不同数据库方言下的兼容性,引入了针对 MySQL 的独立迁移测试。
用 Python Helper 与 ORM 方法替代方言特定的 Raw SQL。
convert_datetime_to_date 封装了不同数据库的日期截断逻辑 (Postgres
date_trunc vs MySQL date_format)。
dataset_retrieval.py 移除 Raw SQL 片段,使用 SQLAlchemy JSON
方法增强类型安全。
精细化运营:知道每一分钱花在哪里。
以统一编排为核心,叠加工程护栏、生态扩展与事件驱动,构建可观测、可演进的生产级 AI 应用。