跳到內容

OpenClaw 訊息處理指南:優化串流與防重複機制

處理聊天機器人的訊息流總是很頭痛,尤其是當你要同時應付多個平台、處理重複發送的訊息,還要確保 AI 的回覆不會因為網路波動或併發請求而亂掉。這篇文章會帶你了解 OpenClaw 如何處理入站訊息、Session、隊列、Streaming 以及推理過程的可見性。

這篇文章整合了 OpenClaw 處理入站訊息、Session、隊列、Streaming 以及推理過程可見性的方式。

Inbound message
-> routing/bindings -> session key
-> queue (if a run is active)
-> agent run (streaming + tools)
-> outbound replies (channel limits + chunking)

關鍵的控制選項位於 configuration 中:

  • messages.* 用於前綴、隊列和群組行為。
  • agents.defaults.* 用於區塊串流(block streaming)和分塊(chunking)的預設值。
  • Channel 覆蓋設定(例如 channels.whatsapp.*, channels.telegram.* 等)用於限制和串流開關。

完整 Schema 請參考 Configuration。

當連線重新建立時,Channel 可能會重複傳送相同的訊息。OpenClaw 會維護一個短效快取,以 channel/account/peer/session/message id 作為 key,確保重複的訊息不會觸發多次 Agent 執行。

來自同一個發送者的快速連續訊息可以透過 messages.inbound 合併成單次 Agent 輪次。防抖(Debouncing)的作用範圍是每個 Channel + 對話,並使用最近的一條訊息來進行回覆執行緒/ID 的處理。

配置(全域預設 + 各 Channel 覆蓋):

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

注意:

  • 防抖僅適用於純文字訊息;媒體/附件會立即發送。
  • 控制指令會繞過防抖,以便保持獨立執行。

Session 由 Gateway 擁有,而不是由用戶端擁有。

  • 私訊會合併到 Agent 的主 Session key 中。
  • 群組/頻道會有各自的 Session key。
  • Session 儲存和對話紀錄(transcripts)儲存在 Gateway 主機上。

多個裝置或 Channel 可以映射到同一個 Session,但歷史紀錄不會完全同步回每個用戶端。建議:長對話使用一個主要裝置,以避免上下文分歧。Control UI 和 TUI 始終顯示 Gateway 備份的 Session 紀錄,因此它們是事實來源。

詳情請見:Session management。

入站內容與歷史上下文 (Inbound bodies and history context)

Section titled “入站內容與歷史上下文 (Inbound bodies and history context)”

OpenClaw 將 prompt body 與 command body 分開處理:

  • Body: 傳送給 Agent 的 Prompt 文字。這可能包含 Channel 封裝和選用的歷史紀錄包裝。
  • CommandBody: 用於指令解析的使用者原始文字。
  • RawBody: CommandBody 的舊版別名(為了相容性而保留)。

當 Channel 提供歷史紀錄時,它會使用一個共享的包裝:

  • [Chat messages since your last reply - for context]
  • [Current message - respond to this]

對於非私訊對話(群組/頻道/聊天室),當前訊息內容會加上發送者標籤的前綴(與歷史紀錄條目使用的樣式相同)。這能保持 Agent Prompt 中即時訊息與隊列/歷史訊息的一致性。

歷史紀錄緩衝區僅包含待處理內容:它們包括未觸發執行的群組訊息(例如:被提及過濾掉的訊息),並且不包含已經存在於 Session 紀錄中的訊息。

指令剝離(Directive stripping)僅適用於當前訊息部分,因此歷史紀錄會保持完整。包裝歷史紀錄的 Channel 應將 CommandBody(或 RawBody)設定為原始訊息文字,並將 Body 保持為組合後的 Prompt。歷史紀錄緩衝區可透過 messages.groupChat.historyLimit(全域預設)和各 Channel 覆蓋設定(如 channels.slack.historyLimit 或 channels.telegram.accounts.<id>.historyLimit,設定為 0 則停用)進行配置。

隊列與後續跟進 (Queueing and followups)

Section titled “隊列與後續跟進 (Queueing and followups)”

如果一個執行(run)已經在進行中,入站訊息可以進入隊列、引導至當前執行,或收集起來用於後續輪次。

  • 透過 messages.queue(以及 messages.queue.byChannel)進行配置。
  • 模式包括:interrupt, steer, followup, collect,以及待辦(backlog)變體。

詳情請見:Queueing。

串流、分塊與批次處理 (Streaming, chunking, and batching)

Section titled “串流、分塊與批次處理 (Streaming, chunking, and batching)”

區塊串流(Block streaming)會在模型產生文字塊時發送部分回覆。分塊(Chunking)會遵循 Channel 的文字限制,並避免拆分圍欄代碼塊(fenced code)。

關鍵設定:

  • 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 (區塊回覆之間模擬人類的停頓)
  • Channel 覆蓋:*.blockStreaming 和 *.blockStreamingCoalesce(非 Telegram 的 Channel 需要明確設定 *.blockStreaming: true)

詳情請見:Streaming + chunking。

推理過程可見性與 Token (Reasoning visibility and tokens)

Section titled “推理過程可見性與 Token (Reasoning visibility and tokens)”

OpenClaw 可以顯示或隱藏模型的推理過程:

  • /reasoning on|off|stream 控制可見性。
  • 推理內容在模型產生時仍會計入 Token 使用量。
  • Telegram 支援將推理串流顯示在草稿氣泡(draft bubble)中。

詳情請見:Thinking + reasoning directives 與 Token use。

前綴、執行緒與回覆 (Prefixes, threading, and replies)

Section titled “前綴、執行緒與回覆 (Prefixes, threading, and replies)”

出站訊息格式在 messages 中集中管理:

  • messages.responsePrefix, channels.<channel>.responsePrefix, 以及 channels.<channel>.accounts.<id>.responsePrefix(出站前綴級聯),加上 channels.whatsapp.messagePrefix(WhatsApp 入站前綴)。
  • 透過 replyToMode 和各 Channel 預設值處理回覆執行緒。

詳情請見:Configuration 和各 Channel 文件。

如果你在設定過程中遇到任何問題,歡迎使用 AI Setup Assistant 尋求協助。

OpenClaw

OpenClaw Expert

還是卡住了?

如果這篇文件沒有解決你的情境,直接問 OpenClaw Expert,拿到可執行步驟。