怎么拿到完整的系统提示词

直觉反应是去翻日志。打开 .openclaw/agents/main/sessions/ 下的会话日志,你会发现里面并没有完整的提示词——但 usage 数据暴露了真相:一条消息的 input token 高达 15391,说明底层确实发了一段极其庞大的 System Prompt。

要拿到完整内容,需要用一个模型代理中间件。具体做法是 clone 一个叫 modelbox 的项目,按 README 安装启动。它的作用是模拟模型提供商,拦截 OpenClaw 发出的完整请求。在聊天窗口随意发一条消息,modelbox 就会把完整的提示词吐出来。

实测一句"hi"产生了约 34062 个字符,换算成 tokens 大概 16k。也就是说,一个干净的新对话,光提示词就默认带了 16k 的底座成本。

系统提示词第一部分:硬编码注入

这部分来自源码硬注入,加上 plugin 工具描述和 skill 描述。拆开来看有几个关键设计:

身份与工具

  • 开头直接写死角色边界:You are a personal assistant running inside OpenClaw
  • 紧接着亮出经过策略过滤后的可用工具清单(read / write / edit / exec 等),运行时动态注入
  • 工具名大小写敏感,写错一个字母就废
  • 你自己装的 plugin 也会被塞进来,和内置工具一视同仁

这里有个坑:提示词里明确写了 TOOLS.md does not control tool availability,意思是 TOOLS.md 只是用户备忘录,不是权限清单。如果你在 TOOLS.md 里定了一些权限规则,可能会被这句硬编码冲掉。

行为约束

  • 常规低风险操作直接调用,不用解释。只有多步骤、复杂任务、敏感操作才需要说明
  • 安全规则灵感来自 Anthropic 的 AI 宪法:不许自我保全、不许复制自己、不许扩权,指令冲突时暂停问人
  • 长耗时任务不许高频轮询,用 yieldMs 拉长间隔或走后台进程,省 token
  • 复杂耗时任务可以派生子代理(sub-agent)异步执行

技能与记忆

  • Skill 索引段要求模型回复前先扫描 available_skills 列表,匹配到就读对应的 SKILL.md 然后照做,一次最多读一个
  • 凡是涉及历史工作、决策、偏好的问题,必须先跑 memory_search 检索,再用 memory_get 拉取具体内容。引用时要带上 Source: path#line

模型别名与环境信息

  • 提供模型别名映射表,比如打 opus 就等于 anthropic/claude-opus-4-6。这张表是运行时从配置里动态注入的——配置太多模型的话,每次都会全量传过去
  • 当前日期时间不让猜,必须跑 session_status 去拿
  • 工作目录路径运行时动态注入
  • 定义了跨平台回复/引用的标签语法、消息路由规则
  • 注入了一段 Inbound Context 的可信元数据(chat_id、channel、provider 等),用来区分系统元数据和用户可伪造的文本,降低提示注入风险

这一整段(从 You are a personal assistant...# Project Context 前)大约占 2589 ~ 4142 tokens。

系统提示词第二部分:项目上下文

Project Context 注入了八个文件,这是 token 消耗的大头。

AGENTS.md(约 2.0k ~ 3.2k tokens)——行为宪法 + 运行手册:

  • 每次会话先读 SOUL.md、USER.md、近两天的 memory 文件,并检索记忆
  • 日志记到 memory/YYYY-MM-DD.md,长期记忆写 MEMORY.md,明确要求"要记就写文件,不要靠脑补"
  • 安全边界:不外泄隐私、偏好 trash 而不是 rm、不确定先问
  • 对外动作(邮件/发帖等)先征求同意,群聊只在有价值时发言
  • 心跳机制:允许主动巡检(邮箱、日历、提醒等),定义何时提醒、何时静默

这里有个值得注意的点:即使是 subagent,因为 AGENTS.md 里写了启动流程要读 SOUL.md 和 memory,它实际上也可能会去读这些文件。

SOUL.md(约 440 ~ 700 tokens)——人格与做事方式:

  • 主基调:真实有用,不要表演式客套
  • 任务完成必须主动汇报,长任务要持续报进度
  • 允许有观点,不做无个性的中性机器口吻
  • 先自助排查再提问,记忆用查询式而非全量灌入

一句话区分:AGENTS.md 管流程,SOUL.md 管"怎么做人"。

TOOLS.md(约 582 ~ 932 tokens)——本机环境私有备忘录,不是工具权限清单。记录设备信息、SSH 配置、应急浏览器方案等,把通用技能逻辑和私有配置分离。

IDENTITY.md(约 50 ~ 80 tokens)——人格卡,定义名字、身份、风格、emoji,给回复语气提供统一基线。

USER.md(约 75 ~ 120 tokens)——用户画像卡,记录称呼偏好、时区、语言等,避免每轮重新猜。

HEARTBEAT.md(约 30 ~ 55 tokens)——心跳轮询时要执行的轻量待办清单。

BOOTSTRAP.md——当前为空。

MEMORY.md(约 2.3k ~ 3.8k tokens)——长期记忆总库,包含安全铁律、项目状态、里程碑、配置规约、失败复盘等。这是 system prompt 成本的大头之一。

系统提示词第三部分:尾部协议

  • Silent Replies:没话说时只能回 NO_REPLY,必须是整条消息的全部内容,不能混在正常回复里
  • Heartbeats:收到心跳轮询,没事回 HEARTBEAT_OK(不返回消息);有事直接发告警内容
  • Runtime:注入当前运行时状态(agent、host、os、model、channel、capabilities 等),让模型基于真实环境决策

用户提示词部分

系统提示词之后是 input 里的历史及当前对话消息,包括新会话启动提示、重置引导指令、人格回复等。

然后是 body.tools[]——本次可调用工具全集,每个工具带 description 和 parameters JSON schema。这部分也很占 token。

实测数据:

  • body.tools[](31 个工具)约 5988 ~ 9582 tokens
  • system 整段:31842 chars,约 7960 ~ 12737 tokens
  • system## Tooling 小节约 874 ~ 1399 tokens

这里存在明显冗余:system 里有一份工具列表,body.tools[] 里又有一份,31 个工具完全重合。区别在于 body.tools[] 带参数 schema(调用必须),system 里的列表主要做行为引导。

Token 优化思路

如果要降成本,优先方向:

  1. 砍系统段工具说明——缩成极短版,只保留规则,不逐个列工具描述。body.tools[] 的 schema 不可少,但 system 里的重复描述可以大幅压缩
  2. 裁剪模型别名表——配置了很多模型的话,每次全量注入。不需要的模型从配置里删掉
  3. 精简注入文件——MEMORY.md 是大头,定期清理过时内容;TOOLS.md 里的废弃配置也该删
  4. 限制 skill / memory 注入策略——按需加载而非全量灌入

Subagent 的提示词差异

spawn 出来的 subagent 提示词结构不同:

  • 保留第一段硬编码注入(减去 skill 相关,增加 spawn subagent 相关提示词)
  • Project Context 只注入 AGENTS.md 和 TOOLS.md
  • 工具列表从 31 个缩减到 23 个,少掉的 8 个是:agents_listsessions_listsessions_historysessions_sendsessions_spawnsession_statusmemory_searchmemory_get

逻辑很清楚:subagent 场景下砍掉了会话编排和记忆检索类工具。subagent 也不会自动看到 skill 索引,但你可以在任务里显式给出 SKILL.md 路径让它读取执行。

Compact 会压缩系统提示词吗

不会。compact 主要压的是会话消息历史(尤其旧对话和大工具结果),system prompt 仍然按当前配置重新构建,不会因为 compact 自动瘦身。所以真正要降 token,优化方向在系统内容本身、tools 描述体积、以及 skill/memory 注入策略上。


了解 OpenClaw 提示词的完整结构,不只是满足好奇心。当你知道每次对话有 16k tokens 的固定底座成本,才能有的放矢地做优化——砍冗余、精简注入文件、裁剪别名表,每一步都是在省真金白银。如果你也在跑 OpenClaw,建议先用 modelbox 抓一次自己的完整提示词,对着本文逐段比对,找出你的优化空间。