本網站為獨立社群專案,與 OpenClaw 官方無任何關聯。內容僅供參考。 了解更多

翻譯文件

本頁為社群翻譯版本,可能與官方最新內容有出入。 查看官方英文原文 →

訊息處理

OpenClaw 處理入站訊息的完整流程,包括去重、防抖、工作階段管理、佇列、串流及推理可見性。

概覽

此頁面整合說明 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.* 用於 block streaming 和分塊預設值。
  • 頻道覆寫(channels.whatsapp.*channels.telegram.* 等)用於上限和串流開關。

完整結構描述請參閱 設定

入站去重

頻道可能在重新連線後重新送達相同訊息。OpenClaw 維護一個以 channel/account/peer/session/message id 為鍵的短期快取,以防止重複送達觸發另一次 Agent 執行。

入站防抖

來自同一發送者的快速連續訊息可以透過 messages.inbound 批次合併為單一 Agent 回合。防抖按頻道 + 對話範圍,並使用最新的訊息進行回覆串接/ID。

設定(全域預設 + 每頻道覆寫):

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

注意事項:

  • 防抖僅適用於純文字訊息;媒體/附件會立即刷新。
  • 控制命令繞過防抖,因此它們保持獨立。

工作階段與裝置

工作階段由 Gateway 擁有,而非客戶端。

  • 直接聊天合併為 Agent 主要工作階段金鑰。
  • 群組/頻道擁有各自的工作階段金鑰。
  • 工作階段儲存和逐字稿位於 Gateway 主機上。

多個裝置/頻道可以對應到相同的工作階段,但歷史記錄不會完全同步回每個客戶端。建議:在長對話中使用一個主要裝置以避免上下文分歧。控制面板 UI 和 TUI 始終顯示 Gateway 支持的工作階段逐字稿,因此它們是唯一的真實來源。

詳情:工作階段管理

入站訊息本體與歷史上下文

OpenClaw 將提示本體命令本體分開:

  • Body:傳送給 Agent 的提示文字。這可能包含頻道封套和可選的歷史包裝。
  • CommandBody:用於指令/命令解析的原始使用者文字。
  • RawBodyCommandBody 的舊版別名(保留以相容)。

當頻道提供歷史記錄時,使用共享的包裝格式:

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

對於非直接聊天(群組/頻道/房間),當前訊息本體會加上發送者標籤(與歷史條目使用相同的樣式)。這使 Agent 提示中的即時和排隊/歷史訊息保持一致。

歷史緩衝區為僅待處理:它們包含未觸發執行的群組訊息(例如被提及閘控的訊息),並排除已在工作階段逐字稿中的訊息。

指令剝離僅適用於當前訊息區段,因此歷史記錄保持完整。包裝歷史的頻道應將 CommandBody(或 RawBody)設為原始訊息文字,並將 Body 保持為組合的提示。

歷史緩衝區可透過 messages.groupChat.historyLimit(全域預設)和每頻道覆寫如 channels.slack.historyLimitchannels.telegram.accounts.<id>.historyLimit 進行設定(設為 0 以停用)。

佇列與後續處理

若執行已在進行中,入站訊息可以被排隊、導向到當前執行中,或收集作為後續回合。

  • 透過 messages.queue(和 messages.queue.byChannel)設定。
  • 模式:interruptsteerfollowupcollect,加上 backlog 變體。

詳情:佇列

串流、分塊與批次處理

Block streaming 在模型產生文字區塊時傳送部分回覆。分塊遵守頻道文字限制,並避免分割圍欄式程式碼。

關鍵設定:

  • agents.defaults.blockStreamingDefaulton|off,預設 off)
  • agents.defaults.blockStreamingBreaktext_end|message_end
  • agents.defaults.blockStreamingChunkminChars|maxChars|breakPreference
  • agents.defaults.blockStreamingCoalesce(基於閒置的批次處理)
  • agents.defaults.humanDelay(block 回覆之間的擬人化暫停)
  • 頻道覆寫:*.blockStreaming*.blockStreamingCoalesce(非 Telegram 頻道需要明確設定 *.blockStreaming: true

詳情:串流 + 分塊

推理可見性與 Token

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

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

詳情:思考 + 推理指令Token 使用

前綴、串接與回覆

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

  • messages.responsePrefixchannels.<channel>.responsePrefixchannels.<channel>.accounts.<id>.responsePrefix(出站前綴層疊),加上 channels.whatsapp.messagePrefix(WhatsApp 入站前綴)
  • 透過 replyToMode 和每頻道預設值進行回覆串接

詳情:設定 和頻道文件。