Configuration

Маршрутизация каналов

Каналы и маршрутизация

OpenClaw маршрутизирует ответы обратно в канал, из которого пришло сообщение. Модель не выбирает канал; маршрутизация детерминирована и управляется конфигурацией хоста.

Ключевые термины

  • Канал: telegram, whatsapp, discord, irc, googlechat, slack, signal, imessage, line, а также каналы Plugin. webchat — это внутренний канал интерфейса WebChat, который не является настраиваемым исходящим каналом.
  • AccountId: экземпляр учетной записи для каждого канала (если поддерживается).
  • Необязательная учетная запись канала по умолчанию: channels.<channel>.defaultAccount выбирает, какая учетная запись используется, когда исходящий путь не указывает accountId.
    • В конфигурациях с несколькими учетными записями задайте явное значение по умолчанию (defaultAccount или accounts.default), когда настроены две или более учетные записи. Без него резервная маршрутизация может выбрать первый нормализованный идентификатор учетной записи.
  • AgentId: изолированное рабочее пространство + хранилище сессий («мозг»).
  • SessionKey: ключ корзины, используемый для хранения контекста и управления параллелизмом.

Префиксы исходящих целей

Явные исходящие цели могут включать префикс провайдера, например telegram:123 или tg:123. Ядро рассматривает этот префикс как подсказку для выбора канала только когда выбранный канал равен last или иначе не разрешен, и только когда загруженный Plugin объявляет этот префикс. Если вызывающая сторона уже выбрала явный канал, префикс провайдера должен соответствовать этому каналу; межканальные комбинации, такие как доставка WhatsApp в telegram:123, завершаются ошибкой до нормализации цели, специфичной для Plugin.

Префиксы типа цели и сервиса, такие как channel:<id>, user:<id>, room:<id>, thread:<id>, imessage:<handle> и sms:<number>, остаются внутри грамматики выбранного канала. Сами по себе они не выбирают провайдера.

Форматы ключей сессий (примеры)

Личные сообщения по умолчанию сворачиваются в основную сессию агента:

  • agent:<agentId>:<mainKey> (по умолчанию: agent:main:main)

Даже когда история переписки личных сообщений используется совместно с основной сессией, песочница и политика инструментов используют производный runtime-ключ личного чата для конкретной учетной записи внешних личных сообщений, чтобы сообщения, пришедшие из канала, не обрабатывались как локальные запуски основной сессии.

Группы и каналы остаются изолированными по каждому каналу:

  • Группы: agent:<agentId>:<channel>:group:<id>
  • Каналы/комнаты: agent:<agentId>:<channel>:channel:<id>

Треды:

  • Треды Slack/Discord добавляют :thread:<threadId> к базовому ключу.
  • Темы форумов Telegram встраивают :topic:<topicId> в ключ группы.

Примеры:

  • agent:main:telegram:group:-1001234567890:topic:42
  • agent:main:discord:channel:123456:thread:987654

Закрепление основного маршрута личных сообщений

Когда session.dmScope равно main, личные сообщения могут использовать одну основную сессию совместно. Чтобы предотвратить перезапись lastRoute сессии личными сообщениями не от владельца, OpenClaw выводит закрепленного владельца из allowFrom, когда выполняются все условия:

  • allowFrom содержит ровно одну запись без wildcard.
  • Запись можно нормализовать в конкретный идентификатор отправителя для этого канала.
  • Отправитель входящего личного сообщения не соответствует этому закрепленному владельцу.

В случае такого несовпадения OpenClaw все равно записывает метаданные входящей сессии, но пропускает обновление lastRoute основной сессии.

Защищенная запись входящих сообщений

Канальные Plugin могут пометить запись входящей сессии как createIfMissing: false, когда защищенный путь не должен создавать новую сессию OpenClaw. В этом режиме OpenClaw может обновлять метаданные и lastRoute для существующей сессии, но не создает запись сессии только для маршрута лишь потому, что было замечено сообщение.

Правила маршрутизации (как выбирается агент)

Маршрутизация выбирает одного агента для каждого входящего сообщения:

  1. Точное совпадение участника (bindings с peer.kind + peer.id).
  2. Совпадение родительского участника (наследование треда).
  3. Совпадение гильдии + ролей (Discord) через guildId + roles.
  4. Совпадение гильдии (Discord) через guildId.
  5. Совпадение команды (Slack) через teamId.
  6. Совпадение учетной записи (accountId в канале).
  7. Совпадение канала (любая учетная запись в этом канале, accountId: "*").
  8. Агент по умолчанию (agents.list[].default, иначе первая запись списка, резервно main).

Когда привязка включает несколько полей сопоставления (peer, guildId, teamId, roles), все предоставленные поля должны совпасть, чтобы эта привязка применилась.

Найденный агент определяет, какое рабочее пространство и хранилище сессий используются.

Группы рассылки (запуск нескольких агентов)

Группы рассылки позволяют запускать нескольких агентов для одного и того же участника когда OpenClaw обычно отправил бы ответ (например: в группах WhatsApp, после проверки упоминания/активации).

Конфигурация:

json5
{  broadcast: {    strategy: "parallel",    "120363403215116621@g.us": ["alfred", "baerbel"],    "+15555550123": ["support", "logger"],  },}

См.: Группы рассылки.

Обзор конфигурации

  • agents.list: именованные определения агентов (рабочее пространство, модель и т. д.).
  • bindings: сопоставляет входящие каналы/учетные записи/участников с агентами.

Пример:

json5
{  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}.

Обнаружение сессий Gateway и ACP также сканирует дисковые хранилища агентов в корне agents/ по умолчанию и в корнях шаблонных session.store. Обнаруженные хранилища должны оставаться внутри этого разрешенного корня агента и использовать обычный файл sessions.json. Символические ссылки и пути за пределами корня игнорируются.

Поведение WebChat

WebChat подключается к выбранному агенту и по умолчанию использует основную сессию агента. Благодаря этому WebChat позволяет видеть межканальный контекст этого агента в одном месте.

Контекст ответа

Входящие ответы включают:

  • ReplyToId, ReplyToBody и ReplyToSender, когда доступны.
  • Цитируемый контекст добавляется в Body как блок [Replying to ...].

Это единообразно для всех каналов.

Связанные разделы

Was this useful?
On this page

On this page