
























@@ -1,7 +1,8 @@
11---
2-summary: "Command queue design that serializes inbound auto-reply runs"
2+summary: "Auto-reply queue modes, defaults, and per-session overrides"
33read_when:
44 - Changing auto-reply execution or concurrency
5+ - Explaining /queue modes or message steering behavior
56title: "Command queue"
67---
78@@ -20,34 +21,42 @@ We serialize inbound auto-reply runs (all channels) through a tiny in-process qu
2021- When verbose logging is enabled, queued runs emit a short notice if they waited more than ~2s before starting.
2122- Typing indicators still fire immediately on enqueue (when supported by the channel) so user experience is unchanged while we wait our turn.
222323-## Queue modes (per channel)
24+## Defaults
25+26+When unset, all inbound channel surfaces use:
27+28+- `mode: "steer"`
29+- `debounceMs: 500`
30+- `cap: 20`
31+- `drop: "summarize"`
32+33+`steer` is the default because it keeps the active model turn responsive without
34+starting a second session run. If the current run cannot accept steering,
35+OpenClaw falls back to a followup queue entry.
36+37+## Queue modes
24382539Inbound messages can steer the current run, wait for a followup turn, or do both:
264027-- `steer`: inject immediately into the current run (cancels pending tool calls after the next tool boundary). If not streaming, falls back to followup.
28-- `followup`: enqueue for the next agent turn after the current run ends.
29-- `collect`: coalesce all queued messages into a **single** followup turn (default). If messages target different channels/threads, they drain individually to preserve routing.
30-- `steer-backlog` (aka `steer+backlog`): steer now **and** preserve the message for a followup turn.
41+- `steer`: queue a steering message into the active Pi run. Pi delivers it **after the current assistant turn finishes executing its tool calls**, before the next LLM call. If the run is not actively streaming or steering is unavailable, OpenClaw falls back to a followup queue entry.
42+- `followup`: enqueue each message for a later agent turn after the current run ends.
43+- `collect`: coalesce queued messages into a **single** followup turn after the quiet window. If messages target different channels/threads, they drain individually to preserve routing.
44+- `steer-backlog` (aka `steer+backlog`): steer now **and** preserve the same message for a followup turn.
3145- `interrupt` (legacy): abort the active run for that session, then run the newest message.
3246- `queue` (legacy alias): same as `steer`.
33473448Steer-backlog means you can get a followup response after the steered run, so
3549streaming surfaces can look like duplicates. Prefer `collect`/`steer` if you want
3650one response per inbound message.
37-Send `/queue collect` as a standalone command (per-session) or set `messages.queue.byChannel.discord: "collect"`.
38-39-Defaults (when unset in config):
40-41-- All surfaces → `collect`
42514352Configure globally or per channel via `messages.queue`:
44534554```json5
4655{
4756 messages: {
4857 queue: {
49- mode: "collect",
50- debounceMs: 1000,
58+ mode: "steer",
59+ debounceMs: 500,
5160 cap: 20,
5261 drop: "summarize",
5362 byChannel: { discord: "collect" },
@@ -60,17 +69,33 @@ Configure globally or per channel via `messages.queue`:
60696170Options apply to `followup`, `collect`, and `steer-backlog` (and to `steer` when it falls back to followup):
627163-- `debounceMs`: wait for quiet before starting a followup turn (prevents “continue, continue”).
64-- `cap`: max queued messages per session.
65-- `drop`: overflow policy (`old`, `new`, `summarize`).
72+- `debounceMs`: quiet window before draining queued followups. Bare numbers are milliseconds; units `ms`, `s`, `m`, `h`, and `d` are accepted by `/queue` options.
73+- `cap`: max queued messages per session. Values below `1` are ignored.
74+- `drop: "summarize"`: default. Drop the oldest queued entries as needed, keep compact summaries, and inject them as a synthetic followup prompt.
75+- `drop: "old"`: drop the oldest queued entries as needed, without preserving summaries.
76+- `drop: "new"`: reject the newest message when the queue is already full.
77+78+Defaults: `debounceMs: 500`, `cap: 20`, `drop: summarize`.
79+80+## Precedence
81+82+For mode selection, OpenClaw resolves:
83+84+1. Inline or stored per-session `/queue` override.
85+2. `messages.queue.byChannel.<channel>`.
86+3. `messages.queue.mode`.
87+4. Default `steer`.
668867-Summarize keeps a short bullet list of dropped messages and injects it as a synthetic followup prompt.
68-Defaults: `debounceMs: 1000`, `cap: 20`, `drop: summarize`.
89+For options, inline or stored `/queue` options win over config. Then
90+channel-specific debounce (`messages.queue.debounceMsByChannel`), plugin
91+debounce defaults, global `messages.queue` options, and built-in defaults are
92+applied. `cap` and `drop` are global/session options, not per-channel config
93+keys.
69947095## Per-session overrides
71967297- Send `/queue <mode>` as a standalone command to store the mode for the current session.
73-- Options can be combined: `/queue collect debounce:2s cap:25 drop:summarize`
98+- Options can be combined: `/queue collect debounce:0.5s cap:25 drop:summarize`
7499- `/queue default` or `/queue reset` clears the session override.
7510076101## Scope and guarantees
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。