我把 OpenClaw 的 System Prompt 拆开了:9层架构,两层你能控制
↑阅读之前记得关注+星标⭐️,😄,每天才能第一时间接收到更新
大家好,我是杰克王,AI 算法 6 年老兵。
你有没有想过,你跟 AI Agent 说话的时候,AI 到底”看到”了什么?
不是你发的那句话,而是整个 System Prompt——那个决定 Agent 如何思考、如何回应、有哪些能力的底层配置。
今天分享一篇技术拆解,把 OpenClaw Agent 发给 LLM 的完整 System Prompt 结构扒开来看:9 层架构,每层是什么,哪些你能控制,哪些不能。
OpenClaw 的 System Prompt 不是一个文件,而是 9 层动态拼装的结果:
- • Layer 1–6:框架自动生成,保证所有 Agent 行为一致,用户无法修改
- • Layer 7:你可以直接编辑的静态配置文件(IDENTITY.md、AGENTS.md 等)
- • Layer 8:你可以写脚本动态注入内容的 Hook 系统
- • Layer 9:每次对话实时注入的上下文,框架自动处理
用户真正可控的只有 Layer 7 和 Layer 8,不是只有 Layer 7。
Layer 1:框架核心层
就像操作手册的”使用说明”——告诉 LLM 你是谁、能做什么
这一层由框架统一生成,包含:Agent 身份标识、当前时间戳、工具调用规范、安全边界(禁止执行 rm -rf 等危险操作)。
所有 Agent 共享这套基础规则,框架升级时自动获得新能力。用户无法修改,但也不需要维护。
Layer 2:工具定义层
就像瑞士军刀的工具清单——告诉 LLM 有哪些工具、每个怎么用
用严格的 JSON Schema 定义每个工具的参数,让 LLM 准确理解用法。框架在工具调用前自动验证参数,出错概率大幅降低。
代价是:添加新工具需要写完整 Schema,不能随意动态扩展。
Layer 3:技能注册表
就像餐厅的”特色菜谱”——有哪些专业领域的”配方”可以调用
自动扫描 Skills 目录,放入新 Skill 文件就自动注册,无需任何配置。
这也是为什么 Skills 越装越多,token 消耗也随之增加——所有 Skill 的 description 都会被注入 System Prompt。
Layer 4:模型别名层
就像快捷键——给复杂的模型路径起简短别名
glm-5 → zhipu/glm-5
Sonnet 4.5 → provider/claude-sonnet-4-5
好处是支持多 Provider 切换,方便 A/B 测试。LLM 可以通过 /model glm-5 直接切换模型。
Layer 5:协议规范层
就像交通规则——定义 Agent 与系统交互的标准协议
三种核心协议:
- • Silent Replies:不需要回复时输出
NO_REPLY,避免群聊刷屏 - • Heartbeats:心跳检测时回
HEARTBEAT_OK,证明 Agent 在线 - • Reply Tags:
[[reply_to_current]]触发平台原生回复功能
Layer 6:运行时信息层
就像仪表盘——告诉 LLM 当前运行环境的实时状态
每次请求注入:当前时间、运行模型名称、主机环境、channel 类型(Discord / Feishu / 等)。
大约消耗 2KB token,但保证 LLM 知道”现在是什么情况”,不会出现时间错乱或路径写错的问题。
Layer 7:工作区文件层 ★ 用户可编辑
就像你的工作笔记——可以直接编辑的静态配置文件
这是用户最熟悉的一层,核心文件有:
| 文件 | 用途 |
|---|---|
IDENTITY.md |
Agent 身份、名称、性格 |
SOUL.md |
行为准则和价值观 |
AGENTS.md |
工作规范和记忆规则 |
USER.md |
关于用户的背景信息 |
MEMORY.md |
长期记忆 |
TOOLS.md |
环境相关配置备注 |
HEARTBEAT.md |
心跳任务清单 |
设计哲学是把”变”和”不变”分离——框架层保证稳定,用户层允许个性化。配置文件可以 git 管理、备份、多台机器共享。
优化建议:
- • 用表格代替段落,用 checklist 代替长文描述
- • 不要把 Skills 的详细说明复制进这里(Skills 会自动注入)
- •
MEMORY.md依赖系统自动维护,不要手动堆内容
Layer 8:Bootstrap Hook 系统 ★ 用户可编程
就像可编程的注射器——写脚本在运行时动态注入内容
这一层比 Layer 7 强大得多,但也更复杂。有四种使用方式:
① 追加额外文件(最简单)
{
"hooks": {
"bootstrap-extra-files": {
"enabled": true,
"paths": ["docs/API.md", "docs/ARCHITECTURE.md"]
}
}
}
适合:需要把项目文档注入 Agent,又不想动默认配置文件。
② 完全控制 bootstrapFiles(最灵活)
registerInternalHook("agent:bootstrap", (event) => {
const context = event.context;
// 根据 session 类型加载不同文件
if (sessionKey.includes("coding")) {
context.bootstrapFiles.push({
path: "CODING_GUIDELINES.md",
content: fs.readFileSync("...").toString()
});
}
});
适合:根据任务类型动态加载不同文件。
③ 注入实时上下文(动态场景)
on("before_prompt_build", (event, ctx) => {
return {
prependContext: `当前时间:${new Date().toISOString()}`
};
});
适合:注入实时天气、Git 状态、API 响应等动态数据。
字符预算控制:
{
"agents": {
"defaults": {
"bootstrapMaxChars": 20000,
"bootstrapTotalMaxChars": 150000
}
}
}
超出部分按”头 70% + 尾 20%”截断,保留最重要的内容。
Layer 9:入站上下文层
就像实时路况信息——每次请求动态注入当前对话的上下文
包含:消息元信息、发送者信息、对话历史。让 LLM 知道”谁在说话”、”这条消息是从哪个平台来的”。
每次消耗约 3KB token,但这是保证对话连贯性的必要代价。
各层大小估算
| 层级 | 估算大小 | 用户可控 |
|---|---|---|
| Layer 1 框架核心 | ~5KB | ❌ |
| Layer 2 工具定义 | ~15KB | ❌ |
| Layer 3 技能注册 | ~10KB | ❌ |
| Layer 4 模型别名 | ~1KB | ❌ |
| Layer 5 协议规范 | ~3KB | ❌ |
| Layer 6 运行时信息 | ~2KB | ❌ |
| Layer 7 工作区文件 | 可变 | ✅ |
| Layer 8 Hook 注入 | 可变 | ✅ |
| Layer 9 入站上下文 | ~3KB | ❌ |
框架自动生成的部分约 39KB 基础消耗,Layer 7+8 因配置而异。
一句话总结
理解了这 9 层,你才真正知道 AI Agent 在”看”什么,也才知道该怎么配置才有效。
Layer 7 是你的静态配置,Layer 8 是你的动态编程。其余 7 层,框架替你管好了。
感谢阅读。我是杰克王,欢迎加微交流 🚀

夜雨聆风