会话

会话管理

OpenClaw 将 每个 Agent 的一个直聊会话 视为主会话。直聊会折叠到 agent:<agentId>:<mainKey>(默认 main),而群/频道有自己的键。session.mainKey 会被尊重。

使用 session.dmScope 控制 直聊 如何分组:

Gateway 是真相来源

所有会话状态 由 Gateway 维护(“主” OpenClaw)。UI 客户端(macOS 应用、WebChat 等)必须向 Gateway 查询会话列表和 token 计数,而不是读取本地文件。

状态存储在哪里

会话修剪

OpenClaw 在 LLM 调用前默认会修剪旧工具结果,减少上下文。
不会 重写 JSONL 历史。参见 [/concepts/session-pruning(../concepts/session-pruning.html)。

预压缩内存刷新

当会话接近自动压缩时,OpenClaw 可运行一个 静默内存刷新 轮次,提醒模型将持久笔记写入磁盘。仅在工作区可写时运行。参见 [记忆(../concepts/memory.html) 和 [压缩(../concepts/compaction.html)。

传输 → 会话键映射

生命周期

发送策略(可选)

无需列出单个 id,就能阻止某些会话类型的发送。

{
  session: {
    sendPolicy: {
      rules: [
        { action: "deny", match: { channel: "discord", chatType: "group" } }, // 中文注释:禁用 Discord 群发送
        { action: "deny", match: { keyPrefix: "cron:" } } // 中文注释:禁用 cron 会话发送
      ],
      default: "allow"
    }
  }
}

运行时覆盖(仅所有者):

配置(可选重命名示例)

// ~/.openclaw/openclaw.json
{
  session: {
    scope: "per-sender",      // 中文注释:保持群键分离
    dmScope: "main",          // 中文注释:DM 连续性(共享收件箱建议 per-channel-peer/per-account-channel-peer)
    identityLinks: {
      alice: ["telegram:123456789", "discord:987654321012345678"] // 中文注释:同一人跨平台共享会话
    },
    reset: {
      // 中文注释:默认 mode=daily, atHour=4(Gateway 主机本地时间)
      // 如果也设置 idleMinutes,先过期者生效
      mode: "daily",
      atHour: 4,
      idleMinutes: 120
    },
    resetByType: {
      thread: { mode: "daily", atHour: 4 },
      dm: { mode: "idle", idleMinutes: 240 },
      group: { mode: "idle", idleMinutes: 120 }
    },
    resetByChannel: {
      discord: { mode: "idle", idleMinutes: 10080 }
    },
    resetTriggers: ["/new", "/reset"],
    store: "~/.openclaw/agents/{agentId}/sessions/sessions.json",
    mainKey: "main",
  }
}

查看/排查

小贴士

会话 origin 元数据

每个会话条目尽力记录来源(origin):

这些字段在直聊、频道和群聊中都会填充。如果某个连接器仅更新传递路由(例如保持 DM 主会话鲜活),它仍应提供入站上下文以便会话保留解释性元数据。扩展可以通过发送 ConversationLabelGroupSubjectGroupChannelGroupSpaceSenderName 并调用 recordSessionMetaFromInbound(或传递相同上下文给 updateLastRoute)来实现。