2026 年 9 月上旬,Dify 连发了两个版本:1.17.0 是一次里程碑更新,把 Agent 从「工作流里的临时节点」解耦成可统一维护的能力资产;随后 1.17.1 做了一轮覆盖面很广的稳定性修复。对已经在用 Dify 搭工作流和聊天助手的团队来说,这个版本有三条变化最值得动手试:工作区级 Skill 管理(能力资产化)、Loop/Iteration 内的人工介入审批(长流程敢交给循环了)、LLM 环境变量复用(换模型不再逐节点改)。本篇按「先升级、再逐个开能力」的顺序,带你把这三件事跑通。
先理解:这个版本改了什么
把 1.17.0 的变更按「对你搭应用的影响」重新排一下,比逐条读 release notes 有用:
| 新能力 | 解决什么问题 | 优先级 |
|---|---|---|
| 工作区级 Skill 管理(draft → publish → version 生命周期) | 能力过去散落在各个应用里,改一处要复制 N 次;现在打包成版本化的可复用资产,Agent 可发现并调用 | 高 |
| Loop / Iteration 节点内的人工介入表单 | 批量任务想在循环中途让人审一眼,过去只能把循环拆散;现在暂停续跑,页面刷新也不丢 | 高 |
| 可复用的 LLM 环境变量 | 十几个 LLM 节点各自配模型,换模型要逐个点;现在一处定义、多处引用,还随 DSL 导入导出保留 | 高 |
| E2B 云沙箱后端 + Home Snapshot | Agent 执行代码的环境从本地沙箱扩展到 E2B 云沙箱;发布应用时固化沙箱 home 目录,运行时按快照还原 | 中 |
| 上下文感知的历史压缩 | 长对话撑爆上下文窗口;按模型实际窗口分层压缩(先清旧工具结果,再摘要更早历史) | 中 |
| 统一链路追踪(Phoenix / LangSmith 适配器) | 排查多节点、嵌套工作流时看不到完整 span 树; opt-in 打开后一次拼齐父子 span | 中 |
升级前先读一条红线。如果你的自托管部署用的是 Dify 内置 Weaviate 向量库,从旧版本升到 1.17.x 涉及 Weaviate 跨多个小版本的跳升,官方要求分阶段手动升级,直接拉镜像重启可能静默且永久性地破坏向量检索。升级操作与避坑清单见站内教程《Dify 1.17.1 自托管升级避坑》,本篇默认你已完成升级或使用外部向量库。
Step 1:确认版本,备份再动
# 查看当前版本(页面右上角「关于」或 API 均可)
curl -s http://localhost/console/api/version
# 自托管:升级前备份数据库与数据卷
docker exec -t docker-db-1 pg_dump -U postgres -d dify > dify_backup_$(date +%Y%m%d).sql
docker run --rm -v docker_volumes:/data -v $(pwd):/backup alpine \
tar czf /backup/dify_volumes_$(date +%Y%m%d).tgz /data
Step 2:给 Agent 换上 E2B 云沙箱(可选但值得试)
1.17.0 之前,Agent 的 shell 与代码执行跑在本地沙箱里;现在可以选择 E2B 云沙箱作为后端。自托管环境这样切换:
# .env 中指定执行后端(默认本地,改为 E2B)
DIFY_AGENT_RUNTIME_BACKEND=e2b
E2B_API_KEY=你的-E2B-API-KEY
# 官方随版本附带 E2B 栈的 compose 文件
docker compose -f docker-compose.e2b.yaml up -d
三条配套机制值得知道:E2B 流量带鉴权,不是裸连;E2B 模板随 Dify 发版自动同步,不用自己维护镜像;本地沙箱仍是默认值,你不改环境变量就一切照旧。
两个成本与合规问题先想清楚。其一,切到云沙箱意味着 Agent 要执行的代码与文件会离开你的机器,发往 E2B 的云端环境——含敏感数据的场景先过合规再开。其二,E2B 是独立计费的云服务,跑量大的任务先在小规模上估一下费用曲线。
Step 3:用 Home Snapshot 固化「构建期状态」
过去有个经典别扭:你在调试时装好的 Python 依赖、上传的参考文件、跑出来的中间状态,发布成应用之后不一定还在,换个会话就得重来。Home Snapshot 的逻辑是:当 Agent 构建被应用(发布)时,把沙箱 home 目录——已安装的包、准备好的文件、工作状态——整体拍成快照;此后每次运行这个已发布应用,都从快照还原文件系统。
构建(Build) → 拍快照:/home 下的包、文件、状态全部固化
发布(Publish)→ 快照与应用版本绑定
运行(Run) → 从快照还原 home,再开始干活
Step 4:把高频能力打包成工作区 Skill
Skill 是 1.17.0 里概念上最重要的新增:把「一段代码 + 一组工具定义」打包成可复用、可版本化的能力单元,放在工作区级统一管理,任何 Agent 都可以发现并调用它。入口在工作区设置里的 Skills 管理器,带列表页、构建面板与文件编辑器。
一个 Skill 的生命周期:
draft(草稿) → 在构建面板写代码、挂工具定义
publish(发布)→ 版本号 +1,进入工作区可用列表
version(版本)→ 改动出新版本,旧版本仍可回溯
一个 Skill 的组成:
- 代码:能力逻辑(如「按模板生成周报」)
- 工具定义:声明它能调用哪些工具、入参出参是什么
实操建议:挑一个你已经在多个应用里复制粘贴过的能力(比如「把上传表格清洗成标准格式」),把它抽成你的工作区内 Skill。发布后到任意 Agent 的能力列表里确认它能被发现、被调用、给出正确版本号。
Skill 里别写死密钥。Skill 是工作区共享资产,能看到它的人比单个应用多。API Key 这类凭证放环境变量或 Dify 的凭据管理里,Skill 代码只引用、不落地。
Step 5:在 Loop / Iteration 里加人工介入
1.17.0 把人工介入表单(human-in-the-loop form)带进了 Loop 和 Iteration 节点内部:循环跑到某一步暂停,弹出表单等人确认或修改,确认后从断点续跑。官方说明它对 debug 与已安装应用都生效,且跨页面刷新保持暂停状态。
典型用法(批量线索清洗):
Iteration 开始
├─ LLM 节点:判断线索质量,打分
├─ 条件分支:低分线索 → 人工介入表单
│ 表单字段:[丢弃 / 修正后继续] + 修改意见
│ 人选「修正」→ 分支回流,用修正值继续跑
└─ 高分线索 → 直接入库
Iteration 结束
审批别放错位置。暂停中的循环会一直占着运行态等输入。万次迭代的内层放一个人工节点,等于把批量任务变成手工任务。原则:人工介入放在聚合后的抽查点或低频分支上,而不是循环体内层的高频路径上。
Step 6:用 LLM 环境变量终结「逐节点换模型」
过去工作流里十几个 LLM 节点各自选模型、调参数,想统一把摘要模型换掉,得逐个节点点开改,漏一个就出现「口径漂移」。1.17.0 允许定义可复用的 LLM 环境变量——把供应商、模型、模式、参数打包成一个命名配置(比如 for_summarize、for_research),任何 LLM 节点直接引用。
# 概念示意(在工作区的 LLM 环境变量面板中定义)
for_summarize : 供应商=DeepSeek, 模型=deepseek-chat, 温度=0.3
for_research : 供应商=Anthropic, 模型=claude-sonnet, 温度=0.7
# LLM 节点里不再逐项配置,引用变量名即可
摘要节点 → 使用 for_summarize
调研节点 → 使用 for_research
Step 7:打开统一追踪,看清整棵 span 树
# .env 打开统一追踪(默认关闭,向后兼容)
OPS_TRACE_UNIFIED_ENABLED=true
# 适配器按你用的平台配置(首发支持 Phoenix 与 LangSmith)
# 具体变量名以所用版本的 .env.example 为准
打开后,工作流、聊天流、消息、节点、循环、迭代、嵌套工作流的父子 span 树会在核心层拼好一次,适配器只负责传输。GenAI 规范的 span 还会带出 LLM 首 token 延迟(TTFT)、Agent 的 ReAct 步骤、工具调用与失败的 LLM 节点——排查「哪一步慢、哪一步错」终于不用翻日志拼时间线了。
接外部观测平台前先做一轮脱敏评估。span 里会带提示词、工具入参与模型输出,可能含用户隐私或业务数据。确认你的 LangSmith / Phoenix 实例的数据驻留与访问控制符合要求,再把这个开关在生产环境打开。
常见问题速查
| 你遇到的现象 | 大概率原因 & 解决 |
|---|---|
| 升级后知识库回答明显变差 | 旧文档被静默错误索引(1.17.1 修复的根因)。重新导入受影响的 CSV / Excel / PDF / 网页 / Notion 文档 |
| 切 E2B 后 Agent 报执行失败 | E2B_API_KEY 未配置或模板未同步。确认 .env 两项齐全,重启 compose 栈 |
| Skill 发布后 Agent 找不到 | Skill 还在 draft 状态,或未发布到当前工作区。检查 publish 状态与工作区归属 |
| 循环里的人工表单刷新后消失 | 确认节点是 1.17.x 的 Loop/Iteration 内置人工介入,而非用旧版「等待输入」节点模拟 |
| 换模型后部分节点仍是旧模型 | 那些节点还是独立配置。改为引用 LLM 环境变量,别再手点下拉框 |
| 打开追踪后平台里看不到 span | OPS_TRACE_UNIFIED_ENABLED 未生效(没重启)或适配器变量没配。改完 .env 记得重启容器 |