<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>OpenClaw on 猜猜是谁的博客</title><link>https://caifengze.com/zh-cn/tags/openclaw/</link><description>Recent content in OpenClaw on 猜猜是谁的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 05 Feb 2026 21:00:00 -0500</lastBuildDate><atom:link href="https://caifengze.com/zh-cn/tags/openclaw/index.xml" rel="self" type="application/rss+xml"/><item><title>为什么 OpenClaw 消耗 Token 这么快？</title><link>https://caifengze.com/zh-cn/blog/2026/%E4%B8%BA%E4%BB%80%E4%B9%88-openclaw-%E6%B6%88%E8%80%97-token-%E8%BF%99%E4%B9%88%E5%BF%AB/</link><pubDate>Thu, 05 Feb 2026 21:00:00 -0500</pubDate><guid>https://caifengze.com/zh-cn/blog/2026/%E4%B8%BA%E4%BB%80%E4%B9%88-openclaw-%E6%B6%88%E8%80%97-token-%E8%BF%99%E4%B9%88%E5%BF%AB/</guid><description>&lt;img src="https://caifengze.com/zh-cn/blog/2026/%E4%B8%BA%E4%BB%80%E4%B9%88-openclaw-%E6%B6%88%E8%80%97-token-%E8%BF%99%E4%B9%88%E5%BF%AB/overview.png" alt="Featured image of post 为什么 OpenClaw 消耗 Token 这么快？" />&lt;h1 id="为什么-openclaw-消耗-token-这么快">为什么 OpenClaw 消耗 Token 这么快？
&lt;/h1>&lt;p>这篇文章的第一部分回答一个最基础、但也最关键的问题：&lt;/p>
&lt;h2 id="每次交互openclaw-到底向模型发送了什么">每次交互，OpenClaw 到底向模型发送了什么？
&lt;/h2>&lt;p>当我们说“上下文很大、token 消耗很快”，本质上是在说：每一次调用模型 API 时，OpenClaw 会把一段“完整输入”发送给模型，这段输入往往远超过用户的当前一句话。&lt;/p>
&lt;p>下面是这段输入的组成和来源。&lt;/p>
&lt;p>&lt;strong>1. System Prompt（系统提示词）&lt;/strong>&lt;/p>
&lt;p>系统提示词是 OpenClaw 每次调用模型都会带上的“基础说明书”。它包含了多段固定或半固定内容，核心目的是让模型知道它是什么、有哪些工具、在哪个工作目录、如何处理记忆和渠道消息等。&lt;/p>
&lt;p>System prompt 是一个“大盒子”，内部包含以下子块：&lt;/p>
&lt;ul>
&lt;li>Tooling 段：列出工具清单以及简要说明。&lt;/li>
&lt;li>Safety 段：基础安全与行为约束。&lt;/li>
&lt;li>Skills 段：技能目录提示（可很长，随技能数量增长）。&lt;/li>
&lt;li>Memory 段：记忆检索规范（告诉模型先搜索 MEMORY.md 等）。&lt;/li>
&lt;li>Documentation 段：本地文档路径提示。&lt;/li>
&lt;li>Workspace 段：当前工作目录 + 备注。&lt;/li>
&lt;li>Project Context 段：注入的上下文文件内容（通常是最大头）。&lt;/li>
&lt;li>Messaging/Voice/Reply Tags/Sandbox/Runtime 等辅助段。&lt;/li>
&lt;/ul>
&lt;p>下面的 2～4 小节之所以单独展开，是为了突出这些子块在 token 体积上的“贡献度”，而不是把它们当作 system prompt 之外的独立部分。&lt;/p>
&lt;p>System prompt 的构建逻辑集中在：&lt;/p>
&lt;ul>
&lt;li>&lt;code>src/agents/pi-embedded-runner/run/attempt.ts&lt;/code>&lt;/li>
&lt;li>&lt;code>src/agents/pi-embedded-runner/system-prompt.ts&lt;/code>&lt;/li>
&lt;li>&lt;code>src/agents/system-prompt.ts&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. Project Context（项目上下文注入）&lt;/strong>&lt;/p>
&lt;p>这是 token 消耗最明显的部分之一。OpenClaw 会在每次运行前读取一组 workspace 的“引导文件”，再将它们原文注入到 system prompt 中。&lt;/p>
&lt;p>默认会读取的文件包括：&lt;/p>
&lt;ul>
&lt;li>&lt;code>AGENTS.md&lt;/code>&lt;/li>
&lt;li>&lt;code>SOUL.md&lt;/code>&lt;/li>
&lt;li>&lt;code>TOOLS.md&lt;/code>&lt;/li>
&lt;li>&lt;code>IDENTITY.md&lt;/code>&lt;/li>
&lt;li>&lt;code>USER.md&lt;/code>&lt;/li>
&lt;li>&lt;code>HEARTBEAT.md&lt;/code>&lt;/li>
&lt;li>&lt;code>BOOTSTRAP.md&lt;/code>&lt;/li>
&lt;li>&lt;code>MEMORY.md&lt;/code> 或 &lt;code>memory.md&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>这些文件会被逐个裁剪（单文件上限默认 20,000 chars），然后以如下形式插入：&lt;/p>
&lt;pre tabindex="0">&lt;code># Project Context
## BOOTSTRAP.md
&amp;lt;内容&amp;gt;
&lt;/code>&lt;/pre>&lt;p>逻辑位于：&lt;/p>
&lt;ul>
&lt;li>&lt;code>src/agents/workspace.ts&lt;/code>（读取文件集合）&lt;/li>
&lt;li>&lt;code>src/agents/bootstrap-files.ts&lt;/code>（组装注入）&lt;/li>
&lt;li>&lt;code>src/agents/pi-embedded-helpers/bootstrap.ts&lt;/code>（裁剪）&lt;/li>
&lt;li>&lt;code>src/agents/system-prompt.ts&lt;/code>（最终注入）&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>3. Skills 列表（技能清单）&lt;/strong>&lt;/p>
&lt;p>如果开启了 skills，OpenClaw 会把全部 skills 编成一个目录段落，注入到 system prompt。这个列表会随技能数量和描述长度线性增长。&lt;/p>
&lt;p>它不是“工具”，而是“工作流程说明”，模型会根据提示去读 SKILL.md。&lt;/p>
&lt;p>相关逻辑：&lt;/p>
&lt;ul>
&lt;li>&lt;code>src/agents/skills/workspace.ts&lt;/code>&lt;/li>
&lt;li>&lt;code>src/agents/system-prompt.ts&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>4. Tools 定义（工具清单 + schema）&lt;/strong>&lt;/p>
&lt;p>模型真正能调用的工具列表（如 &lt;code>read&lt;/code>、&lt;code>exec&lt;/code>、&lt;code>message&lt;/code>）会被注入到 system prompt 中，同时工具参数 schema 也会被传入模型。这部分通常不会在 prompt 里完整展示，但仍会占用输入 token。&lt;/p>
&lt;p>相关逻辑：&lt;/p>
&lt;ul>
&lt;li>&lt;code>src/agents/pi-tools.ts&lt;/code>&lt;/li>
&lt;li>&lt;code>src/agents/system-prompt.ts&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>5. 历史对话 + 工具结果&lt;/strong>&lt;/p>
&lt;p>除了 system prompt，OpenClaw 还会把 session 中的历史消息、工具调用结果一起发送给模型。这些历史会不断累积，直到触发 compaction 或 memory flush。&lt;/p>
&lt;p>相关逻辑：&lt;/p>
&lt;ul>
&lt;li>&lt;code>src/agents/pi-embedded-runner/run/attempt.ts&lt;/code>（加载历史）&lt;/li>
&lt;li>&lt;code>src/agents/pi-embedded-runner/compact.ts&lt;/code>（压缩）&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>6. 当前用户输入&lt;/strong>&lt;/p>
&lt;p>最后才是用户的这一条消息，它会和上面所有内容一起构成“本次 API 调用的完整输入”。&lt;/p>
&lt;p>&lt;strong>总结：一次交互实际上不是“只发你这一句话”。&lt;/strong>&lt;/p>
&lt;p>OpenClaw 每次调用模型，会发送：&lt;/p>
&lt;ul>
&lt;li>system prompt（很长）&lt;/li>
&lt;li>project context（很长）&lt;/li>
&lt;li>skills 列表（可很长）&lt;/li>
&lt;li>工具 schema（可很长）&lt;/li>
&lt;li>历史对话与工具结果（会不断增长）&lt;/li>
&lt;li>当前用户消息&lt;/li>
&lt;/ul>
&lt;p>这就是为什么 token 会增长得很快。&lt;/p>
&lt;p>&lt;img src="https://caifengze.com/zh-cn/blog/2026/%E4%B8%BA%E4%BB%80%E4%B9%88-openclaw-%E6%B6%88%E8%80%97-token-%E8%BF%99%E4%B9%88%E5%BF%AB/overview.png"
width="4284"
height="2112"
srcset="https://caifengze.com/zh-cn/blog/2026/%E4%B8%BA%E4%BB%80%E4%B9%88-openclaw-%E6%B6%88%E8%80%97-token-%E8%BF%99%E4%B9%88%E5%BF%AB/overview_hu_e49c0d2ff66be2e5.png 480w, https://caifengze.com/zh-cn/blog/2026/%E4%B8%BA%E4%BB%80%E4%B9%88-openclaw-%E6%B6%88%E8%80%97-token-%E8%BF%99%E4%B9%88%E5%BF%AB/overview_hu_27464601b4dee01f.png 1024w"
loading="lazy"
alt="OpenClaw token flow overview"
class="gallery-image"
data-flex-grow="202"
data-flex-basis="486px"
>&lt;/p>
&lt;p>&lt;em>图：一次请求中 system prompt、session history、用户输入与子 agent/fallback/compaction 的关系。&lt;/em>&lt;/p>
&lt;p>&lt;strong>代码佐证：系统提示词的“总装配口”&lt;/strong>&lt;/p>
&lt;p>以下是 &lt;code>src/agents/pi-embedded-runner/run/attempt.ts&lt;/code> 中的关键片段，能直观看到哪些内容被打包进 system prompt（已做精简）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// src/agents/pi-embedded-runner/run/attempt.ts
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">const&lt;/span> &lt;span class="nx">appendPrompt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">buildEmbeddedSystemPrompt&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">skillsPrompt&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">// Skills 列表
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">contextFiles&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">// Project Context（BOOTSTRAP 等）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">tools&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">// Tool 列表 + schema
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">docsPath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">// 文档提示
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">runtimeInfo&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">// 运行环境信息
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">workspaceNotes&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">// workspace 提示
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">sandboxInfo&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">// 沙箱信息
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">modelAliasLines&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">// 模型别名
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// ... 还有更多辅助信息
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="一次请求可能触发多轮-api工具调用链">一次请求可能触发多轮 API：工具调用链
&lt;/h2>&lt;p>一个“用户请求”不一定只调用一次模型 API。最常见的原因是 &lt;strong>工具调用链&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>模型看到工具列表后，先发起 tool call（如 &lt;code>read&lt;/code> / &lt;code>exec&lt;/code>）。&lt;/li>
&lt;li>OpenClaw 执行工具，产出 tool result。&lt;/li>
&lt;li>工具结果被写回 session（作为工具消息）。&lt;/li>
&lt;li>模型继续生成，必要时再发起下一次 tool call。&lt;/li>
&lt;/ol>
&lt;p>这意味着一次用户输入可能产生多轮模型交互，从而更快消耗 token。&lt;/p>
&lt;p>对应代码入口（精简路径）：&lt;/p>
&lt;ul>
&lt;li>工具定义：&lt;code>src/agents/pi-tools.ts&lt;/code>&lt;/li>
&lt;li>session 创建 + tools 注入：&lt;code>src/agents/pi-embedded-runner/run/attempt.ts&lt;/code>&lt;/li>
&lt;li>订阅工具事件：&lt;code>src/agents/pi-embedded-subscribe.ts&lt;/code>&lt;/li>
&lt;li>工具执行生命周期处理：&lt;code>src/agents/pi-embedded-subscribe.handlers.tools.ts&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="失败重试--fallback模型回退与重试如何发生">失败重试 / fallback：模型回退与重试如何发生
&lt;/h2>&lt;p>OpenClaw 并不是“遇错就算了”。当模型调用失败（超时、限流、鉴权等），系统会尝试&lt;strong>模型回退&lt;/strong>，继续用候选模型列表中的下一个模型重试。&lt;/p>
&lt;p>核心逻辑在 &lt;code>runWithModelFallback&lt;/code> 中实现：&lt;br>
&lt;code>src/agents/model-fallback.ts&lt;/code>&lt;/p>
&lt;p>它的逻辑非常清晰：&lt;/p>
&lt;ol>
&lt;li>先根据配置生成“候选模型列表”（来自 &lt;code>agents.defaults.model.fallbacks&lt;/code> 或调用时传入的 override）。&lt;/li>
&lt;li>按顺序逐个尝试调用模型。&lt;/li>
&lt;li>只有当错误被判定为 &lt;strong>FailoverError&lt;/strong> 才会进入下一轮回退；否则直接抛错。&lt;/li>
&lt;/ol>
&lt;p>这意味着，&lt;strong>一次用户请求可能因为回退机制而触发多次 API 调用&lt;/strong>。当然，这是好事。&lt;/p>
&lt;h2 id="compaction-与-memory-flush上下文快满时发生了什么">Compaction 与 Memory Flush：上下文快满时发生了什么
&lt;/h2>&lt;p>当上下文快满时，OpenClaw 可能触发&lt;strong>两种不同的额外模型调用&lt;/strong>：&lt;br>
一个是 &lt;strong>Compaction（摘要压缩）&lt;/strong>，一个是 &lt;strong>Memory Flush（记忆写入）&lt;/strong>。两者目的不同、流程也不同。&lt;/p>
&lt;h3 id="1-compaction摘要压缩">1. Compaction（摘要压缩）
&lt;/h3>&lt;p>目标：把历史对话“压缩成更短摘要”，释放上下文空间。&lt;/p>
&lt;p>实现逻辑在：&lt;code>src/agents/compaction.ts&lt;/code>&lt;/p>
&lt;p>关键点：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>不是一次性把全部历史发给模型&lt;/strong>&lt;br>
会先按 token 将历史分块，然后逐块调用模型生成摘要，再合并为一个总摘要。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>如果单条消息太大&lt;/strong>&lt;br>
会走 fallback：只摘要小消息，大消息用占位提示。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>简化流程：&lt;/p>
&lt;pre tabindex="0">&lt;code>历史消息 → 按 token 分块 → 每块调用模型摘要 → 合并摘要
&lt;/code>&lt;/pre>&lt;h3 id="2-memory-flush记忆写入">2. Memory Flush（记忆写入）
&lt;/h3>&lt;p>目标：在 compaction 之前，把“长期记忆”写入磁盘（&lt;code>memory/YYYY-MM-DD.md&lt;/code>）。&lt;/p>
&lt;p>触发逻辑在：&lt;code>src/auto-reply/reply/agent-runner-memory.ts&lt;/code>&lt;br>
提示与默认文案在：&lt;code>src/auto-reply/reply/memory-flush.ts&lt;/code>&lt;/p>
&lt;p>关键点：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>不是摘要历史&lt;/strong>&lt;br>
而是让模型整理出“值得长期保存的记忆”，写到 &lt;code>memory/&lt;/code> 目录。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>这是一轮额外的模型调用&lt;/strong>&lt;br>
目的在于保存持久记忆，而不是压缩上下文。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="子-agent--sessions_spawn并行与分工如何导致额外调用">子 agent / sessions_spawn：并行与分工如何导致额外调用
&lt;/h2>&lt;p>当任务复杂、耗时或适合并行时，主 agent 可能会调用 &lt;code>sessions_spawn&lt;/code> 工具，把子任务交给子 agent 处理。这会启动一个&lt;strong>全新的子会话&lt;/strong>，它拥有自己的 sessionKey、system prompt 和工具链路，因此会带来额外的模型调用。&lt;/p>
&lt;p>核心入口在：&lt;code>src/agents/tools/sessions-spawn-tool.ts&lt;/code>&lt;/p>
&lt;p>简化流程如下：&lt;/p>
&lt;ol>
&lt;li>主 agent 调用 &lt;code>sessions_spawn&lt;/code>（这是一种模型的工具调用选择）。&lt;/li>
&lt;li>系统生成 &lt;code>childSessionKey&lt;/code>（&lt;code>agent:&amp;lt;id&amp;gt;:subagent:&amp;lt;uuid&amp;gt;&lt;/code>）。&lt;/li>
&lt;li>构造子 agent 的 system prompt（&lt;code>buildSubagentSystemPrompt&lt;/code>）。&lt;/li>
&lt;li>通过 &lt;code>callGateway&lt;/code> 启动子 agent 的独立运行流程。&lt;/li>
&lt;li>子 agent 完成任务后，结果回传主会话。&lt;/li>
&lt;/ol>
&lt;p>简单来说，就是 &lt;strong>子 agent 是“另起一条完整会话”&lt;/strong>。因此它会显著增加整体的 API 调用次数与 token 消耗。&lt;/p></description></item></channel></rss>