OpenClaw 透過一條包含工作階段解析、佇列、串流、工具執行與推理可見性的管線處理傳入訊息。本頁說明從傳入訊息到回覆的路徑。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.
訊息流程(高階)
messages.*用於前綴、佇列與群組行為。agents.defaults.*用於區塊串流與分塊預設值。- Channel 覆寫(
channels.whatsapp.*、channels.telegram.*等)用於上限與串流切換。
傳入去重
Channel 可能會在重新連線後重新投遞相同訊息。OpenClaw 會保留一個 短期快取,以 channel/account/peer/session/message id 作為鍵,避免重複 投遞觸發另一個 agent 執行。傳入防抖
來自同一寄件者的快速連續訊息,可透過messages.inbound 批次合併為單一
agent 回合。防抖範圍限定在每個 channel + 對話,
並使用最新訊息作為回覆串接/ID。
設定(全域預設 + 各 channel 覆寫):
- 防抖適用於純文字訊息;媒體/附件會立即送出。
- 控制命令會略過防抖,因此會保持獨立處理,除非某個 channel 明確選擇加入同寄件者 DM 合併(例如 BlueBubbles
coalesceSameSenderDms),此時 DM 命令會在防抖視窗內等待,讓拆分傳送的負載可以加入同一個 agent 回合。
工作階段與裝置
工作階段由 Gateway 擁有,而不是由用戶端擁有。- 直接聊天會收斂到 agent 主要工作階段鍵。
- 群組/channel 會取得自己的工作階段鍵。
- 工作階段儲存與逐字稿位於 Gateway 主機上。
工具結果中繼資料
工具結果的content 是模型可見的結果。工具結果的 details 是
用於 UI 呈現、診斷、媒體投遞與 Plugin 的執行階段中繼資料。
OpenClaw 明確維持這個邊界:
toolResult.details會在供應商重播與 Compaction 輸入前被移除。- 持久化工作階段逐字稿只保留受限的
details;過大的中繼資料 會被替換成標記為persistedDetailsTruncated: true的精簡摘要。 - Plugin 與工具應將模型必須讀取的文字放在
content,而不只 放在details。
傳入本文與歷史脈絡
OpenClaw 會區分提示本文與命令本文:Body:傳送給 agent 的提示文字。這可能包含 channel 信封與 選用的歷史包裝。CommandBody:用於指令/命令解析的原始使用者文字。RawBody:CommandBody的舊版別名(為相容性保留)。
[Chat messages since your last reply - for context][Current message - respond to this]
CommandBody(或 RawBody)設定為原始訊息文字,
並讓 Body 保持為合併後的提示。歷史緩衝區可透過
messages.groupChat.historyLimit(全域預設)與各 channel 覆寫設定,
例如 channels.slack.historyLimit 或
channels.telegram.accounts.<id>.historyLimit(設定為 0 可停用)。
佇列與後續處理
如果已有執行正在進行,傳入訊息可以被排入佇列、導向目前執行, 或收集到後續回合中。- 透過
messages.queue(以及messages.queue.byChannel)設定。 - 預設模式為
steer,當導向退回到佇列後續投遞時, 會有 500ms 的後續防抖。 - 模式:
steer、followup、collect、steer-backlog、interrupt, 以及舊版一次一個的queue模式。
Channel 執行擁有權
Channel Plugin 可以在訊息進入工作階段佇列前保留順序、對輸入進行防抖, 並套用傳輸背壓。它們不應在 agent 回合本身周圍施加 獨立逾時。一旦訊息被路由到工作階段,長時間執行的工作會由工作階段、工具與執行階段 生命週期管理,使所有 channel 都能一致地回報並從緩慢回合復原。串流、分塊與批次處理
區塊串流會在模型產生文字區塊時傳送部分回覆。 分塊會遵守 channel 文字限制,並避免拆開圍欄程式碼。 關鍵設定:agents.defaults.blockStreamingDefault(on|off,預設關閉)agents.defaults.blockStreamingBreak(text_end|message_end)agents.defaults.blockStreamingChunk(minChars|maxChars|breakPreference)agents.defaults.blockStreamingCoalesce(以閒置為基礎的批次處理)agents.defaults.humanDelay(區塊回覆之間類似人類的暫停)- Channel 覆寫:
*.blockStreaming與*.blockStreamingCoalesce(非 Telegram channel 需要明確設定*.blockStreaming: true)
推理可見性與權杖
OpenClaw 可以公開或隱藏模型推理:/reasoning on|off|stream控制可見性。- 當模型產生推理內容時,它仍會計入權杖用量。
- Telegram 支援將推理串流到草稿氣泡中。
前綴、串接與回覆
傳出訊息格式集中在messages 中:
messages.responsePrefix、channels.<channel>.responsePrefix與channels.<channel>.accounts.<id>.responsePrefix(傳出前綴串接),以及channels.whatsapp.messagePrefix(WhatsApp 傳入前綴)- 透過
replyToMode與各 channel 預設值進行回覆串接
靜默回覆
精確的靜默權杖NO_REPLY / no_reply 表示「不要投遞使用者可見的回覆」。
當某個回合同時有待處理的工具媒體(例如產生的 TTS 音訊)時,OpenClaw
會移除靜默文字,但仍會投遞媒體附件。
OpenClaw 會依對話類型解析該行為:
- 直接對話預設不允許靜默,並會將單獨的靜默 回覆改寫為簡短的可見備援回覆。
- 群組/channel 預設允許靜默。
- 內部編排預設允許靜默。
/verbose 為 on 或 full 時,才會顯示原始執行器詳細資訊。
預設值位於 agents.defaults.silentReply 與
agents.defaults.silentReplyRewrite;surfaces.<id>.silentReply 與
surfaces.<id>.silentReplyRewrite 可以針對每個介面覆寫它們。
當父工作階段有一個或多個待處理的已生成子 agent 執行時,單獨的
靜默回覆會在所有介面上被丟棄而不是被改寫,因此
父工作階段會保持安靜,直到子項完成事件投遞真正的回覆。