Configuration
Маршрутизация каналов
Каналы и маршрутизация
OpenClaw направляет ответы обратно в канал, из которого поступило сообщение. Модель не выбирает канал; маршрутизация детерминирована и управляется конфигурацией хоста.
Ключевые термины
- Канал: встроенный плагин канала, например
discord,googlechat,imessage,irc,line,signal,slack,telegramилиwhatsapp, а также установленные плагины каналов.webchat— внутренний канал интерфейса WebChat, который нельзя настроить как исходящий канал. - AccountId: экземпляр учётной записи для отдельного канала (если поддерживается).
- Необязательная учётная запись канала по умолчанию:
channels.<channel>.defaultAccountопределяет, какая учётная запись используется, если в исходящем пути не указанaccountId.- В конфигурациях с несколькими учётными записями явно задайте учётную запись по умолчанию (
defaultAccountили учётную запись с именемdefault), если настроены две или более учётные записи. В противном случае резервная маршрутизация может выбрать первый нормализованный идентификатор учётной записи.
- В конфигурациях с несколькими учётными записями явно задайте учётную запись по умолчанию (
- AgentId: изолированная рабочая область и хранилище сеансов («мозг»).
- SessionKey: ключ сегмента, используемый для хранения контекста и управления параллелизмом.
Префиксы исходящих целей
Явные исходящие цели могут содержать префикс провайдера, например telegram:123 или tg:123. Ядро рассматривает этот префикс как подсказку для выбора канала, только если выбран канал last или канал ещё не определён, и только если загруженный плагин объявляет поддержку этого префикса. Если вызывающая сторона уже явно выбрала канал, префикс провайдера должен соответствовать этому каналу; межканальные сочетания, например доставка через WhatsApp в telegram:123, завершаются ошибкой до нормализации цели конкретным плагином.
Префиксы типа цели и сервиса, например channel:<id>, user:<id>, room:<id>, thread:<id>, imessage:<handle> и sms:<number>, остаются частью грамматики выбранного канала. Сами по себе они не выбирают провайдера.
Форматы ключей сеансов (примеры)
По умолчанию личные сообщения объединяются в основном сеансе агента:
agent:<agentId>:<mainKey>(по умолчанию:agent:main:main)
session.dmScope управляет объединением личных сообщений: main (по умолчанию) использует один общий основной
сеанс, а per-peer, per-channel-peer и per-account-channel-peer
хранят личные сообщения в отдельных сеансах. Привязка маршрута может переопределить область действия для
соответствующих ей собеседников с помощью bindings[].session.dmScope.
Даже если история переписки в личных сообщениях используется совместно с основным сеансом, политики песочницы и инструментов используют производный ключ среды выполнения личного чата для каждой учётной записи при внешних личных сообщениях, чтобы сообщения, поступившие из каналов, не обрабатывались как локальные запуски основного сеанса.
Группы и каналы остаются изолированными для каждого канала:
- Группы:
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 основного сеанса.
Защищённая запись входящих сообщений
Плагины каналов могут пометить запись входящего сеанса как createIfMissing: false,
если защищённый путь не должен создавать новый сеанс OpenClaw. В этом режиме
OpenClaw может обновить метаданные и lastRoute существующего сеанса, но
не создаёт запись сеанса только для маршрута лишь потому, что было обнаружено сообщение.
Правила маршрутизации (как выбирается агент)
Маршрутизация выбирает одного агента для каждого входящего сообщения:
- Точное совпадение собеседника (
bindingsсpeer.kind+peer.id). - Совпадение родительского собеседника (наследование ветки).
- Совпадение собеседника по подстановочному знаку (
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" }, ],}Хранение сеансов
Строки сеансов среды выполнения хранятся в базе данных SQLite каждого агента в каталоге
состояния (по умолчанию ~/.openclaw):
~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite
В старых установках могут присутствовать устаревшие файлы расшифровок JSONL и хранилище строк sessions.json
в каталоге ~/.openclaw/agents/<agentId>/sessions/. При запуске Gateway и
openclaw doctor --fix автоматически импортируют активно используемые устаревшие строки и историю в SQLite.
Используйте openclaw doctor --session-sqlite inspect --session-sqlite-all-agents и последовательность проверки
Doctor, когда требуются
явные подтверждения миграции.
Для рабочих процессов миграции и автономного обслуживания по-прежнему можно выбрать путь к устаревшему хранилищу с помощью шаблонов session.store и {agentId}.
Механизм обнаружения сеансов Gateway и ACP также сканирует дисковые хранилища агентов в
корневом каталоге agents/ по умолчанию и в корневых каталогах, заданных шаблонами session.store. Обнаруженные
хранилища должны находиться внутри соответствующего корневого каталога агента и использовать обычный устаревший
файл sessions.json. Символические ссылки и пути за пределами корневого каталога игнорируются.
Поведение WebChat
WebChat подключается к выбранному агенту и по умолчанию использует основной сеанс агента. Благодаря этому WebChat позволяет просматривать межканальный контекст этого агента в одном месте.
Контекст ответа
Входящие ответы содержат:
ReplyToId,ReplyToBodyиReplyToSender, если они доступны.- Цитируемый контекст добавляется к
Bodyв виде блока[Replying to ...].
Это поведение одинаково для всех каналов.