read_when:
- 想降低 OpenClaw 的 token 消耗
- 群聊太费钱
- 长会话上下文越来越大
summary: 用简单语言解释哪些 OpenClaw 设置最影响 token 成本,以及该怎么配
省 Token 配置指南
这篇文档只讲一件事:
怎样让 OpenClaw 在不明显影响体验的前提下,少花 token。
如果你觉得机器人“越聊越贵”、“群里太容易触发”、“一条图文消息就很烧钱”,这篇文档就是给你的。
先讲结论
OpenClaw 的 token 开销,主要来自 3 件事:
1. 调用次数太多
2. 每次调用带进去的上下文太长
3. 额外的预处理太多
比如自动看链接、自动看图、自动看视频、长历史回放、compaction 前的 memory flush 等
所以省 token 的思路也很简单:
1. 少调用
2. 少带历史
3. 少开自动理解功能
如果你不想先看细节,最值得优先调的就是这几项:
session.reset/session.resetByTypemessages.groupChat.historyLimitmessages.queuesession.parentForkMaxTokensagents.defaults.compactiontools.linkstools.media.imagetools.media.video
一、最有效的设置:让旧上下文早点失效
1. `session.reset`
最直接、最稳的省 token 方式,就是不要让一个 session 无限长下去。
{
session: {
reset: {
mode: "idle",
idleMinutes: 60,
},
},
}
这段配置的意思是:
- 如果这个会话 60 分钟没有新消息
- 那么下一条消息到来时
- OpenClaw 会把它当作一个新的 session
- 不再继续复用上一个 session 的上下文
为什么这个设置这么有用
因为很多 token 消耗,不是来自“这一次用户只发了 10 个字”,而是来自:
- 这 10 个字后面挂着 2 小时的历史
- 历史里还有工具输出、系统提示、群聊记录、媒体描述
把 session 定期切断,成本会立刻降下来。
推荐值
如果你主要是普通聊天:
- 私聊:
60 - 群聊:
15到30 - Thread:
30
可以进一步按聊天类型分开配:
{
session: {
reset: {
mode: "idle",
idleMinutes: 60,
},
resetByType: {
group: { mode: "idle", idleMinutes: 20 },
thread: { mode: "idle", idleMinutes: 30 },
},
},
}
什么时候不要配太短
如果你的场景是:
- 连续做一个复杂任务
- 用户希望“中间隔半小时回来还记得刚才聊到哪”
那就不要把 idleMinutes 设得太小。
一个很实用的原则是:
- 觉得“经常忘上下文”就调大
- 觉得“越聊越贵”就调小
二、群聊最费钱:先控触发,再控历史
群聊通常是最烧 token 的场景,因为它同时会带来:
- 更多无关消息
- 更频繁的触发
- 更多历史上下文
2. `messages.groupChat.historyLimit`
{
messages: {
groupChat: {
historyLimit: 6,
},
},
}
它的意思是:
- 每次处理群消息时
- 最多只回看最近
6条群消息
为什么这项很重要
群里最容易出现这种情况:
- 用户只问一句话
- 但系统为了“理解上下文”,把前面几十条群消息也带进去了
这样很快就会贵。
推荐值
- 很省钱:
4到6 - 平衡:
8到12 - 强连续上下文:
15+
如果你只是做答疑 bot,而不是要深度参与群讨论,6 往往够用。
3. 群里尽量用 `mention`,不要 `always`
OpenClaw 的群激活模式有两种常见思路:
mention:只有被点名时才认真处理always:群里每条消息都可能触发
如果你想省 token,优先用 mention。
运行时也可以用命令切:
/activation mention
如果你开 always,成本通常会明显上升,因为:
- 机器人会看到更多消息
- 会更频繁进入处理流程
- 群历史也更容易不断变长
三、减少“连续发多条”带来的重复调用
很多用户不是一次发一长段,而是这样发:
1. “帮我看看这个”
2. “还有这个”
3. “顺便这个也算一下”
如果每一条都单独调用模型,token 会浪费很多。
4. `messages.queue`
{
messages: {
queue: {
mode: "collect",
debounceMs: 1500,
cap: 8,
drop: "summarize",
},
},
}
这几个字段分别是什么意思:
mode: "collect"
把短时间内连续来的消息收集起来,再一起处理
debounceMs: 1500
等 1.5 秒,看看用户会不会继续发
cap: 8
最多保留 8 条排队消息
drop: "summarize"
如果太多了,不是直接全丢,而是尽量压缩成摘要
推荐理解方式
你可以把 queue 想成一句话:
“别急着每条都回,先等等,看看用户是不是还没发完。”
推荐值
对聊天机器人很实用的一组:
{
messages: {
queue: {
mode: "collect",
debounceMs: 1500,
cap: 8,
drop: "summarize",
},
},
}
如果你的用户特别爱连发,甚至可以试:
debounceMs: 2000cap: 6
什么时候不适合调太大
如果你特别追求“每句话都秒回”,那 debounceMs 太大会让机器人显得慢一点。
所以这里是典型的取舍:
- 更省钱:更大的 debounce
- 更灵敏:更小的 debounce
四、避免线程 / 子会话继承太多历史
5. `session.parentForkMaxTokens`
{
session: {
parentForkMaxTokens: 20000,
},
}
这个设置的作用是:
- 当一个 thread / topic / 子会话想继承父会话上下文时
- 如果父会话已经太大
- 就不要 fork 过去
- 直接从一个更干净的上下文开始
为什么它有用
没有这个限制时,经常会出现一种浪费:
- 主会话已经很长
- 开了一个 thread
- thread 又把整段主会话历史一起继承过去
这样 thread 一上来就很贵。
推荐值
- 偏省钱:
12000到20000 - 平衡:
20000到40000 - 不太在乎成本:更大,或者
0关闭保护
如果你已经有 session.reset,再配一个 parentForkMaxTokens,通常会更稳。
五、长会话要靠 compaction,但 compaction 也有成本
OpenClaw 会在上下文快撑满时做 compaction。
你可以把它理解成:
- 把很长的历史压缩成摘要
- 只保留最近最重要的一部分
- 避免每一轮都把完整历史重新喂给模型
这是长会话里非常重要的省 token 机制。
6. `agents.defaults.compaction`
一个偏省钱但不算激进的示例:
{
agents: {
defaults: {
compaction: {
mode: "default",
maxHistoryShare: 0.25,
recentTurnsPreserve: 1,
keepRecentTokens: 6000,
postCompactionSections: [],
},
},
},
}
这些字段怎么理解
`maxHistoryShare`
历史最多能占整个上下文预算的多少。
比如:
0.25表示最多给历史 25%- 留更多空间给当前问题和当前回答
如果你想省 token,通常可以设小一点。
`recentTurnsPreserve`
最近几轮对话保留原文,不做摘要。
- 大一点:更稳,更不容易丢最近细节
- 小一点:更省
如果你不是在做很复杂的连续任务,1 或 2 往往够用。
`keepRecentTokens`
无论如何都尽量保住最近这部分 token。
- 大一点:最近上下文更完整
- 小一点:更省
`postCompactionSections`
这个设置经常被忽略。
compaction 完之后,OpenClaw 可以把 AGENTS.md 某些章节重新塞回上下文里,帮助模型“重新读一遍关键规则”。
这很有用,但也会额外增加 token。
如果你的目标是明显降成本,可以直接:
postCompactionSections: []
它的意思是:
compaction 后不要再自动回注这些章节。
这是个很实用的省 token 点。
7. `compaction.model`
{
agents: {
defaults: {
compaction: {
model: "openai/gpt-4.1-mini",
},
},
},
}
这表示:
- 正常对话用你的主模型
- 但 compaction 这件事,交给一个更便宜的模型做
这不是减少“上下文 token”,而是减少“做 compaction 本身的成本”。
如果你的主模型比较贵,这个设置很值。
8. `compaction.memoryFlush`
OpenClaw 默认会在重 compaction 前做一次 memory flush。
你可以把它理解成:
- 在历史被强压缩前
- 先尝试把一些“长期应该记住的东西”写到 memory 文件里
这对长期记忆有帮助,但它本质上是一次额外 agent turn,也会花 token。
如果你的目标是“能省就省”,可以关掉:
{
agents: {
defaults: {
compaction: {
memoryFlush: {
enabled: false,
},
},
},
},
}
什么时候不建议关
如果你的 bot 很依赖长期记忆,比如:
- 记住用户偏好
- 持续记录项目状态
- 长期维护某个 memory 文件
那最好别轻易关。
简单说:
- 想更省:关
- 想更会记:开
六、关闭不必要的自动理解功能
很多人以为 token 只花在“聊天正文”上。
其实不是。
下面这些自动功能,也会悄悄把 token 花掉:
- 自动看链接
- 自动看图片
- 自动看视频
9. `tools.links`
{
tools: {
links: {
enabled: false,
},
},
}
如果你的机器人主要做文本问答,不需要“用户一贴链接就自动读网页”,那直接关掉最省。
如果你还想保留这个能力,也建议至少收紧:
{
tools: {
links: {
enabled: true,
maxLinks: 1,
scope: "explicit",
},
},
}
大白话理解就是:
- 最多只看 1 个链接
- 只有用户明显在让你看时才看
10. `tools.media.image`
如果你的场景基本是纯文本,可以直接关:
{
tools: {
media: {
image: {
enabled: false,
},
},
},
}
如果你必须开图像理解,至少建议把 maxChars 压小:
{
tools: {
media: {
image: {
enabled: true,
maxChars: 800,
},
},
},
}
原因很简单:
- 图片理解本身要花钱
- 图片被描述成很长文字后
- 后续对话还会继续把这段描述带进 prompt
11. `tools.media.video`
视频通常比图片还贵。
如果不是核心能力,建议直接关:
{
tools: {
media: {
video: {
enabled: false,
},
},
},
}
如果必须开,也建议限制输出长度:
{
tools: {
media: {
video: {
enabled: true,
maxChars: 1200,
},
},
},
}
七、运行时也能省:不是只有配置文件
除了 openclaw.json,还有几个运行时开关也很实用。
12. `/think`
如果你用的是支持 thinking / reasoning 的模型,/think 会明显影响成本。
建议:
- 日常聊天:
/think off或/think minimal - 只有遇到复杂任务时,再临时开高一点
不要默认长期开 high / xhigh,除非你真的需要。
13. `/verbose off`
/verbose off
这会减少工具结果在回复里的展开程度。
好处是:
- 回复更短
- transcript 膨胀更慢
- 后续轮次也更省
14. `/usage off`
/usage off
这主要是为了减少每次回复后面附带的 usage footer。
它不是最大的省钱点,但在高频聊天里也有一点帮助,而且能让消息更干净。
八、三套推荐配置
1. 极致省钱版
适合:
- 文本聊天为主
- 不需要自动读链接、图片、视频
- 群聊较多
{
session: {
reset: { mode: "idle", idleMinutes: 60 },
resetByType: {
group: { mode: "idle", idleMinutes: 20 },
thread: { mode: "idle", idleMinutes: 30 },
},
parentForkMaxTokens: 15000,
},
messages: {
groupChat: { historyLimit: 6 },
queue: {
mode: "collect",
debounceMs: 1500,
cap: 8,
drop: "summarize",
},
},
agents: {
defaults: {
compaction: {
mode: "default",
maxHistoryShare: 0.25,
recentTurnsPreserve: 1,
keepRecentTokens: 6000,
postCompactionSections: [],
memoryFlush: { enabled: false },
},
},
},
tools: {
links: { enabled: false },
media: {
image: { enabled: false },
video: { enabled: false },
},
},
}
2. 平衡版
适合:
- 想省钱
- 但也不想让机器人“失忆太快”
{
session: {
reset: { mode: "idle", idleMinutes: 90 },
resetByType: {
group: { mode: "idle", idleMinutes: 30 },
},
parentForkMaxTokens: 25000,
},
messages: {
groupChat: { historyLimit: 8 },
queue: {
mode: "collect",
debounceMs: 1200,
cap: 10,
drop: "summarize",
},
},
agents: {
defaults: {
compaction: {
mode: "default",
maxHistoryShare: 0.35,
recentTurnsPreserve: 2,
keepRecentTokens: 8000,
},
},
},
tools: {
links: {
enabled: true,
maxLinks: 1,
},
media: {
image: {
enabled: true,
maxChars: 800,
},
video: {
enabled: false,
},
},
},
}
3. 群聊优先版
适合:
- QQ / Telegram / Discord 群机器人
- 重点是不要被群消息拖爆成本
{
session: {
reset: { mode: "idle", idleMinutes: 60 },
resetByType: {
group: { mode: "idle", idleMinutes: 15 },
},
},
messages: {
groupChat: { historyLimit: 4 },
queue: {
mode: "collect",
debounceMs: 1800,
cap: 6,
drop: "summarize",
},
},
}
同时建议在群里把激活模式保持为:
/activation mention
九、怎么判断是不是调对了
不要一上来追求“最省”。
更实用的办法是:
1. 先选一套偏保守配置
2. 观察 2 到 3 天
3. 再看是“太贵”还是“太容易忘”
如果还是太贵
优先按这个顺序继续收紧:
1. 调小 messages.groupChat.historyLimit
2. 调小 group 的 session.reset.idleMinutes
3. 调大 messages.queue.debounceMs
4. 关闭 tools.links
5. 关闭 tools.media.image / video
6. 把 recentTurnsPreserve 再调小
如果开始变笨 / 失忆
优先按这个顺序放宽:
1. 调大 session.reset.idleMinutes
2. 调大 messages.groupChat.historyLimit
3. 调大 keepRecentTokens
4. 把 recentTurnsPreserve 从 1 提到 2
5. 如果关了 memoryFlush,考虑重新打开
十、一个经验法则
如果你只记住一句话,就记这个:
省 token 最有效的方法,不是抠单次回答的几个字,而是减少无意义的历史、无意义的触发、无意义的自动理解。
具体到 OpenClaw,就是:
- 让 session 别拖太长
- 群聊别带太多历史
- 连发消息尽量合并处理
- 链接 / 图片 / 视频别默认全开
- compaction 后别把没必要的东西又塞回去