OpenClaw 的 Heartbeat 在 Issue #7613 里会 10–20 秒触发一次,每次约 170k–210k tokens,官方 Discussion #11042 直接承认它是 Token 黑洞。与其先动 Cron,不如把外接 LLM 的认证通道收到 TaoToken:去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建 Key,再把 OpenClaw 模型配置里的 Base URL 填 https://taotoken.net/api。这篇排障不承诺让 TaoToken 去修心跳,也不建议你把调度系统交给模型;它只做一件事——让 OpenClaw 发出的每一次模型请求都带同一把 Key,这样你在控制台看到的是可对账的调用曲线,而不是散落在多个供应商、多个 Key 里的黑盒消耗。原生 Heartbeat 之所以可怕,不只是单次上下文大,还因为它和 Cron 共享 Gateway 事件总线,Bug #29182 与 #7613 会把心跳事件错误投递或把触发频率顶到秒级。先把模型出口统一,再去对照 Issue 禁用心跳或换隔离 Cron,排障顺序会清楚很多。OpenClaw 自身没有推理能力,它必须外接 Claude、GPT-4o、DeepSeek、Kimi 这类 LLM 当大脑;心跳每次唤醒都要调用模型,所以模型通道的计量方式直接决定你能不能看清 Token 去哪了。
1. 心跳每 10–20 秒烧掉 170k Token,先分清是哪一层失控
1.1 Discussion #11042 里的 Token 黑洞长什么样
官方 Discussion #11042 里,核心贡献者给出的建议很直接:禁用原生 Heartbeat,改用隔离 Cron Session 运行心跳逻辑,再配合 openclaw-mem 只加载最小必要状态,走轻量级上下文模式。这个建议之所以被反复引用,是因为原生 Heartbeat 每次运行会携带完整主 Session 上下文,消耗约 170k–210k tokens。按默认设计,心跳本该每 30 分钟唤醒一次;但在 Issue #7613 描述的状态机污染下,实测触发间隔会掉到 10–20 秒。你可以自己粗算:如果每 15 秒触发一次,一小时就是 240 次,每次按 17 万 token 估算,量级会迅速失控。更麻烦的是,这些请求不是集中在一次排障会话里,而是散落在主 Session、隔离 Session、Cron 通道和各个消息平台之间,等你发现账单异常时,上下文已经滚了好几轮。
心跳失控时,日志里常见几类信号:HEARTBEAT_OK反复出现,主 Session 收到不该有的摘要推送,隔离 Session 里混入Cron: HEARTBEAT_OK系统消息,Telegram 或 Discord 出现重复主动通知。它们分别对应 Bug #20941、#29182、#40545 等已确认问题。排障第一步不是换模型,也不是删 Key,而是先确认这些请求到底从哪条调度链路发出来。
1.2 为什么先把模型通道收拢到 TaoToken,而不是直接改 Heartbeat
OpenClaw 的调度层和模型层是两件事。Heartbeat 和 Cron 负责决定“什么时候唤醒、唤醒谁、带什么上下文”,模型供应商负责“这次推理发往哪个 API、用哪把 Key、算在哪个账号”。如果模型出口是散的——比如主 Session 用一把 Key,隔离 Cron 用另一把,子 Agent 又走了第三个供应商——你看到 Token 暴涨时根本无法判断是调度重复触发,还是模型通道自己在重试。把 OpenClaw 的模型配置统一到 TaoToken,Base URL 填https://taotoken.net/api,Key 用同一把YOUR_API_KEY,你至少能拿到一条完整的调用时间线:什么时间、哪个模型、请求了多少次。
TaoToken 在这里的角色是统一 API 和兼容通道,不是调度修复器。它不会去改HEARTBEAT.md,也不会替你关闭 Cron。它的价值在于把模型请求的计量口径统一,让你在控制台里看到异常密集的调用,再拿着这些时间点去对照 OpenClaw 日志和 Issue。先分清“调度重复”和“模型重试”,后面才不会乱改配置。
1.3 这篇排障的边界:哪些事必须你手动做
OpenClaw 是跑在你本地或你服务器上的守护进程,TaoToken 没有权限也不应该去碰它的进程、Cron 表或 Session 文件。你需要手动做的包括:备份~/.openclaw/cron/jobs.json和模型配置文件,编辑配置,重启 OpenClaw,观察日志。控制台能帮你确认调用是否走到同一把 Key,但不能替你执行 OpenClaw 内部的修复。官方建议的“禁用原生 Heartbeat、换隔离 Cron Session、只加载最小状态”也要在 OpenClaw 侧完成。把边界划清,才不会把模型通道当成万能药。
2. 打开 OpenClaw 模型供应商配置,把 Base URL 换成 https://taotoken.net/api
2.1 准备材料:从官网创建 YOUR_API_KEY
打开 TaoToken,注册并登录,进入控制台创建 API Key。Key 通常只完整显示一次,复制后放到安全位置。本文所有配置里的 Key 都写成占位符YOUR_API_KEY,你不要把真实 Key 贴进聊天、Issue 评论或SOUL.md。模型 ID 不要凭记忆写,去模型广场看当时的列表,复制对应 ID。准备材料就三样:一把 Key、一个 Base URLhttps://taotoken.net/api、一个以模型广场为准的模型 ID。
2.2 OpenClaw 配置文件里改哪几个字段
OpenClaw 的 Workspace-First 配置由 Markdown 和 JSON 共同驱动。Markdown 文件如SOUL.md、AGENTS.md、HEARTBEAT.md是给模型看的约束,不要往里写密钥。模型供应商配置在~/.openclaw/下的 JSON 文件里,常见是config.json或类似名称,具体以你本机版本为准。下面是一个 OpenAI-compatible 供应商的配置片段,字段名如果和你本地不同,只替换对应值,不要新增一套无关结构:
{ "llm": { "provider": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKey": "YOUR_API_KEY", "model": "YOUR_MODEL_ID" } }注意三件事。第一,baseUrl末尾不要加/v1,填https://taotoken.net/api即可。第二,如果原文件里字段叫base_url、baseURL或api_base,沿用原字段名,只改值。第三,JSON 对逗号和引号敏感,改完先用编辑器的 JSON 校验或jq过一遍,再重启 OpenClaw。改配置前先复制一份备份,避免语法错误导致整个 Gateway 起不来。
2.3 模型 ID 以模型广场为准,不要硬编码过期名称
模型 ID 是排障里最容易埋雷的字段。你从旧教程里抄一个带日期后缀的 ID,或者凭印象写一个不存在的名称,OpenClaw 可能不会立刻报错,而是回退到默认模型,或者在重试逻辑里反复请求。心跳本来就在高频触发,再叠上模型找不到导致的重试,Token 消耗会更快。正确做法是打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 看模型广场当时列表,复制可用模型 ID。如果你的 OpenClaw 配置支持多个模型,把心跳和主对话分开指定,至少不要让心跳误用最贵的那个。
3. 重启 OpenClaw 后,用同一把 Key 盯住心跳请求
3.1 先发一条低风险指令,确认通道通了
配置保存后,重启 OpenClaw 或重载配置。不要一上来就丢复杂任务,先在聊天渠道发一条低风险指令,比如“回复 OK”或“列出当前工作区”。观察 OpenClaw 运行日志里模型请求的 endpoint 是否指向https://taotoken.net/api。如果出现 401,优先检查YOUR_API_KEY是否复制完整、是否有多余空格。如果出现 404,检查 Base URL 是否被写成了带/v1的地址。如果返回模型不存在,回模型广场核对 ID。通道没通之前,不要动 Heartbeat 配置,否则你会同时面对两个变量。
3.2 在控制台看这次调用有没有记到同一把 Key 上
刚才那条测试消息应该出现在控制台的调用记录或用量视图里。去 控制台 API Keys 看同一把 Key 的请求曲线。重点不是只看“有没有调用”,而是看调用时间分布:如果测试消息只发了一次,但控制台在几分钟内出现大量密集请求,说明 OpenClaw 内部还有别的循环在打模型,很可能是 Heartbeat 或 Cron 在重复触发。这时你手里的证据就从“账单涨了”变成“同一把 Key 在 10–20 秒内被打了 N 次”,排障方向会具体很多。
3.3 如果心跳频率仍然失控,回看 Issue #29182 与 #7613
统一模型出口不能修复调度 Bug。Issue #29182 描述的是心跳 Poll 事件被错误地通过 Cron 投递通道传递,导致隔离 Session 中出现幽灵Cron: HEARTBEAT_OK消息。Issue #7613 更麻烦:心跳触发间隔变成数秒到数分钟,完全不遵守配置的 every 值;即使切换到 Cron 调度,问题依然存在,因为两套调度系统的状态机互相污染。你在 TaoToken 控制台看到的密集请求,只是这些 Bug 的外部表现。下一步应该去 OpenClaw 侧备份并检查~/.openclaw/cron/jobs.json,按 Discussion #11042 的建议禁用原生 Heartbeat,换隔离 Cron Session,并限制每次加载的状态量。模型通道保持不变,方便你改完调度后再对比请求频率。
4. 对照五个已确认 Bug:哪些报错不该甩给 TaoToken
4.1 路由污染:HEARTBEAT_OK 被投递到 Cron 通道
Bug #20941 的链条是:隔离 Cron 任务以 announce 方式返回HEARTBEAT_OK,网关向主 Session 推送摘要,摘要又触发心跳系统,于是产生额外通知。这个循环和 API Key 无关,和 Base URL 也无关。你在控制台看到的是模型调用次数上升,但根因在 OpenClaw 的事件投递逻辑。排障时可以把HEARTBEAT_OK当作关键字去搜 OpenClaw 日志,确认是否出现了“Cron 完成 → HEARTBEAT_OK → 摘要推送 → 心跳再触发”的序列。
4.2 双平台重复通知与 Announce 字面量解析
Bug #18573 暴露的是标识符语义问题:announce delivery 完成时,网关尝试把结果投递到telegram:heartbeat,Telegram API 把heartbeat解释成用户名@heartbeat,而不是解析成心跳配置。Bug #40545 则出现在同时启用 Discord 和 Telegram 的场景,Cron 与 Heartbeat 会产生重复的主动消息。这两类问题都会让用户以为“模型通道在乱发请求”,但实际是消息投递层的路由和解析错误。不要在 TaoToken 配置里找原因,去检查 OpenClaw 的 announce 配置和渠道绑定。
4.3 Token 灾难案例:1.28 亿 Token 与 750 万 Token 的共因
原文提到的几个案例值得放在一起看。Case 1 中,隔离 Cron Session 的子 Agent 完成回调从未被标记为“已投递”,约每 3 秒重注入一次完整 Session 历史,累计 2,258 次投递,消耗约 1.28 亿 token。Case 4 中,Cron 任务里的 Bash 脚本超时,Agent 进入无限重试,约每 2 秒重新执行同一命令,498 次 turn 后浪费 750 万+ token。Case 2 的单日 2150 万 token 里,cacheRead 占比 79.4%,output 仅 0.4%,说明大量历史被反复重放;Case 3 则在 16 分钟内产生 123 次 Opus 调用,直到触发上游速率限制才停止。它们共同指向两个缺失:runaway session 熔断和回调/重试去重。TaoToken 控制台能让你更早看到异常曲线,但熔断机制必须在 OpenClaw 侧或你的预算监控里补。
4.4 ClawJacked RCE 与恶意 Skills:模型通道管不到的边界
原文还提到安全层面的问题。CVE-2026-25253 涉及 Control UI 对 URL 参数缺少验证,可能被跨站 WebSocket 劫持并触发远程代码执行;ClawHub 市场中也出现过大量伪装成正常工具的恶意 Skills。OpenClaw 作为本地守护进程长期运行并暴露 WebSocket 端口,攻击面天然比终端交互式工具更大。TaoToken 只处理模型 API 调用,不审查 Skills,也不会去连你的 OpenClaw 端口。你要自己限制监听地址、审查第三方 Skill、不要把管理接口暴露到公网。排障 Token 黑洞时,别忘了安全边界是另一条线。
5. 把心跳拆到隔离 Cron 之后,再做一次用量对账
5.1 官方建议的轻量上下文模式怎么套到自己的 OpenClaw
Discussion #11042 给出的方向是:禁用原生 Heartbeat,改用隔离 Cron Session 运行心跳逻辑,配合 openclaw-mem 只加载最小必要状态。落到操作上,先备份~/.openclaw/cron/jobs.json和模型配置;然后在 OpenClaw 配置里关闭原生心跳,把心跳检查清单搬到隔离 Cron 任务里;再确认每次任务只读取必要的 Markdown 片段,而不是把整个主 Session 上下文拖进去。改完后重启,观察模型请求频率是否从秒级尖峰变成你设置的周期。这个过程不需要动 TaoToken 的 Base URL,只需要确认改完后请求仍然打在同一把 Key 上。
5.2 用 TaoToken 控制台核对 cacheRead 与 output 比例
原文 Case 2 里,用户看不到异常,因为系统没有 token 消耗告警;等发现时,单日已经烧掉 2150 万 token。统一模型出口后,你至少可以在控制台按 Key 查看请求构成。如果 cacheRead 远高于 output,说明每次请求都在拖着巨大历史块,Compaction 可能没有正常工作。OpenClaw 的永久 Session 设计会让~/.openclaw/下的.jsonl文件持续膨胀,原文提到过 7,069 条消息、205 张图片引用、20MB 磁盘占用、17 万 token 的极端 Session。这种情况下,换模型通道不会让历史变小,但能让你看清每次请求到底带了多少上下文。
5.3 没有熔断机制时,人工设一条 Token 消耗告警线
OpenClaw 原生缺少 runaway session 熔断,回调重复和重试循环可以一直跑到上游限流。你可以先做一条人工告警线:在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 控制台里按日查看同一把 Key 的用量,超过你设定的心理阈值就暂停 Agent 或降级模型。这个阈值没有统一标准,按你的预算和业务容忍度来。重点是把“事后看账单”变成“当天就能看到异常”。如果控制台出现连续密集请求,而你的聊天渠道并没有对应操作,先去 OpenClaw 日志搜HEARTBEAT_OK、Cron和announce。
6. 配置完成后,下一步去这几个入口
6.1 模型对话:验证同一把 Key 的模型 ID
配置保存并重启成功后,先在 TaoToken 模型对话 里用同一把 Key 发一条测试消息,确认模型 ID 和 Base URL 没填错。模型对话能帮你把“Key 是否有效、模型是否可用”这两个变量单独验证掉,再回 OpenClaw 看心跳请求,排查会更干净。
6.2 Coding Plan 与 API Keys:长期跑 Agent 的额度准备
如果 OpenClaw 要长期在线,心跳和 Cron 会持续产生模型调用,建议打开 Coding Plan 看当前套餐是否够用。新的 Key 在 控制台 API Keys 创建,创建后仍按本文方式填入 OpenClaw 模型配置。不要为了省额度把心跳频率调得比业务需要还高,那是本末倒置。
6.3 Claude Code 接入文档:兼容通道的字段对照
如果你之后要换 Claude Code 或做对照,可以参考 Claude Code 接入文档。但 OpenClaw 的 Heartbeat 路由污染、Session 膨胀、回调去重问题,仍然要回到 OpenClaw 的 Issue 和配置文件里解决。模型通道统一只是让你有一张可对账的账单,不是把调度系统的责任转嫁给上游。
先让模型出口可对账,再拆心跳和 Cron。改完隔离 Cron 后,回到控制台看同一把 Key 的调用曲线:如果它从 10–20 秒一次的尖峰变成你设置的周期,说明调度侧改动生效;如果仍然密集,优先查 Issue #7613 和 #29182 的状态机污染,而不是反复换 Key。OpenClaw 的工程问题不会因为换一个 Base URL 消失,但至少每次模型请求都有迹可循。