---
read_when:
    - Изменение маршрутизации каналов или поведения входящих сообщений
summary: Правила маршрутизации для каждого канала (WhatsApp, Telegram, Discord, Slack) и общий контекст
title: Маршрутизация каналов
x-i18n:
    generated_at: "2026-06-28T22:33:34Z"
    model: gpt-5.5
    postprocess_version: locale-links-v1
    provider: openai
    source_hash: 92b14cf02b00312121bec2f0f8ec784f36364babd6085d684e71f425dd82715e
    source_path: channels/channel-routing.md
    workflow: 16
---

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

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"],
  },
}
```

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

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

- `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 ...]`.

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

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

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