Маршрутизация каналов
OpenClaw направляет ответы обратно в канал, откуда пришло сообщение. Модель не выбирает канал; маршрутизация детерминирована и управляется конфигурацией хоста.
Ключевые термины
- Канал:
whatsapp,telegram,discord,slack,signal,imessage,webchat. - AccountId: экземпляр аккаунта для конкретного канала (если поддерживается).
- Необязательный аккаунт по умолчанию для канала:
channels.<channel>.defaultAccountвыбирает, какой аккаунт используется, когда исходящий путь не указываетaccountId.- В настройках с несколькими аккаунтами задайте явный аккаунт по умолчанию (
defaultAccountилиaccounts.default), когда сконфигурировано два или более аккаунта. Без этого резервная маршрутизация может выбрать первый нормализованный идентификатор аккаунта.
- В настройках с несколькими аккаунтами задайте явный аккаунт по умолчанию (
- AgentId: изолированное рабочее пространство + хранилище сессий («мозг»).
- SessionKey: ключ сегмента, используемый для хранения контекста и управления параллелизмом.
Форматы ключей сессии (примеры)
Личные сообщения объединяются в основную сессию агента:
agent:<agentId>:<mainKey>(по умолчанию:agent:main:main)
Группы и каналы остаются изолированными для каждого канала:
- Группы:
agent:<agentId>:<channel>:group:<id> - Каналы/комнаты:
agent:<agentId>:<channel>:channel:<id>
Треды:
- Треды Slack/Discord добавляют
:thread:<threadId>к базовому ключу. - Темы форума Telegram включают
:topic:<topicId>в ключ группы.
Примеры:
agent:main:telegram:group:-1001234567890:topic:42agent:main:discord:channel:123456:thread:987654
Фиксация основного маршрута для личных сообщений
Когда session.dmScope имеет значение main, личные сообщения могут использовать одну основную сессию. Чтобы предотвратить перезапись lastRoute сессии личными сообщениями от не-владельца, OpenClaw определяет закрепленного владельца из allowFrom, когда выполняются все следующие условия:
allowFromсодержит ровно одну запись, не являющуюся подстановочным знаком.- Эту запись можно нормализовать до конкретного идентификатора отправителя для данного канала.
- Отправитель входящего личного сообщения не совпадает с этим закрепленным владельцем.
В случае такого несовпадения OpenClaw все равно записывает метаданные входящей сессии, но пропускает обновление lastRoute основной сессии.
Правила маршрутизации (как выбирается агент)
Маршрутизация выбирает одного агента для каждого входящего сообщения:
- Точное совпадение пира (
bindingsсpeer.kind+peer.id). - Совпадение родительского пира (наследование из треда).
- Совпадение гильдии + ролей (Discord) через
guildId+roles. - Совпадение гильдии (Discord) через
guildId. - Совпадение команды (Slack) через
teamId. - Совпадение аккаунта (
accountIdна канале). - Совпадение канала (любой аккаунт на этом канале,
accountId: "*"). - Агент по умолчанию (
agents.list[].default, иначе первая запись в списке, резервный вариантmain).
Когда привязка включает несколько полей для совпадения (peer, guildId, teamId, roles), все предоставленные поля должны совпадать, чтобы эта привязка применилась. Совпавший агент определяет, какое рабочее пространство и хранилище сессий будут использоваться.
Трансляционные группы (запуск нескольких агентов)
Трансляционные группы позволяют запускать несколько агентов для одного и того же пира в ситуациях, когда OpenClaw обычно отвечает (например: в группах WhatsApp, после проверки упоминания/активации). Конфигурация:
{
broadcast: {
strategy: "parallel",
"120363403215116621@g.us": ["alfred", "baerbel"],
"+15555550123": ["support", "logger"],
},
}
См.: Трансляционные группы.
Обзор конфигурации
agents.list: именованные определения агентов (рабочее пространство, модель и т.д.).bindings: сопоставление входящих каналов/аккаунтов/пиров с агентами.
Пример:
{
agents: {
list: [{ id: "support", name: "Support", workspace: "~/.openclaw/workspace-support" }],
},
bindings: [
{ match: { channel: "slack", teamId: "T123" }, agentId: "support" },
{ match: { channel: "telegram", peer: { kind: "group", id: "-100123" } }, agentId: "support" },
],
}
Хранилище сессий
Хранилища сессий находятся в директории состояния (по умолчанию ~/.openclaw):
~/.openclaw/agents/<agentId>/sessions/sessions.json- Транскрипты в формате JSONL находятся рядом с хранилищем
Вы можете переопределить путь к хранилищу через session.store и шаблонизацию {agentId}.
Поведение WebChat
WebChat прикрепляется к выбранному агенту и по умолчанию использует основную сессию этого агента. Благодаря этому WebChat позволяет видеть межканальный контекст для этого агента в одном месте.
Контекст ответа
Входящие ответы включают:
ReplyToId,ReplyToBodyиReplyToSender, когда они доступны.- Цитируемый контекст добавляется к
Bodyв виде блока[Replying to ...].
Это согласовано для всех каналов.
Трансляционные группыПарсинг местоположения канала