Comfy Agent 只回半句 / 是上下文窗口还是工作流超时?

文章导读
Comfy Agent 只回半句,通常先分两条线排查:一是对话侧上下文窗口被截断,二是 ComfyUI 工作流执行超时或中断后 Agent 提前返回。判断的关键不是猜,而是把半句停止的位置和 ComfyUI 控制台同一时间的工作流状态对齐看:控制台显示工作流已执行完成,停止更像上下文裁剪或文本拼接截断;控制台停在某个节点、仍在运行或出现超时中断提示,超时的可能性更大。
📋 目录
  1. A 在会话记录里标出半句停止的位置
  2. B 查看 ComfyUI 控制台同一时间的工作流状态
  3. C 用短上下文和长上下文各跑一次对照
  4. D 把超时相关配置写成通用占位并标注验证项
  5. E 整理两类现象的可复现步骤
A A

Comfy Agent 只回半句,通常先分两条线排查:一是对话侧上下文窗口被截断,二是 ComfyUI 工作流执行超时或中断后 Agent 提前返回。判断的关键不是猜,而是把半句停止的位置和 ComfyUI 控制台同一时间的工作流状态对齐看:控制台显示工作流已执行完成,停止更像上下文裁剪或文本拼接截断;控制台停在某个节点、仍在运行或出现超时中断提示,超时的可能性更大。

先记录半句停止的时间点、消息角色和停止前后文本,再取同一时刻 ComfyUI 控制台最后几行。工作流已完成而文本中途断开,优先查上下文长度和历史消息裁剪;工作流仍在运行或出现超时提示,优先查等待超时与节点耗时。两类原因可能叠加,建议各跑一次对照确认,不要只改一处配置就下结论。

在会话记录里标出半句停止的位置

打开会话记录,可以是 Agent 前端的历史面板、后端 session 日志,也可以是落库的 messages 表。先确定最后一条 assistant 消息,然后截取停止点左右的内容:停止前最后一段完整文本、停止处的残余字符,以及停止点后面是否还有内容。记录时间点精确到秒、消息角色是 user、assistant 还是 system、消息序号、字符长度或粗略 token 估算。

用下面这类占位记录格式,把两次运行的差异摆在一起看:

time=相对时间戳  role=user       msg_id=xx  chars=xx
 time=相对时间戳  role=assistant  msg_id=xx  status=stopped
 tail_before=最后一段完整文本
 stop_point=被切断处的残余字符
 after_stop=停止点之后是否还有文本

如果半句切断在 JSON、代码块、Markdown 表格中间,缺少闭合标记,通常是被硬截断;如果半句前已经出现工作流结果摘要,停止发生在结果之后的说明文字,则更像工作流返回后的拼接或后续调用中断,而不是上下文窗口本身不够。截取时不要只抄最后一行,至少保留停止前完整一段和停止处残余,否则后面无法比较两次运行的停止位置。

查看 ComfyUI 控制台同一时间的工作流状态

在 ComfyUI 控制台窗口或日志文件里,定位与半句停止时间接近的最后几行。需要重点记录三项:最后执行到的节点名称或编号、该节点是完成还是报错、是否出现执行完成、执行错误、中断、超时或连接关闭之类的提示。

控制台表现工作流状态半句停止更可能的原因
最后一行显示执行完成或完成耗时已完成上下文截断、历史消息裁剪或返回文本拼接截断
停在某个节点,之后没有新输出仍在运行或卡住等待工作流超时,Agent 先行返回不完整文本
出现执行错误、中断或被终止提示失败或中断工作流异常或资源不足,与上下文长度关系不大
没有工作流日志,只有对话请求日志未触发工作流上下文窗口先截断,工具调用未发出

ComfyUI 页面上的队列面板可以辅助核对:停止时队列里是否还有该 prompt、队列状态是执行中还是已清空。控制台最后几行和队列状态要一起留档,单独看一边容易误判。

用短上下文和长上下文各跑一次对照

固定同一个提示词和同一个工作流,不改模型、采样步数、分辨率、节点参数。第一遍清空会话或只保留最近一两轮对话,让历史消息尽量短;第二遍保留较多历史消息,或主动塞入一段长文本作为上下文。两次都用同样的记录格式,记下停止位置、返回耗时和控制台工作流状态。

如果长上下文那次停止位置明显提前,且控制台显示工作流已完成,通常指向上下文窗口或 Agent 的历史裁剪策略;如果两次停止位置都落在同一个工作流耗时点附近,长上下文并没有改变停止位置,超时的嫌疑更大。这个对照只能缩小范围,具体阈值需要结合模型上下文长度和 Agent 配置确认。

Comfy Agent 只回半句 / 是上下文窗口还是工作流超时?

验证时不要只看对话窗口,可以翻 Agent 请求日志里的 token 数或 messages 条数,确认第二遍确实比第一遍长;同时确认两次的工作流耗时接近,避免把工作流耗时差异误当成上下文长度影响。对照实验的价值在于只动一个变量,其他条件保持住。

把超时相关配置写成通用占位并标注验证项

把可调超时和不可调运行耗时分开记录。可调项通常包括 Agent 等待工作流结果的超时、HTTP 请求超时、WebSocket 空闲超时、ComfyUI 队列等待相关设置;不可调项是工作流实际执行时间,由模型、采样步数、分辨率、节点数量决定,不能靠改一个字段消除。

# 占位示例,字段名按你的环境替换,数值按需调整
 agent:
   workflow_wait:
     timeout_seconds: 120
   http_client:
     request_timeout_seconds: 120
 comfyui:
   queue_wait_timeout_seconds: 120

改完后用同一提示词再跑一次,在控制台或日志里确认新值是否被读取。可验证的信号包括:日志里出现与超时配置相关的读取记录、实际等待时长接近配置值、超时提示文案与该配置项对应。如果改了 timeout_seconds 但停止位置和等待时长没有变化,说明该字段未生效、被其他层覆盖,或应用没有重启加载。需要结合环境确认配置优先级和进程重启情况。

整理两类现象的可复现步骤

先记录基线:同一提示词、同一工作流、同一会话状态,连续跑两次,确认半句停止可以重复出现。然后分别构造条件,每次只改一个变量。

上下文截断类

  • 最小触发:保留长历史消息,使总长度接近或超过模型上下文窗口,或把历史消息条数调多。
  • 操作:只改历史消息长度,不改工作流。
  • 观察信号:停止位置随历史长度变化;控制台工作流已完成;降低历史长度后半句停止消失或停止位置后移。

超时中断类

  • 最小触发:让工作流执行时间超过配置的等待超时,可以用大分辨率或更多节点拉长耗时来验证。
  • 操作:只改等待超时或工作流耗时,不改上下文长度。
  • 观察信号:停止位置与工作流耗时点对应;控制台仍在执行或出现超时中断提示;调大等待超时后返回完整,或停止位置后移。

两类原因可能同时出现,比如上下文已经接近上限、工作流又刚好耗时较长。建议先固定其中一项,再单独改另一项,把会话记录、控制台最后几行和配置值一起留档。如果调整后现象没有变化,需要回到日志确认 Agent 实际读取的配置和 ComfyUI 实际执行状态,而不是继续叠加修改项。