Workflow miss

该问题通常出现在 Dify 工作流中的 Agent 节点调用推理模型(如 GLM-5.3)且涉及工具调用时,模型输出的 标签未正确闭合,导致后续内容全部被渲染为“思考中”而不可见。优先检查 Agent 节点是否已正确关闭 标签,并考虑在节点后添加 Code 节点做兜

快速结论:该问题通常出现在 Dify 工作流中的 Agent 节点调用推理模型(如 GLM-5.3)且涉及工具调用时,模型输出的 <think> 标签未正确闭合,导致后续内容全部被渲染为“思考中”而不可见。优先检查 Agent 节点是否已正确关闭 </think> 标签,并考虑在节点后添加 Code 节点做兜底清理。

适用环境:Dify 1.17(Self Hosted,Docker 部署),工作流中使用 Agent 节点并配置带工具调用的推理模型。

最快修复方案:暂无确认的一步修复方案。Dify 核心代码中 Agent 节点的 AgentMessageTransformer.transform() 方法目前没有对 <think> 标签的跨片段状态追踪与强制闭合逻辑。可优先尝试在 Agent 节点后添加 Code 节点,通过正则清理未闭合标签作为临时方案。

注意事项:该问题并非 GLM-5.3 特有,任何在 Agent 节点中调用带推理能力且涉及工具调用的模型均可能触发。Dify 官方此前有修复 PR(#38506),但仅针对 Agent v2 应用运行器,工作流中 Agent 节点的 message_transformer.py 尚无对应保护逻辑。

问题场景

用户在 Dify 1.17 自托管(Docker)环境中,于工作流内使用 Agent 节点,配置 GLM-5.3 模型并开启工具调用。模型输出预期包含 <think>...</think> 与正常回复两部分,但实际执行时,工具调用边界处 <think> 标签未被闭合,导致后续所有内容(包括对用户可见的回复)都被包裹在思考标签之内,无法正常显示。

报错原文

Workflow miss 

<think>
prefill 配置:seq_len=4096, cache_len=0(纯 causal,mask_ratio=0.5),tp=1, ep=8, ranks=8, gbs=64。dp_size 在 prefill 时 = num_ranks // (cp*ulysses*pp*tp) = 8 → bs=8。

先快速读 prefill/simulate.py 的 build_graph 与 check(尤其 cache_kv=None 的 prefill 处理与 prune 列表),再跑。
<think>
prefill simulate.py 检查:

从输出可见,第一个 <think> 之后没有出现 </think>,紧接着又出现了第二个 <think>。因思考标签未闭合,用户无法看到实际回复内容。

原因分析

该问题属于 Dify 在处理 <think> 推理标签时的结构性缺陷,而非偶发异常。核心原因如下:

Dify 的“启用推理标签分离”功能(将 <think></think> 内容单独提取并展示)目前仅实现于 LLM 节点(详见 PR #23313),Agent 节点没有对应逻辑。Agent 节点的 AgentMessageTransformer.transform() 方法仅将每个 TEXT 消息块拼接到 text 字段后输出为 StreamChunkEvent,代码中没有跨片段的状态解析器来追踪 <think> 标签是否未闭合,也没有在工具调用事件中断输出流时强制关闭悬空的 <think> 块。

当 GLM 在工具调用边界输出未闭合的 <think> 标签后,后续所有流式内容都会被渲染在仍处于打开状态的标签内,最终表现为全部内容进入“思考中”区域。旧版 Agent 运行器(FunctionCallAgentRunner)同样存在该问题——它按文本片段累加原始响应字符,没有跨工具调用轮次维护 think 标签状态。

环境排查

  • 确认 Dify 版本是否为 1.17(或更高版本中是否已更新相关代码)。
  • 确认 Agent 节点中配置的模型是否为带推理标签输出的模型(如 GLM-5.3 或其他推理模型)。
  • 确认 Agent 节点已启用工具调用功能,即是否为 Agent with tools 工作流。
  • 查看用例通过时,问题是否在特定模型提供方或插件版本下出现。

解决步骤

  1. 临时兜底方案(可优先尝试):在 Agent 节点后添加 Code 节点,通过正则清理未闭合的 <think> 标签:
    import re
    # 删除所有 <think>...</think> 块(包括未闭合的)
    result = re.sub(r'<think>.*?</think>', '', agent_output, flags=re.DOTALL)
    result = re.sub(r'<think>.*', '', result, flags=re.DOTALL)  # 捕获未闭合标签
  2. 建议追踪修复进展:Dify 官方此前有 PR #38055 尝试增加 Agent 推理标签分离,但已关闭(维护者表示修复应放在独立的 Agent strategy 插件中,而非 Dify 核心)。请关注 Dify 仓库中关于 Agent 节点推理标签处理的相关 Issue 与 PR。
  3. 为维护者提供信息:如问题持续出现,请反馈准确的模型提供方/插件版本,以及工具调用边界的原始执行追踪记录,帮助确认修复应在核心代码(message_transformer.py)还是模型提供方插件中实现。
  4. 改用 Agent v2 应用运行器:Dify 已对 Agent v2 应用运行器合入修复(PR #38506),该修复会在每个工具事件中显式关闭当前 thinking 段落。如可行,可考虑使用 Agent v2 而非工作流中的 Agent 节点。

验证方法

执行一次带工具调用的长工作流,观察模型输出:确认在工具调用边界后,思考内容与回复内容的分隔是否正确,用户能否正常看到最终回复。若添加了 Code 节点作为临时方案,验证正则清理后输出是否正常展示,且不影响正常闭合标签时的反向内容显示。

参考来源

langgenius/dify #41558 Workflow miss

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22077

发表回复

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