发消息之后,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 本身没问题,是上一个任务太重。
解决:
- 把大任务拆小:「先帮我列一个提纲」→「展开第 2 点」→「写第 3 节正文」
- 换更快的模型处理长任务。在 Hermes 配置里,把
model临时改成响应更快的选项:
# ~/.hermes/config.yaml
model: deepseek-chat # 比 deepseek-reasoner 快得多
- 如果必须用重型任务,设置超时时间:
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 场景问题?竞品监控机器人,零代码手把手