串流 + 分塊
OpenClaw 有兩個獨立的「串流」層級:- Block streaming (channels): emit completed blocks as the assistant writes. These are normal channel messages (not token deltas).
- 類 token 串流(僅 Telegram): 在生成期間以部分文字更新 草稿泡泡;最終訊息於結尾送出。
區塊串流(頻道訊息)
Block streaming sends assistant output in coarse chunks as it becomes available.text_delta/events:模型串流事件(對非串流模型可能較為稀疏)。chunker:套用最小/最大界限 + 斷行偏好的EmbeddedBlockChunker。channel send:實際對外送出的訊息(區塊回覆)。
agents.defaults.blockStreamingDefault:"on"/"off"(預設關閉)。- Channel overrides:
*.blockStreaming(and per-account variants) to force"on"/"off"per channel. agents.defaults.blockStreamingBreak:"text_end"或"message_end"。agents.defaults.blockStreamingChunk:{ minChars, maxChars, breakPreference? }。agents.defaults.blockStreamingCoalesce:{ minChars?, maxChars?, idleMs? }(在送出前合併串流區塊)。- 頻道硬性上限:
*.textChunkLimit(例如channels.whatsapp.textChunkLimit)。 - 頻道分塊模式:
*.chunkMode(預設length;newline會在長度分塊前,先依空白行(段落邊界)分割)。 - Discord 軟性上限:
channels.discord.maxLinesPerMessage(預設 17),會拆分過高的回覆以避免 UI 裁切。
text_end:一旦分塊器輸出就串流區塊;在每個text_end時清空送出。message_end:等助理訊息完成後,再一次清空送出緩衝的輸出。
message_end 若緩衝文字超過 maxChars,仍會使用分塊器,因此結尾可能送出多個區塊。
分塊演算法(低/高界限)
區塊分塊由EmbeddedBlockChunker 實作:
- 低界限: 在緩衝區 <
minChars前不送出(除非被強制)。 - 高界限: 優先在
maxChars之前分割;若被強制,則在maxChars分割。 - 斷行偏好:
paragraph→newline→sentence→whitespace→ 強制斷行。 - 程式碼區塊(Code fences): 絕不可在區塊內部分割;若因
maxChars限制而必須分割,請先關閉再重新開啟區塊,以保持 Markdown 有效。
maxChars 會被限制在頻道的 textChunkLimit,因此無法超過各頻道上限。
合併(合併串流區塊)
當啟用區塊串流時,OpenClaw 可以合併連續的區塊分塊 before sending them out. This reduces “single-line spam” while still providing progressive output.- Coalescing waits for idle gaps (
idleMs) before flushing. - 緩衝區會受到
maxChars限制,若超出將會立即輸出。 minChars會避免在累積到足夠文字前送出微小片段 (最終清空一定會送出剩餘文字)。- 連接符號源自
blockStreamingChunk.breakPreference(paragraph→\n\n、newline→\n、sentence→ 空白)。 - 可透過
*.blockStreamingCoalesce提供頻道覆寫(包含各帳戶設定)。 - 預設合併
minChars在 Signal/Slack/Discord 會提升至 1500,除非被覆寫。
1. 區塊之間的人類化節奏
當啟用區塊串流時,你可以在區塊回覆之間加入隨機暫停(第一個區塊之後)。 3. 這會讓多氣泡回應感覺更自然。- 設定:
agents.defaults.humanDelay(可透過agents.list[].humanDelay為每個代理程式覆寫)。 - 模式:
off(預設)、natural(800–2500ms)、custom(minMs/maxMs)。 - 僅適用於 區塊回覆,不適用於最終回覆或工具摘要。
「串流分塊或一次送出」
- 這對應到:
- 串流分塊:
blockStreamingDefault: "on"+blockStreamingBreak: "text_end"(邊產生邊送出)。非 Telegram 頻道還需要*.blockStreaming: true。 5. 非 Telegram 頻道也需要*.blockStreaming: true。 - 結尾一次串流全部:
blockStreamingBreak: "message_end"(只清空一次;若非常長,可能分成多個區塊)。 - 不使用區塊串流:
blockStreamingDefault: "off"(僅最終回覆)。
*.blockStreaming 設為 true,否則區塊串流 預設關閉。Telegram 可在沒有區塊回覆的情況下進行草稿串流(channels.telegram.streamMode)。 6. Telegram 可以在沒有區塊回覆的情況下串流草稿(channels.telegram.streamMode)。
設定位置提醒:blockStreaming* 的預設值位於
agents.defaults 之下,而不是根設定。
Telegram 草稿串流(類 token)
Telegram 是唯一支援草稿串流的頻道:- 使用 Bot API
sendMessage(首次更新)+editMessageText(後續更新)。 channels.telegram.streamMode: "partial" | "block" | "off"。partial:以最新串流文字更新草稿。block:以分塊區塊更新草稿(相同的分塊規則)。off:不進行草稿串流。
- 草稿分塊設定(僅適用於
streamMode: "block"):channels.telegram.draftChunk(預設:minChars: 200、maxChars: 800)。 - 預覽串流與區塊串流是分開的。
- 當明確啟用 Telegram 區塊串流時,將跳過預覽串流以避免重複串流。
- 純文字最終內容會直接在預覽訊息上原地編輯套用。
- 非文字/複雜最終內容則會回退為一般的最終訊息傳送方式。
/reasoning stream會將推理內容寫入即時預覽(僅限 Telegram)。
preview message:在生成過程中持續更新的暫時性 Telegram 訊息。final edit:在同一則預覽訊息上進行原地編輯(僅限純文字)。