芥末
发布于 2026-03-09 / 0 阅读
0
0

OpenClaw 核心架构、记忆机制与多 Agent 部署实践

OpenClaw 可以理解成一套面向个人和小团队的 Agent 运行框架。它把大语言模型、即时通信工具、本地工作区、工具权限、长期记忆、会话历史和多 Agent 协作串到一起,让一个 Agent 不只停留在聊天窗口里,而是能长期运行、接收消息、调用工具、读写文件,并把一部分知识沉淀到自己的 workspace 中。

它的工程复杂度并不来自某个非常神秘的算法,而是来自一套清晰的约定:每个 Agent 有独立身份、独立 workspace、独立记忆、独立技能列表;多个 Agent 之间可以互相发消息,也可以临时派生子任务。掌握这些约定以后,OpenClaw 就不再是一个黑盒工具,而是一套可以被改造和精细化管理的 Agent 基础设施。

OpenClaw 解决的核心问题

单纯把一个大语言模型接到聊天软件里,只能解决“问答入口”的问题。真正做个人 Agent 时,还会遇到一堆更具体的工程问题:

问题如果没有统一框架OpenClaw 的处理方式
Agent 身份每次靠 prompt 临时描述用 AGENTS.md、SOUL.md、IDENTITY.md 等文件固化
工具权限工具越接越多,边界越来越模糊用 TOOLS.md 和配置文件控制白名单、黑名单
长期记忆对话一长就忘,或者上下文被污染用 Session、Memory、压缩和检索机制管理
多 Agent 协作每个 Agent 的通信方式都要自己设计内置 sessions_send 和 sessions_spawn
技能扩展skill 越装越乱,调用不稳定按优先级扫描 skill,并按需读取完整内容
部署入口需要自己写 IM Bot、网关和调度通过 gateway 统一接入 IM 和 Agent Runner

整体结构可以抽象成下面这样:

flowchart LR
    U[用户 / IM 群聊] --> IM[IM Bot]
    IM --> G[OpenClaw Gateway]
    G --> R[Agent Runner]

    R --> W[Agent Workspace]
    W --> C[配置文件<br/>AGENTS / SOUL / TOOLS]
    W --> M[Memory<br/>MEMORY.md / daily memory]
    W --> S[Sessions<br/>JSONL 会话记录]
    W --> SK[Skills<br/>按需加载]

    R --> LLM[LLM 大语言模型]
    R --> T[本地工具 / API / 文件系统]

OpenClaw 的价值不在于“替代模型”,而在于把模型外部的工程能力组织起来。模型越强,Agent 的执行质量通常越高;但角色定义、长期记忆、技能沉淀、多 Agent 分工这些资产,可以随着底层模型升级继续复用。

部署方式:云机与自部署

使用 OpenClaw 通常有两种方式:云机部署和本地自部署。

方式适合场景优点代价
云机部署想快速跑起来,不想维护实体机器配置简单,环境稳定,数据可以下载数据和运行环境依赖云侧
本地自部署希望 Agent 能长期驻留在自己的设备上,或接入本地模型、本地文件控制权更强,可以接 ComfyUI、TTS、本地脚本需要维护机器、依赖、网络和安全边界

本地部署时,macOS 环境通常更省事,很多工具链和脚本对 Mac 更友好。Windows 也可以部署,但调环境的成本会更高。

如果只是运行 OpenClaw、调用各种 API(应用程序编程接口),机器性能压力并不大;真正吃配置的是本地文生图、文生视频、TTS(文本转语音)等模型。硬件选择可以按下面的思路判断:

配置项只跑 OpenClaw + 云端 LLM还要跑本地多模态模型
芯片Apple M 系列即可,M1 也够用M 系列越新越好
内存16GB 通常够用建议 24GB 或更高
磁盘256GB 可用模型文件很大,512GB/1TB 更舒服

LLM(Large Language Model,大语言模型)的选择会直接影响 Agent 的稳定性。低能力模型经常会把工具参数写错、忘记角色边界、错误调用 skill,最后表现为“Agent 不可靠”。如果预算允许,优先使用 SOTA(State of the Art,当前领先水平)模型,更容易判断问题到底来自框架配置,还是来自模型能力不足。

安全边界必须提前设计

OpenClaw 一旦接入 IM(Instant Messaging,即时通信)工具,就相当于把一个能调用工具、能读写文件、能访问本地资源的机器人暴露给聊天入口。安全风险不能靠“我会小心使用”来兜底,而要靠权限隔离和最小授权来控制。

需要特别注意几件事:

风险点建议做法
把 Agent 当文件传输助手不要向 Agent 所在聊天窗口随手发送私密文件、密钥、合同、证件等内容
工具权限过大用 TOOLS.md 和配置文件限制文件系统、Shell、网络请求等能力
workspace 混放敏感文件给每个 Agent 单独目录,避免把整个用户目录暴露给工具
openclaw.json 混有密钥密钥通过环境变量或注入机制管理,不要直接提交到 Git
多 Agent 互相调用失控明确哪些 Agent 可以互相通信,哪些只能被动执行子任务
IM 平台额度消耗多 Agent 会放大健康检查和消息调用次数,需要选额度足够的平台

OpenClaw 的配置应按“某些数据可能会被 IM、LLM、工具链同时接触”来设计。只要这个前提成立,很多权限决策就会变得更谨慎。

快速安装与初始化

安装前准备两类信息:

  1. IM 平台的 Bot API 配置;
  2. LLM 模型的 API Key、Base URL、模型名称等信息。

本机安装命令如下:

curl -fsSL https://openclaw.ai/install.sh | bash

安装完成后会进入 onboarding 流程,用来配置主 Agent、IM Bot、LLM 模型等基础信息。skills 配置可以先跳过,等主流程跑通后再做精细化管理。

不建议让代码助手在不了解 OpenClaw 项目结构的情况下直接改配置。更稳的方式是:

flowchart LR
    A[下载 OpenClaw 源码] --> B[让代码助手理解源码结构]
    B --> C[描述本地配置问题]
    C --> D[辅助定位和 Debug]
    D --> E[人工确认配置变更]

代码助手适合辅助排错,但 OpenClaw 的 Agent 配置、workspace、sessions、skills 之间有关联,盲改很容易出现“短期能跑,后续难维护”的状态。

Agent workspace 的核心文件

OpenClaw 的每个 Agent 都有自己的 workspace。Agent 的人格、权限、长期记忆、用户偏好和启动引导,主要由一组 Markdown 文件描述。

文件作用对 Agent 的影响
AGENTS.mdAgent 职责声明和工作规则决定 Agent 应该做什么、不应该做什么
SOUL.md个性化提示词注入 system prompt,影响表达风格和行为倾向
TOOLS.md工具白名单、黑名单和使用规则形成安全边界
IDENTITY.md名称、头像等身份信息影响 IM 通道展示
USER.md用户偏好和固定背景信息给 Agent 提供上下文先验
HEARTBEAT.md定时任务配置用于周期性任务
BOOTSTRAP.md首次 onboarding 引导初始化阶段消费
MEMORY.md精炼后的长期记忆作为 RAG 和长期上下文来源

这些文件会在 Agent 运行时被加载,并参与构造 system prompt。源码层面可以抽象成类似下面的逻辑:

export async function loadWorkspaceBootstrapFiles(dir: string) {
  const entries = [
    { name: "AGENTS.md", filePath: path.join(dir, "AGENTS.md") },
    { name: "SOUL.md", filePath: path.join(dir, "SOUL.md") },
    { name: "TOOLS.md", filePath: path.join(dir, "TOOLS.md") },
    { name: "IDENTITY.md", filePath: path.join(dir, "IDENTITY.md") },
    { name: "USER.md", filePath: path.join(dir, "USER.md") },
    { name: "HEARTBEAT.md", filePath: path.join(dir, "HEARTBEAT.md") },
    { name: "BOOTSTRAP.md", filePath: path.join(dir, "BOOTSTRAP.md") },
  ];

  // 还会动态检测 MEMORY.md / memory.md
  // 读取时需要做路径和文件边界校验,避免路径穿越

  for (const entry of entries) {
    await readWorkspaceFileWithGuards(entry);
  }
}

AGENTS.md 通常最重要,因为它定义了 Agent 的职责、工作边界、记忆管理方式、工具调用原则和与其他 Agent 的协作规则。想让 Agent 长期稳定执行某类任务,不要只在聊天窗口里口头提醒,而要把规则写进 AGENTS.md。

Agent 的启动流程

OpenClaw 的 Agent 不是一个永远不销毁的常驻大脑。更准确的理解是:每次会话触发运行时,OpenClaw 会加载 workspace、恢复 session、构造 system prompt、创建 Agent Session、执行任务,然后把结果和状态写回文件系统。

flowchart TD
    A[IM 消息到达 Gateway] --> B[解析 Agent 和 sessionKey]
    B --> C[读取 workspace bootstrap 文件]
    C --> D[准备 SessionManager]
    D --> E[构造 system prompt]
    E --> F[加载 Skills 列表]
    F --> G[创建 Agent Session]
    G --> H[调用 LLM 与工具]
    H --> I[写回 session / memory / 文件]
    I --> J[返回 IM 消息]

可以用一段伪代码表示这个过程:

import { createAgentSession } from "@mariozechner/pi-coding-agent";

// 1. 加载 workspace 上下文
const bootstrap = await resolveBootstrapContextForRun({
  workspaceDir,
  agentId,
});

// 2. 准备 session 管理器
const sessionManager = await prepareSessionManagerForRun({
  sessionKey,
  workspaceDir,
});

// 3. 构造 system prompt
const systemPrompt = buildEmbeddedSystemPrompt({
  bootstrapFiles: bootstrap.files,
  skills,
});

// 4. 创建 Agent Session
const agentSession = await createAgentSession({
  model,
  systemPrompt,
  sessionManager,
  tools: createOpenClawCodingTools({ workspaceDir }),
});

这里有一个很关键的点:system prompt 是动态构造的。也就是说,AGENTS.md、SOUL.md、TOOLS.md 等文件的修改,会在新的运行过程中被重新读取。某些 session 级快照除外,例如 skills 快照,后面会单独讲。

Session 与 Memory:OpenClaw 如何处理记忆

OpenClaw 的记忆不是单一文件,而是由会话历史、按天记录的 memory、精炼后的 MEMORY.md 一起组成。

典型路径如下:

# 会话历史,JSON Lines 格式
.openclaw/agents/ceo/sessions/xxxx.jsonl

# 按天记录的 memory
.openclaw/workspace-ceo/memory/YYYY-MM-DD.md

# 精炼后的长期记忆
.openclaw/workspace-ceo/MEMORY.md

三者的分工可以这样理解:

文件保存内容用途
sessions/xxxx.jsonl某个 session 的对话、工具调用、工具结果恢复上下文,继续对话
memory/YYYY-MM-DD.md某天沉淀下来的记忆材料作为中间记忆档案
MEMORY.mdLLM 精炼后的长期记忆注入或检索长期背景

Session Header

每个 JSONL 会话文件的第一行是 session 元数据,通常包含 sessionId、工作目录、时间戳等信息。

{
  "type": "session",
  "version": 3,
  "id": "fd292408-168e-4c7b-9f2a-ff7ec0a7c492",
  "timestamp": "2026-03-04T16:11:50.567Z",
  "cwd": "/Users/example/.openclaw/workspace-ceo"
}

消息到达后,OpenClaw 会根据 sessionKey 找到对应的 sessionId,再加载对应 JSONL 文件。这个过程是按需发生的,不是把所有历史都提前塞进模型。

sequenceDiagram
    participant IM as IM Bot
    participant G as Gateway
    participant SM as SessionManager
    participant F as JSONL 文件
    participant L as LLM

    IM->>G: 新消息
    G->>SM: 根据 sessionKey 找 sessionId
    SM->>F: 加载对应 session JSONL
    F-->>SM: 返回历史记录
    SM->>SM: 过滤 / 压缩 / 裁剪
    SM->>L: 发送可用上下文
    L-->>G: 返回回复或工具调用
    G-->>IM: 回复用户

长会话不会全部塞进 Context

Transformer 架构的 LLM 受到 context 窗口限制。会话越来越长时,如果把所有用户消息、助手回复、工具结果都塞进去,成本会升高,速度会变慢,还会挤掉真正重要的上下文。

OpenClaw 主要靠三类策略控制上下文长度。

策略是否持久化处理方式适合解决的问题
Compaction 压缩把旧消息总结成 summary,只保留较新的消息长对话占用过多 context
Session Pruning 修剪发送给 LLM 前临时替换旧 tool result工具结果过大,例如日志、网页、长 JSON
History Limit 历史限制可选限制发送给 LLM 的消息数量特定 session 只需要短上下文

Compaction 的效果大致如下:

压缩前:
[user1, assistant1, user2, assistant2, ..., user100, assistant100]

压缩后:
[compaction_summary, user80, assistant80, ..., user100, assistant100]

Session Pruning 更像临时清理:

JSONL 文件中仍然保存:
[user1, assistant1, toolResult1(10KB), user2, assistant2, toolResult2(5KB)]

实际发送给 LLM:
[user1, assistant1, "[Old tool result cleared]", user2, assistant2, toolResult2(5KB)]

压缩会改变后续会话看到的历史,修剪只影响本次送入模型的上下文。

Agent 如何写入 MEMORY.md

当 session 接近 context 上限时,OpenClaw 会提示 Agent 把重要信息写入 Memory,再进行 session 压缩。Agent 本质上是通过文件系统工具更新 MEMORY.md 或按天 memory 文件,例如 fsWrite、fsAppend。

一个合理的记忆流转可以画成这样:

flowchart TD
    A[用户对话和工具结果] --> B[Session JSONL]
    B --> C{上下文是否过长}
    C -- 否 --> D[继续使用近期 session]
    C -- 是 --> E[提炼关键信息]
    E --> F[memory/YYYY-MM-DD.md]
    F --> G[更新 MEMORY.md]
    E --> H[Compaction Summary]
    H --> B

    G --> I{后续任务是否需要长期背景}
    I -- 需要 --> J[检索 / 注入相关 Memory]
    I -- 不需要 --> K[只使用当前 Session]

长期记忆的质量很依赖 Agent 的规则设计。如果 AGENTS.md 没有明确“什么信息值得写入长期记忆、什么信息只是临时上下文”,Agent 就容易把无关内容写进去,后续检索时造成污染。

为什么需要多 Agent

单 Agent 最大的问题不是“不能做事”,而是容易把不同领域的上下文混在一起。

假设一个 Agent 原本负责 Flutter 学习辅导,中途又频繁讨论 C++、部署脚本、家庭事务、论文摘要。由于 session 和 memory 会保留这些内容,后续再让它生成 Flutter 示例时,它可能错误地联想到 C++ 示例。这不是模型完全不会 Flutter,而是上下文被污染了。

flowchart LR
    A[单 Agent] --> B[Flutter 学习]
    A --> C[C++ 讨论]
    A --> D[家庭提醒]
    A --> E[论文摘要]
    B --> F[Memory 混杂]
    C --> F
    D --> F
    E --> F
    F --> G[检索偏移 / 示例跑题 / Context 浪费]

更稳的方式是让 Agent 专事专做:

Agent适合职责不适合混入
ceo任务拆解、调度、总体规划具体领域细节长期堆积
iostutoriOS / Swift / Flutter 学习辅导家庭任务、论文订阅
paper每日论文抓取和摘要代码实现细节
family家庭提醒、天气、日程技术项目上下文
formatterMarkdown 排版、格式整理长期记忆和复杂决策

多 Agent 的核心不是“数量越多越好”,而是降低 context 污染,让每个 Agent 的 memory、skills、工具权限都围绕固定职责设计。

新增 Agent

新增 Agent 可以使用 OpenClaw CLI:

openclaw agents add iostutor

新增过程中会进入 onboarding,按提示填入 IM Bot API 和 LLM API 即可。完成后,通常会生成新的 agent 配置目录和 workspace,例如:

.openclaw/
  agents/
    ceo/
    iostutor/
  workspace-ceo/
  workspace-iostutor/

多 Agent 建好后,还需要配置它们之间的通信方式,否则它们只是多个互不认识的独立 Agent。

多 Agent 通信:sessions_send 与 sessions_spawn

OpenClaw 中 Agent 之间常见的协作方式有两种:sessions_sendsessions_spawn

方式含义是否使用已有 session适合场景
sessions_send向另一个 Agent 的既有 session 发消息需要延续上下文、让对方记住沟通过程
sessions_spawn在独立环境中派生一次任务否,偏临时任务让另一个 Agent 完成一次明确交付

可以用“同事沟通”和“临时外包任务”来理解:

flowchart TD
    A[ceo Agent] --> B{需要 iostutor 做什么}

    B -- 延续某个讨论<br/>需要写入对方 session --> C[sessions_send]
    C --> D[iostutor 既有 session]
    D --> E[双方后续可继续基于上下文沟通]

    B -- 一次性明确任务<br/>完成后返回结果 --> F[sessions_spawn]
    F --> G[iostutor 子任务环境]
    G --> H[返回交付物]

配置 sessions_send

sessions_send 依赖 agentToAgent 能力和 session 可见性配置。需要在 openclaw.json 中打开 Agent 间通信,并允许相关 Agent 互相可见。

{
  "tools": {
    "agentToAgent": {
      "enabled": true,
      "allow": ["ceo", "iostutor"]
    },
    "sessions": {
      "visibility": "all"
    }
  }
}

visibility: "all" 很容易漏掉。没有这个配置时,Agent 可能知道有通信工具,但找不到目标 session。

如果有多个核心 Agent,并且希望它们像一个扁平团队一样互相沟通,可以把核心 Agent 都加入 allow 列表:

{
  "tools": {
    "agentToAgent": {
      "enabled": true,
      "allow": ["ceo", "iostutor", "paper", "family"]
    },
    "sessions": {
      "visibility": "all"
    }
  }
}

配置 sessions_spawn

sessions_spawn 需要配置 subagents。比如希望 ceo 可以把任务派给 iostutor

{
  "id": "ceo",
  "name": "ceo",
  "workspace": "/Users/example/.openclaw/workspace-ceo",
  "agentDir": "/Users/example/.openclaw/agents/ceo/agent",
  "model": "openai-codex/gpt-5.3-codex",
  "subagents": {
    "allowAgents": ["iostutor"]
  }
}

如果两个 Agent 可以互相派任务,就需要在两个 Agent 的配置里分别加入对方:

[
  {
    "id": "iostutor",
    "name": "iOSTutor",
    "workspace": "/Users/example/.openclaw/workspace-iostutor",
    "agentDir": "/Users/example/.openclaw/agents/iostutor/agent",
    "model": "openai-codex/gpt-5.3-codex",
    "subagents": {
      "allowAgents": ["ceo"]
    }
  },
  {
    "id": "ceo",
    "name": "ceo",
    "workspace": "/Users/example/.openclaw/workspace-ceo",
    "agentDir": "/Users/example/.openclaw/agents/ceo/agent",
    "model": "openai-codex/gpt-5.3-codex",
    "subagents": {
      "allowAgents": ["iostutor"]
    }
  }
]

但不是所有 Agent 都应该互为 subagent。像 Markdown formatter、图片生成器、TTS 播报器这类工具型 Agent,通常只需要被上层 Agent 调用,不一定需要主动联系其他 Agent。

LLM 如何选择 send 还是 spawn

sessions_sendsessions_spawn 都可用时,具体调用哪个工具取决于 LLM 对任务的判断。

用户指令更可能的工具原因
“让 iostutor 写一个 Swift 网络请求封装类”sessions_spawn这是一次独立交付任务
“继续跟 iostutor 讨论刚才那篇文章”sessions_send明确要求延续既有上下文
“问问 paper Agent 今天有哪些 AI 论文值得看”sessions_send 或 spawn如果需要长期订阅上下文,用 send;如果只要一次结果,用 spawn
“让 formatter 把这段 Markdown 排好版”sessions_spawn工具型一次性任务,不需要长期记忆

为了让 Agent 稳定选择正确工具,不能只靠聊天窗口里的临时说明。应该把 Agent 路由规则写进 AGENTS.md。

例如在 workspace-ceo/AGENTS.md 中加入:

## AgentToAgent 通信规则

当任务需要其他角色参与时,按下面的规则选择:

- iOS、Swift、Flutter 学习和代码示例:联系 `iostutor`
- 每日论文、模型动态、技术趋势:联系 `paper`
- 家庭日程、天气、提醒:联系 `family`
- Markdown 排版和格式清理:调用 `formatter`

如果任务需要延续对方已有上下文,使用 sessions_send。
如果任务是一次性明确交付,使用 sessions_spawn。

AGENTS.md 会进入 system prompt,比在聊天窗口里说一次更可靠。否则几天后 session 被压缩,Agent 可能会忘记怎样联系其他 Agent。

sessions_send 会复用旧 session

sessions_send 不会因为时间间隔自动创建新 session。只要目标 session 还存在,它会继续向已有 session 发消息。

例如 6 小时前 ceoiostutor 已经通过内部 session 通信:

agent:ceo:internal:main
agent:iostutor:internal:main

6 小时后继续使用 sessions_send,仍然会复用这些 session。好处是上下文连续,代价是旧上下文可能污染后续讨论。对于完全无关的新任务,可以考虑用 sessions_spawn

IM 调用额度:多 Agent 容易踩的坑

多 Agent 部署后,IM 平台调用额度会明显增长。OpenClaw gateway 里存在定时健康快照逻辑,类似下面这样:

const healthInterval = setInterval(() => {
  void params.refreshGatewayHealthSanpshot({ probe: true });
}, 60_000);

如果每个 Agent 都需要定期 ping IM,Agent 数量一多,额度消耗会很快放大。

Agent 数量可能的问题处理建议
1 个通常不明显普通额度够用
5 个左右健康检查、消息路由调用增多观察 IM 平台用量
10 个以上额度可能快速耗尽选择额度更高或不限额的平台,减少无必要 Agent

多 Agent 不是越多越强。更推荐保留少量核心 Agent,再把格式化、TTS、文生图这类能力设计成工具型 subagent。

Skills 的加载机制

Skills 是 OpenClaw 扩展能力的重要方式,但它不是把所有 skill 文档完整塞进 system prompt。更合理的做法是:system prompt 只注入 skill 列表,Agent 判断需要时,再用 read 工具读取完整的 SKILL.md

flowchart TD
    A[扫描 Skills 目录] --> B[按优先级合并]
    B --> C[检查 requires 条件]
    C --> D[生成 available_skills 列表]
    D --> E[注入 system prompt]
    E --> F{Agent 是否需要某个 skill}
    F -- 需要 --> G[read SKILL.md]
    F -- 不需要 --> H[不加载完整内容]

Skills 来源有优先级:

优先级位置作用
最高workspace-xxx/skills/单个 Agent 专属 skills
中等~/.openclaw/skills/多 Agent 共享 skills
最低bundled skillsOpenClaw 内置 skills

每个 skill 还可以声明运行条件,例如依赖命令、环境变量、配置项。以 weather skill 为例:

name: weather
description: "Get current weather and forecasts via wttr.in or Open-Meteo. Use when: user asks about weather, temperature, or forecasts for any location. NOT for: historical weather data, severe weather alerts, or detailed meteorological analysis. No API key needed."
homepage: https://wttr.in/:help
metadata:
  openclaw:
    emoji: "🌤️"
    requires:
      bins:
        - curl

如果当前环境没有 curl,这个 skill 就应该被过滤掉,避免 Agent 看到一个无法执行的能力。

注入到 system prompt 的通常是类似这样的列表:

<available_skills>
  <skill>
    <name>healthcheck</name>
    <description>Check whether the configured gateway and services are healthy.</description>
    <location>~/.openclaw/skills/healthcheck/SKILL.md</location>
  </skill>
  <skill>
    <name>weather</name>
    <description>Get current weather and forecasts.</description>
    <location>~/.openclaw/skills/weather/SKILL.md</location>
  </skill>
</available_skills>

Skills 应该按 Agent 职责精细化配置

Skills 过多会带来两个问题:

  1. skill 列表本身占用 context;
  2. Agent 更容易错误调用不相关 skill。

更稳的设计是“通用基础 skills + Agent 专属 skills”。

类型示例放置位置
通用基础 skillhealthcheck、summarize、brave-search~/.openclaw/skills/
技术 Agent 专属 skilliOS 文档检索、Flutter 示例库、代码审查规范workspace-iostutor/skills/
家庭 Agent 专属 skillweather、calendar、药品提醒模板workspace-family/skills/
内容 Agent 专属 skillpaper crawler、RSS summary、deep researchworkspace-paper/skills/

例如 brave-search 属于通用联网检索能力,可以共享;weather 如果只服务家庭提醒,就不应该暴露给所有 Agent。

Skills 更新后为什么没有立刻生效

OpenClaw 在 session 启动时会创建 skills 快照,并在当前 session 生命周期内复用。修改 skills 目录后,旧 session 可能仍然看到旧列表。

处理方式通常是:

# 思路示例:找到对应 agent 的旧 session
ls ~/.openclaw/agents/ceo/sessions

# 删除不再需要的旧 session 文件,或新建 session
rm ~/.openclaw/agents/ceo/sessions/<old-session>.jsonl

# 重启 gateway
openclaw restart

实际操作前要确认 session 文件是否还有保留价值。删除 session 会丢失对应会话历史;如果里面有重要信息,先提炼到 MEMORY.md。

用 Clawhub 管理 Skills

Clawhub 可以理解为 OpenClaw 的 Skills Market,常用命令如下:

# 语义搜索 Skills
clawhub search "calendar management"

# 安装指定 Skill
clawhub install <skill-slug>

# 列出已安装的 Skills
clawhub list

# 更新所有已安装的 Skills
clawhub update --all

# 同步并备份本地 Skills
clawhub sync

可关注的 skill 类型包括:

Skill用途
find-skills帮助发现和选择合适 skills
summarize长内容摘要
self-improving-agentAgent 自我改进流程
brave-search联网搜索
frontend-design前端设计辅助

Skills 安装太容易,反而需要定期治理。可以周期性让高阶模型扫描本地 skills,清理低质量、重复、冲突或长期不用的 skill。

OpenClaw 配置的版本控制

OpenClaw 会沉淀大量本地数据:Agent 配置、workspace、skills、memory、session、密钥。直接把整个 .openclaw 目录提交到 Git 风险很高。

比较合理的策略是:版本化框架配置和可复用规则,不版本化敏感数据和私人会话。

.gitignore 可以按下面的方向设计:

# 会话历史,通常包含私人对话和工具结果
.openclaw/agents/*/sessions/

# 按天记忆,可能包含隐私
.openclaw/workspace-*/memory/

# 精炼长期记忆,也可能包含隐私
.openclaw/workspace-*/MEMORY.md

# 本地密钥和环境变量
.env
.env.local

# 临时缓存
.openclaw/**/cache/
.openclaw/**/tmp/

可以纳入版本管理的内容:

AGENTS.md
SOUL.md
TOOLS.md
IDENTITY.md
HEARTBEAT.md
BOOTSTRAP.md
skills 中自己编写且不含密钥的部分
openclaw.json 的脱敏模板

openclaw.json 如果同时包含核心配置和密钥,不要直接提交。可以拆成模板加环境变量注入:

{
  "model": "openai-codex/gpt-5.3-codex",
  "apiKeyEnv": "OPENAI_API_KEY",
  "baseUrlEnv": "OPENAI_BASE_URL"
}

然后在本机 .env.local 中保存真实密钥:

OPENAI_API_KEY=sk-xxx
OPENAI_BASE_URL=https://example.com/v1

可落地的 Agent 场景

OpenClaw 的玩法很多,关键是把任务拆成稳定输入、稳定工具、稳定输出。

场景Agent 设计关键能力
每日论文摘要paper Agent 定时抓取 Hugging Face Papers,再摘要和评分搜索、网页抓取、摘要
订阅内容总结summary Agent 定期分析订阅源RSS、网页读取、内容评分
Deep Researchresearch Agent 对某个问题做多轮检索和交叉验证搜索、资料整理、报告生成
RAG Tutortutor Agent 读取 workspace 中的学习资料RAG(检索增强生成)、长期记忆
本地文生图/视频image Agent 调用 ComfyUI 本地接口本地模型、API 调用
TTS 新闻播报voice Agent 调用本地 TTS 模型文本转语音、定时任务
家庭助理family Agent 管理提醒、天气、家庭任务IM 群聊、定时任务、Memory 隔离

例如 RAG Tutor 可以把资料放到专属 workspace 中:

.openclaw/workspace-iostutor/
  AGENTS.md
  MEMORY.md
  materials/
    swift-concurrency.md
    flutter-state-management.md
    ios-networking.md

AGENTS.md 中写清楚它的角色:

## 角色

你是 iOS / Swift / Flutter 学习辅导 Agent。

## 工作方式

- 回答技术问题时,优先检索 workspace 中的 materials 目录。
- 示例代码默认使用 Swift 或 Dart,除非用户明确要求其他语言。
- 如果问题超出 iOS / Swift / Flutter 范围,说明边界,并建议联系更合适的 Agent。
- 重要学习偏好可以写入 MEMORY.md,临时讨论不要写入长期记忆。

这样可以减少“明明是 Flutter Tutor,却突然输出 C++ 示例”的概率。

多 Agent 设计建议

多 Agent 架构不是组织层级越复杂越好。更推荐从少量清晰角色开始,等边界稳定后再拆分。

建议原因
核心 Agent 数量控制在少量Agent 越多,通信、记忆、权限和 IM 额度越难管理
核心 Agent 可以双向通信规划类、研究类、技术类 Agent 经常需要互相补充信息
工具型 Agent 只做 subagentformatter、TTS、image 这类任务不需要长期上下文
路由规则写进 AGENTS.md避免 session 压缩后忘记如何调用其他 Agent
Memory 按领域隔离降低检索污染和 context 浪费
定期清理 skills 和 session防止低质 skill、旧工具结果、无关记忆越积越多

一个相对稳的结构可以是:

flowchart TD
    CEO[ceo<br/>任务拆解与调度]

    CEO <--> IOS[iostutor<br/>iOS / Flutter 学习]
    CEO <--> PAPER[paper<br/>论文与技术动态]
    CEO <--> FAMILY[family<br/>家庭提醒与日程]

    CEO --> FORMAT[formatter<br/>Markdown 排版]
    CEO --> IMAGE[image<br/>ComfyUI 生成]
    CEO --> VOICE[voice<br/>TTS 播报]

    IOS --> FORMAT
    PAPER --> FORMAT
    FAMILY --> VOICE

双向箭头表示可以用 sessions_send 延续沟通;单向箭头表示更适合用 sessions_spawn 做一次性任务。

一份部署检查清单

OpenClaw 跑起来不难,长期稳定使用更依赖配置治理。可以按这份清单检查:

检查项目标
IM 平台Bot 权限清晰,额度足够,多 Agent 健康检查不会快速耗尽额度
LLM 模型优先使用能力足够强的模型,避免因模型太弱误判 Agent 框架
AGENTS.md每个 Agent 的职责、边界、通信规则明确
TOOLS.md文件系统、Shell、网络请求等高风险工具有边界
MEMORY.md只写长期有价值的信息,避免临时上下文污染
Skills通用和专属分层管理,定期清理冲突 skill
sessions重要内容提炼后再删除旧 session
openclaw.json密钥不入库,使用环境变量注入
多 Agent核心 Agent 少而清晰,工具型 Agent 不承担复杂记忆
本地模型ComfyUI、TTS 等能力单独隔离,避免和核心 workspace 混放

OpenClaw 的核心思路可以概括成一句话:用文件系统和配置约定,把 Agent 的身份、工具、记忆、技能和协作关系固定下来,再让 LLM 在这些边界内执行任务。真正把它用稳,不是多装几个 skill 或多建几个 Agent,而是持续维护好每个 Agent 的职责边界、上下文质量和安全权限。


评论