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

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

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

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

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

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

Личные сообщения объединяются в основную сессию агента:

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

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

  • Группы: 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 основной сессии.

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

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

  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, после проверки упоминания/активации). Конфигурация:

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

Хранилище сессий

Хранилища сессий находятся в директории состояния (по умолчанию ~/.openclaw):

  • ~/.openclaw/agents/<agentId>/sessions/sessions.json
  • Транскрипты в формате JSONL находятся рядом с хранилищем

Вы можете переопределить путь к хранилищу через session.store и шаблонизацию {agentId}.

Поведение WebChat

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

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

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

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

Это согласовано для всех каналов.

Трансляционные группыПарсинг местоположения канала