Stream is not closed properly when moderation rule hits.

该报错发生在 Dify Chatflow(高级聊天)应用开启输入审核(Input Moderation)后,用户输入触发审核规则时,流式响应未按预期正常关闭。优先排查 _handle_stop_event 中 _workflow_run_id 是否为空,以及 _save_message 或 _mes

快速结论:该报错发生在 Dify Chatflow(高级聊天)应用开启输入审核(Input Moderation)后,用户输入触发审核规则时,流式响应未按预期正常关闭。优先排查 _handle_stop_event_workflow_run_id 是否为空,以及 _save_message_message_end_to_stream_response() 在输出异常时的处理逻辑。

适用环境:Dify Cloud 版(latest 版本);Chatflow 聊天流应用;启用了输入审核功能。

最快修复方案:暂无确认的一步修复方案。当前 Issue 已关闭,但需根据服务端日志中的实际异常堆栈定位具体失败位置。

注意事项:核心问题可能出现在消息保存或流式响应结束时状态不一致;若尚未定位根因,建议先严格复现并收集服务端异常日志。

问题场景

在 Dify 的 Chatflow(高级聊天)应用中,用户开启输入审核(Input Moderation)功能后,输入会触发审核规则的内容。此时,系统应正常结束流式响应,但实际表现为流以异常方式中断,服务端抛出错误。该问题在 Dify Cloud 版(latest)上可稳定复现。

报错原文

Stream is not closed properly when moderation rule hits.

原因分析

根据 Issue 中的代码追踪,当输入审核触发 ModerationError 时,runner 的 handle_input_moderation 会调用 _complete_with_stream_output,先发布 QueueTextChunkEvent(包含审核提示消息),随后发布 QueueStopEvent(stopped_by=INPUT_MODERATION)

在 pipeline 侧的 _handle_stop_event 中,由于审核发生在工作流启动之前_workflow_run_id 仍为空字符串,因此代码会进入 elif INPUT_MODERATION 分支,调用 _save_message(session=session)(未携带 graph_runtime_state)并输出 _message_end_to_stream_response()。理论上游标应能正常关闭,但实际异常可能发生在 _save_message_message_end_to_stream_response() 期间——例如:metadata 或消息记录本身的状态因为工作流从未运行而不符合预期。

可能原因:在审核拦截路径中,消息保存或流结束阶段的某些状态(如 metadata、消息记录)未按正常流程初始化,导致二次异常抛出。此外,QueueTextChunkEvent 的处理函数调用 _handle_output_moderation_chunk(delta_text)(输出审核处理器),虽然不会对输入审核产生实际影响,但会走一遍该代码路径,也可能间接影响状态。

环境排查

  • 确认 Dify 版本是否为 latest(当前 Issue 在 Cloud 版复现)。
  • 检查服务端日志中 _handle_stop_event_save_message_message_end_to_stream_response 相关调用是否抛出异常。
  • 若自行部署,检查 Python 环境、Dify API 容器日志中的 traceback 堆栈信息。
  • 确认 Chatflow 应用是否正确配置了输入审核(Input Moderation)规则。

解决步骤

  1. 收集异常堆栈:复现触发审核的操作后,从服务端日志中提取完整的 traceback,定位具体报错文件与行号,重点检查 generate_task_pipeline.py_handle_stop_event 分支(L784-L793)和 app_runner.pyhandle_input_moderation / _complete_with_stream_output(L294-L341)。
  2. 检查消息保存逻辑:确认 _save_message(session=session) 在未传入 graph_runtime_state 时,是否对 metadata 等字段进行了空值处理。可优先尝试在保存前增加状态初始化或判空保护。
  3. 检查流结束函数:核对 _message_end_to_stream_response() 的返回值是否符合 SSE 格式预期,并确认 QueueStopEvent 是否被 _process_stream_response 正确识别为终止事件(L1023-L1025)。
  4. 验证输出审核处理:虽然输入审核不应调用输出审核路径,但可确认 output_moderation_handler 在未设置时是否会引发副作用。
  5. 临时规避:如无法立即定位根因,可在应用侧关闭输入审核功能,或调整审核规则避免触发,以作为临时规避方案。

验证方法

修复后,重新开启输入审核并输入触发规则的内容;确认服务端日志不再出现异常堆栈,客户端流式响应能够在审核提示后正常结束(收到完整的流结束标记,而非连接中断或异常报错)。同时,可在 Chatflow 中检查该消息记录是否正常保存且无报错。

参考来源

langgenius/dify #40881

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 18927

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注