Сообщения и доставка

Сообщения

На этой странице собрана информация о том, как OpenClaw обрабатывает входящие сообщения, сессии, очереди, потоковую передачу и видимость рассуждений.

Поток сообщений (высокоуровнево)

Входящее сообщение
  -> маршрутизация/привязки -> ключ сессии
  -> очередь (если запущен процесс)
  -> процесс агента (потоковая передача + инструменты)
  -> исходящие ответы (ограничения канала + разбиение на части)

Основные настройки находятся в конфигурации:

  • messages.* для префиксов, очередей и группового поведения.
  • agents.defaults.* для потоковой передачи блоков и настроек разбиения по умолчанию.
  • Переопределения для каналов (channels.whatsapp.*, channels.telegram.* и т.д.) для ограничений и переключения потоковой передачи.

Полную схему смотрите в Конфигурации.

Дедупликация входящих сообщений

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

Дебаунсинг входящих сообщений

Быстрые последовательные сообщения от одного и того же отправителя могут быть объединены в один ход агента с помощью messages.inbound. Дебаунсинг применяется в рамках канала + беседы и использует самое последнее сообщение для формирования цепочки ответов/идентификаторов. Конфигурация (глобальная по умолчанию + переопределения для каждого канала):

{
  messages: {
    inbound: {
      debounceMs: 2000,
      byChannel: {
        whatsapp: 5000,
        slack: 1500,
        discord: 1500,
      },
    },
  },
}

Примечания:

  • Дебаунсинг применяется только к текстовым сообщениям; медиа/вложения отправляются немедленно.
  • Управляющие команды обходят дебаунсинг, чтобы оставаться самостоятельными.

Сессии и устройства

Сессиями владеет шлюз, а не клиенты.

  • Прямые чаты объединяются в основной ключ сессии агента.
  • Группы/каналы получают свои собственные ключи сессий.
  • Хранилище сессий и транскрипты находятся на хосте шлюза.

Несколько устройств/каналов могут быть привязаны к одной сессии, но история не синхронизируется полностью со всеми клиентами. Рекомендация: используйте одно основное устройство для длинных бесед, чтобы избежать расхождения контекста. Панель управления (Control UI) и TUI всегда показывают транскрипт сессии с шлюза, поэтому они являются источником истины. Подробнее: Управление сессиями.

Тела входящих сообщений и контекст истории

OpenClaw разделяет тело промпта и тело команды:

  • Body: текст промпта, отправляемый агенту. Он может включать оболочки канала и дополнительные обёртки истории.
  • CommandBody: исходный текст пользователя для разбора директив/команд.
  • RawBody: устаревший алиас для CommandBody (сохранён для совместимости).

Когда канал предоставляет историю, используется общая обёртка:

  • [Сообщения чата с момента вашего последнего ответа - для контекста]
  • [Текущее сообщение - ответьте на него]

Для непрямых чатов (группы/каналы/комнаты) тело текущего сообщения предваряется меткой отправителя (в том же стиле, что и для записей истории). Это обеспечивает согласованность сообщений в реальном времени и поставленных в очередь/истории в промпте агента. Буферы истории являются только ожидающими: они включают групповые сообщения, которые не запустили процесс (например, сообщения, требующие упоминания), и исключают сообщения, уже находящиеся в транскрипте сессии. Удаление директив применяется только к разделу текущего сообщения, чтобы история оставалась нетронутой. Каналы, которые оборачивают историю, должны установить CommandBody (или RawBody) в исходный текст сообщения, а Body оставить как объединённый промпт. Буферы истории настраиваются через messages.groupChat.historyLimit (глобальное значение по умолчанию) и переопределения для каждого канала, такие как channels.slack.historyLimit или channels.telegram.accounts.<id>.historyLimit (установите 0 для отключения).

Очередь и последующие действия

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

  • Настройка через messages.queuemessages.queue.byChannel).
  • Режимы: interrupt, steer, followup, collect, а также варианты с отложенными сообщениями.

Подробнее: Очередь.

Потоковая передача, разбиение на части и пакетирование

Потоковая передача блоков отправляет частичные ответы по мере генерации текстовых блоков моделью. Разбиение на части учитывает ограничения канала по длине текста и избегает разделения блоков кода. Ключевые настройки:

  • agents.defaults.blockStreamingDefault (on|off, по умолчанию off)
  • agents.defaults.blockStreamingBreak (text_end|message_end)
  • agents.defaults.blockStreamingChunk (minChars|maxChars|breakPreference)
  • agents.defaults.blockStreamingCoalesce (пакетирование на основе простоя)
  • agents.defaults.humanDelay (человеческая пауза между ответами-блоками)
  • Переопределения для каналов: *.blockStreaming и *.blockStreamingCoalesce (не-Telegram каналы требуют явного *.blockStreaming: true)

Подробнее: Потоковая передача + разбиение на части.

Видимость рассуждений и токены

OpenClaw может показывать или скрывать рассуждения модели:

  • /reasoning on|off|stream управляет видимостью.
  • Контент рассуждений всё равно учитывается в использовании токенов, когда генерируется моделью.
  • Telegram поддерживает поток рассуждений в пузырёк черновика.

Подробнее: Директивы мышления + рассуждений и Использование токенов.

Префиксы, цепочки ответов и ответы

Форматирование исходящих сообщений централизовано в messages:

  • messages.responsePrefix, channels.<channel>.responsePrefix и channels.<channel>.accounts.<id>.responsePrefix (каскад префиксов для исходящих), а также channels.whatsapp.messagePrefix (префикс для входящих WhatsApp)
  • Цепочки ответов через replyToMode и значения по умолчанию для каждого канала

Подробнее: Конфигурация и документация по каналам.

ПрисутствиеПотоковая передача и разбиение на части