Block streaming
像一块一块地把写好的内容递出来。不是每个字都飞出来,而是攒成段,再发消息。
Concepts 导读
OpenClaw 的 streaming 分两层:block streaming 把助手写完的整块内容发到频道,preview streaming 在 Telegram/Discord/Slack 上临时更新一条预览消息。没有真正的 token 级流式输出到频道。配置时先搞清楚你要的是“边写边发完整段落”还是“生成完再发最终结果”,block streaming 默认关闭,需在 agents.defaults.blockStreamingDefault 或频道覆盖中开启。
先讲这一页到底在解决什么
OpenClaw 的 streaming 分两层:block streaming 把助手写完的整块内容发到频道,preview streaming 在 Telegram/Discord/Slack 上临时更新一条预览消息。没有真正的 token 级流式输出到频道。配置时先搞清楚你要的是“边写边发完整段落”还是“生成完再发最终结果”,block streaming 默认关闭,需在 agents.defaults.blockStreamingDefault 或频道覆盖中开启。
第一站
原文一开始就说得很清楚:它不是只有一种流式,而是两层。
像一块一块地把写好的内容递出来。不是每个字都飞出来,而是攒成段,再发消息。
像先在一个临时小黑板上不断擦写,让你看到它正在生成,最后再给出正式版本。
官方明确说了,目前不是那种“字粒子雨”式 streaming。它仍然是按消息块在工作。
因为不同渠道能做的事不一样。有的更适合不断改同一条预览,有的更适合分块发多条消息。
第二站
模型写出一段内容后,chunker 会先看看这一小段够不够发、要不要再攒一会儿、要不要先找个更好看的断点。
像“太短先别递”。一句半句就飞出去会很碎,所以会先攒到差不多。
像“太长也别憋着”。到了这个上限,就要找地方切开,先发一块出去。
像优先按自然段、换行、句号这些地方切,尽量别把一句话从中间硬砍开。
因为官方不想把代码围栏切坏。所以如果逼不得已要中间断,也会先帮你把围栏收好,再在下一块重新打开。
第三站
如果每攒一点点就发一条,很容易像被消息雨砸脸。所以 OpenClaw 还会先把连续小块再合一下。
像等一小会儿,看看后面还有没有接着写。如果还有,就先别急着发。
像合并篮子也不能太大,太大了就得先倒出来一部分。
Coalescing 不是新的流式,是为了别让 block streaming 碎成满地纸屑。
因为这些地方如果一行一个气泡,读感会特别吵,所以官方会更偏向先攒大一点再发。
第四站
有些渠道支持不断改一条预览消息。这时候你看到的是“草稿板在更新”,不一定是正式多条消息已经发出去了。
像一块草稿板,上面的字不断被更新成最新版本。
像草稿板不是整块重写,而是一步步往下追加几块内容。
像先显示“正在做事”的状态提示,等真正写完再把正式答案递出来。
Telegram、Discord、Slack 都能做预览,但每家的玩法不完全一样,别以为一个配置 everywhere 都同样表现。
第五站
这一页的配置很多,但本质上都在管“什么时候发、发多大、发成什么样”。
agents.defaults.blockStreamingDefault像总开关,决定默认要不要用“边写边递纸条”这一套。
blockStreamingBreak: "text_end"像一写完一小块就尝试往外递,节奏更快。
blockStreamingBreak: "message_end"像等整段大作文基本写好,再一次或分几块送出去,节奏更稳。
channels.<channel>.streaming像给某个具体聊天门口单独决定:这个地方是用草稿板预览,还是干脆不要预览。
第六站
原文这段很可爱。它不是技术必须,而是读感优化。
像在多条 block 回复之间故意停一小下,更像人类发消息,不像脚本喷射器。
像你自己决定停顿区间,让节奏更快或更慢。
它只影响多块 block 回复之间的间隔,不是让整条最终答案都慢下来。
Human delay 是读感化妆,不是功能核心。
最后总结
OpenClaw 的 streaming 更像“边写边分块递纸条”或“先用草稿板不断更新”,而不是每个字都像雨点一样掉出来。
如果你下一页只想继续看一页,我建议看 /tools/browser。因为浏览器工具和流式回复很像,表面看起来很丝滑,背后其实也分“即时预览”和“真正动作”两层。