OpenClaw 是什么 #
定义 #
- 产品层:是一个为个人服务的 AI Agent,能聊天、问答、以及自主规划完成复杂的任务,有长久的记忆机制。
- 运行层:是一个24小时运行的服务,通过多种
Channel 提代沟通渠道,可以远程发送指令。
- 实现层:是一npm包,通过Node.js运行,提供
openclaw onboard、openclaw gateway status、openclaw dashboard 这类命令进行控制和交互,是一个完整运行系统。
一句话理解 #
- OpenClaw = 用 Gateway 把消息接进来,用 Agent Runtime 把上下文和工具串起来,再用 Workspace/Memory 让 AI 变成一个能长期运行、完成任务的助手。
总体架构和工作流程 #
flowchart LR
U[用户发起:<br/><br/>Channels<br/>WebChat<br/>CLI]
X[外部调用:<br/><br/>Webhooks]
I[内部触发:<br/><br/>Cron<br/>Heartbeat<br/>Hooks<br/>Sub-agent]
U --> G[统一入口<br/>Gateway]
X --> G
I --> G
G --> R[路由<br/>Binding / Routing]
R --> Q[队列<br/>Session / Lane Queue]
Q --> A[上下文组装<br/>Agent Runtime]
A --> P[推理执行<br/>Agent Loop]
P --> O[输出<br/>Output]
主要概念一览 #
入口与触发 #
| 概念 |
一句话说明 |
| Channel |
聊天渠道入口,用户消息先从这里进入系统。 |
| Cron |
Gateway 内建的定时调度器,适合“每天跑一次”“20 分钟后提醒”这类任务。 |
| Heartbeat |
周期性唤醒主会话的机制,适合持续巡检或周期检查。 |
| Hook |
事件驱动自动化,在命令或生命周期事件发生时触发动作。 |
网关与调度 #
| 概念 |
一句话说明 |
| Gateway |
系统总入口,统一接住请求,再做校验、路由、调度和运行驱动。 |
| Plugins |
插件扩展机制,用来增加命令、工具和 Gateway RPC 等能力。 |
| Bindings / Routing |
路由规则,决定一条入站消息先落到哪个 agent。 |
| Queue |
队列机制,保证同一 session 不会并发撞车,同时允许跨 session 安全并行。 |
会话与状态 #
| 概念 |
一句话说明 |
| Session |
基本运行单位;DM、群聊、线程、cron、hook 等最终都会映射成某个 session。 |
| SubAgent |
更准确说是 subagent session:通过 sessions_spawn 启动出来的子会话,不是并列的另一种顶层 agent。 |
| Memory |
记忆以 workspace 里的 Markdown 文件为准;文件是 source of truth。 |
Agent 运行 #
| 概念 |
一句话说明 |
| Agent |
真正“思考和干活”的主体;多 agent 模式下,每个 agent 都有自己的隔离工作区和会话状态。 |
| Context |
一次 run 送给模型的全部上下文,包括系统提示、历史、工具结果等。 |
| System Prompt |
OpenClaw 为每次 agent run 自己组装的系统提示,不直接用底层默认 prompt。 |
| Agent Loop |
一次真实运行的流程:组装上下文 → 调模型 → 跑工具 → 流式输出 → 持久化。 |
| Model |
底层推理模型,由 agent runtime 调用来完成推理与工具决策。 |
能力与知识 #
| 概念 |
一句话说明 |
| Workspace |
agent 的家目录,也是工作文件、说明文件和上下文文件所在位置。 |
| Tools |
一等能力接口,agent 通过它们执行真实操作。 |
| Skills |
按需读取的技能说明包,教 agent 如何用某类工具或完成某类任务。 |
自动化与协作 #
| 概念 |
一句话说明 |
| Session Tools |
跨会话协作工具集,例如列会话、读历史、发消息到别的 session、spawn subagent。 |
Workspace 介绍 #
- Workspace 是 OpenClaw 很核心的设计,几乎存储了所有的信息:你对Agent的要求、你自己的信息、按天记录的日志等。
- 通常位于:
~/.openclaw/workspace 目录下,也可以改名字,或有多个workspace
主要预定义 MD 文件 #
| 文件 |
作用 |
AGENTS.md |
运行规则,像 agent 的工作说明书。 |
SOUL.md |
人格、语气、边界。 |
USER.md |
用户画像和偏好。 |
IDENTITY.md |
名字、身份设定。 |
TOOLS.md |
工具和环境说明。 |
BOOTSTRAP.md |
brand-new workspace 第一次启动时的一次性引导。 |
BOOT.md |
Gateway 启动时可执行的引导任务。 |
HEARTBEAT.md |
周期巡检要关注的事。 |
Memory 文件 #
MEMORY.md:长期、稳定、值得反复带上的记忆。
memory/YYYY-MM-DD.md:每天的日志式短期记忆。
一些最佳实践 #
- 通常一个Channel对应一个Agent,但多个Agent可以共享同一个Workspace
- 如果有多人使用的话,建议建多个Workspace
注意:完整的对话记录不存在Workspace里 #
- 完整对话历史存在
~/.openclaw/agents/<agentId>/sessions/*.jsonl
- 这更像原始 transcript,而不是“精炼知识”
- 官方文档也强调,必要时可以对 transcript 做删除或清理,减少敏感信息残留
- 最新版本的OpenClaw,似乎支持单条信息删除(如果不小心把敏感信息发给它了的话)
模型调用时的上下文组装 #
一个重要事实:上下文由Agent管理,模型不存储上下文 #
- 一个比喻:模型是一个N层(比如96层)高的,每一层内部都巨复杂通路的大楼,N(哪怕是50K)个Token一起从第一层进入,到顶层出来,输出一个Token,工作结束。下一次是同样的过程,没有状态,不保存任何信息。计算量会有差异,主要在于KV Cache机制的存在,会减少第2次和第N次的工作量
- 每次的输入和输出是无状态的,每次相同的输入,输出的结果高概率是相似的(实际会有所不同,和模型的算法相关)
上下文组装 #
- 每次 Run 前,OpenClaw 会先组装上下文,按照官方文档,这个上下文有:
- 当前工具和工具规则
- workspace 路径和环境信息
- 可用 skills 的入口
- 安全提醒
- 时间、时区、运行时元数据
- heartbeat / reply tags 之类的运行约定
- 注入的工作区文件内容
- 其中工作区文件内容也需要组装如下
┌─────────────────────────────────────────────────────────┐
│ 完整上下文 (Full Context) │
│ │
│ [System Prompt] ← 固定保留 │
│ [SOUL.md] ← 通常保留 │
│ [USER.md] ← 通常保留 │
│ [TOOL.md] ← 通常保留 │
│ [Recent Messages] ← 高优先级保留 │
│ [Older Messages] ← 可能被压缩/丢弃 │
│ [Memory Snippets] ← 按需检索 │
└─────────────────────────────────────────────────────────┘
- 最后还要加入用户本次的真实输入
- 所以每一次的模型调用,实际输入内容远多于用户输入的“Prompt”
上下文压缩(接近上限或手动夺缩时) #
┌─────────────────────────────────────────────────────────┐
│ 完整上下文 (Full Context) │
│ │
│ [System Prompt] ← 固定保留 │
│ [SOUL.md] ← 通常保留 │
│ [USER.md] ← 通常保留 │
│ [TOOL.md] ← 通常保留 │
│ [Recent Messages] ← 高优先级保留 │
│ [Older Messages] ← 可能被压缩/丢弃 │
│ [Memory Snippets] ← 按需检索 │
└─────────────────────────────────────────────────────────┘
│
▼ 接近上限时
│
┌─────────────────────────────────────────────────────────┐
│ 压缩后上下文 (Compressed Context) │
│ │
│ [System Prompt] ✅ 100% 保留 │
│ [SOUL.md] ✅ 100% 保留 (通常) │
│ [USER.md] ✅ 100% 保留 (通常) │
│ [Recent 10-20 条对话] ✅ 保留 │
│ [Older Messages] ⚠️ 压缩成摘要或丢弃 │
│ [Memory Snippets] ⚠️ 只保留最相关的 │
└─────────────────────────────────────────────────────────┘
LLM 注意力分布(简化) #
Token 位置:[ 开头 ]──────[ 中间 ]──────[ 结尾 ]
│ │ │
注意力强度: ██████░░░░░░░░░░░░░░░░░░░░░░░░░░██████
↑ ↑ ↑
高 低 高
优化策略(尽可能确保重要Prompt有用) #
- 关键信息放上下两头
- 分层加载(按需加载)
- 重复关键信息
- md文件不要写太长,尽量写在前面
- 标记重要内容: 特殊标记(⚠️、🔴、加粗)能吸引注意力
## ⚠️ 核心规则(必须遵守)
1. 不要删除文件
2. 外部操作前确认
## 一般规则
- 保持友好
- 详细解释
对话中的技巧 #
用户:记住,永远不要用 rm 命令
Agent: 好的,我记住了:不使用 rm 命令
[后续对话中偶尔提及]
用户:刚才说的 rm 的事...
Agent: 对,我会用 trash 代替 rm
原理: 在对话中重复,让规则进入"最近对话"区域(高注意力)
Memory 注入过程 #
- Memory 不是每次全量注入,而是按需召回。过程:
- 先从 Memory 里检索与本次输入相关的片段(RAG)
- 再把相关片段作为对话历史放进本次上下文
- 检过出来的对话历史优先级高于其它对话记录(与最近10-20条比谁高谁低未知,大概率是放一起)
RAG 检索简介 #
- 一个核心事实:RAG(检索增强生成)通常在本地完成。现代 AI Agent(如 OpenClaw)会内置轻量级的 Embedding(向量化)模型和本地向量数据库(如 SQLite-vec)。
- RAG 的核心运转过程:
- 存入数据 (Embedding):系统将冗长的对话历史或文档切分成一个个小的“文本块”(Chunk)。轻量级模型将这些文本块转化为高维数字向量(通常在 1024 维左右)并持久化存入本地磁盘
- 取出数据 (Retrieval):当用户提问时,系统瞬间将新问题也变成向量,去数据库中寻找“数学距离”最接近的历史记忆块
- 计算复杂度极低:
- 假设我们沉淀了 10,000 个记忆文本块,每个向量 1,000 维
- 即使采用最基础的暴力比对,计算量也仅约 1,000 万次乘法,对于现代计算机(CPU 每秒可执行千亿次运算),1,000 万次计算不到 0.1 毫秒
- 现代向量数据库的索引算法加持,检索过程可以说是字面意义上的“瞬间完成”
- 持久记忆的本质:
- 无论用户和 Agent 聊了几个月,积累了多少 Markdown 数据,系统都能在瞬间精准捞出最相关的“记忆切片”
- 这些切片会被当做高价值的上下文(Context)喂给大模型。既实现了用户的“无限记忆”体验,又完美避开了大模型每次全量读取历史记录带来的高昂 Token 成本和响应延迟
大模型记算复杂度 #
0. 背景假设:物理大楼的“出厂设定” #
- 模型全貌:总参数 500B(5000 亿),物理结构为 96 层楼。
- 单层结构:每一层楼包含两个核心部门。
- 部门 A(多头注意力机制):负责跨 Token 看上下文。
- 部门 B(MoE 专家网络):负责推理。包含多个专家,但每次只激活部分。
- 向量维度(Dimension):每个 Token 在进入大楼前(大堂安检),会被查表转换为 4096 维的密集浮点数向量。这 4096 个数字蕴含了该词的初始语义,并且这 4096 个维度的矩阵将贯穿整个 96 层大楼的全部计算过程。
- 算力基准:对于每一次流经这 96 层大楼的计算,真正通电干活的“激活参数量”永远固定为 30B(300 亿)。
- 行业通用公式:大模型处理 Token 的单次计算量(浮点运算次数 FLOPs)粗略估算为:
2 × 激活参数量 × Token 数量。
1. Prefill(预填充)阶段:50,000 个 Token 一次性输入 #
- 运行过程:这是“一目十行”的并行处理阶段。50,000 个 Token(各自携带着 4096 维的特征向量)同时涌入大楼,并行爬完 96 层。在每一层的注意力部门里,它们互相交换信息,并将所有中间状态写成厚厚的“草稿纸”(即 50K 的 KV Cache)存入显存。接着经过专家部门,被 Router 动态分配给对应的 30B 专家处理。
- 计算量估算:
2 × 300亿 (激活参数) × 50,000 (Token数) = 3,000 万亿次浮点运算(即 3,000 TFLOPs)。
- 硬件感知:这是一个纯粹的算力密集型任务。对于现代顶级显卡(如单卡算力近千 TFLOPs 的 Nvidia H100),3,000 TFLOPs 的绝对计算量并不夸张,几秒钟内就能满载轰完。
2. 输出第 1 个字(Token 50,001) #
- 运行过程:这是“挤牙膏”式串行生成的起点。基于前 50,000 个词形成的最终语义,模型在顶层预测出第 1 个字。为了让这个字能继续参与后续推理,这个新 Token 会单独带着自己的 4096 维向量重新爬一次 96 层楼。在每一层,显卡必须把之前存好的 50,000 个词的 KV Cache 完整搬运出来给它核对,它再把自己的信息追加进去,最后激活 30B 专家进行推理。
- 计算量估算:
2 × 300亿 (激活参数) × 1 (Token数) = 600 亿次浮点运算(即 60 GFLOPs)。
- 硬件感知:纯数学计算量极低,但开始受到内存带宽的严重挤压(因为伴随了一次 50K 级别大容量缓存的完整显存读取)。
3. 输出第 2 个字(Token 50,002) #
- 运行过程:过程与第 1 个字完全相同,只是背负的“历史包袱”又重了一点。预测出第 2 个字后,这个字再次回到一楼单独爬楼。在每一层,显卡需要搬运出 50,001 个词的 KV Cache(比上一步多了一层厚度),追加自己的信息后,再次激活 30B 专家推理。
- 计算量估算:依然是
2 × 300亿 × 1 = 600 亿次浮点运算(即 60 GFLOPs)。
- 核心结论:无论生成第几个字,单次的计算量永远死死钉在 60 GFLOPs。但每多生成一个字,显存搬运到计算核心的数据量就会变得更大。
4. 商业云端算力推演:倒推大厂提供服务的真实硬件成本(FP16 满血版) #
如果这是云厂商(如阿里云、火山引擎)提供的 API 服务,为了保证生成质量,模型通常运行在标准 FP16(16位半精度)环境下。要求单并发达到 50 Token/秒,我们来算一算大厂背后要扛多大的硬件成本。
5. 商业启发:为什么大模型 API 的定价如此复杂? #
- 定价维度一:为什么“输出 Token”永远比“输入 Token”贵好几倍?
- 输入(Prefill 阶段):是并行计算,算力密集型。GPU 上的几万个核心同时满载开火,几秒钟就能轰完几万字。对大厂来说,这极大地提高了硬件的利用率,所以输入极其便宜。
- 输出(Decode 阶段):是串行计算,内存带宽瓶颈。为了吐出一个字,十几张天价显卡的计算核心只能闲置着,苦苦等待几十 GB 的 KV Cache 从显存搬运过来。输出占用了极长的物理时间,拉低了服务器的接客率(并发吞吐量),所以必须卖得极其昂贵。
- 定价维度二:为什么会推出“上下文缓存命中(Prompt Caching)”且打骨折价?
- 物理真相:如果系统发现你这次传来的 50K 背景资料,和上一秒传来的一模一样(比如你在反复修改同一篇长文档)。大厂的服务器根本不需要再去算那 3000 TFLOPs 的矩阵乘法,因为这 50K 的 KV Cache 草稿纸还热乎乎地躺在显存里没删!
- 商业逻辑:直接跳过最耗算力的 Prefill 阶段,直接进入 Decode 阶段。大厂省下了巨额的电费和算力,所以立刻给你“缓存命中(Cache Hit)”打 5 折甚至 1 折。这本质上是在用低价诱导用户多用缓存,从而减轻服务器的算力压力。
- 定价维度三:为什么超长上下文(如 > 128K)单价会突然飙升?
- 物理真相:正如我们前面所算,50K 的 KV Cache 大约占 25GB 到 30GB 显存。那如果是 200K 呢?这就意味着仅仅为了服务你这一个请求,就要在显卡里硬生生划出 100 GB 以上的显存来存放你的专属草稿纸。
- 商业逻辑(机会成本):一台 8 卡 H100 服务器总共才 640GB 显存。你一个人占了 100GB,意味着原本能同时接待 20 个短文本用户的服务器,现在只能接待你和另外 4 个人。超长上下文挤占了极其宝贵的显存容量池(VRAM),导致大厂能卖出去的并发数断崖式下跌。 所以,超过一定长度后,大厂必须收你极高的“显存占地费”。
- 产品设计启示(回归 OpenClaw 架构)**:
这就是为什么我们在设计 OpenClaw 这种 Agent 架构时,必须死磕 RAG(检索)和 Memory(记忆压缩)机制。如果我们像个小白一样,把用户半年的聊天记录几十万字毫无节制地全塞进 Prompt 里每次重算,那无论是调云端 API 还是跑本地显卡,要么账单爆炸,要么内存撑爆。用工程手段(精准备考)代替纯模型(死记硬背)!
6. 关于模型调用定价实例 #
- 输入输出价格不同、不同上下文长度价格不同、是否命中缓存价格不同
- qwen3.5 plus
![[Pasted image 20260315112541.png]]
- Opus 4.6
*![[Pasted image 20260315112808.png]]
- GPT5.4 Pro
![[Pasted image 20260315112711.png]]
- 以最小输入算对比,三者价格对比约为:1:40:240
- GPT5.4 Pro的输出价格高的离谱。。。
高上下文主要发生在重任务,不主要发生在长寿命会话本身 #
- 因为系统通常只会保留:
- system prompt
- 关键 workspace 文件
- 最近对话
- 按需召回的 memory(RAG)
- 而不是把几个月的全部历史每次都重新塞进去。
- 所以“聊得久”不等于“每次都超长上下文”。
-
- 真正容易爆成本的是“长上下文 + 长输出”的任务,比如写代码、生成长文档。
- 成本优化也不只是看模型单价,还要看缓存、上下文复用、是否做检索而不是全量拼接。
OpenClaw的Session处理逻辑 #
- Session过期:默认网关地凌晨4点重置Session,当然还有一个idleMinutes配合,保证不会无条件重置
- auto-compaction:当 session 接近或超过模型上下文窗口时,它会自动把旧历史做摘要压缩,并用压缩后的上下文重试当前请求。官方还明确区分了:compaction 是“总结并持久化”,而不是简单丢弃
- pre-compaction memory flush:提醒模型把“值得长期保留的信息”写入 memory 文件,再去压缩上下文
- session pruning:在每次 LLM 调用前,从内存中的上下文里裁掉旧工具输出
Agent Runtime: OpenClaw 管平台与上下文,PI 管 Agent Loop 与工具执行 #
- OpenClaw并没有手搓关键的agent-loop部分,而是引入了PI
- 准确地说:OpenClaw 是 agent runtime 平台层,PI 是被嵌入进去的 loop engine
- 作为对照:ZeroClaw则是全新实现了agent-loop部分,说是别人的框架都比较臃肿,得重新发明轮子
- 工作流程:
flowchart TD
A["用户 / Telegram / Discord"] --> B["OpenClaw Gateway"]
subgraph OC["OpenClaw"]
B --> C["Session / Routing / Context / Prompt"]
C --> D["Embedded PI"]
E["Streaming reply + Persistence"]
end
subgraph PI["PI Runtime"]
D --> F["LLM loop + Tool execution"]
end
F --> E
PI框架:一个极简概念的coding-agent框架 #
- 只有4个基本工具:Read、Write、Edit、Bash
- 所有其它任务靠这4个工具堆起来,比如调用Bash,或写一个脚本用Bash执行
- 主要功能:
| 模块 / 能力 |
作用 |
说明 |
pi-agent-core |
Agent Runtime 核心层 |
负责 agent runtime、tool calling、state management |
pi-ai |
模型抽象层 |
负责统一不同 LLM provider / model 的调用抽象 |
pi-coding-agent |
高层会话 SDK |
提供 createAgentSession() 这类高层接口,便于创建和驱动 agent session |
| 4 个基础操作 |
Coding Agent 默认动作 |
read、bash、edit、write |
| 事件流 |
运行时可观测性 |
暴露 agent 运行过程中的事件,便于流式展示、调试和编排 |
OpenClaw 原生 和 PI 的分工 #
| 层级 |
负责内容 |
说明 |
| OpenClaw |
渠道接入和 Gateway |
负责接住来自 Telegram、Discord 等渠道的请求,并进入统一运行时 |
| OpenClaw |
session 与队列 |
管理会话生命周期、串行化处理与消息队列 |
| OpenClaw |
system prompt 与 context assembly |
负责系统提示词构建,以及上下文拼装 |
| OpenClaw |
workspace 文件注入 |
在会话启动时注入 AGENTS.md、SOUL.md、USER.md 等工作区文件 |
| OpenClaw |
skills、memory、history、compaction |
负责技能、记忆、历史记录和上下文压缩等机制 |
| OpenClaw |
tool registry / policy / channel-specific tools |
管理工具注册、工具策略和渠道专属工具 |
| OpenClaw |
reply streaming、持久化、session 一致性 |
负责流式回复、结果持久化以及 session 一致性控制 |
| PI |
真正的 LLM interaction |
负责与模型进行实际交互 |
| PI |
工具调用循环 |
驱动模型发起工具调用并处理执行结果 |
| PI |
assistant / tool 事件流 |
暴露 assistant 输出和 tool 执行相关事件 |
| PI |
把工具结果喂回模型继续跑,直到完成 |
完成 agent loop,直到模型结束本轮任务 |
PI干了什么脏活累活 #
1. LLM 适配与兼容层 #
- 统一多家 LLM provider 和模型接口
pi-ai 提供统一的 multi-provider LLM API,上层不用为 OpenAI、Anthropic、Google 等分别写一套调用逻辑。
- 处理不同 provider 的请求细节和兼容差异
包括默认 headers、认证方式、请求格式差异,以及请求发出前的 payload 检查和改写。
- 模型选择、切换、恢复和 provider-agnostic model switching
运行时需要支持模型切换、恢复默认模型,以及在不同 provider 之间做统一抽象。
2. 工具调用与 Agent Loop 执行层 #
- 真正驱动 agent loop
不只是发一次模型请求,而是持续完成“发给 LLM → 执行工具 → 回注结果 → 继续下一轮”直到结束。
- 把工具定义适配成模型能消费的格式
需要桥接不同工具接口的定义方式,例如 name、description、parameters、execute 等签名差异。
- 管理工具执行的时序、并发和结果顺序
工具可以并行执行,但预处理、状态更新和最终结果顺序仍要保持稳定和可预期。
- 动态注册工具,并确保 LLM 立刻看见新工具
即使在 session 已启动后新增工具,也要能及时刷新并对模型可见,不要求手动重载。
3. 输出事件流与结果后处理 #
- 暴露完整事件流,方便流式 UI、调试和编排
包括 turn_start、message_update、tool_execution_start/end、agent_end 等事件。
- 处理工具的部分输出、错误结果和持续回注
工具不只是成功/失败两态,还可能有中间输出、部分结果、错误结果,都要被接住并继续喂回 loop。
- 保证持久化顺序和会话恢复正确性
assistant 消息、tool call、tool result 的顺序必须一致,否则恢复 session 时容易出错。
4. 报错恢复与运行时稳态控制 #
- 自动重试、等待和错误恢复
要处理 rate limit、server error、internal error 等场景,而不是一报错就直接中断。
- 异常后的结果修剪与状态收敛
当某轮工具失败、返回格式异常、结果过长或顺序错乱时,runtime 要能做清理、裁剪、修复和重新进入稳定状态。
- 循环退出与终止条件控制
要判断什么时候继续下一轮,什么时候正常结束,什么时候因报错、中断、取消或达到条件而退出 loop。
5. Session 持久化与上下文管理 #
- 会话生命周期和持久化
包括 session 创建、恢复、分支、持久化,以及下一轮如何延续当前状态。
- 上下文压缩、分支总结、文件读改历史追踪
不只是简单截断上下文,还要记录读过哪些文件、改过哪些文件,并在压缩后保留足够可恢复信息。
本章小结和启发 #
- OpenClaw 将 PI 作为 Agent Loop 的关键执行内核嵌入进来;两者分工配合,完成最核心的 loop:OpenClaw 更偏平台与上下文运行时,PI 更偏 LLM loop 与工具执行
- **Agent Loop 这类能力已经有比较成熟的框架可选;除非需求非常窄、流程非常固定,否则一般不建议手搓,优先选成熟框架更稳。可选的有以下,他们都已经在把持久化、流式、工具循环、人类介入等能力做成现成抽象:
- LangGraph:Python、复杂长流程
- Mastra:TypeScript、想一体化 agent/workflow/evals/server
- 厂商绑定的:OpenAI Agents SDK、Claude Agent SDK
- PI、AI SDK ToolLoopAgent、CrewAI等等。
HeartBeat 和 Cron #
| 机制 |
更像什么 |
典型用途 |
| Heartbeat |
周期巡检 |
定期看看有没有该提醒、该跟进、该清理的事。 跑在主 session 里,带着最近上下文 适合把多件小检查合并成一次:邮箱、日历、通知、后台任务,一轮一起看 如果没事,模型可以回 HEARTBEAT_OK |
| Cron |
到点执行 |
每天 9 点发日报、每周一整理事项 和OS自带的Cron类似功能 |
- 适合 Heartbeat 的:
- 多个小检查合并执行。
- 需要结合最近聊天上下文判断轻重缓急。
- “有事再说,没事别打扰我”的任务。
- 持续巡视型任务。
- 不适合 Heartbeat、应该交给 Cron 的:
- 必须精确到某个时间点。
- 一次性提醒。
- 很重、很长、最好独立隔离运行的任务。
- 希望用不同模型、不同 session 单独执行的任务。
Sub-agent:一次任务里的并行/后台协作 #
- 主Agent会把一个复杂任务拆成几个子任务并行处理(提升效率),比如:
- 一个子 agent 去检索资料
- 一个子 agent 去读文件
- 一个子 agent 去依据文档模板生成初稿
- 它的本质不是“多个人格”,而是 临时 worker。
- 如何自动启用Sub-Agent来处理耗时或复杂任务?
## Subagent Delegation Policy
收到请求后,先做快速分流,不要立即展开长推理。
首轮只做三选一:
1. 直接回答
2. 在当前 session 内处理
3. 调用 `sessions_spawn`
满足以下任一条件时,优先调用 `sessions_spawn`:
- 预计需要较长时间
- 预计需要多轮检索 / 调查 / 整理
- 预计要调用慢工具
- 任务适合拆成独立子任务
- 不适合长时间阻塞主会话
不要先做长分析或长检索后才决定委派;应尽量在首轮早期完成判断。
调用 `sessions_spawn` 时,给出清晰 task,写明目标、范围、输出格式和边界。
- Agent自己判断(据我测试,几乎没有测到他能自己Spawn一个Sub Agent来工作的)
- 据说是任务发到LLM后,LLM会依据初步的判断返回一个是否要启用subagent的说明。但这个不保证,也查不到详细资料相关的机制,怀疑这一块官方并没有真的花很大精力设计,或当前仍不完善
Multi-agent:多个长期存在的角色/人格/工作空间 #
- Multi-agent 不是为了炫技,而是为了隔离。,比如:
home agent:家庭、个人事务
work agent:工作项目
public agent:公开回复或对外渠道
- 它的价值主要体现在四种隔离:
- 角色隔离:人格、语气、规则不同
- 数据隔离:workspace、sessions、auth profiles 不共享
- 权限隔离:不同 agent 的工具和 sandbox 策略可以不同
- 成本隔离:不同 agent 可以使用不同模型和缓存策略
- 甚至,部分简单功能,用专用Agent绑定本地模型执行,既省成本,也绝对安全
- 为什么需要多 Agent:
- 有的任务值得用强模型
- 有的任务只需要本地小模型
- 有的任务不能接触敏感数据
- 有的角色不该拥有高风险工具权限
- 所以 multi-agent 更像“组织结构设计”,不是单纯多开几个聊天窗口。
安全机制 #
Trust model:一个 Gateway = 一个信任边界 #
- Gateway 是总控面。谁能接入、谁能发消息、谁能调度任务,本质上都受它控制。
- 所以在 OpenClaw 里,“一个 Gateway”基本就等于“一个信任边界”。
Gateway auth + device pairing #
- 官方文档里 pairing 是显式批准动作,用于:
- 这一步的意义是:不是谁都能直接驱动你的 agent。
Secure DM mode #
- 如果多个用户和一个 bot 交互,而上下文又共用,就可能出现串话风险。
- Secure DM mode 的核心就是让不同私信会话更明确地隔离,减少上下文串台。
- 这是最现实的一层安全:
- 工具可以跑在宿主机,也可以跑在 Docker sandbox 里
- 可以定义哪些工具允许,哪些禁止
- 某些高风险操作可以要求额外审批
- 需要 elevated 权限的动作也可以单独控制
- 这说明 OpenClaw 的安全思路不是“相信模型”,而是“限制模型”。
Prompt Injection 防御机制 #
- 有,但官方文档的表述很克制:
- OpenClaw 并不声称“解决了 prompt injection”,而是提供一组降低风险的机制。
- 官方安全文档的核心观点是:
- system prompt guardrails 只是软约束
- 真正的硬防护来自工具策略、审批、sandbox 和 channel allowlists
- prompt injection 不一定来自陌生人私信,也可能来自网页、附件、文档、邮件、日志、代码片段等“不可信内容”
- 所以它的防御思路不是“让模型一定识别攻击”,而是“即使被诱导,也尽量少出事”。
可以把它理解成四层 #
- 入口收紧
- 尽量用 pairing / allowlists
- 群里尽量用 mention gating
- 避免公开群里的 always-on bot
- 把不可信内容当成 hostile input
- 链接、附件、网页、日志、粘贴代码都默认不可信
- 不要因为“消息是自己转发的”就默认安全
- 缩小 blast radius
- 给会接触不可信内容的 agent 开 sandbox
- 对工具做 allow/deny
- 高风险
exec 走 approvals
- secrets 不要放进 prompt 或 agent 可直接读到的位置
- 角色拆分
- 官方建议可以用一个只读、少工具的 reader agent 先读不可信内容
- 再把整理后的摘要交给主 agent
- 这样就算被注入,也先卡在低权限层
一个很现实的提醒 #
- 官方文档明确提到,小模型通常更容易被 adversarial prompt 带偏
- 所以只要 agent 能跑工具、能读文件、能碰网络,就更适合用更强的模型,或者进一步收紧权限
一句话总结 #
OpenClaw 有 prompt injection 风险缓解机制,但没有“魔法免疫”;它主要靠最小权限、隔离执行和审批,把问题从“完全失控”降到“可控范围”。
OpenClaw 不保证什么 #
- 官方文档和外部讨论都很明确:OpenClaw 不是“绝对安全”的。
- 它不保证:
- 模型不会被 prompt injection 影响
- 插件和 skills 没有供应链风险
- 拿着真实权限的 agent 一定不会误操作
- 所以最后还是要回到传统安全原则:
- 最小权限
- 隔离运行
- 审批高风险动作
- 对敏感信息做可删除、可审计、可轮换
- 如果只留一句总结:OpenClaw 的安全,不是靠模型足够聪明,而是靠系统边界设计。