首页 教程 分类 Skills下载 关于
ZH EN JA KO
基础配置

OpenClaw多Agent路由与会话隔离机制详解

· 12 分钟

前言

当你在 OpenClaw 中配置了多个聊天平台后,一个关键问题随之而来:不同平台、不同用户、不同对话之间的消息应该如何路由和隔离?如果所有消息混在一起,AI 的回复必然会混乱不堪。

OpenClaw 通过多 Agent 路由与会话隔离机制,优雅地解决了这一问题。每个 Agent 拥有独立的会话空间,会话以 JSONL 格式持久化存储,并支持树形结构的分支与压缩。本文将深入解析这套机制的工作原理和配置方法。

多 Agent 路由架构

OpenClaw 的核心设计理念是"按对话路由"。当你配置了多个平台(Telegram、Discord、Slack 等)后,系统不是简单地把所有消息扔进同一个处理管道,而是为每个独立的对话维护一个隔离的会话上下文。

用户A (Telegram DM)  ──→  Agent-1  ──→  Session A-001
用户A (Discord #general) ──→  Agent-2  ──→  Session A-002
用户B (Telegram DM)  ──→  Agent-1  ──→  Session B-001
用户B (Slack 群组)   ──→  Agent-3  ──→  Session B-002

可以看到,即使是同一个用户,在不同平台上的对话也会被路由到不同的 Agent,拥有完全隔离的会话。这种设计确保了上下文不会互相污染。

会话存储:JSONL 与树形结构

OpenClaw 的会话数据以 JSONL(JSON Lines)格式存储,每个会话文件包含一系列消息记录。存储路径遵循统一的目录结构:

~/.openclaw/agents/<agentId>/sessions/
├── session-a001.jsonl
├── session-a002.jsonl
├── session-b001.jsonl
└── session-b002.jsonl

每条消息记录都包含 idparentId 字段,形成树形结构:

{"id":"msg_001","parentId":null,"role":"user","content":"你好","timestamp":1710000000}
{"id":"msg_002","parentId":"msg_001","role":"assistant","content":"你好!有什么可以帮你的?","timestamp":1710000001}
{"id":"msg_003","parentId":"msg_002","role":"user","content":"帮我写一段Python代码","timestamp":1710000010}
{"id":"msg_004","parentId":"msg_002","role":"user","content":"今天天气怎么样","timestamp":1710000015}

注意上面的 msg_003msg_004 拥有相同的 parentId,这意味着对话在 msg_002 之后产生了分支。树形结构让 OpenClaw 能够完整记录对话的所有分支路径,而不仅仅是线性的聊天记录。这在用户重新编辑之前的消息或者系统进行自动压缩时尤为重要。

按频道类型限制历史记录

不同类型的聊天频道有着不同的使用场景,OpenClaw 据此对历史记录长度做出差异化处理。

私聊(DM)频道

私聊场景通常是一对一的深度对话,用户期望 AI 能够记住更长的上下文。因此 DM 频道默认保留更多的历史消息:

{
  agents: {
    "personal-assistant": {
      history: {
        dm: {
          maxMessages: 100,      // 保留最近100条消息
          maxTokens: 32000,      // 最大Token数
        },
      },
    },
  },
}

群组(Group)频道

群组场景中消息量大、话题切换频繁,保留过多历史反而会引入噪声。OpenClaw 对群组频道默认采用更严格的限制:

{
  agents: {
    "group-bot": {
      history: {
        group: {
          maxMessages: 30,       // 仅保留最近30条消息
          maxTokens: 8000,       // 更小的Token窗口
        },
      },
    },
  },
}

这种按频道类型区分的设计既节省了 Token 成本,又保证了不同场景下的最佳体验。

上下文溢出时的自动压缩

当对话历史超过模型的上下文窗口限制时,OpenClaw 不会简单地截断旧消息,而是触发自动压缩(Auto-compaction)机制。

自动压缩的工作流程如下:

  1. 检测到当前会话的 Token 数即将超过模型的上下文限制
  2. 将较早的对话内容发送给模型,生成一段压缩摘要
  3. 用摘要替换原始的历史消息,大幅减少 Token 占用
  4. 在 JSONL 文件中创建一个新的压缩节点,原始消息保留在树的旧分支中
{"id":"compact_001","parentId":null,"role":"system","type":"compaction","content":"[会话摘要] 用户讨论了Python爬虫开发,包括requests库的使用、反爬策略、数据解析方法...","timestamp":1710001000}
{"id":"msg_050","parentId":"compact_001","role":"user","content":"继续讲讲Scrapy框架","timestamp":1710001001}

压缩操作发生时,用户完全无感。AI 依然能够基于摘要理解此前的对话背景,同时大幅降低了每次请求的 Token 消耗。

你可以通过配置来调整压缩行为:

{
  agents: {
    "my-agent": {
      compaction: {
        enabled: true,
        // 当Token使用率达到多少时触发压缩(0-1)
        threshold: 0.85,
        // 压缩摘要的最大Token数
        summaryMaxTokens: 1024,
        // 保留最近多少条消息不被压缩
        preserveRecent: 10,
      },
    },
  },
}

会话持久化与分支管理

JSONL 格式配合树形结构,让 OpenClaw 具备了强大的会话持久化能力。即使服务重启,所有会话状态都能完整恢复。

分支场景

树形结构在以下场景中发挥作用:

  • 用户编辑消息:用户修改了之前的一条消息并重新发送,OpenClaw 不会覆盖原有的对话路径,而是从被编辑的节点创建新分支
  • 自动压缩分支:压缩操作创建新的摘要节点,原始对话保留为旧分支,确保不丢失任何数据
  • 对话回溯:管理员可以通过 Dashboard 查看任意分支的完整对话历史

查看会话数据

你可以直接查看原始的会话文件:

# 列出某个Agent的所有会话
ls ~/.openclaw/agents/my-agent/sessions/

# 查看某个会话的内容
cat ~/.openclaw/agents/my-agent/sessions/session-xxx.jsonl | jq .

Provider 无关的模型切换

OpenClaw 的多 Agent 架构还带来了一个重要优势:每个 Agent 可以独立指定模型提供商和模型名称,互不影响。

{
  agents: {
    // Agent 1:使用 Claude,处理 Telegram 私聊
    "telegram-dm": {
      model: {
        provider: "claude",
        name: "claude-sonnet-4-20250514",
      },
      channels: ["telegram"],
      scope: "dm",
    },

    // Agent 2:使用 Ollama 本地模型,处理 Discord 群聊
    "discord-group": {
      model: {
        provider: "ollama",
        name: "llama3.1:70b",
      },
      channels: ["discord"],
      scope: "group",
    },

    // Agent 3:使用 GPT-4o,处理 Slack 工作频道
    "slack-work": {
      model: {
        provider: "openai",
        name: "gpt-4o",
      },
      channels: ["slack"],
      scope: "all",
    },
  },
}

这种 Provider 无关的设计意味着你可以随时为某个 Agent 切换模型,而不影响其他 Agent 的运行。例如,你可以把成本敏感的群聊 Agent 从 Claude 切换到 Ollama 本地模型,同时保持私聊 Agent 继续使用高质量的商业模型。

路由规则总结

OpenClaw 的多 Agent 路由遵循以下优先级链:

  1. 平台匹配:消息来自哪个聊天平台(Telegram / Discord / Slack 等)
  2. 频道类型匹配:消息来自私聊还是群组
  3. Agent 分配:根据匹配结果将消息路由到对应的 Agent
  4. 会话查找或创建:在 Agent 的会话目录中查找现有会话,或创建新会话
  5. 历史加载:根据频道类型的历史限制,加载适当长度的上下文
  6. 模型调用:使用该 Agent 配置的模型处理消息

整个流程全自动完成,无需用户干预。

小结

OpenClaw 的多 Agent 路由与会话隔离机制是其架构中最核心的设计之一。通过按对话路由实现完全的上下文隔离,通过 JSONL 树形结构实现持久化和分支管理,通过按频道类型差异化的历史限制平衡成本与体验,再加上自动压缩应对上下文溢出——这套机制让你可以放心地在多个平台上部署多个 Agent,每个 Agent 都能稳定、高效地运行在自己的会话空间中。

OpenClaw 是开源免费的个人AI助手,支持 WhatsApp、Telegram、Discord 等多平台接入