如何解决 Hermes QQ 机器人掉线问题

Hermes Agent 在接入 QQ 机器人时,常因长时间无业务流量触发 QQ 网关的 idle 超时机制(错误码 4009),导致即使心跳正常也会断线。由于 QQ C2C 场景天然低频,偶发的重连失败易使 Bot 进入“假死”状态。为解决此问题,采用 Hermes 内置的 Watch Dog 服务进行自动化监控:通过 cron job 每 5 分钟检查 Gateway 日志,若发现断连且未成功重连,则自动重启 Gateway。正常运行则静默处理。该方案无需 LLM 参与,零 Token 消耗。

发布于2026年5月14日 14:29
编辑零重力瓦力
评论0
阅读56

用 Hermes Agent 差不多 2 个月了。 一直被一个问题困扰,在接 QQ 机器人的时候,如果一段时间没发消息,bot 就会悄悄掉线。

查了一下 gateway 日志,每隔约 30 分钟就会出现一条:

WebSocket closed: code=4009 reason=Session timed out

4009 是 QQ 官方 WebSocket 网关的会话超时错误码。虽然 Hermes 内置了自动重连机制(断线后 2 秒重连),但偶发的重连失败会让 bot 进入"假死" 状态,也就是进程在跑,消息却收不到。

问题出在哪?其实就在 QQ 的 WebSocket 协议设计。

QQ 官方要求客户端在收到 Hello 事件后定期发心跳包,默认间隔约 41 秒。Hermes 按 80% 间隔(约 33 秒)发送心跳,理论上没问题。但 QQ 服务端还有另一层逻辑:长时间没有业务流量的会话会被判定为 idle,直接踢掉。

也就是说,即使心跳正常,"没人聊天" 一样会被踢掉。

这跟 Telegram 或 Discord 的 bot 不一样。Telegram 用长轮询(long polling),Discord 用的是高活跃度的 WebSocket(大型服务器每秒几十条消息),idle 超时极少触发。QQ 的 C2C(私聊)场景天然低频,而问题就出现在这。

在咨询了 Hermes 后,它给出了一个不错的方案,就是给 QQ 机器人加一个 Watch Dog 服务:每 5 分钟检查一次 gateway 日志,判断 qqbot 的连接状态。正常就静默退出,断连就自动重启 gateway。

Watch Dog 脚本用 Hermes 的 cron job 跑,采用 no_agent 模式的纯脚本,不需要 LLM,零 Token 消耗。

关键判断逻辑:

  1. 检查 gateway 服务是否在运行
  2. 查看最近日志里断连事件是否在重连事件之后
  3. 检查最近 5 分钟内有没有 Session timed out 但没有成功重连的情况

跑了一天,效果不错。之前隔三差五就要手动重启,现在全自动化了。

对了,如果 Watch Dog 脚本触发重启,它会通过 QQ 给我发一条通知。正常情况下则什么都不发。

Watch Dog

#!/bin/bash
# QQBot Watchdog - Check qqbot connection, restart gateway if disconnected
# Runs every 5 minutes via Hermes cron (no_agent mode)
set -euo pipefail

LOGFILE="$HOME/.hermes/logs/qqbot-watchdog.log"
MAX_LOG_LINES=200

log() {
    echo "[(date′+*" >> "$LOGFILE"
}

# Rotate log if too large
if [ -f "$LOGFILE" ]; then
    lines=(wc−l<"LOGFILE")
    if [ "lines"−gt"MAX_LOG_LINES" ]; then
        tail -n "MAXL​OGL​INES""LOGFILE" > "LOGFILE.tmp" && mv "LOGFILE.tmp" "$LOGFILE"
    fi
fi

# Check if gateway service is running
if ! systemctl --user is-active --quiet hermes-gateway.service 2>/dev/null; then
    log "WARN: Gateway service not running, starting it"
    hermes gateway start 2>&1 >> "$LOGFILE"
    echo "⚠️ QQBot 看门狗:Gateway 服务未运行,已尝试重启"
    exit 0
fi

# Check qqbot connection from recent gateway logs
GATEWAY_LOG="$HOME/.hermes/logs/gateway.log"

if [ ! -f "$GATEWAY_LOG" ]; then
    log "ERROR: Gateway log not found at $GATEWAY_LOG"
    echo "⚠️ QQBot 看门狗:找不到 gateway 日志文件"
    exit 0
fi

# Get the last 50 lines of gateway log for analysis
RECENT=(tail−50"GATEWAY_LOG")

# Find the most recent connection state events
LAST_DISCONNECT=(echo"RECENT" | grep -n 'WebSocket closed\|WebSocket error\|Reconnect failed\|Still not connected\|Disconnected' | tail -1)
LAST_CONNECTED=(echo"RECENT" | grep -n 'Ready\|Reconnected\|qqbot connected' | tail -1)

# Extract line numbers for comparison
DISCONNECT_LINE=""
CONNECT_LINE=""

if [ -n "$LAST_DISCONNECT" ]; then
    DISCONNECT_LINE=(echo"LAST_DISCONNECT" | cut -d: -f1)
fi
if [ -n "$LAST_CONNECTED" ]; then
    CONNECT_LINE=(echo"LAST_CONNECTED" | cut -d: -f1)
fi

# If last disconnect happened AFTER last connect, qqbot is likely disconnected
if [ -n "$DISCONNECT_LINE" ]; then
    if [ -z "CONNECTL​INE"]∣∣["DISCONNECT_LINE" -gt "$CONNECT_LINE" ]; then
        log "WARN: QQBot appears disconnected. Last disconnect (line DISCONNECTL​INE)afterlastconnect(lineCONNECT_LINE). Restarting gateway."
        hermes gateway restart 2>&1 >> "$LOGFILE" || true
        # Give it a moment, then verify
        sleep 5
        if systemctl --user is-active --quiet hermes-gateway.service; then
            echo "🔄 QQBot 看门狗:检测到断连,已重启 gateway"
        else
            echo "❌ QQBot 看门狗:重启后 gateway 仍未运行,请手动检查"
        fi
        exit 0
    fi
fi

# Also check: has there been any heartbeat timeout in the last 5 minutes WITHOUT reconnect?
LAST_5MIN=$(date -d '5 minutes ago' '+%Y-%m-%d %H:%M' 2>/dev/null || date -v-5M '+%Y-%m-%d %H:%M')
RECENT_5MIN=(tail−200"GATEWAY_LOG" | awk -v ts="LAST5​MIN"′0 >= ts')

TIMEOUT_IN_5MIN=(echo"RECENT_5MIN" | grep -c 'Session timed out' 2>/dev/null || echo "0")
RECONNECT_IN_5MIN=(echo"RECENT_5MIN" | grep -c 'Reconnected\|Ready' 2>/dev/null || echo "0")

if [ "TIMEOUT_IN_5MIN" -gt 0 ] && [ "RECONNECT_IN_5MIN" -eq 0 ]; then
    log "WARN: Session timeout detected without successful reconnect in last 5min. Restarting gateway."
    hermes gateway restart 2>&1 >> "$LOGFILE" || true
    sleep 5
    echo "🔄 QQBot 看门狗:检测到超时未重连,已重启 gateway"
    exit 0
fi

# All good - quiet exit (no output = no notification)
log "OK: QQBot connected and healthy"
exit 0

相关文章

Hermes 超越 OpenClaw,背后是两种哲学的正面交锋
AI 产品工具
2026年5月16日
0 条评论
零重力瓦力

Hermes 超越 OpenClaw,背后是两种哲学的正面交锋

Hermes Agent 以单日 2240 亿 token 的处理量超越 OpenClaw,登顶开源 AI 智能体榜首。两者代表不同发展哲学:OpenClaw 侧重“连接一切”,拥有庞大生态但近期遭遇严重安全危机;Hermes 主打“自我进化”,通过自动反思生成技能并自主优化库,实现效率提升。尽管 OpenClaw 在广度上仍具优势,但 Hermes 凭借自学习机制和安全改进迅速崛起。未来趋势或指向两种哲学的融合,即兼具广泛连接与自主进化能力的智能体。

#Hermes Agent#OpenClaw#智能体框架
阅读全文
上下文工程:当提示词工程装不下整个智能体时,谁来接管 AI 的 “工作台”
智能体工程
2026年5月15日
0 条评论
零重力瓦力

上下文工程:当提示词工程装不下整个智能体时,谁来接管 AI 的 “工作台”

“上下文工程” 正取代 “提示词工程”,成为 AI Agent 开发的核心范式。随着模型能力提升、Agent应用普及及企业合规需求,交互重点从单轮指令转向多步骤工作流中的动态信息编排。该领域涵盖系统指令、用户输入、检索知识、对话历史及工具定义五层结构。由于上下文窗口资源有限且易出现中毒、分心等失败模式,需通过ACE框架实现上下文的自进化与增量更新。实操建议包括外部化状态、按需检索、压缩累积及隔离多Agent上下文。本质上,上下文工程是提示词工程的超集,标志着 AI 开发进入以系统架构和状态管理为主导的工程时代。

#上下文工程#智能体工程#提示词工程
阅读全文
读懂 LLM : AI 是如何“思考”的,又该如何高效使用
智能体工程
2026年5月13日
0 条评论
小创

读懂 LLM : AI 是如何“思考”的,又该如何高效使用

掌握大语言模型(LLM)的核心在于理解其底层机制与交互技巧。首先,Token 是模型处理文本的最小单位,直接影响输入输出长度及费用。默认的非确定性模式赋予模型创意,但也导致结果不可预测。其次,温度、最大 Token 数和 Top-p 三个参数共同调控模型的随机性、回复长度及词汇选择范围,用户可根据精准或创意需求灵活调整。此外,受限于上下文窗口,模型仅能记忆当前对话片段,超出部分会被丢弃。最后,提示词质量决定输出效果,高质量的提示词应包含清晰指令、背景信息及期望格式,通过缩小猜测空间来提升回答的准确度。

#提示词工程
阅读全文
互动讨论

评论区

围绕《如何解决 Hermes QQ 机器人掉线问题》展开交流,未登录用户可浏览评论,登录后可参与讨论。

评论数
0
登录后参与评论
支持发表观点与回复一级评论,互动后将同步到消息中心。
登录后评论
暂无评论,欢迎成为第一个参与讨论的人。