发消息之后,Agent 确实在「转」——加载动画还在,TUI 里的 spinner 还在旋转,或者 Telegram 那边显示 Bot 正在输入……但就是不发出来。

等了 1 分钟,还是转。5 分钟,还是转。

这和「完全没反应」不一样——那种情况是消息发出去没任何动静,通常是 Gateway 没起来或者 Token 填错了(参见:Hermes Agent 没反应怎么办)。

转圈不回复代表 Agent 已经收到了你的消息,也在尝试处理,但卡在某个环节出不来。这篇是这种故障的排查指南。


先做这件事:打断它

不要继续等。超过 2 分钟还没回复,立刻打断:

TUI 模式下:按 Ctrl + C,停止当前会话

Telegram / QQ Bot 模式下:发送这条消息:

/stop

或者直接重启 Gateway:

hermes gateway stop
hermes gateway start

打断之后,再发一条简短的测试消息(比如「你好」)确认 Agent 已经恢复响应。如果恢复了,再往下看原因;如果还是不行,直接看第 5 条。


五个原因,按发生频率排序

原因 1:任务太重,模型在慢慢思考

症状:任务涉及「写一篇长文」「分析这几十条数据」「帮我规划整个项目」——任务本身复杂,模型需要几分钟生成。

判断方法:打断任务,发「你好」——能正常回复。说明 Agent 本身没问题,是上一个任务太重。

解决

  1. 把大任务拆小:「先帮我列一个提纲」→「展开第 2 点」→「写第 3 节正文」
  2. 换更快的模型处理长任务。在 Hermes 配置里,把 model 临时改成响应更快的选项:
# ~/.hermes/config.yaml
model: deepseek-chat   # 比 deepseek-reasoner 快得多
  1. 如果必须用重型任务,设置超时时间:
llm:
  timeout_seconds: 120   # 超过 2 分钟强制中止,不要无限等待

原因 2:工具调用卡住了

症状:Agent 被要求访问某个网站、调用外部 API、或者执行某个系统命令,但那个操作本身挂起了。

判断方法:查看实时日志,看 Agent 卡在哪个工具调用:

hermes logs --tail 30

如果日志最后几行是类似这样的内容:

[tool] web_fetch: fetching https://some-slow-site.com ...
[tool] web_fetch: waiting for response...
[tool] web_fetch: waiting for response...

一直在等待某个外部请求,就是这个原因。

解决

打断之后,手动测试目标网站是否可访问:

curl -I https://some-slow-site.com --max-time 10

如果超时或者无法访问,说明是目标网站的问题,不是 Hermes 的问题。

给工具调用设置超时:

tools:
  web_fetch:
    timeout_seconds: 15   # 网页抓取超过 15 秒就放弃

原因 3:Agent 陷入了工具调用循环

症状:查看日志,发现 Agent 在反复调用同一个工具,没有任何进展——比如一直在搜索同一个关键词,或者一直在读同一个文件。

典型日志

[step 1] search: "competitor pricing"
[step 2] search: "competitor pricing page"
[step 3] search: "competitor pricing details"
[step 4] search: "competitor pricing information"
...(一直在搜,没有在回复)

这是 ReAct 循环的一种卡死形式——模型认为它还没搜到足够的信息,所以继续搜,但每次搜索结果都不满足它的判断,陷入死循环。

解决

打断后,重新描述任务时加上约束:

帮我查一下竞品的定价,最多搜索 3 次,搜不到就直接告诉我「未找到」

也可以在配置里限制每次会话的最大工具调用次数:

agent:
  max_tool_calls: 20   # 每次会话最多调用 20 次工具,超过就停止

原因 4:对话历史太长,上下文撑满了

症状:在同一个对话里聊了很久,越来越慢,最后开始转圈不回复。这种情况通常是渐进式的——前几条消息没问题,越往后越慢。

判断方法:开一个新会话,发同样的消息。如果新会话秒回,说明是旧会话的上下文太长。

解决

清除当前对话上下文:

/clear

或者完全重置会话:

/reset

重置之后,重新描述你的需求。如果是长期任务,建议每 20-30 条消息主动 /clear 一次,避免上下文积累过多。

提示:Hermes v0.13.0 之后,/goal 命令可以跨轮次保持任务目标。如果你有持续性任务,用 /goal 我要做的事情 代替每次重新描述,既能保持目标又不会堆积无效上下文。


原因 5:两个会话同时在运行

症状:你之前可能开了 TUI、同时又在 Telegram 发消息,或者 Gateway 崩溃后自动重启但旧进程没退出,导致两个 Hermes 进程在抢同一个 API Key 或者同一个端口。

判断方法

hermes status

如果看到多个活动会话,或者状态显示异常,就是这个问题。

也可以直接查进程:

# Linux / macOS
ps aux | grep hermes

# Windows PowerShell
Get-Process | Where-Object { $_.Name -like "*hermes*" }

解决:强制停止所有 Hermes 进程,再干净启动:

hermes gateway stop --force
# 等 5 秒
hermes gateway start

验证:确认恢复正常

处理完上面的某个原因之后,发这条消息验证:

现在几点?

这是最轻量的测试——只需要 Agent 报一下当前时间,不涉及任何工具调用,如果这条秒回,说明完全恢复了。


快速查原因:看这张表

你的情况对应原因
任务是「写长文/分析大量数据」原因 1:任务太重
任务包含「访问网站/调用 API」原因 2:工具调用卡住
日志里同一个工具反复调用原因 3:工具调用循环
对话已经进行了很长时间原因 4:上下文太长
最近重启过 Gateway 或开了 TUI原因 5:进程冲突

以后怎么预防

~/.hermes/config.yaml 加上这三行,可以预防大多数转圈卡死的情况:

llm:
  timeout_seconds: 120     # LLM 响应超时 2 分钟

agent:
  max_tool_calls: 20       # 单次会话最多调用工具 20 次

tools:
  web_fetch:
    timeout_seconds: 15    # 网页抓取超时 15 秒

这三个超时设置加上之后,任何原因导致的卡死最多等 2 分钟就会自动报错退出,不会无限转圈。


「Agent 急救手册」系列持续更新,解决最高频的 Hermes Agent 故障。
上一篇:Agent 完全没反应:6 步排查清单
遇到 Vibe Coder 场景问题?竞品监控机器人,零代码手把手