Skip to content

OpenClaw 的 Ambient Room Events 让智能体在群组或频道中安静监听未提及的消息:它能更新记忆和会话状态,但不会自动在房间内发言,仅当智能体显式调用 message 工具时才输出可见消息。配置分两步:全局设置 messages.groupChat.unmentionedInbound: "room_event"visibleReplies: "message_tool",再为对应群组关闭 requireMention。目前支持 Discord 公频、Slack 频道和多人群聊、Telegram 群组。如果智能体显示打字或消耗 token 但没有消息发出,先检查 allowlist 和 requireMention,再从日志中查看 didSendViaMessagingTool: false 或 suppressed final payload 标识。

OpenClaw 群组安静上下文(Ambient Room Events)配置与问题排查

适用场景

当你的智能体需要在群组或频道中持续监听所有对话(包括未被 @提及的消息),但只在必要时回复(通过 message 工具),而非自动输出最终文本时,使用 Ambient Room Events。这是推荐的全天候群聊模式:智能体可以更新记忆和会话状态,但房间保持静默,直到它调用 message 工具主动发言。

支持当前版本:Discord 公会频道、Slack 频道和私密频道、Slack 多人私聊、Telegram 群组或超级群组。其他群组渠道保持原有行为,除非其渠道页面明确支持 Ambient Room Events。

全局设置步骤

首先在配置中设定全局群聊行为:

json5
{
  messages: {
    groupChat: {
      unmentionedInbound: "room_event",
      visibleReplies: "message_tool",
      historyLimit: 50,
    },
  },
}

然后将群组本身设为“始终开启”,即对该群组关闭 requireMention。该群组仍需满足其 groupPolicy、房间允许列表和发送者允许列表。

配置保存后,Gateway 会热加载 messages 设置。只有在关闭文件监控或配置重载时才需要重启。

开启后的变化

messages.groupChat.unmentionedInbound: "room_event" 生效后:

  • 未提及的允许群组/频道消息 → 变为安静的房间事件
  • 提及了智能体的消息 → 保持为 user request(正常对话)
  • 文本指令和原生指令 → 保持为 user request
  • 中止/停止请求 → 保持为 user request
  • 私聊消息 → 保持为 user request

房间事件使用严格可见传递机制:智能体的最终文本是私密的,不会被自动发到房间。智能体必须调用 message(action=send) 才能在房间中发布可见消息。

Discord 配置示例

json5
{
  messages: {
    groupChat: {
      unmentionedInbound: "room_event",
      visibleReplies: "message_tool",
      historyLimit: 50,
    },
  },
  channels: {
    discord: {
      groupPolicy: "allowlist",
      guilds: {
        "<DISCORD_SERVER_ID>": {
          requireMention: false,
          users: ["<YOUR_DISCORD_USER_ID>"],
        },
      },
    },
  },
}

如果只想让特定频道静默监听,使用 per-channel 方式:

json5
{
  channels: {
    discord: {
      guilds: {
        "<DISCORD_SERVER_ID>": {
          channels: {
            "<DISCORD_CHANNEL_ID_OR_NAME>": {
              allow: true,
              requireMention: false,
            },
          },
        },
      },
    },
  },
}

Slack 配置示例(使用 Channel ID)

Slack 频道允许列表必须使用 Channel ID(如 C12345678),而不是频道名称。

json5
{
  messages: {
    groupChat: {
      unmentionedInbound: "room_event",
      visibleReplies: "message_tool",
      historyLimit: 50,
    },
  },
  channels: {
    slack: {
      groupPolicy: "allowlist",
      channels: {
        "<SLACK_CHANNEL_ID>": {
          allow: true,
          requireMention: false,
        },
      },
    },
  },
}

Telegram 群组配置示例(需关闭 BotFather 隐私模式)

Telegram 群组中,机器人必须能看见普通群消息。如果设置 requireMention: false,需要在 BotFather 中关闭隐私模式(Privacy Mode),或者使用其他能向机器人传递所有群消息的 Telegram 设置。

json5
{
  messages: {
    groupChat: {
      unmentionedInbound: "room_event",
      visibleReplies: "message_tool",
      historyLimit: 50,
    },
  },
  channels: {
    telegram: {
      groups: {
        "<TELEGRAM_GROUP_CHAT_ID>": {
          groupPolicy: "open",
          requireMention: false,
        },
      },
    },
  },
}

Telegram 群组 ID 通常是负数,如 -1001234567890。你可以通过以下方式获取:执行 openclaw logs --follow 查看 chat.id、将群消息转发给 ID 查询机器人、或检查 Bot API 的 getUpdates 响应。

为特定智能体单独开启安静监听

当多个智能体共享同一个群组,但只有其中一个需要监听未提及消息时,使用智能体级别的覆盖:

json5
{
  messages: {
    groupChat: {
      visibleReplies: "message_tool",
    },
  },
  agents: {
    list: [
      {
        id: "main",
        groupChat: {
          unmentionedInbound: "room_event",
          mentionPatterns: ["@openclaw", "openclaw"],
        },
      },
    ],
  },
}

智能体级的 agents.list[].groupChat.unmentionedInbound 会覆盖全局 messages.groupChat.unmentionedInbound

可见回复模式说明

messages.groupChat.visibleReplies 的默认值是 "automatic"(适用于普通群组/频道 user request)。保留该默认值时,智能体的最终文本会自动发送到房间。

对于 Ambient Room Events 始终开启的群组,强烈推荐使用 messages.groupChat.visibleReplies: "message_tool",尤其是搭配最新一代、工具稳定性高的模型(如 GPT 5.5)。这样智能体通过调用 message 工具来决定何时发言。如果模型返回了最终文本但未调用工具,OpenClaw 会将其视为私密内容,并记录 suppressed delivery 元数据。

注意:即使其他群组请求使用自动回复,未提及的房间事件仍保持严格模式:必须通过 message(action=send) 才能输出可见消息。

历史消息数量控制

messages.groupChat.historyLimit 控制全局群聊历史上下文的默认值。渠道可以通过 channels.&lt;channel&gt;.historyLimit 覆盖,部分渠道还支持按账号设置历史限制。

设置 historyLimit: 0 可以完全禁用群组历史上下文。

对于支持 Ambient Room Events 的渠道,最近的安静房间事件消息也会作为上下文保留。Discord 中,房间事件的历史会保留到首次可见的 Discord 发送成功为止,因此未使用 message 工具之前不会丢失安静上下文。

故障排查:智能体有动作但无消息输出

如果群组中显示智能体正在打字或消耗了 token,但没有可见消息:

  1. 确认该房间已通过渠道允许列表和发送者允许列表。
  2. 确认 requireMention: false 设置在你期望的层级(群组/频道)上。
  3. 检查 messages.groupChat.unmentionedInbound 或智能体覆盖是否确实是 "room_event"
  4. 查看日志,搜索 suppressed final payload 元数据或 didSendViaMessagingTool: false
  5. 对于普通群组请求,如果希望自动回复,请恢复 messages.groupChat.visibleReplies: "automatic"。对于安静房间使用 message_tool 时,请确保使用能可靠调用工具的模型/运行时。

如果 Telegram 安静房间完全不触发,检查 BotFather 隐私模式,确认 Gateway 能收到普通群组消息。

如果 Slack 安静房间不触发,确认频道键是 Slack Channel ID,且应用拥有该房间类型所需的 channels:historygroups:history 范围。

常见问题

为什么智能体在群组中不回复任何消息?

最常见的原因是配置了 unmentionedInbound: "room_event"visibleReplies: "message_tool",但智能体没有调用 message 工具,或者模型无法可靠地调用工具。检查日志中是否出现 didSendViaMessagingTool: false,并确认模型/运行时支持工具调用。

为什么智能体显示打字或消耗 token,但消息没有发出来?

可能是因为开启了 Ambient Room Events 且 visibleReplies 设置为 "message_tool",但智能体的回复输出没有通过 message 工具。OpenClaw 会将此类最终文本私有化。请检查日志中的 suppressed delivery 信息,并确保模型在输出前调用 message(action=send)

Telegram 群组的 Ambient Room Events 不生效怎么办?

首先确认 BotFather 中已关闭隐私模式,否则机器人无法看到未提及的群消息。然后检查 Telegram 群组 ID 是否正确(通常是负数),并确认 Gateway 能正常接收群组消息。可以在 /openclaw/guide/channels/telegram 查看更详细的 Telegram 配置说明。

如何让智能体在群组中自动回复(恢复普通模式)?

messages.groupChat.visibleReplies 设为 "automatic",同时移除 unmentionedInbound: "room_event" 设置(或设为默认值 "request")。这样所有群组消息都会作为普通 user request 处理,智能体自动回复。