← 所有文章

Hermes Agent 报错 "Response Remained Truncated After 3/4 Continuation Attempts" 修复

修复 Hermes Agent 报错 Response remained truncated after 3/4 continuation attempts:先看前一行日志区分 length 截断、流中断或无可见输出,保住已有内容并按 3 步恢复。

UniRoute ·

当 Hermes Agent 在回合结束时提示 Response remained truncated after 3 continuation attempts 或 Response remained truncated after 4 continuation attempts,说明当前回合因达到单轮输出上限(finish_reason='length')或遇到流式连接中断(st.is_stub)进入了自动续写恢复循环(_continue_text),但在用尽重试次数后仍未能拿到完整结束符。

现在就能做的 3 步解法

  1. 看报错前一行的告警信号: 检查重试计数(1/3 或 1/4)正上方的那一行提示(或运行 hermes logs errors -n 100),判断本次是单轮输出达到上限(finish_reason='length')、流式传输中途断开(Stream interrupted — requesting continuation),还是未产出可见文本(no visible text was produced)。
  2. 不要原样重发,先保住已有输出: 先把报错上方已拼接出的半截回复复制保存;如果当前回合涉及改文件或跑命令,先执行只读命令 /diff、/status 与 /context 确认工作区状态,避免盲目重发覆盖磁盘改动或翻倍消耗 Token。
  3. 让模型只续写剩余部分,或缩小单轮输出、换输出上限更大的模型: 明确要求模型“只从最后完成的小节继续往下写”,或把大体积文件修改拆成多次小补丁;若受制于当前模型的单轮输出上限,可改用输出上限更大的模型。使用一个 UniRoute API Key(见 Hermes CLI 接入文档)即可在 Hermes 内切换 Claude、GPT、DeepSeek 等模型——例如 DeepSeek 官方价格页标明 deepseek-flash 与 deepseek-v4-pro 的最大输出长度为 384K(截至 2026-10-27,实时费率见 UniRoute 定价页;注意 UniRoute 目录里各模型的输出上限可能不同,请以 /zh/models 为准)。

本文覆盖的报错原文变体(核对自 NousResearch/hermes-agent 固定提交 b0427271e33c8b239985d3d66bd9d4f10f87e25b 源码及官方 Issue #628、#9372、#46833、#58423):

  • Response remained truncated after 3 continuation attempts(2026 年中期之前的发布版,如 v0.9.0–v0.16.0)
  • Response remained truncated after 4 continuation attempts(当前 main 分支 agent/turn_truncation.py)
  • ⚠️ Response still truncated after N continuation attempts — no visible text was produced.
  • Codex response remained incomplete after 3 continuation attempts(codex_responses 协议路径)

注:用户也会搜索类似 "response still truncated after two output token limit continuations" 的写法——该表述并非 b0427271 源码中的字面原文,但指向同一类输出续写耗尽故障。

核查范围说明(2026-10-20):本文基于 NousResearch/hermes-agent 官方 Issue 及固定提交源码(b0427271e33c8b239985d3d66bd9d4f10f87e25b)核查整理。我们未在 UniRoute 环境复现该故障,文中步骤旨在帮助开发者快速定位原因并保全既有进度,不作“单一配置即可包治所有上游截断”的承诺。


1. 快速分流:先看报错前一行的告警信号

最终的 Response remained truncated... 仅代表“续写恢复未能在上限内完成”。在重发指令前,请先核对重试计数(1/3 或 1/4)正上方紧邻的告警提示或 hermes logs 日志,区分具体触发路径:

报错前的终端告警或日志特征触发路径实际发生了什么首选安全动作
⚠️ Response hit token limit (finish_reason='length') 随后出现 ↻ Requesting continuation (n/3)... 或 (n/4)...单轮输出触及上限 (finish_reason == "length")模型或 OpenAI 兼容服务端在达到单轮输出上限时停止生成,后续自动续写仍未拿到 stop 结束符。先检查屏幕上是否已保留可用的半截正文;运行只读命令 /status 与 /context;仅要求模型从断点之后继续生成。
↻ Stream interrupted — requesting continuation (n/4)... 或日志出现 stream ended before completion流式传输中途断开 (st.is_stub)上游流式连接在返回结束状态前提前断开;Hermes 尝试基于流中断存根(stub)发起续写,但最终仍未完成。运行 hermes logs errors -n 100 排查上游断流或超时;可参考 Stream Idle Timeout 流空闲超时排查指南。
⚠️ Response still truncated after N continuation attempts — no visible text was produced.未产生可见正文(需结合日志分流)初始响应与续写均未产出可见文本——可能源于上游空存根/流提前断开,也可能是推理模型在思考(Thinking)阶段耗尽了输出配额(仅为可能原因之一)。先运行 hermes logs errors -n 100 排查具体原因并核对服务端默认最大输出限制;若日志确认是思考阶段耗尽配额且路由支持,可尝试调低推理强度(/model 搭配 --reasoning low)。
↻ Stream interrupted mid tool-call (...) — requesting chunked retry (n/4)... 或工具调用截断重试工具调用 JSON 参数被截断模型在生成大体积工具参数(如 patch 或 write_file)时发生截断;Hermes 拒绝执行残缺的 JSON。先运行 /diff 和 git status 核对工作区改动,随后要求 Agent 改为分步、小粒度的文件修改。
Codex response remained incomplete after 3 continuation attemptsCodex Responses status=incomplete在 codex_responses 协议路径下,上游接口在重试预算内持续返回 status=incomplete。运行 /context 检查上下文余量及服务端限制,将大任务拆分为更小的单步对话。

2. 停止条件与计费边界(切勿盲目连点重试)

遇到续写失败时,请勿直接连按重试。由于自动续写会向上游发送携带历史上下文的后续请求,盲目重跑同一条大 Prompt 往往会白白增加 Token 消耗。

  1. 不要仅凭报错数字硬推实际请求数或是否有正文:在 agent/turn_truncation.py(第 305–370 行)中,_continue_text 会先将计数器加一(n += 1),仅在满足 n < 4 and filled is None 时才真正发出下一次续写请求;若检测到上下文窗口已满也会提前终止。同时,若上游或中断存根未产生可见文本(例如空存根或思考阶段耗尽预算,见第 316–320、356–360 行),屏幕上会提示 no visible text was produced。因此,不能用固定公式从报错文案反推是否有可见正文、实际发出了几次成功请求,或是否产生费用(是否收费及具体金额取决于所连服务商、本地免费部署或云端部署方式、实际 usage 记录与账单结算)。
  2. 以真实调用记录与账单为准:请先在会话中运行 /usage 和 /status,并查看 hermes logs(agent.log)或上游服务商日志中的实际 api_calls 与 Token 统计。如果你通过 UniRoute 接入 Hermes,可前往 UniRoute 控制台核对每笔请求的实际记录(注:控制台可见的调用日志与钱包余额结算属于不同记录环节)。
  3. 先保全工作区与会话现场:
    • 如果报错上方已经打印出拼接后的部分回复(partial_response),先把可用内容复制或保存下来,避免从零重算。
    • 如果该回合包含文件读写或命令执行,先运行只读的 /diff(或在终端执行 git status / git diff)以及 /agents,确认前序步骤是否已经修改了磁盘文件。
    • 停止条件:如果缩小范围提示后连续 2 次依然触发截断,请立即停止重试,先执行第 4 节的只读诊断。

3. 为什么有的报“3 次”、有的报“4 次”?为什么旧帖的 max_tokens 已失效?

在检索 GitHub Issue 时,你常会看到不同帖子里给出的报错次数和配置建议互相矛盾,这源于 2026 年间 Hermes 的版本演进。

1. 历史版本(3 次)与当前 main 分支(4 次)

  • 历史版本显示 3 continuation attempts:2026 年 3 月至 7 月的多条官方 Issue——包括 #628(2026 年 3 月)、#9372(v0.9.0,2026 年 4 月)、#46833(v0.16.0,2026 年 6 月)和 #58423(2026 年 7 月)——均报出 Response remained truncated after 3 continuation attempts。
  • 当前 main 分支显示 4 continuation attempts:在当前 agent/turn_truncation.py(第 305–370 行)中,_continue_text 最终返回 Response remained truncated after 4 continuation attempts(而 codex_responses 的未完成处理分支仍保留 3 次的文案)。
  • _continue_text 同时承接 length 与流中断存根(st.is_stub):如 agent/turn_truncation.py(第 328–337 行)所示,_continue_text 既处理 finish_reason == "length",也处理流式响应中途断开留下的 st.is_stub 路径。因此,不能绝对地将该报错归结为“只因输出 Token 上限引起、绝不涉及流中断”。

2. 版本敏感配置与官方 Issue 状态核对表

配置项或官方 Issue / PR当前官方文档与仓库状态(b0427271)对用户的实际排障影响
model.max_tokens、HERMES_MAX_TOKENS、model_overrides.*.*.max_output_tokens当前版本已不再读取,官方建议移除(providers.md 第 1290–1311 行)在新版 ~/.hermes/config.yaml 中添加这些旧字段不会生效。自定义 OpenAI 兼容端点使用服务端自身的生成默认上限(例如 SGLang 的 --default-max-tokens),需在推理服务端调整。
model.context_length 与 model.ollama_num_ctx当前有效(控制总上下文窗口)(providers.md 第 1173–1195、1290–1292 行)定义的是输入 + 输出的总上下文窗口(用于自动压缩阈值与本地上下文校验),不是单轮输出上限。官方文档建议在硬件允许时 Agent 场景至少配置 64000。
Issue #9372(v0.9.0)、PR #9489、PR #12152Issue 已关闭;两个 PR 均关闭且未合并(merged: false)#9372 报告 NVIDIA Build API 下 z-ai/glm4.7 触发输出上限。相关的 PR #9489(内部重试抬升)与 PR #12152(NIM 默认值与接线)均未合并;维护者在 #9372#issuecomment-4668289126 说明递进式重试抬升已通过 f7af90e2d 合入主干。
Issue #58423(cron/scheduler.py 忽略单任务 max_tokens)已作为 not_planned 关闭~/.hermes/cron/jobs.json 中的单任务 max_tokens 不会被读取;该帖 2026 年 7 月评论中“改配全局 model.max_tokens”的建议已被当前 providers.md 淘汰。
Issue #46833(v0.16.0,Ollama gemma4:12b 思考截断与显存暴涨)仍处于 open 状态思考 Token 挤占输出配额,且 Hermes 从 Ollama /api/show 读取到 GGUF 上限 262144(num_ctx=262144)。报告者当时的 16384/65536 为 v0.16.0 单机经验值;新版应调整服务端输出上限及 model.context_length / model.ollama_num_ctx。

4. 只读诊断命令清单(不改状态、不耗费额外 Token)

在修改配置或压缩会话前,先使用官方 CLI 命令参考文档 与 斜杠命令参考文档 中的只读命令确认现状:

会话内只读斜杠命令(零 LLM 调用,不影响 Prompt Cache)

  • /status:显示当前模型、Provider、Session ID、累计 Token 以及本地会话摘要。由内存直接计算,零 LLM 调用,不会重置 Prompt Cache(见 slash-commands.md 第 65 行)。
  • /context(简写 /ctx):展示上下文窗口占用比例、距自动压缩阈值的余量及各规则文件 Token 估算。同样为纯本地只读,零 LLM 调用,不影响缓存(见 slash-commands.md 第 66 行)。
  • /usage 与 /config:只读查看当前会话用量与生效配置。
  • /diff 与 /agents:只读查看工作区未提交的 Git 改动,以及当前会话是否有正在运行的后台子任务。

终端只读排查命令

# 1. 查看本机安装的 Hermes 版本与 Commit
hermes --version

# 2. 查看运行状态
hermes status

# 3. 执行只读健康检查(首次排查切勿加 --fix)
hermes doctor

# 4. 查看 ~/.hermes/logs/ 中的错误与告警日志
hermes logs errors -n 100
hermes logs --level WARNING --since 1h
  • hermes doctor 的能力边界:通过 hermes doctor 仅说明本地配置文件语法和基础网络连通正常,不能证明实际长输出不会撞上服务端限制。
  • hermes dump 隐私保护:如需运行 hermes dump 导出环境摘要,切勿添加 --show-keys,并在发帖前手动删去私有文件路径、内网域名和账号标识。默认不要运行 hermes debug share(除非显式加 --local),否则日志会被上传到公共粘贴服务。

5. 先保全、再恢复的操作步骤(含明确的有损与请求/费用边界)

由于上下文压缩(/compress)属于有损摘要,而新建/重置会话(/new、/reset)会丢弃当前活动上下文,任何恢复操作都无法承诺绝对“无损”。请按从轻到重的顺序操作,并先保全已有成果:

恢复操作适用场景副作用、数据有损性与请求/费用边界
1. 局部定点续写或拆分工具调用屏幕上已有可用的半截正文,或单次 patch/write_file JSON 过大被截断。保留当前会话上下文,但会发起一次新的模型请求(是否收费及具体金额取决于所连服务商、本地免费部署或云端计费方式,以及实际 usage 与账单结算记录)。请明确要求模型“仅从最后完成的小节继续,不重复前文”,或要求分多次小补丁修改文件。
2. 尝试调低推理强度(/model ... --reasoning low)模型将配额耗尽在内部 Thinking 阶段,且当前模型与服务商支持推理强度控制。属于修改配置操作(非只读)。 注意:调低推理强度不能保证消除截断——例如在 Issue #46833 的 Ollama 环境中,将 high 调为 low 后若服务端输出上限与上下文窗口未调好,依然会截断。此外,用 /model 切换模型会重置 Prompt Cache(slash-commands.md 第 80 行)。
3. 先保存再压缩长会话(/save → /compress)/context 显示历史消息已逼近上下文上限(例如 Issue #628 中累积到 648 条消息 / 约 299K Token 的网关会话)。有损摘要 + 独立模型请求。 /compress 会将早期对话概括为摘要(可用 /compress here [N] 保留最近 N 轮原文),并额外发起一次独立的 Summarizer LLM 请求(configuration.md 第 997–1015 行;是否产生费用取决于 auxiliary.compression 所配服务商/本地部署方式及实际用量与结算记录)。执行前务必先运行 /save。
4. 开启新会话(/new [名称] 或 /reset)当前长对话历史已无需保留,希望启用全新的上下文窗口。清空当前会话历史。 请保留默认确认弹窗。注意:/new 与 /reset 不会回滚已写入磁盘的文件改动(重置前先看 /diff),也不会停止后台任务。

配置文件修改与后台任务注意事项

  • 编辑 ~/.hermes/config.yaml 前先关闭客户端:正在运行的 Hermes 会话可能会把内存中的状态回写到 config.yaml,覆盖你的手工修改。若需配置自动上下文压缩(注:当前官方 configuration.md 第 997–1015 行 使用 compression: 配置块,而非早期 #628 评论里讨论的 session_hygiene:),请先退出 CLI 或停止网关。
  • 切勿把 /stop 当成常规清理步骤:根据官方 slash-commands.md(第 51 行),/stop 会终止所有正在运行的后台进程(Kill all running background processes)。除非你已通过只读命令 /agents 确认存在卡死的后台任务、核实了它已产生的文件副作用且确认可以强行终止,否则不要随意执行 /stop。
  • 严禁删除 ~/.hermes 或 ~/.hermes/state.db:删除该目录会直接破坏本地历史会话数据库、Cron 任务及所有持久化状态。

6. 关联上游错误排查指南

若你在 hermes logs errors 中同时看到上游返回 HTTP 500、529 Overloaded 或流空闲断开,可分别参考 Claude Code API Error 500 排障指南、Claude API 529 Overloaded 错误修复方案 与 Claude Stream Idle Timeout 流空闲超时排查指南。