我的OpenClaw每天消耗5000万token。以下是我的修复方法。
摘要
一个带有心跳功能的OpenClaw代理因为会话膨胀和一个即使被禁用仍持续运行的bug,每天消耗5000万token。作者分享了如何通过清除会话和配置心跳设置来识别并修复该问题。
我在OpenClaw上运行了几个代理(一个内容管道加上一些辅助工具)。上周,我的LLM API用量突然飙升,而我的设置明显没有任何变化。以下是每日token用量的实际情况:
- 第1天:约1100万
- 第2天:约2400万
- 第3天:约3300万
- 第4天:约4400万
- 第5天:约3200万
- 第6天:约5100万
6天内大约消耗了1.96亿token,且呈上升趋势。这时很明显不是“我只是忙”,肯定出了问题。所以我没有猜来猜去,而是去查了日志。
OpenClaw将每个会话写入.jsonl转录文件,每次轮询都会记录其自身的token使用量(input, output, cacheRead)。我写了一个小脚本,按代理、按天、按模型汇总token数。有两个数字非常突出:
1. 我所有token的95%都是cacheRead。这意味着模型在重新读取旧对话历史,而不是执行新任务。我真正关心的新任务不到5%。
2. 一个名为“main”的代理(我甚至已经不再使用了)占了总数的56%。
那么“main”在做什么呢?什么都没做。它只是一个旧项目的遗留物。但是OpenClaw的心跳机制每30分钟就戳它一下,日夜不停,询问“有事做吗?”而每次它都必须先加载整个会话历史(几个月前的,大约22.5万token)才能回复“HEARTBEAT_OK”然后继续休眠。也就是说,每天大约48次,它要读一本电话簿来说“没有”。永远如此。而且走的是更昂贵的路线,因为那个代理使用的是默认模型。真正让我抓狂的是:我之前已经尝试过关闭它。我留下了一个空的HEARTBEAT.md文件,本应让代理跳过检查。但在我的构建中,这个跳过并没有生效。它一直在运行。所以如果你也用同样的方式“禁用”了你的代理,去验证一下它是否真的停止了。
修复方法分为两部分:
1. 清除膨胀的会话。心跳每次都会拖着一大堆累积的历史记录。清除那一个会话可以立即降低费用,因为下一次心跳将从空白状态开始。不过要小心,保留你真正的DM/聊天会话,只移除那个垃圾会话。
2. 阻止它重新填充。一次性清除后问题会逐渐复发,因为心跳会不断向会话添加内容。持久的修复方法在配置中:
- 将心跳间隔设为“0m”以完全关闭(如果该代理不做任何事情),或者
- 设置isolatedSession: true 加上 lightContext: true,这样每次心跳都在一个新的、很小的上下文中运行,而不是完整的历史。文档说这可以将一次运行从大约10万token降低到2-5千token。
另外我還发现了一个泄漏:我的其他代理也都在重复使用一个不断增长的会话(我传递了一个会话ID,但在这个构建中它并不会真正启动一个新会话),所以它们的上下文随着运行次数而膨胀。同样的思路可以修复:在任务之间重置会话,这样每次运行都从干净状态开始。
如果你不想被账单吓到,以下是一些要点:
- 闲置的代理不是免费的。一个拥有臃肿会话的心跳机制可能比你的实际工作花费更多。
- cacheRead 是一个信号。如果你大部分token都是cacheRead,那么你是在为重新读取历史付费,而不是在完成任何任务。
- 检查“关闭”是否真的关闭了。空的HEARTBEAT.md并没有阻止我的代理。
- 阅读转录文件。每次轮询的用量都在那里。你不必猜测。通过一个基本上只是配置变更的操作,我将用量减少了一半以上。希望这能帮其他人省下几百万token。
相似文章
你的OpenClaw AI代理是不是在疯狂消耗代币?
文章批评了当前浏览器AI代理的低效率,因为它们反复解析和推理相同的网站,并提出了一种模型,代理可以重用经过验证的交互路径,以减少代币消耗并提高速度。
你的OpenClaw智能体可能不应该轮询所有内容
本文讨论了OpenClaw智能体中轮询的低效性,并介绍了一个将事件检测移出智能体循环的插件,从而显著减少了源调用和令牌使用量。
为什么OpenClaw的更新如此痛苦?
这篇文章讨论了开发OpenClaw(一款AI驱动工具)的高昂成本,其创建者在一个月内花费了超过130万美元的OpenAI API代币,导致更新过程痛苦不堪。
OpenClaw 退出访谈——一月下旬采用者
一位用户讲述了在遭遇模型访问限制、失控的 token 成本和不断出现的 bug 后,关闭其 OpenClaw AI 助手的经历,并得出结论:麻烦大于收益。
Cron任务与Heartbeat效率提升
在OpenClaw中使用Cron任务和Heartbeat的技巧,以提高效率并减少token使用量,附各适用场景示例。