Messages and delivery
Сообщения
OpenClaw обрабатывает входящие сообщения через конвейер разрешения сеанса, постановки в очередь, потоковой передачи, выполнения инструментов и видимости рассуждений. Эта страница описывает путь от входящего сообщения до ответа.
Поток сообщений (общий уровень)
Inbound message -> routing/bindings -> session key -> queue (if a run is active) -> agent run (streaming + tools) -> outbound replies (channel limits + chunking)Ключевые параметры находятся в конфигурации:
messages.*для префиксов, постановки в очередь и поведения в группах.agents.defaults.*для стандартных настроек потоковой передачи блоков и разбиения на фрагменты.- Переопределения каналов (
channels.whatsapp.*,channels.telegram.*и т. д.) для ограничений и переключателей потоковой передачи.
Полную схему см. в разделе Конфигурация.
Дедупликация входящих сообщений
Каналы могут повторно доставлять одно и то же сообщение после переподключений. OpenClaw хранит краткоживущий кеш с ключом по каналу/аккаунту/собеседнику/сеансу/ID сообщения, чтобы повторные доставки не запускали еще один прогон агента.
Устранение дребезга входящих сообщений
Быстрые последовательные сообщения от одного и того же отправителя можно объединять в один
ход агента через messages.inbound. Устранение дребезга ограничено областью канал + беседа
и использует самое последнее сообщение для привязки ответов к ветке/ID.
Конфигурация (глобальное значение по умолчанию + переопределения для каналов):
{ messages: { inbound: { debounceMs: 2000, byChannel: { whatsapp: 5000, slack: 1500, discord: 1500, }, }, },}Примечания:
- Устранение дребезга применяется к сообщениям только с текстом; медиа/вложения отправляются немедленно.
- Управляющие команды обходят устранение дребезга, чтобы оставаться самостоятельными. Каналы, которые явно включают объединение DM от одного отправителя, могут сохранять DM-команды внутри окна устранения дребезга, чтобы полезная нагрузка, отправленная частями, могла попасть в тот же ход агента.
Сеансы и устройства
Сеансами владеет Gateway, а не клиенты.
- Прямые чаты сворачиваются в ключ основного сеанса агента.
- Группы/каналы получают собственные ключи сеансов.
- Хранилище сеансов и стенограммы находятся на хосте Gateway.
Несколько устройств/каналов могут сопоставляться с одним и тем же сеансом, но история не полностью синхронизируется обратно во все клиенты. Рекомендация: используйте одно основное устройство для длинных бесед, чтобы избежать расходящегося контекста. Control UI и TUI всегда показывают стенограмму сеанса, поддерживаемую Gateway, поэтому они являются источником истины.
Подробности: Управление сеансами.
Метаданные результата инструмента
content результата инструмента — это видимый модели результат. details результата инструмента — это
метаданные среды выполнения для отрисовки UI, диагностики, доставки медиа и Plugins.
OpenClaw сохраняет эту границу явной:
toolResult.detailsудаляется перед повторным воспроизведением у провайдера и входом Compaction.- Сохраненные стенограммы сеансов оставляют только ограниченные
details; слишком большие метаданные заменяются компактной сводкой с пометкойpersistedDetailsTruncated: true. - Plugins и инструменты должны помещать текст, который должна прочитать модель, в
content, а не только вdetails.
Тела входящих сообщений и контекст истории
OpenClaw отделяет тело промпта от тела команды:
BodyForAgent: основной текст для модели в текущем сообщении. Канальные Plugins должны удерживать его сфокусированным на текущем тексте отправителя, несущем промпт.Body: устаревший резервный вариант промпта. Он может включать оболочки канала и необязательные обертки истории, но текущие каналы не должны полагаться на него как на основной ввод модели, когда доступенBodyForAgent.CommandBody: исходный пользовательский текст для разбора директив/команд.RawBody: устаревший псевдоним дляCommandBody(сохранен для совместимости).
Когда канал передает историю, он использует общую обертку:
[Сообщения чата с момента вашего последнего ответа — для контекста][Текущее сообщение — ответьте на него]
Для непрямых чатов (групп/каналов/комнат) тело текущего сообщения получает префикс с меткой отправителя (в том же стиле, что и записи истории). Это сохраняет согласованность сообщений реального времени и сообщений из очереди/истории в промпте агента.
Буферы истории являются только ожидающими: они включают групповые сообщения, которые не запустили прогон (например, сообщения, пропущенные через фильтр упоминаний), и исключают сообщения, уже находящиеся в стенограмме сеанса.
Удаление директив применяется только к разделу текущего сообщения, чтобы история
оставалась нетронутой. Каналы, которые оборачивают историю, должны устанавливать CommandBody (или
RawBody) в исходный текст сообщения и оставлять Body объединенным промптом.
Структурированная история, ответы, пересланные сообщения и метаданные канала отрисовываются как
ненадежные контекстные блоки с ролью пользователя во время сборки промпта.
Буферы истории настраиваются через messages.groupChat.historyLimit (глобальное
значение по умолчанию) и переопределения для каналов, такие как channels.slack.historyLimit или
channels.telegram.accounts.<id>.historyLimit (установите 0, чтобы отключить).
Очередь и последующие сообщения
Если прогон уже активен, входящие сообщения по умолчанию направляются в текущий прогон.
messages.queue выбирает, будут ли сообщения при активном прогоне направляться, ставиться в очередь
на потом, собираться в один последующий ход или прерывать активный прогон.
- Настраивается через
messages.queue(иmessages.queue.byChannel). - Режим по умолчанию —
steer, с устранением дребезга 500 мс для пакетов управления Codex и очередей followup/collect. - Режимы:
steer,followup,collectиinterrupt.
Подробности: Очередь команд и Очередь управления.
Владение прогоном каналом
Канальные Plugins могут сохранять порядок, устранять дребезг ввода и применять транспортное обратное давление до того, как сообщение попадет в очередь сеанса. Они не должны накладывать отдельный тайм-аут вокруг самого хода агента. После маршрутизации сообщения в сеанс длительная работа регулируется жизненным циклом сеанса, инструмента и среды выполнения, чтобы все каналы единообразно сообщали о медленных ходах и восстанавливались после них.
Потоковая передача, разбиение на фрагменты и пакетная обработка
Потоковая передача блоков отправляет частичные ответы по мере того, как модель создает текстовые блоки. Разбиение на фрагменты учитывает текстовые ограничения канала и избегает разделения огражденного кода.
Ключевые настройки:
agents.defaults.blockStreamingDefault(on|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 поддерживает поток рассуждений во временный черновой пузырь, который удаляется после финальной доставки; используйте
/reasoning onдля постоянного вывода рассуждений.
Подробности: Директивы мышления + рассуждений и Использование токенов.
Префиксы, ветвление и ответы
Форматирование исходящих сообщений централизовано в messages:
messages.responsePrefix,channels.<channel>.responsePrefixиchannels.<channel>.accounts.<id>.responsePrefix(каскад исходящих префиксов), плюсchannels.whatsapp.messagePrefix(входящий префикс WhatsApp)- Ветвление ответов через
replyToModeи значения по умолчанию для каналов
Подробности: Конфигурация и документация каналов.
Тихие ответы
Точный тихий токен NO_REPLY / no_reply означает «не доставлять видимый пользователю ответ».
Когда в ходе также есть ожидающие медиа от инструмента, например сгенерированное TTS-аудио, OpenClaw
удаляет тихий текст, но все равно доставляет медиа-вложение.
OpenClaw разрешает это поведение по типу беседы:
- Прямые беседы никогда не получают инструкции промпта
NO_REPLY. Если прямой прогон случайно возвращает отдельный тихий токен, OpenClaw подавляет его вместо переписывания или доставки. - Группы/каналы по умолчанию допускают тишину только для автоматических групповых ответов.
В режиме видимого ответа
message_toolтишина означает, что модель не вызываетmessage(action=send). - Внутренняя оркестрация по умолчанию допускает тишину.
OpenClaw также использует тихие ответы для общих внутренних сбоев раннера в
непрямых чатах, поэтому группы/каналы не видят шаблонный текст ошибки Gateway.
Классифицированные сбои с пользовательским текстом восстановления, такие как отсутствие авторизации,
уведомления об ограничении частоты или перегрузке, все еще могут доставляться. Прямые чаты по
умолчанию показывают компактный текст сбоя; сырые детали раннера показываются только при включенном
/verbose full.
Значения по умолчанию находятся в agents.defaults.silentReply; surfaces.<id>.silentReply
может переопределять групповую/внутреннюю политику для каждой поверхности.
Отдельные тихие ответы отбрасываются на всех поверхностях, поэтому родительские сеансы остаются тихими вместо переписывания текста-сентинела в резервную болтовню.
Связанные разделы
- Рефакторинг жизненного цикла сообщений - целевой надежный дизайн отправки и получения
- Потоковая передача — доставка сообщений в реальном времени
- Повторная попытка — поведение повторной попытки доставки сообщений
- Очередь — очередь обработки сообщений
- Каналы — интеграции с платформами обмена сообщениями