---
read_when:
    - Изменение маршрутизации каналов или поведения входящих сообщений
summary: Правила маршрутизации для каждого канала (WhatsApp, Telegram, Discord, Slack) и общий контекст
title: Маршрутизация каналов
x-i18n:
    generated_at: "2026-07-13T19:30:03Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 24
    provider: openai
    source_hash: 4836671840e8c7919e7def8140d4a54fdeea17ddbe8c7a348ab5a23ff8b4213c
    source_path: channels/channel-routing.md
    workflow: 16
---

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

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:42`
- `agent:main:discord:channel:123456:thread:987654`

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

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

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

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

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

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

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

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

1. **Точное совпадение собеседника** (`bindings` с `peer.kind` + `peer.id`).
2. **Совпадение родительского собеседника** (наследование ветки).
3. **Совпадение собеседника по подстановочному знаку** (`peer.id: "*"` для типа собеседника).
4. **Совпадение сервера и ролей** (Discord) через `guildId` + `roles`.
5. **Совпадение сервера** (Discord) через `guildId`.
6. **Совпадение команды** (Slack) через `teamId`.
7. **Совпадение учётной записи** (`accountId` в канале).
8. **Совпадение канала** (любая учётная запись в этом канале, `accountId: "*"`).
9. **Агент по умолчанию** (`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" },
  ],
}
```

## Хранение сеансов

Строки сеансов среды выполнения хранятся в базе данных 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](/ru/cli/doctor#session-sqlite-migration), когда требуются
явные подтверждения миграции.
Для рабочих процессов миграции и автономного обслуживания по-прежнему можно выбрать путь к устаревшему хранилищу с помощью шаблонов `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)
