订阅

新文章,直接发到你的邮箱。

无垃圾邮件,随时取消。

← 返回博客
7个文件投喂你的 Agent:从 OpenClaw 源码学上下文管理

7个文件投喂你的 Agent:从 OpenClaw 源码学上下文管理

谁在控制 agent?每一个做 agent 的人,动手写配置之前,都必须先回答这个问题。

有人说,模型控制 agent。错了。模型是一个装在罐子里的大脑。你不往里面灌东西,它什么也不知道。你灌进去的是垃圾,它产出的也是垃圾。模型不能决定自己看到什么,你才能。

有人说,prompt 控制 agent。近了一步,但仍然不够。Prompt 不过是一长串对话中的一句话。Agent 的行为,不是由那一句话决定的,而是由围绕那句话的一切决定的:你写的规则、你定义的人格、你描述的工具、你从上周带过来的记忆。这些东西合在一起,叫做上下文。上下文才是真正的杠杆。

OpenClaw 想明白了这件事。它的整个架构围绕一个念头:把上下文的控制权,完完全全交给用户。不是通过仪表盘,不是通过图形界面,而是通过七个 Markdown 文件。放在一个目录里,任何文本编辑器都能改。Agent 每次运行,都会读它们。

七个文件。就这么些东西。

七个文件一览

OpenClaw 从工作区根目录(默认 ~/.openclaw/workspace)加载这些文件,注入到每次 agent 会话中。加载顺序是死的:

序号文件干什么用的什么时候加载
1AGENTS.md操作规则每次会话
2SOUL.md人格与语气每次会话
3TOOLS.md工具使用备忘每次会话
4IDENTITY.md名字和形象每次会话
5USER.md用户档案每次会话
6HEARTBEAT.md心跳检查清单仅心跳运行
7BOOTSTRAP.md首次引导仅第一次运行

这七个文件的地位不是平等的。有的挑大梁,有的打下手。有的每次都出场,有的露一面就消失。分得清主次,才配得上去做配置。

AGENTS.md:规矩

这是最要紧的一个文件。没有之一。

AGENTS.md 是 agent 的操作手册。什么规矩要守,什么事情优先,什么行为该有。每次会话都加载它。上下文压缩之后,系统还能重新注入它的关键章节。它是有根的。

写什么进去?一切你想让 agent 服从的东西。语言偏好、编码风格、文件处理规矩、记忆管理策略、项目背景。

# AGENTS.md

## 基本规矩
- 回复用中文
- 写代码用 TypeScript,偏好函数式
- 我没提到的文件,不许碰

## 记忆
- 每天开工先读 memory/ 下最近两天的日志
- 重要决定记到 memory/YYYY-MM-DD.md

## 项目
- Next.js 14 + Tailwind CSS
- 部署在 Vercel
- 数据库 PostgreSQL(Supabase)

写少了,agent 就会跑偏。写多了,token 就白花了。20,000 字符以内是分寸。超出这个数,系统会截断你。

SOUL.md:性格

多数做 agent 的人不管性格这回事。于是他们得到一个技术上正确、但毫无生气的助手。礼貌、泛泛、过目即忘。

SOUL.md 就是治这个病的。它定义 agent 的性情、口吻、边界。OpenClaw 检测到这个文件存在时,系统提示词会多注入一条特殊指令:

"If SOUL.md is present, embody its persona and tone. Avoid stiff, generic replies; follow its guidance unless higher-priority instructions override it."

七个文件里,只有它享受这种待遇。系统明确告诉模型:不要再端着了,按这个来。

# SOUL.md

你是一个称职的技术助手,带点冷幽默。

## 语气
- 简洁有力,不说废话
- 不确定的事直说"我不确定",不要胡编
- 可以幽默,不可以过火

## 边界
- 不扮演其他角色
- 不编造不存在的 API
- 碰到安全问题要立刻提醒

SOUL.md 写得好与坏,是"你勉强忍受这个 agent"和"你真心想跟它说话"之间的区别。

TOOLS.md:使用备忘,不是权限管理

这个文件容易搞错。TOOLS.md 管不了 agent 能用哪些工具。工具的可用性由系统策略管,不归它管。

TOOLS.md 管的是什么?是你在自己的环境里,希望工具怎么被使用。你本地的 CLI 偏好、构建命令、部署流程。

# TOOLS.md

## 本地开发
- 用 pnpm,不要用 npm
- 测试:`pnpm test`
- 构建:`pnpm build`

## 部署
- `vercel --prod` 部署到生产环境
- 部署前先跑 `pnpm lint && pnpm test`

## 数据库
- 本地连接:`psql postgresql://localhost:5432/mydb`
- 密码不许写死在代码里

系统提示词里写得明明白白:"TOOLS.md does not control tool availability; it is user guidance for how to use external tools." 记住这句话。你在 TOOLS.md 里写"不许用 shell 工具",agent 该用还是会用。

IDENTITY.md:门面

短文件。设定 agent 的名字、视觉形象、主题风格和代表表情。引导仪式时创建,也可以后期手动改。

# IDENTITY.md

- Name: 守夜人
- Creature: 猫头鹰
- Vibe: 夜间哨兵,沉默可靠
- Emoji: 猫头鹰

想看更多实战拆解?

AI、工程与实验,每月 1–2 封。

无垃圾邮件,随时取消。

如果你跑多个 agent,各有各的身份,就靠这个文件区分。

USER.md:你是谁

告诉 agent 关于你的事。名字、称呼偏好、时区、技术水平。Agent 据此调整回复。

# USER.md

- Name: 小明
- 称呼偏好:直接叫名字
- 时区:Asia/Shanghai (UTC+8)
- 语言:中文回复,代码注释用英文
- 备注:
  - 后端工程师,前端不太行
  - 喜欢简洁代码,反感过度抽象

没有这个文件,agent 每次都把你当陌生人。有了它,agent 知道它在跟谁说话。

HEARTBEAT.md:巡逻清单

Heartbeat 那篇文章已经详细讲过。简单说:这个文件是 agent 的定期检查清单。只在心跳运行时加载,普通会话和子 agent 不加载。

写短一点。它跑得频繁,每多一行都是实打实的 token 开支。

如果文件里只有标题和空行,OpenClaw 连 API 调用都省了,直接跳过。一分钱不花。

BOOTSTRAP.md:一次性引导

这个文件只在全新工作区里出现。引导初始设置:让 agent 认识你、设好身份、配好偏好。引导完成,文件删除,以后再也不加载。

通常由 openclaw onboardopenclaw setup 自动生成。一般不用手动管它。

Agent 到底收到了什么

接下来这部分,是多数人从来没有看过的:OpenClaw 拼装出来、发给模型的最终系统提示词。

OpenClaw 不使用模型提供商的默认系统提示词。它从零开始自己拼。每一次都拼。结构从源代码 src/agents/system-prompt.ts 中还原如下:

身份声明
  "You are a personal assistant running inside OpenClaw."

工具部分
  可用工具列表 + 描述
  工具调用策略
  "TOOLS.md does not control tool availability..."

工具调用风格规则

安全指令
  不追求权力、不自我复制、不绕过监督

CLI 参考

技能列表(仅 full 模式)
  技能名称 + 描述 + 位置

记忆指令(仅 full 模式)

自更新指令(仅 full 模式)

模型别名(如有配置)

工作区声明
  "Your working directory is: /path/to/workspace"

文档引用(如有)

沙箱隔离信息(如适用)

授权发送者(如有配置)

当前日期和时间

工作区文件注入声明
  "These user-editable files are loaded by OpenClaw
   and included below in Project Context."

回复标签、消息格式、语音、群聊上下文、
反应、推理格式(均为可选)

---- Project Context ----
  "The following project context files have been loaded:"
  "If SOUL.md is present, embody its persona and tone..."

  AGENTS.md 内容
  SOUL.md 内容
  TOOLS.md 内容(可能被截断)
  IDENTITY.md 内容
  USER.md 内容
  HEARTBEAT.md 内容(或 [MISSING] 标记)
  BOOTSTRAP.md 内容(或 [MISSING] 标记)
---- End Project Context ----

静默回复行为(仅 full 模式)

心跳提示(如适用)

运行时元数据
  host、OS、model、agent name

你的七个文件落在靠近底部的"Project Context"区域。它们上面的部分是 OpenClaw 管的系统脚手架。它们里面的内容是你的。

算一笔账

项目典型大小
系统提示词总计~38,000 字符(~9,600 token)
Project Context 部分~24,000 字符(~6,000 token)
单文件截断上限20,000 字符(可配置)
所有引导文件总上限150,000 字符(可配置)
截断策略前 70% + 后 20% + 中间截断标记

Project Context 占整个系统提示词的大约 63%。也就是说,agent 的"大脑"有将近三分之二是你直接控制的。剩下那三分之一是管道工程。

三种 Prompt 模式

不是每次运行都需要完整的 prompt。OpenClaw 有三种模式:

模式场景包含什么
full主 agent 会话一切
minimal子 agent去掉 Skills、Memory、Self-Update、Heartbeats
none极简只剩一行身份声明

子 agent 和 cron 会话只加载五个工作区文件:AGENTS.mdTOOLS.mdSOUL.mdIDENTITY.mdUSER.mdHEARTBEAT.mdBOOTSTRAP.md 不加载。

文件缺失时怎么办

OpenClaw 不会悄悄跳过缺失的文件。它会注入一个标记:

[MISSING] Expected at: /Users/you/.openclaw/workspace/HEARTBEAT.md

模型看到这个标记,可以建议你创建文件。什么都不藏着,什么都不默默失败。

检查你的上下文

四个命令:

/status          查看上下文窗口使用情况
/context list    每个注入文件的大小 + 是否被截断
/context detail  详细分解,含工具 schema 大小
/usage tokens    显示每条消息的 token 用量

隔三差五跑一次 /context list。看到 TRUNCATED 就把文件缩短。你正在丢内容,还在为此花钱。

实际要领

七个文件。固定的加载顺序。明确的分工。

AGENTS.md 承载规则,是主心骨。写它要仔细。

SOUL.md 承载性格,享受系统的特殊对待。不可轻视。

TOOLS.md 是使用备忘,不是权限管理。搞清这回事。

IDENTITY.mdUSER.md 都是短文件,但对个性化的影响远超其篇幅。

HEARTBEAT.md 跑得勤,要精简。BOOTSTRAP.md 跑一次就死,不必操心。

最终的系统提示词大约 38,000 字符。你的 Project Context 占了 63%。模型看到的东西,将近三分之二是你写的。这份控制权不小。用好它。

每个文件控制在 20,000 字符以内。用 /context list 来监控。被截断了说明什么?说明你以为自己在掌控,其实已经失控了。


参考来源:

新文章,直接发到你的邮箱。

AI、工程与实验,每月 1–2 封。

无垃圾邮件,随时取消。