OpenClaw handles inbound messages through a pipeline of session resolution, queueing, streaming, tool execution, and reasoning visibility. This page maps the path from inbound message to reply.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Message flow (high level)
messages.*for prefixes, queueing, and group behavior.agents.defaults.*for block streaming and chunking defaults.- Channel overrides (
channels.whatsapp.*,channels.telegram.*, etc.) for caps and streaming toggles.
Inbound dedupe
Channels can redeliver the same message after reconnects. OpenClaw keeps a short-lived cache keyed by channel/account/peer/session/message id so duplicate deliveries do not trigger another agent run.Inbound debouncing
Rapid consecutive messages from the same sender can be batched into a single agent turn viamessages.inbound. Debouncing is scoped per channel + conversation
and uses the most recent message for reply threading/IDs.
Config (global default + per-channel overrides):
- Debounce applies to text-only messages; media/attachments flush immediately.
- Control commands bypass debouncing so they remain standalone — except when a channel explicitly opts in to same-sender DM coalescing (e.g. BlueBubbles
coalesceSameSenderDms), where DM commands wait inside the debounce window so a split-send payload can join the same agent turn.
Sessions and devices
Sessions are owned by the gateway, not by clients.- Direct chats collapse into the agent main session key.
- Groups/channels get their own session keys.
- The session store and transcripts live on the gateway host.
Tool result metadata
Tool resultcontent is the model-visible result. Tool result details is
runtime metadata for UI rendering, diagnostics, media delivery, and plugins.
OpenClaw keeps that boundary explicit:
toolResult.detailsis stripped before provider replay and compaction input.- Persisted session transcripts keep only bounded
details; oversized metadata is replaced with a compact summary markedpersistedDetailsTruncated: true. - Plugins and tools should put text the model must read in
content, not only indetails.
Inbound bodies and history context
OpenClaw separates the prompt body from the command body:Body: prompt text sent to the agent. This may include channel envelopes and optional history wrappers.CommandBody: raw user text for directive/command parsing.RawBody: legacy alias forCommandBody(kept for compatibility).
[Chat messages since your last reply - for context][Current message - respond to this]
CommandBody (or
RawBody) to the original message text and keep Body as the combined prompt.
History buffers are configurable via messages.groupChat.historyLimit (global
default) and per-channel overrides like channels.slack.historyLimit or
channels.telegram.accounts.<id>.historyLimit (set 0 to disable).
Queueing and followups
If a run is already active, inbound messages can be queued, steered into the current run, or collected for a followup turn.- Configure via
messages.queue(andmessages.queue.byChannel). - Modes:
interrupt,steer,followup,collect, plus backlog variants.
Streaming, chunking, and batching
Block streaming sends partial replies as the model produces text blocks. Chunking respects channel text limits and avoids splitting fenced code. Key settings:agents.defaults.blockStreamingDefault(on|off, default off)agents.defaults.blockStreamingBreak(text_end|message_end)agents.defaults.blockStreamingChunk(minChars|maxChars|breakPreference)agents.defaults.blockStreamingCoalesce(idle-based batching)agents.defaults.humanDelay(human-like pause between block replies)- Channel overrides:
*.blockStreamingand*.blockStreamingCoalesce(non-Telegram channels require explicit*.blockStreaming: true)
Reasoning visibility and tokens
OpenClaw can expose or hide model reasoning:/reasoning on|off|streamcontrols visibility.- Reasoning content still counts toward token usage when produced by the model.
- Telegram supports reasoning stream into the draft bubble.
Prefixes, threading, and replies
Outbound message formatting is centralized inmessages:
messages.responsePrefix,channels.<channel>.responsePrefix, andchannels.<channel>.accounts.<id>.responsePrefix(outbound prefix cascade), pluschannels.whatsapp.messagePrefix(WhatsApp inbound prefix)- Reply threading via
replyToModeand per-channel defaults
Silent replies
The exact silent tokenNO_REPLY / no_reply means “do not deliver a user-visible reply”.
When a turn also has pending tool media, such as generated TTS audio, OpenClaw
strips the silent text but still delivers the media attachment.
OpenClaw resolves that behavior by conversation type:
- Direct conversations disallow silence by default and rewrite a bare silent reply to a short visible fallback.
- Groups/channels allow silence by default.
- Internal orchestration allows silence by default.
/verbose is on or full.
Defaults live under agents.defaults.silentReply and
agents.defaults.silentReplyRewrite; surfaces.<id>.silentReply and
surfaces.<id>.silentReplyRewrite can override them per surface.
When the parent session has one or more pending spawned subagent runs, bare
silent replies are dropped on all surfaces instead of being rewritten, so the
parent stays quiet until the child completion event delivers the real reply.