你以为自己只发了一句
hello,模型看到的却常常是一整套运行现场。
我是青玉白露,大厂程序员,主业写代码,副业做 AI 工具和内容。
这次我把 openclaw/openclaw 仓库里几份最关键的文档和运行时路径对着看了一遍,终于把这件事想明白了:OpenClaw 里最贵的地方,往往不在 hello 这 5 个字符上,贵在它为了把这轮回复说对,额外补进去的上下文。

你在输入框里看到的是一句问候。
Gateway、session、system prompt、tools、skills、历史摘要、记忆检索,看到的却是一整套“当前现场”。
只要这个 Agent 还想记得你前面说过什么、知道自己在哪个群里、能不能调工具、要不要继承上一轮设置,token 账单就很难只按一句 hello 来算。
你发出 hello 之后,中间其实还要过几站
OpenClaw 官方文档 docs/concepts/messages.md 把消息流写得很直白:一条入站消息,会先做路由,拿到 sessionKey,必要时进入队列,随后才进入 agent run。
再往下看 docs/concepts/session.md 和 docs/reference/session-management-compaction.md,你会发现它还要恢复会话状态、读取 transcript、确认当前 session 的运行信息。
一条 hello,在真正进模型前,差不多会经历这样一条链路:
hello
-> 解析来源,得到 sessionKey
-> 从 sessions.json 找当前 session 的状态和计数
-> 从 <sessionId>.jsonl 取最近消息、工具结果、历史摘要
-> 组装 system prompt、tools、skills、workspace 信息
-> 必要时补 compaction 摘要和 active memory
-> 再把整包上下文交给模型

所以“Hello 为什么费 Token”这件事,真正该盯的从来都不是问候语本身,而是这条链路每一站都往包里塞了什么。
真正把 Token 顶上去的,是这 4 层信息

- 消息不会原样直送模型
docs/concepts/messages.md 讲的是高层流程,src/agents/transport-message-transform.ts 讲的是更细一层的运行时处理。
也就是说,OpenClaw 看到的通常不是“纯文本的一句 hello”,而是一条带来源、角色、工具结果配对、平台差异修补后的消息。你在界面里只看见一句话,运行时看到的已经是更完整的消息结构了。
- 会话状态要先恢复
docs/concepts/session.md 说明了消息会被路由到不同 session;docs/reference/session-management-compaction.md 进一步给出了两个很关键的落盘位置:
~/.openclaw/agents/<agentId>/sessions/sessions.json~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl
前者管的是当前 session 的元信息,后者存的是实际对话、工具调用、压缩摘要这些内容。
src/agents/command/session-store.ts 则说明,OpenClaw 每轮运行后还会继续回写 session 的 token、模型、状态等信息。换句话说,模型每次开口前,系统都得先知道“我现在接的是哪一段对话、这段对话已经走到哪里了”。
- system prompt 本身就很重
这部分是我这次最有感触的一层。
docs/concepts/system-prompt.md 明确写了,OpenClaw 会为每次 agent run 组装一份自己的 system prompt,而且里面不只有一段“你是谁”的提示。Tooling、Execution Bias、Skills、Workspace、Runtime、Heartbeats 这些固定区块都会进来。
真正落到运行时,关键路径在 src/agents/pi-embedded-runner/run/attempt-system-prompt.ts 和 src/agents/system-prompt.ts。前者负责把基础 prompt、额外上下文、provider 侧变换拼起来,后者定义了 system prompt 的固定结构和注入顺序。
你只说了一句 hello,模型却可能同时拿到:
- 当前可用工具说明
- 已加载 skills 的内容
- 工作目录和上下文文件
- 运行环境、时间、推理模式
- 子 agent / 群聊 / runtime 的额外提示
这部分 token 很少会在 UI 里直接露出来,但账单会老老实实记上。
- 历史压缩和记忆检索也会继续占上下文
很多人以为“压缩了就省完了”。
仓库里的 docs/concepts/compaction.md 和 src/agents/compaction.ts 给出的答案更像是:旧消息会被压成摘要,摘要还是要带进下一轮;只不过它比整段原文短得多。
再加上 docs/concepts/active-memory.md 里那套 active memory 机制,系统还有机会在主回复前主动捞一把相关记忆。这样做很值,因为回复会更稳,但这也意味着模型前面的那包上下文,通常不只有“最近几句聊天”。
我对着仓库看,最关键的几个源码/文档锚点在这里
如果你也想自己顺着仓库往下看,最值得先看的就是这几处:
docs/concepts/messages.md
docs/concepts/session.md
docs/reference/session-management-compaction.md
docs/concepts/system-prompt.md
docs/concepts/compaction.md
docs/concepts/active-memory.md
src/agents/command/session-store.ts
src/agents/pi-embedded-runner/run/attempt-system-prompt.ts
src/agents/system-prompt.ts
src/agents/compaction.ts

我自己的阅读顺序是这样的:
- 先看
messages.md和session.md,把消息是怎么进 session 的看清楚。 - 再看
system-prompt.md,你会立刻明白为什么一句短消息也能带出一大包运行信息。 - 然后看
session-management-compaction.md和compaction.ts,这时候就能看懂“历史为什么不会凭空消失,只会换一种更短的形态继续留下来”。
看到这里,标题里那句“顺着源码终于懂了”,才算真正落到了文件路径上。
真想把成本降下来,可以先做这 5 个动作

- 话题已经切了,就别还挂在同一个 session 里
你昨天在聊部署,今天在聊写作,中间还穿插了一轮调模型。继续硬接在同一条长 session 里,模型每轮都得先回忆“我们之前在干嘛”。
- 长对话要接受 compaction 这件事
/compact 的意义,不只是省钱,它是在帮你把旧历史缩成更轻的可复用上下文。对持续很久的 Agent 会话来说,这是必要动作。
- skill 和 tool 只开当前真的要用的
system prompt 里每多一段工具说明、每多一段 skill 内容,输入体积都会继续涨。想让 hello 便宜一点,最有效的办法之一就是别让每一轮都背着一整个工具箱。
- 长期要记住的东西,尽量交给记忆系统
能沉到 OpenViking 或 memory 的事实,就别每轮都靠整段聊天硬带。这样做更省,也更像真正的长期记忆。
- 比模型价格时,别只看 input 单价
很多人拿两家模型比价,只看“每百万 input token 多少钱”。真到 Agent 场景里,更该看的其实是:这套 prompt 装配之后,你平均每轮到底会带进去多少额外上下文。
一句话记住就够了:hello 很短,运行现场很长。
你看到的只是提问本身,模型看到的却是“这句话该放进怎样的一套环境里理解”。OpenClaw 想把 Agent 做得连续、可控、能调工具,token 就一定会有一部分花在这里。看懂这一点,你后面才知道该精简哪一层。
延伸阅读
- 我们给AI出的考试,可能全错了:两份不相干的报告指向同一件事,AI学会了应付考试,而不是真的具备能力。当分数越来越高、可信度越来越低,验证的价值正在超过信任。
- Grok Build开源,是慷慨还是灭火?:xAI把Grok Build开源了,但五天前它刚被抓到偷偷上传用户全部代码。这是慷慨,还是灭火?AI编程工具的信任危机才刚刚开始。
- FDE:AI行业给自己开的一张病历诊断书:FDE岗位招聘量一年暴涨729%,这不只是一个新岗位的走红,而是AI行业集体承认了一个事实:模型不是答案,落地才是。
- 孙正义把AI攻击比作机关枪,于是他要卖「补丁即服务」:软银联手OpenAI推出Patching as a Service,把日本前3000家企业的安全防护变成按月收费的订阅服务。当攻击方已经全面AI化,安全正在从一件你拥有的东西,变成一件你租用的东西。

评论区
欢迎留下你的看法,支持匿名评论。
你的评论会公开展示,建议填写便于交流的昵称,并尽量提供有信息量的反馈。