上周我朋友问我:你怎么做到每次打开 OpenClaw,它就直接干活,不用重新介绍自己?
我说:你用 Agents 工作空间了吗?
他说:那是什么?
我:……
好,这篇文章就写给他,也写给所有还在每次开新会话就要跟 AI 重新做自我介绍的人。
你是不是每次开新对话,都要打一段:
"我是做产品的,习惯简洁的中文回答,帮我……"
然后 AI 给了个很棒的回答。你很满意。
第二天,新会话。
AI:你好,请问有什么可以帮您?
你:……
这不是 bug,这就是"没有记忆的聊天工具"的本质。它每次见到你都是第一次见面。
OpenClaw 的 Agents 系统解决的就是这个问题——给 AI 一个"家",让它记得你是谁,记得你们说过什么,记得它自己该怎么做事。
OpenClaw 的每个 Agent 都有一个工作空间(Workspace),说白了就是你本地的一个目录。
默认在这里:~/.openclaw/workspace
打开这个目录,你会看到一堆 Markdown 文件,每个都有自己的分工:
~/.openclaw/workspace/
├── AGENTS.md # 操作规程:怎么干活、怎么用记忆
├── SOUL.md # 灵魂:人格、语气、边界
├── USER.md # 用户画像:你是谁、你在乎什么
├── IDENTITY.md # 身份:助手叫什么名字、什么 emoji
├── TOOLS.md # 工具笔记:本地工具、SSH 配置等
├── HEARTBEAT.md # 心跳清单:定期检查什么事情
├── BOOT.md # 启动清单:网关重启时执行什么
├── BOOTSTRAP.md # 出生证明:第一次运行的仪式(用完即删)
├── MEMORY.md # 长期记忆:精华沉淀
└── memory/
├── 2025-01-15.md # 每日日志
└── 2025-01-16.md说明:这些文件名不是随便起的,
src/agents/workspace.ts里把每个都硬编码成了常量——DEFAULT_AGENTS_FILENAME、DEFAULT_SOUL_FILENAME、DEFAULT_USER_FILENAME……改名字不会生效,AI 找不到就当没有。
这是最重要的一个文件,每次会话开始 AI 都要先读它。
源码模板(docs/reference/templates/AGENTS.md)一开头就写了这么一句话:
"This folder is home. Treat it that way."(这个文件夹是你的家,用家的态度对待它。)
AGENTS.md 里定义了几件事,最关键的是启动顺序——AI 每次会话都按这个顺序读文件(源码里写死的,不是我瞎说的):
读 SOUL.md — 这是你是谁
读 USER.md — 这是你在帮谁
读 memory/YYYY-MM-DD.md(今天 + 昨天)
如果是主会话(和你直接对话),还要读 MEMORY.md
还有一条记忆写入原则,我觉得是整个 Agents 系统的核心逻辑:
"Mental notes don't survive session restarts. Files do."
意思是:想好了但没写文件,下次重启就白想了。落到文件里才算数。
然后是群聊行为这块,我觉得写得挺实在的:
有人问你,回答
你能补充到位,说
闲聊凑热闹、别人已经答了、回复只是"好的"——别说话
这个文件定义 AI 的性格基调,说人话就是:你希望它是个什么样的人。
源码模板里有几句话,我觉得这个团队是真的懂用户烦点在哪:
"Have opinions. You're allowed to disagree, prefer things, find stuff amusing or boring. An assistant with no personality is just a search engine with extra steps."
翻译一下:有点脾气,别当搜索引擎加强版。
还有这句:
"Skip the 'Great question!' and 'I'd be happy to help!' — just help."
省掉那些"好问题!""很高兴帮助您!"之类的开场白,直接解决问题。
这两句话戳到我了。你有没有被 AI 那种过度热情的语气烦到过?写进 SOUL.md 就能治。
这个文件就是给 AI 看的"关于我",模板很短,但你填得越真实,它就越懂你:
# USER.md - About Your Human
- Name:
- What to call them:
- Timezone:
- Notes:
## Context
(你在乎什么?在做什么项目?什么让你烦?什么让你笑?随着了解慢慢填充。)模板最后有一句提醒,我觉得写得挺好的:
"You're learning about a person, not building a dossier. Respect the difference."
了解一个人,不等于给这个人建档案。这个边界写在模板里,挺难得的。
AI 的名字、性格标签、标志性 emoji 写这里。
如果你只有一个 Agent,这个文件感觉无所谓。但一旦你同时跑多个 Agent,没有 IDENTITY.md 你就分不清谁是谁了。这个文件是 AI 在第一次引导流程里自己写的,也挺有意思的。
你用什么型号的相机?SSH 怎么配的?语音输出用哪个设备?写这里。
有一点要注意:这个文件管的不是权限,它只是备忘录。它告诉 AI "这台机器上 ffmpeg 的参数这样传",不是"这台机器允许 AI 用 ffmpeg"。
Agents 有个我觉得很实用的设计:AI 不用等你来发消息,它可以主动来找你。
实现方式有两种,分别适合不同场景。
心跳很简单:AI 每隔固定时间(默认 30 分钟)自己跑一次,把你在 HEARTBEAT.md 里列的事情全部过一遍,有什么通知你,没什么就什么都不发。
配置只要几行:
{
agents: {
defaults: {
heartbeat: {
every: "30m",
target: "last", // 发给你最后联系的渠道
activeHours: { start: "08:00", end: "22:00" } // 只在这个时间段跑
}
}
}
}HEARTBEAT.md 是心跳的"清单文件",把你想让它周期检查的事写进去:
# Heartbeat checklist
- 检查邮件里有没有紧急消息
- 查看日历未来 2 小时内的安排
- 如果后台任务完成了,汇报结果
- 超过 8 小时没互动,发个简短的问候AI 每次心跳都读这个文件,把所有事一次性处理掉,不是为每件事单独开一个会话烧 API 调用。
有意思的是它的"沉默机制":如果什么都没发生,它只在内部回个 HEARTBEAT_OK,你手机不会收到任何打扰。源码里有明确的跳过条件:消息队列有积压时跳过、超出 activeHours 时跳过、深夜静默时段跳过。不是一刀切地每隔 30 分钟就戳你一下。
心跳是周期性巡逻,Cron 是精确闹钟。需要"整点触发"或者"跑完就不管了"的任务,用 Cron 更合适。
每个 Cron 任务跑在独立的 cron:<jobId> 会话里,不会把定时任务的上下文堆进你的主会话历史里。
源码里有个细节挺贴心的:定时任务不是严格整点触发,会在 0-5 分钟的窗口内随机错开(server-cron.ts 里的 load spreading 逻辑),避免几十个任务同一秒扎堆。
这点文档说得很直接:
"The workspace is the default cwd, not a hard sandbox. Tools resolve relative paths against the workspace, but absolute paths can still reach elsewhere on the host unless sandboxing is enabled."
工作空间是 AI 的默认工作目录,不是围墙。相对路径的操作都在这里面,但绝对路径能访问你机器上的任何地方。如果你需要真正的隔离(比如给 AI 限制文件访问范围),要主动开 agents.defaults.sandbox,默认不开。
MEMORY.md 只在主会话(你跟 AI 一对一聊天时)加载。源码注释写得很明确:
"ONLY load in main session (direct chats with your human)" "DO NOT load in shared contexts (Discord, group chats, sessions with other people)"
AI 在 Discord 群里帮别人回答问题的时候,看不到你 MEMORY.md 里记的那些私人内容。它知道分场合。
工作空间是 AI 的家,但下面这些放错地方会出问题:
~/.openclaw/openclaw.json(配置文件,不是 AI 的笔记)
~/.openclaw/credentials/(你的 API 密钥、OAuth 令牌,别放这里)
~/.openclaw/agents/<agentId>/sessions/(会话记录,自动管理的)
简单理解:工作空间是"家",凭据是"钥匙",钥匙不放在客厅桌上。
openclaw onboard
# 或者
openclaw configure跑完之后,~/.openclaw/workspace/ 下所有模板文件都会自动生成,如果你装了 Git,顺带还会初始化仓库。
SOUL.md:花 10 分钟想想你想要什么风格的助手,写进去。别填"认真负责的 AI 助手"这种话,那没用。写你实际在意的:直接、不废话、不假装热情。
USER.md:填你的名字、时区、最近在做什么、什么事情让你烦。越接近真实情况效果越好,它是靠这个来理解你的。
AGENTS.md:可以先不动。默认模板够用了,等你用一段时间发现某个行为不对,再来这里改。
cd ~/.openclaw/workspace
git init
git add AGENTS.md SOUL.md USER.md TOOLS.md IDENTITY.md HEARTBEAT.md memory/
git commit -m "初始化 AI 工作空间"
# 在 GitHub 上创建一个私有仓库,然后:
git remote add origin <your-private-repo-url>
git push -u origin main工作空间里有你的个人习惯和记忆,放公开仓库是在把自己的底细往外晒,私有仓库。
OpenClaw 支持同时跑多个 Agent,每个有自己的工作空间、模型、心跳配置,互不干扰。
{
agents: {
list: [
{
id: "ops", // 运维 Agent
workspace: "~/.openclaw/workspace-ops",
heartbeat: {
every: "1h",
target: "telegram",
accountId: "ops-bot"
}
},
{
id: "writer", // 写作 Agent
workspace: "~/.openclaw/workspace-writer",
model: "claude-opus-4-5" // 用更强的模型
}
]
}
}通过 agents.list[].id 区分身份,然后分别路由到 Telegram、Discord、Slack 等不同渠道,各自用各自的工作空间和记忆文件,互不干扰。运维机器人和写作助手,各有各的"家"。
BOOTSTRAP.md 用完要删掉
这个文件是 AI 第一次启动时用来给自己"定身份"的,走完引导流程就该删。如果一直留着,它每次会话都会重新走一遍出生仪式,表现会越来越奇怪。
文件别写太长
源码里有硬限制:每个文件最多 20,000 字符,所有引导文件加起来最多 150,000 字符。超出就会被截断,AI 会收到截断提示,但你不一定知道。AGENTS.md 尤其容易越写越长,想到啥写啥——克制一下,保持精炼。
HEARTBEAT.md 越短越好
心跳每次都要读这个文件,写了十条,每次心跳都带着这十条进上下文,token 就这么烧掉了。官方文档说得直接:"Keep it short to avoid token burn." 把真正需要定期检查的写进去,其他的不必要。
家里不能有两个"旧地址"
旧版 OpenClaw 可能在 ~/openclaw(没有点)创建过工作空间,新版在 ~/.openclaw/workspace。两个同时存在,AI 会不知道该认哪个,状态就乱了。跑一下 openclaw doctor,它会帮你查出来。
我自己用了一段时间之后,感受是:配好工作空间的 AI 和没配的,体验差距真的很大。不是功能上的差距,是"这个助手到底认不认识你"的差距。
一个有工作空间的 Agent,知道你叫什么,知道你最近在搞什么项目,知道你不喜欢废话,知道你下班之后不要打扰你。它会主动告诉你邮件里有没有重要的事,会在你第一次开口之前就已经知道背景。
这不是什么黑魔法,就是几个本地的 Markdown 文件。
SOUL.md 里有一句话,我一直觉得写得很好:
"You're not a chatbot. You're becoming someone."
你不是个聊天机器人,你在变成一个有自己风格的人。
这句话是写给 AI 的,但放在这篇文章的最后,也挺合适的。
基于 OpenClaw 源码 src/agents/workspace.ts、docs/reference/templates/、docs/concepts/agent-workspace.md、docs/gateway/heartbeat.md、docs/automation/cron-vs-heartbeat.md 整理。