
1. 为什么 Brain 模块值得单独拆一篇OpenClaw 的 Brain 模块说白了就是整个 Agent 的“推理中枢”它决定给大模型看什么Prompt、看多少Context、以及怎么和大模型来回配合干活Harness。很多人第一次读 OpenClaw 源码会以为 Brain 只是把用户消息转发给 LLM 再拿回结果但真正跑起来你会发现它内部其实是一整套工程化流水线——System Prompt 分层拼装、Token 预算动态裁剪、工具调用循环、上下文压缩每一层都在为“用可控成本换最大能力”服务。这篇是系列第 5 篇前面 Router 负责把消息分发进来Brain 负责真正干活。我会带你从 Prompt Engineering、Context Engineering、Harness Engineering 三个维度拆开看并且结合 TaoToken 统一 Key/API 通道把settings.json和config.toml的骨架配置直接给你让你在本地能跑通整条链路。适合已经装好 OpenClaw、想搞懂 Brain 内部机制、或者想自己调 Prompt/上下文策略的开发者。2. TaoToken 前置统一 Key 与 API 通道在动手配 Brain 之前先把模型通道打通。OpenClaw 支持多 Provider但如果你不想为每个模型单独维护一套 Key 和 Base URL用 TaoToken 做统一入口会省很多事。它的 API 地址是https://taotoken.net/api兼容 OpenAI 风格的调用方式OpenClaw 里配置 Provider 时直接指向它即可。你需要先拿到一个 API Key。登录 TaoToken 控制台在 API Keys 页面创建一个新 Key复制出来备用。这个 Key 会同时用于对话模型和后续可能的 coding 场景所以建议单独建一个项目 Key方便按项目统计用量。拿到 Key 之后OpenClaw 侧有两种配置方式settings.json走应用层配置config.toml走更底层的 Provider 定义。两者可以共存优先级上运行时覆盖 配置文件 模型发现缓存 默认值。下面我会分别给出骨架。注意Key 不要硬编码进提交到 Git 的文件里建议用环境变量注入配置文件里写占位符。3. 可复制配置settings.json 与 config.toml 骨架先看settings.json它主要管 Brain 的行为策略比如 Prompt 模式、上下文窗口、压缩阈值。下面这份骨架可以直接抄改掉 Key 和模型名即可{ models: { providers: { taotoken: { baseUrl: https://taotoken.net/api, apiKey: ${TAOTOKEN_API_KEY}, models: [ { id: gpt-4-turbo, contextTokens: 128000 }, { id: claude-opus-4, contextTokens: 1048576, context1m: true } ] } } }, agents: { defaults: { promptMode: full, compaction: { mode: default, reserveTokens: 32000, keepRecentTokens: 20000, minMessages: 4, parts: 2 } } }, skills: { limits: { maxSkillsInPrompt: 25, maxSkillsPromptChars: 12000 } } }再看config.toml它更偏向 Provider 传输层和工具执行框架的定义[provider.taotoken] base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY transport openai-compatible [provider.taotoken.models.gpt-4-turbo] context_tokens 128000 [provider.taotoken.models.claude-opus-4] context_tokens 1048576 context_1m true [harness] tool_loop_max_turns 12 tool_call_timeout_ms 60000 stream true [harness.compaction] reserve_tokens 32000 soft_threshold_tokens 2000这两份配置的分工是settings.json决定 Brain“怎么想”config.toml决定 Brain“怎么连、怎么执行”。实际项目里我一般把 Provider 和 Harness 放config.toml把 Agent 策略和 Skills 限制放settings.json职责清晰改起来不容易互相污染。配置里的context1m标志是给 Anthropic 系 1M 窗口模型用的触发条件是 Provider 为 anthropic 且模型 ID 以claude-opus-4或claude-sonnet-4开头。如果你用的是 TaoToken 转发的同款模型保持这个标志即可Brain 会自动把窗口解析成 1048576。4. 验证请求跑通 Prompt/Context/Harness 链路配置写完先别急着上复杂任务用一条最小请求验证三层链路是否都通了。启动 OpenClaw 后在对话里发一句请读取当前目录下的 README.md总结它的三个核心要点。这条请求会依次触发Brain 组装 System PromptPrompt 层→ 解析上下文窗口并注入文件内容Context 层→ 发起工具调用read并回灌结果Harness 层。如果三层都正常你会看到模型先调用 read 工具拿到文件内容后再生成总结。想更直观地确认 Context 层生效可以在配置里临时把contextTokensOverride设小比如 4000然后发一条长对话观察是否触发了 Compaction。触发时日志里会出现类似Skills truncated: included 12 of 50 (compact format, descriptions omitted). ⚙ Compaction in progress... Context compacted: reduced from 15000 to 3000 tokens (80% reduction).Harness 层的验证看工具调用循环。发一条需要多步的任务比如“查一下当前系统时间然后写进 /tmp/time.txt”。正常表现是模型先调exec拿时间再调write写文件两次工具调用之间有明确的结果回灌。如果只调了一次就停说明tool_loop_max_turns或toolChoice配置有问题。提示验证阶段建议把promptMode设为full这样 System Prompt 里会包含完整的 Tooling 和 Execution Bias 段落方便你观察模型行为。生产环境再按需降到minimal省 Token。5. 本篇常见错排查报错一Context window exceeded但配置里明明写了 128K。这通常是模型发现缓存没刷新。OpenClaw 的窗口解析有四层优先级运行时覆盖 配置文件 模型发现缓存 默认值。如果你改了settings.json但没重启缓存里还是旧值。解决方式是删掉models.json缓存文件后重启或者直接在请求里传contextTokensOverride强制覆盖。报错二Skills 全部没有 description模型选错技能。这是 Compact 格式被触发了。当 Skills 数量或字符数超出maxSkillsPromptChars时Brain 会先降级格式删掉所有 description再不够才二分查找截断数量。如果你发现技能匹配不准先把maxSkillsPromptChars调大或者减少同时加载的技能数。报错三工具调用循环停不下来。检查tool_loop_max_turns默认 12 轮。如果任务确实需要更多轮调大这个值但更常见的原因是模型在重复调用同一个工具这时候要看 System Prompt 里的 Tool Call Style 段落是否被promptMode: minimal裁掉了。裁掉后模型缺少“不要重复叙述”的约束容易陷入循环。报错四Compaction 后关键信息丢失。检查identifierPolicy是否设为strict。这个策略会强制保留 UUID、文件路径、错误码等不透明标识符。如果设成off摘要时这些信息可能被模型“顺手简化”掉导致后续任务找不到文件。6. 继续深入与通道选择Brain 模块的三层工程实践核心就一句话Prompt 决定输入结构Context 决定输入容量Harness 决定交互节奏。三者缺一不可而且都围绕同一个目标——在可控成本内让模型自主完成复杂任务。如果你接下来要长期跑编码类或 Agent 类任务建议把模型通道固定到 TaoToken 的 Coding Plan统一 Key 管理省得每个模型单独配。想先验证模型行为可以直接在模型对话里试要接入自己的项目去 API Keys 页面建 Key再对照接入文档把baseUrl指向https://taotoken.net/api即可。配置骨架上面已经给全改掉 Key 就能跑。