读完这一节,你会搞清:工作区里那几份文件是怎么被「喂」给助手的、会话存在哪、队列几种模式分别啥意思(你发多条消息时助手怎么处理),以及沙箱在什么场景下用、怎么配。适合已经改过配置、想细调「谁先跑、怎么跑、跑在哪儿」的你。
助手每次新会话的第一轮,OpenClaw 会把工作区里那几份 bootstrap 文件(AGENTS.md、SOUL.md、USER.md、IDENTITY.md、TOOLS.md 等)的内容直接塞进助手的上下文里,相当于「一上来就告诉助手:你是谁、规矩是啥、用户是谁」。这就是注入(inject):不是助手自己去读文件,而是 Gateway 在发请求给模型前,先把这些内容拼进提示里。
openclaw setup 可以帮你补建默认模板。agents.defaults.bootstrapMaxChars、agents.defaults.bootstrapTotalMaxChars 调。agent.skipBootstrap: true,就不会再自动创建这些文件。子会话(例如子 Agent)一般只注入 AGENTS.md 和 TOOLS.md 等部分文件,主会话才会注入完整一套;细节见官方 Agent runtime。
一次连续对话从开始到结束,在 OpenClaw 里算一个会话(Session)。每个会话有一个稳定 ID,由 OpenClaw 分配。
~/.openclaw/agents/<agentId>/sessions/<SessionId>.jsonlagentId 是 main。agentId,会话目录互相独立。你一般不用直接去改这些 JSONL;只是要知道:会话 = 一段连续对话的完整记录,存在上述路径下,重启 Gateway 也不会丢(除非你删掉或换了状态目录)。
当你在飞书、Telegram 或控制台里连续发多条消息时,Gateway 不会同时开多个「助手轮」乱抢,而是通过一个队列把请求串起来或按规则合并。具体行为由队列模式决定,你可以在配置里设默认,也可以在某些渠道里单独设。
可以简单理解成三种常见模式:
| 模式 | 含义(通俗说) |
|---|---|
| steer | 新消息立刻插进当前这一轮:助手正在干活时收到新消息,会在「下一个合适的位置」停下当前计划,转去处理新消息。适合你希望「发一句就能打断/改方向」的场景。 |
| followup | 新消息不插队,等当前这一轮完全结束后,再开新的一轮,用新消息当输入。适合不想打断、一条一条排队处理。 |
| collect | 多条新消息先攒着,等当前轮结束后,把攒着的多条合并成一条再交给助手(可配 debounce,避免「继续继续」刷屏)。默认很多渠道用的是 collect。 |
还有 steer-backlog(既立刻 steer,又保留一份给下一轮,可能看起来像「回了两次」)、interrupt(直接中止当前轮,只处理最新一条)等,详见官方 Queue。
配置示例(全局默认 + 按渠道覆盖):
{
messages: {
queue: {
mode: "collect",
debounceMs: 1000,
cap: 20,
drop: "summarize",
byChannel: { discord: "collect" },
},
},
}
默认情况下,助手的工具(读文件、执行命令、写文件等)是直接在你运行 Gateway 的本机上执行的。若你希望把「执行」关进一个隔离环境,减少误操作或恶意指令的影响,可以用 沙箱(Sandbox):OpenClaw 用 Docker 容器跑工具,让文件、进程都限制在容器里。
agents.defaults.sandbox(以及可选的 agents.list[].sandbox)控制。mode 决定「哪些会话」进沙箱:
off:不沙箱,全在本机。non-main:只有非主会话进沙箱(例如群聊、子 Agent、某些渠道会话),主会话(你私聊、控制台)仍在本机。all:所有会话的工具执行都进沙箱。agents.defaults.sandbox.workspaceAccess:
none(默认):沙箱里看不到你真实工作区,只有一块临时目录(在 ~/.openclaw/sandboxes 下),适合「完全隔离」。ro:把真实工作区以只读挂进沙箱(例如 /agent),助手能读不能写。rw:把真实工作区以读写挂进沙箱,助手在沙箱里改的就是你工作区。沙箱需要本机有 Docker,并先按官方文档构建沙箱镜像(如 openclaw-sandbox:bookworm-slim)。若你不需要隔离,可以不开沙箱,工具照常在本机跑。
agents.list 里多个 id),每个 Agent 可以有自己的工作区路径(在对应 agent 的配置里写 workspace)。这样不同助手用不同目录,互不干扰。详见 Multi-Agent 和本教程第三部分。non-main 或 all 时,非主会话可以使用按会话隔离的沙箱工作区(在 agents.defaults.sandbox.workspaceRoot 下),而不是直接用你的主工作区,进一步避免串台。详见官方 Sandboxing。agent.skipBootstrap: true 禁止自动创建。~/.openclaw/agents/<agentId>/sessions/<SessionId>.jsonl,会话 ID 稳定,由 Gateway 分配。/queue <mode>。Q:改了 AGENTS.md 但助手好像没按新规矩来?
引导文件只在新会话的第一轮注入;若你是在已有会话里继续聊,当前会话已经用过旧内容了。新开一个会话(新对话或刷新后重聊)才会读到最新文件。
Q:队列模式在哪儿设?
全局在配置里 messages.queue.mode 和 messages.queue.byChannel.<渠道>;当前会话也可用 /queue collect、/queue steer 等(取决于渠道是否支持)。
Q:开了沙箱后助手说找不到工作区里的文件?
若 workspaceAccess 是 none,沙箱里根本没有挂你的工作区,只有沙箱自己的临时目录。需要读工作区时改为 ro 或 rw(注意 rw 会让助手在沙箱里改你真实工作区)。
Q:多 Agent 时每个助手的工作区路径怎么设?
在 agents.list[] 里给每个 agent 设 workspace(或用 agentDir 等);详见 Multi-Agent 和本教程 3.1。