> ## Documentation Index
> Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
> Use this file to discover all available pages before exploring further.

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

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

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 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  broadcast: {
    strategy: "parallel",
    "120363403215116621@g.us": ["alfred", "baerbel"],
    "+15555550123": ["support", "logger"],
  },
}
```

См.: [Группы рассылки](/ru/channels/broadcast-groups).

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

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

Пример:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  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 ...]`.

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

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

* [Группы](/ru/channels/groups)
* [Группы рассылки](/ru/channels/broadcast-groups)
* [Сопряжение](/ru/channels/pairing)
