1.13.0 - 人在回路和工作流执行最新升级 (社区版)

:rocket: 新功能:人机协作 (HITL)(社区版)

来源:Release 1.13.0 - Human-in-the-Loop and Workflow Execution Upgrades · langgenius/dify · GitHub

我们正在引入人工输入节点,这是一项重大更新,它将改变 AI 和人类在 Dify 工作流中的协作方式。

背景

以前,工作流是二元的:要么完全自动化,要么完全手动。这在需要 AI 速度但人类判断至关重要的高风险场景中造成了“信任鸿沟”。通过 HITL,我们使人工监督成为工作流架构的固有部分,允许您将审查步骤直接嵌入到执行图中。

主要功能

  • 原生工作流暂停: 插入“人工输入”节点,在关键决策点暂停工作流执行。
  • 审查与编辑: 该节点生成一个 UI,人类可以在其中审查 AI 输出并修改变量(例如,编辑草稿或更正数据),然后流程继续。
  • 基于操作的路由: 配置自定义按钮(如“批准”、“拒绝”或“升级”)来确定工作流的后续路径。
  • 灵活的交付方式: 人工输入表单可以通过 Webapp电子邮件 交付。在云环境中,电子邮件交付的可用性可能取决于计划/功能设置。

:hammer_and_wrench: 架构更新

为了支持 HITL 所需的有状态暂停/恢复机制并提供事件订阅 API,我们重构了执行引擎:基于工作流的流式执行和高级聊天执行现在在 Celery worker 中运行,而非流式 WORKFLOW 运行仍在 API 进程中执行。所有暂停/恢复路径(例如 HITL)都通过 Celery 恢复,事件通过 Redis Pub/Sub 流回。

对于大型部署和自托管用户:

我们引入了一个名为 workflow_based_app_execution 的新 Celery 队列。虽然标准设置可以开箱即用,但高吞吐量环境应考虑以下优化以确保稳定性和性能:

  1. 扩展 Worker: 根据您的特定工作负载调整消耗 workflow_based_app_execution 队列的 worker 数量。
  2. 专用 Redis(可选): 对于大规模部署,我们建议配置新的 PUBSUB_REDIS_URL 环境变量以指向专用的 Redis 实例。强烈建议使用带有分片 PubSub 的 Redis 集群模式以确保水平可伸缩性。

:warning: 重要升级说明

需要新的 Celery 队列:workflow_based_app_execution

请确保您的部署配置(Docker Compose、Helm Chart 等)包含侦听新 workflow_based_app_execution 队列的 worker。此队列是基于工作流的流式执行和所有恢复流(例如 HITL)所必需的;否则,流式执行和恢复任务将无法处理。

:wrench: 操作说明

附加 Celery 队列:api_token

如果 ENABLE_API_TOKEN_LAST_USED_UPDATE_TASK=true,请确保您的部署也有侦听 api_token 的 worker。此队列用于 API 令牌 last_used_at 时间戳的计划批处理更新任务。

:gear: 配置更改

我们引入了几个新的环境变量来支持架构更改。大型部署应特别关注 PubSub Redis 配置以确保可伸缩性。

  • PUBSUB_REDIS_URL(关键):指定用于 API 和 Celery worker 之间 PubSub 通信的 Redis URL。如果留空,则默认为标准 REDIS_* 配置。
  • PUBSUB_REDIS_CHANNEL_TYPE(关键):定义流事件的通道类型。选项为 pubsub(默认)或 sharded我们强烈建议在高吞吐量环境中使用 sharded
  • PUBSUB_REDIS_USE_CLUSTERS(关键):设置为 true 以启用 PubSub 的 Redis 集群模式。与分片 PubSub 结合使用,这对于水平扩展至关重要。

其他新增功能:

  • WEB_FORM_SUBMIT_RATE_LIMIT_MAX_ATTEMPTS:在速率限制窗口内,每个 IP 允许的最大 Web 表单提交次数(默认值:30)。
  • WEB_FORM_SUBMIT_RATE_LIMIT_WINDOW_SECONDS:Web 表单提交速率限制的时间窗口(以秒为单位)(默认值:60)。
  • HUMAN_INPUT_GLOBAL_TIMEOUT_SECONDS:工作流运行在等待人工输入之前可以保持暂停的最大秒数,超过此时间将全局超时(默认值:604800,7 天)。
  • ENABLE_HUMAN_INPUT_TIMEOUT_TASK:启用检查过期人工输入请求的后台任务(默认值:true)。
  • HUMAN_INPUT_TIMEOUT_TASK_INTERVAL:设置超时检查任务的间隔(以分钟为单位)(默认值:1)。
  • ENABLE_API_TOKEN_LAST_USED_UPDATE_TASK:启用定期后台任务,用于批量更新 API 令牌 last_used_at 时间戳(默认值:true)。
  • API_TOKEN_LAST_USED_UPDATE_INTERVAL:设置批量更新 API 令牌 last_used_at 时间戳的间隔(以分钟为单位)(默认值:30)。
  • SANDBOX_EXPIRED_RECORDS_CLEAN_BATCH_MAX_INTERVAL:保留清理批次之间最大随机延迟(以毫秒为单位),以减少数据库压力峰值(默认值:200)。

:pushpin: 附加更新日志亮点

可靠性与正确性

  • 添加了迁移时去重和租户默认模型的唯一约束,以防止重复的默认模型记录。
  • 修复了由提供者 ID 类型不匹配导致的工具删除边缘情况。
  • 修复了 FastOpenAPI 集成回归,其中经过身份验证的用户在远程文件 API 中可能被解析为匿名用户。
  • 修复了文件相关响应的消息事件类型检测,并对非管理员用户隐藏了工作区邀请操作。

性能与可伸缩性

  • 通过插件清单预缓存和 AppListApi 查询优化,减少了后端负载和控制台延迟。
  • 通过拆分数据库会话、批量清理执行、索引调整和可配置的批次间节流,提高了大数据任务的稳定性,用于保留清理作业。

API 与平台功能

  • 添加了用于具有租户/应用程序范围强制执行的最终用户查找的服务 API 端点。
  • 改进了运行状态转换期间工作流运行历史记录刷新行为。
  • 通过从 MCP 响应中提取和报告使用元数据(例如,令牌/成本字段),增强了 MCP 工具集成。

安全

  • 从 ECharts 解析中移除了动态 new Function 评估,现在对不支持的图表代码返回明确的解析错误。

本地化

  • 在后端语言映射和 Web 本地化资源中添加了荷兰语 (nl-NL) 支持。

升级指南

重要提示

如果您使用自定义 CELERY_QUEUES,请确保包含 workflow_based_app_execution
如果 ENABLE_API_TOKEN_LAST_USED_UPDATE_TASK=true,也请包含 api_token

有关背景和详细信息,请参阅上面的:warning: 重要升级说明:wrench: 操作说明

Docker Compose 部署

  1. 备份您的自定义 docker-compose YAML 文件(可选)
cd docker
cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak
  1. 从主分支获取最新代码
git checkout main
git pull origin main
  1. 停止服务。请在 docker 目录中执行
docker compose down
  1. 备份数据
tar -cvf volumes-$(date +%s).tgz volumes
  1. 升级服务
docker compose up -d

注意

如果您遇到如下错误
2025/11/26 11:37:57 /app/internal/db/pg/pg.go:30 [error] 数据库初始化失败,错误信息为:无法连接到 host=db_postgres user=postgres database=dify_plugin:主机名解析错误 (在 127.0.0.11:53 上查找 db_postgres:服务器行为异常) 2025/11/26 11:37:57 /app/internal/db/pg/pg.go:34 [error] 数据库初始化失败,错误信息为:无法连接到 host=db_postgres user=postgres database=postgres:主机名解析错误 (在 127.0.0.11:53 上查找 db_postgres:服务器行为异常) 2025/11/26 11:37:57 init.go:99: [PANIC]初始化 Dify 插件数据库失败:无法连接到 host=db_postgres user=postgres database=postgres:主机名解析错误 (在 127.0.0.11:53 上查找 db_postgres:服务器行为异常) panic: [PANIC]初始化 Dify 插件数据库失败:无法连接到 host=db_postgres user=postgres database=postgres:主机名解析错误 (在 127.0.0.11:53 上查找 db_postgres:服务器行为异常)

请改用以下命令。详情请阅读此 #28706

docker compose --profile postgresql up -d

源码部署

  1. 停止 API 服务器、Worker 和 Web 前端服务器。
  2. 从发布分支获取最新代码:
git checkout 1.13.0
  1. 更新 Python 依赖:
cd api uv sync
  1. 然后,运行迁移脚本:
uv run flask db upgrade
  1. 最后,再次运行 API 服务器、Worker 和 Web 前端服务器。

更新内容* 重构(API): 在 trial.py 中用 Pydantic 模型替换 reqparse by @Sean-Kenneth-Doherty in #31789

  • 重构: 插件详情面板组件,以提高可维护性和代码组织性。 by @CodingOnStar in #31870
  • 修复: 移除 API 参考文档链接的英文前缀 by @hyoban in #31910
  • 修复: 缺少 console_ns 导入 by @hjlarry in #31916
  • 修复: 修复 MCP 服务器状态不正确的问题 by @fatelei in #31826
  • 测试: 尝试修复测试,清除 CI 中的测试日志 by @hyoban in #31912
  • 修复: 修复 MCP 输出 schema 为联合类型导致前端崩溃的问题 by @fatelei in #31779
  • 修复: 自动汇总环境 by @zxhlyh in #31930
  • 重构(数据集): 提取带有全面测试的 hooks 和组件 by @CodingOnStar in #31707
  • 修复: 在 useExploreAppList 中包含 localeappList 查询键中以支持本地化 by @CodingOnStar in #31921
  • 杂项: 为测试目录分配代码所有者 by @laipz8200
  • 重构(Web): 将复杂组件提取到模块化结构中,并进行全面测试 by @CodingOnStar in #31729
  • 修复: 修复 delete_draft_variables_batch 循环不停止的问题 by @fatelei in #31934
  • 杂项: 将 docker-compose 和包管理器中的版本提升到 1.12.1 by @QuantumGhost in #31947
  • 杂项: 更新 CODEOWNERS 以指定基础组件的测试文件模式 by @CodingOnStar in #31941
  • 功能: 使用最新哈希同步草稿 by @fatelei in #31924
  • 修复: 从触发器查询 hooks 中移除 staleTime/gcTime 覆盖,并使用 orpc 契约 by @lyzno1
  • 功能: 账户删除清理 by @GareArc in #31519
  • 测试: 修复测试 by @hyoban in #31975
  • 修复: 修复 db.session 误用 by @fatelei in #31971
  • 杂项: 在探索页面中固定应用列表标题 by @iamjoel in #31967
  • 修复(Web): 添加重写规则以修复 Serwist 预缓存 404 错误 by @majiayu000
  • 修复: 修复 uuid_generate_v4 仅在 PostgreSQL 中使用的问题 by @fatelei
  • 杂项: 迁移到 eslint-better-tailwind by @hyoban in #31969
  • 功能: 在检查更新前预缓存所有插件清单 by @Stream29 in #31942
  • 性能(API): 优化 AppListApi 端点的响应时间 by @QuantumGhost in #31999
  • 杂项: 移除变量类型描述中多余的双空格 (core/variables/variables.py) by @WH-2099 in #32002
  • 重构: 剥离工作流模板转换中的外部导入 by @WH-2099 in #32017
  • 杂项: 移除 .codex/skills 目录 by @longway-code in #32022
  • 修复: 修复代理节点工具类型不正确的问题 by @fatelei in #32008
  • 修复: 使 flask upgrade-db 在出错时失败 by @longbingljw
  • 杂项: 更新 HITL 自动部署工作流 by @QuantumGhost in #32040
  • 修复: 修复工具类型缺失的问题 by @fatelei
  • 性能: 使用批量删除方法而非单次删除 by @QuantumGhost in #32036
  • 修复(API): 在 DELETE 端点中返回正确的 HTTP 204 状态码 by @NeatGuyCoding in #32012
  • 测试: 仅在 CI 中移除文本覆盖率 by @hyoban in #32043
  • 杂项: 更新 deploy-hitl.yaml 的部署分支 by @QuantumGhost in #32051
  • 修复: API token 的 Redis by @zyssyz123 in #31861
  • 修复: 批量删除文档数据库会话块 by @JohnJyong in #32062
  • 修复: 移除知识库检索设置中不必要的滚动条 by @crazywoola in #32082
  • 重构: 移除不必要的类型: async_workflow_service.py by @kongdayan in #32081
  • 重构: 将 Celery 任务会话划分为更小、离散的执行 by @fatelei in #32085
  • 功能: 提取 MCP 工具使用情况 by @fatelei
  • 修复: 搜索模型提供商列表 by @zxhlyh in #32106
  • 重构: document_indexing_update_task 分割数据库会话 by @fatelei
  • 测试: 稳定测试 by @hyoban in #32108
  • 重构: 将数据库操作与知识检索节点解耦 by @fatelei in #31981
  • 功能: 服务 API - 添加终端用户查找端点 by @BeautyyuYanli in #32015
  • 修复: 将用户时区从应用上下文传递给日期选择器组件. by @ZeroZ-lab in #31831
  • 修复:修复触发器输出 schema 缺失 by @fatelei in #32116
  • 特性:人工输入节点 by @QuantumGhost in #32060
  • 杂项(api):更新 launch.json.template by @QuantumGhost in #32124
  • 样式:更新横幅项样式并增强暗/亮主题变量 by @Yessenia-d in #32111
  • 杂项:修复 #i18n 中 useTranslation 的类型 by @hyoban in #32134
  • 重构:document_indexing_sync_task 分离数据库会话 by @fatelei in #32129
  • 修复(api):注册知识管道服务 API 路由 by @tokezooo in #32097
  • 修复(api):序列化管道文件上传的 created_at by @tokezooo in #32098
  • 杂项:检测 CSS 中的实用工具 by @hyoban in #32143
  • 杂项:引入 CSS 图标 by @hyoban in #32004
  • 重构(api):收紧 OTel 装饰器类型 by @shuv-amp in #32163
  • 修复(api):在成员移除时清理孤立的待处理账户 by @eureka928 in #32151
  • 修复:当用户为非沙盒用户且有付费余额时,… by @zyssyz123 in #32173
  • 重构:在 globals.css 中导入组件 CSS by @hyoban in #32180
  • 修复(api):为工作流工具文件输出包含文件标记 by @OiPunk in #32114
  • 修复(web):从 schema 填充工作流工具输出描述 by @OiPunk in #32117
  • 修复:用 fetch keepalive 替换 sendBeacon 实现页面关闭时自动保存 by @veeceey in #32088
  • 测试:为人工输入节点功能添加全面测试 by @WTW0313 in #32191
  • 杂项(api):更新 launch.json.example 以包含新的 workflow_based_app_execution. by @Nov1c444 in #32184
  • 重构:从 UpdateDSLModal 和 Metadata 组件中提取子组件和自定义钩子 by @CodingOnStar in #32045
  • 修复:修复无 dify 主目录导致权限错误 by @fatelei in #32169
  • 重构:类型安全环境,更新到 zod v4 by @hyoban in #32035
  • 特性:增强 Celery 配置 by @ruanimal in #32145
  • 修复(控制台):在标记为已读时保持对话 updated_at 不变 by @OiPunk in #32133
  • 杂项:允许草稿运行单个节点而无需连接到其他节点 by @hjlarry in #31977
  • 杂项(依赖):将 /sdks/nodejs-client 中的 axios 从 1.13.2 更新到 1.13.5 by @dependabot[bot] in #32199
  • 修复:修复基础节点状态图标的显示 by @WTW0313 in #32208
  • 杂项(api):在 start-worker 脚本中消费 workflow_based_app_execution 队列中的任务 by @QuantumGhost in #32214
  • 修复(api):RedisClientWrapper 导致 CPU 使用率过高 by @QuantumGhost in #32212
  • 修复:修复所有工具被删除的问题 by @fatelei in #32207
  • 修复:为 tenant_default_models 添加唯一约束以防止重复… by @qiaofenlin in #31221
  • 特性:支持 nl-NL 语言 by @fatelei in #32216
  • 修复:修复 get_message_event_type 返回错误消息类型 by @fatelei in #32019
  • 文档(api):将 SetupApi 标记为设计上无需认证 by @41tair in #32224
  • 特性(工作流):增强工作流运行历史管理和 UI 更新 by @WTW0313 in #32230
  • 杂项(依赖):将 /api 中的 cryptography 从 46.0.3 更新到 46.0.5 by @dependabot[bot] in #32218
  • 杂项(依赖):将 /api 中的 google-api-python-client 从 2.90.0 更新到 2.189.0 by @dependabot[bot] in #32102
  • 特性(测试):在管道运行测试中为 useInvalidateWorkflowRunHistory 添加 mock by @WTW0313 in #32234
  • 修复:修复使用 fastopenapi 导致用户匿名 by @fatelei in #32236
  • 修复:更新索引以优化消息清理性能 by @hj24 in #32238
  • 修复:如果当前用户不是工作区管理员,则隐藏邀请按钮 by @douxc in #31744
  • 杂项:版本升级到 1.13.0 by @QuantumGhost in #32147

新贡献者

完整更新日志1.12.1…1.13.0

你好。这个在云端上线了吗?我似乎找不到它。

提交方式里的webapp不可用是什么原因呢