新功能:人机协作 (HITL)
来源:Release 1.13.0 - Human-in-the-Loop and Workflow Execution Upgrades · langgenius/dify · GitHub
我们正在推出 人机输入 节点,这是一项重大更新,它将改变 AI 和人类在 Dify 工作流中的协作方式。
背景
此前,工作流是二元的:要么完全自动化,要么完全手动。这在高风险场景中造成了“信任鸿沟”,即需要 AI 的速度,但人类判断至关重要。通过 HITL,我们正在使人工监督成为工作流架构的固有部分,允许您将审查步骤直接嵌入到执行图中。
主要功能
- 原生工作流暂停: 插入“人机输入”节点,在关键决策点暂停工作流执行。
- 审查与编辑: 该节点生成一个 UI,人类可以在其中审查 AI 输出并修改变量(例如,编辑草稿或更正数据),然后流程继续。
- 基于动作的路由: 配置自定义按钮(如“批准”、“拒绝”或“升级”),以确定工作流的后续路径。
- 灵活的交付方式: 人机输入表单可以通过 Web 应用 或 电子邮件 交付。在云环境中,电子邮件交付的可用性可能取决于计划/功能设置。
架构更新
为了支持 HITL 所需的有状态暂停/恢复机制并提供事件订阅 API,我们重构了执行引擎:基于工作流的流式执行和高级聊天执行现在在 Celery worker 中运行,而非流式 WORKFLOW 运行仍在 API 进程中执行。所有暂停/恢复路径(例如 HITL)都通过 Celery 恢复,并且事件通过 Redis Pub/Sub 流回。
对于大型部署和自托管用户:
我们引入了一个名为 workflow_based_app_execution 的新 Celery 队列。虽然标准设置可以开箱即用,但高吞吐量环境应考虑以下优化以确保稳定性和性能:
- 扩展 Worker: 根据您的特定工作负载调整消耗
workflow_based_app_execution队列的 worker 数量。 - 专用 Redis(可选): 对于大规模部署,我们建议配置新的
PUBSUB_REDIS_URL环境变量以指向专用的 Redis 实例。强烈建议使用 Redis 集群模式和分片 PubSub 以确保横向可扩展性。
重要升级说明
需要新的 Celery 队列:workflow_based_app_execution
请确保您的部署配置(Docker Compose、Helm Chart 等)包含侦听新 workflow_based_app_execution 队列的 worker。此队列是基于工作流的流式执行和所有恢复流(例如 HITL)所必需的;否则,流式执行和恢复任务将无法处理。
操作说明
附加 Celery 队列:api_token
如果 ENABLE_API_TOKEN_LAST_USED_UPDATE_TASK=true,请确保您的部署也有侦听 api_token 的 worker。此队列用于 API 令牌 last_used_at 时间戳的计划批处理更新任务。
配置更改
我们引入了几个新的环境变量来支持架构更改。大型部署应特别关注 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)。
附加更新日志亮点
可靠性与正确性
- 添加了迁移时去重和租户默认模型的唯一约束,以防止重复的默认模型记录。
- 修复了由提供者 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。
有关背景和详细信息,请参阅上方的
重要升级说明 和
操作说明。
Docker Compose 部署
-
备份您自定义的 docker-compose YAML 文件(可选)
cd docker cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak -
从主分支获取最新代码
git checkout main git pull origin main -
停止服务。请在 docker 目录下执行
docker compose down -
备份数据
tar -cvf volumes-$(date +%s).tgz volumes -
升级服务
docker compose up -d
注意
如果您遇到以下错误2025/11/26 11:37:57 /app/internal/db/pg/pg.go:30 \[error\] failed to initialize database, got error failed to connect to host=db_postgres user=postgres database=dify_plugin: hostname resolving error (lookup db_postgres on 127.0.0.11:53: server misbehaving) 2025/11/26 11:37:57 /app/internal/db/pg/pg.go:34 \[error\] failed to initialize database, got error failed to connect to host=db_postgres user=postgres database=postgres: hostname \u003e resolving error (lookup db_postgres on 127.0.0.11:53: server misbehaving) 2025/11/26 11:37:57 init.go:99: \[PANIC\]failed to init dify plugin db: failed to connect to host=db_postgres user=postgres database=postgres: hostname resolving error (lookup db_postgres on 127.0.0.11:53: server misbehaving) panic: \[PANIC\]failed to init dify plugin db: failed to connect to host=db_postgres user=postgres database=postgres: hostname resolving error (lookup db_postgres on 127.0.0.11:53: server misbehaving)
请改用以下命令。详情请阅读此 #28706
docker compose --profile postgresql up -d
源代码部署
-
停止 API 服务器、Worker 和 Web 前端服务器。
-
从发布分支获取最新代码:
git checkout 1.13.0
-
更新 Python 依赖:
cd api uv sync
-
然后,运行迁移脚本:
uv run flask db upgrade
-
最后,再次运行 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 中包含 locale 到 appList 查询键中以支持本地化 by @CodingOnStar in #31921
- 例行工作: 为测试目录分配代码所有者 by @laipz8200 in #31940
- 重构(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 in #31863
- 功能: 账户删除清理 by @GareArc in #31519
- 测试: 修复测试 by @hyoban in #31975
- 修复: 修复 db.session 误用 by @fatelei in #31971
- 例行工作: 在探索页面中固定应用列表标题 by @iamjoel in #31967
- 修复(web): 添加重写规则以修复 Serwist 预缓存 404 错误 by @majiayu000 in #31770
- 修复: 修复 uuid_generate_v4 仅在 postgresql 中使用的问题 by @fatelei in #31304
- 例行工作: 迁移到 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 in #32024 - 例行工作: 更新 HITL 自动部署工作流 by @QuantumGhost in #32040
- 修复: 修复工具类型缺失的问题 by @fatelei in #32042
- 性能: 使用批量删除方法而不是单个删除 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 令牌的 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 in #31802
- 修复: 搜索模型提供商列表 by @zxhlyh in #32106
- 重构: document_indexing_update_task 分割数据库会话 by @fatelei in #32105
- 测试: 稳定测试 by @hyoban in #32108
- 重构: 将数据库操作与知识检索节点解耦 by @fatelei in #31981
- 功能: 服务 API - 添加终端用户查找端点 by @BeautyyuYanli in #32015
- 修复: 将用户时区从应用上下文传递给日期选择器组件* 由 @ZeroZ-lab 在 #31831 中贡献
- fix: 修复触发器输出 schema 缺失问题,由 @fatelei 在 #32116 中贡献
- feat: 人工输入节点,由 @QuantumGhost 在 #32060 中贡献
- chore(api): 更新 launch.json.template,由 @QuantumGhost 在 #32124 中贡献
- style: 更新横幅项样式并增强深色/浅色主题变量,由 @Yessenia-d 在 #32111 中贡献
- chore: 修复
#i18n中 useTranslation 的类型,由 @hyoban 在 #32134 中贡献 - refactor: document_indexing_sync_task 分离数据库会话,由 @fatelei 在 #32129 中贡献
- fix(api): 注册知识管道服务 API 路由,由 @tokezooo 在 #32097 中贡献
- fix(api): 序列化管道文件上传 created_at,由 @tokezooo 在 #32098 中贡献
- chore: 检测 CSS 中的实用工具,由 @hyoban 在 #32143 中贡献
- chore: 引入 CSS 图标,由 @hyoban 在 #32004 中贡献
- refactor(api): 收紧 OTel 装饰器类型,由 @shuv-amp 在 #32163 中贡献
- fix(api): 在成员移除时清理孤立的待处理账户,由 @eureka928 在 #32151 中贡献
- fix: 当用户是非沙盒用户且有付费余额时,…,由 @zyssyz123 在 #32173 中贡献
- refactor: 在 globals.css 中导入组件 CSS,由 @hyoban 在 #32180 中贡献
- fix(api): 为工作流工具文件输出包含文件标记,由 @OiPunk 在 #32114 中贡献
- fix(web): 从 schema 填充工作流工具输出描述,由 @OiPunk 在 #32117 中贡献
- fix: 替换 sendBeacon 为 fetch keepalive,用于页面关闭时自动保存,由 @veeceey 在 #32088 中贡献
- test: 为人工输入节点功能添加全面测试,由 @WTW0313 在 #32191 中贡献
- chore(api): 更新 launch.json.example 以包含新的 workflow_based_app_execution,由 @Nov1c444 在 #32184 中贡献
- refactor: 从 UpdateDSLModal 和 Metadata 组件中提取子组件和自定义 Hook,由 @CodingOnStar 在 #32045 中贡献
- fix: 修复 Dify 主目录不存在导致权限错误的问题,由 @fatelei 在 #32169 中贡献
- refactor: 类型安全的 env,更新到 Zod v4,由 @hyoban 在 #32035 中贡献
- feat: 增强 Celery 配置,由 @ruanimal 在 #32145 中贡献
- fix(console): 标记为已读时保持会话 updated_at 不变,由 @OiPunk 在 #32133 中贡献
- chore: 允许草稿运行单个节点而不连接到其他节点,由 @hjlarry 在 #31977 中贡献
- chore(deps): 将 /sdks/nodejs-client 中的 axios 从 1.13.2 升级到 1.13.5,由 @dependabot\[bot\] 在 #32199 中贡献
- fix: 修复基础节点状态图标的显示,由 @WTW0313 在 #32208 中贡献
- chore(api): 在 start-worker 脚本中消费
workflow_based_app_execution队列中的任务,由 @QuantumGhost 在 #32214 中贡献 - fix(api): RedisClientWrapper 导致的 CPU 使用率过高问题,由 @QuantumGhost 在 #32212 中贡献
- fix: 修复所有工具被删除的问题,由 @fatelei 在 #32207 中贡献
- fix: 为 tenant_default_models 添加唯一约束以防止重复,由 @qiaofenlin 在 #31221 中贡献
- feat: 支持荷兰语 (nl-NL),由 @fatelei 在 #32216 中贡献
- fix: 修复 get_message_event_type 返回错误消息类型的问题,由 @fatelei 在 #32019 中贡献
- docs(api): 将 SetupApi 标记为设计上无需认证,由 @41tair 在 #32224 中贡献
- feat(workflow): 增强工作流运行历史管理和 UI 更新,由 @WTW0313 在 #32230 中贡献
- chore(deps): 将 /api 中的 cryptography 从 46.0.3 升级到 46.0.5,由 @dependabot\[bot\] 在 #32218 中贡献
- chore(deps): 将 /api 中的 google-api-python-client 从 2.90.0 升级到 2.189.0,由 @dependabot\[bot\] 在 #32102 中贡献
- feat(tests): 在管道运行测试中为 useInvalidateWorkflowRunHistory 添加模拟,由 @WTW0313 在 #32234 中贡献
- fix: 修复使用 fastopenapi 导致用户匿名的问题,由 @fatelei 在 #32236 中贡献
- fix: 更新索引以优化消息清理性能,由 @hj24 在 #32238 中贡献
- fix: 如果当前用户不是工作区管理员,则隐藏邀请按钮,由 @douxc 在 #31744 中贡献
- chore: 将版本提升至 1.13.0,由 @QuantumGhost 在 #32147 中贡献
新贡献者
- @Sean-Kenneth-Doherty 在 #31789 中首次贡献
- @WH-2099 在 #32002 中首次贡献
- @longway-code 在 #32022 中首次贡献
- @kongdayan 在 #32081 中首次贡献
- @tokezooo 在 #32097 中首次贡献
- @shuv-amp 在 #32163 中首次贡献
- @OiPunk 在 #32114 中首次贡献
- @veeceey 在 #32088 中首次贡献
完整更新日志: 1.12.1…1.13.0