怎么拿到完整的系统提示词
直觉反应是去翻日志。打开 .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 tokenssystem整段:31842 chars,约 7960 ~ 12737 tokenssystem里## Tooling小节约 874 ~ 1399 tokens
这里存在明显冗余:system 里有一份工具列表,body.tools[] 里又有一份,31 个工具完全重合。区别在于 body.tools[] 带参数 schema(调用必须),system 里的列表主要做行为引导。
Token 优化思路
如果要降成本,优先方向:
- 砍系统段工具说明——缩成极短版,只保留规则,不逐个列工具描述。
body.tools[]的 schema 不可少,但 system 里的重复描述可以大幅压缩 - 裁剪模型别名表——配置了很多模型的话,每次全量注入。不需要的模型从配置里删掉
- 精简注入文件——MEMORY.md 是大头,定期清理过时内容;TOOLS.md 里的废弃配置也该删
- 限制 skill / memory 注入策略——按需加载而非全量灌入
Subagent 的提示词差异
spawn 出来的 subagent 提示词结构不同:
- 保留第一段硬编码注入(减去 skill 相关,增加 spawn subagent 相关提示词)
- Project Context 只注入 AGENTS.md 和 TOOLS.md
- 工具列表从 31 个缩减到 23 个,少掉的 8 个是:
agents_list、sessions_list、sessions_history、sessions_send、sessions_spawn、session_status、memory_search、memory_get
逻辑很清楚:subagent 场景下砍掉了会话编排和记忆检索类工具。subagent 也不会自动看到 skill 索引,但你可以在任务里显式给出 SKILL.md 路径让它读取执行。
Compact 会压缩系统提示词吗
不会。compact 主要压的是会话消息历史(尤其旧对话和大工具结果),system prompt 仍然按当前配置重新构建,不会因为 compact 自动瘦身。所以真正要降 token,优化方向在系统内容本身、tools 描述体积、以及 skill/memory 注入策略上。
了解 OpenClaw 提示词的完整结构,不只是满足好奇心。当你知道每次对话有 16k tokens 的固定底座成本,才能有的放矢地做优化——砍冗余、精简注入文件、裁剪别名表,每一步都是在省真金白银。如果你也在跑 OpenClaw,建议先用 modelbox 抓一次自己的完整提示词,对着本文逐段比对,找出你的优化空间。