news 2026/5/3 18:28:26

OpenClaw从入门到应用——Agent:流式传输与分块

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenClaw从入门到应用——Agent:流式传输与分块

通过OpenClaw实现副业收入:《OpenClaw赚钱实录:从“养龙虾“到可持续变现的实践指南》

OpenClaw 有两个独立的流式传输层:

  • 块流式传输(频道):在助手生成内容时,发出已完成的。这些是普通的频道消息(不是令牌增量)。
  • 预览流式传输(Telegram/Discord/Slack):在生成过程中更新一个临时的预览消息

目前没有真正的令牌增量流式传输到频道消息。预览流式传输是基于消息的(发送 + 编辑/追加)。

块流式传输(频道消息)

块流式传输在助手输出可用时,以粗粒度的块发送。

模型输出 └─ text_delta/events ├─ (blockStreamingBreak=text_end) │ └─ 分块器在缓冲区增长时发出块 └─ (blockStreamingBreak=message_end) └─ 分块器在 message_end 时刷新 └─ 频道发送(块回复)

图例:

  • text_delta/events:模型流事件(对于非流式模型可能很稀疏)。
  • 分块器EmbeddedBlockChunker应用最小/最大边界 + 断点偏好。
  • 频道发送:实际的出站消息(块回复)。

控制选项:

  • agents.defaults.blockStreamingDefault"on"/"off"(默认关闭)。
  • 频道覆盖:*.blockStreaming(以及每个账户的变体)可为每个频道强制设置"on"/"off"
  • agents.defaults.blockStreamingBreak"text_end""message_end"
  • agents.defaults.blockStreamingChunk{ minChars, maxChars, breakPreference? }
  • agents.defaults.blockStreamingCoalesce{ minChars?, maxChars?, idleMs? }(在发送前合并流式块)。
  • 频道硬性上限:*.textChunkLimit(例如,channels.whatsapp.textChunkLimit)。
  • 频道分块模式:*.chunkMode(默认为lengthnewline在长度分块前按空行(段落边界)分割)。
  • Discord 软性上限:channels.discord.maxLinesPerMessage(默认 17 行)分割过长的回复以避免 UI 裁剪。

边界语义:

  • text_end:一旦分块器发出就流式传输块;在每个text_end时刷新。
  • message_end:等待助手消息完成,然后刷新缓冲的输出。

即使使用message_end,如果缓冲的文本超过maxChars,仍然会使用分块器,因此可以在末尾发出多个块。

分块算法(低/高边界)

块分块由EmbeddedBlockChunker实现:

  • 低边界:在缓冲区 >=minChars之前不要发出(除非强制)。
  • 高边界:优先在maxChars之前分割;如果强制,则在maxChars处分割。
  • 断点偏好:paragraphnewlinesentencewhitespace→ 硬性分割。
  • 代码围栏:永远不会在围栏内部进行分割;当在maxChars处强制分割时,会关闭并重新打开围栏以保持 Markdown 有效性。

maxChars会被限制在频道的textChunkLimit内,因此你无法超过每个频道的上限。

合并(合并流式块)

启用块流式传输后,OpenClaw 可以在发送之前合并连续的块。这减少了“单行垃圾信息”,同时仍然提供渐进式输出。

  • 合并会在刷新前等待空闲间隔idleMs)。
  • 缓冲区受maxChars限制,如果超过该限制则会刷新。
  • minChars防止在积累足够文本之前发送微小片段(最终刷新总是会发送剩余文本)。
  • 连接符源自blockStreamingChunk.breakPreferenceparagraph\n\nnewline\nsentence→ 空格)。
  • 可通过*.blockStreamingCoalesce进行频道覆盖(包括每个账户的配置)。
  • 除非被覆盖,否则 Signal/Slack/Discord 的默认合并minChars会提高到 1500。

块之间的类人节奏

启用块流式传输后,你可以在块回复之间添加随机暂停(在第一个块之后)。这让多气泡回复感觉更自然。

  • 配置:agents.defaults.humanDelay(可通过agents.list[].humanDelay为每个代理覆盖)。
  • 模式:off(默认),natural(800–2500ms),customminMs/maxMs)。
  • 仅适用于块回复,不适用于最终回复或工具摘要。

“流式分块或一次性全部”

这对应于:

  • 流式分块:blockStreamingDefault: "on"+blockStreamingBreak: "text_end"(边生成边发出)。非 Telegram 频道还需要*.blockStreaming: true
  • 在末尾一次性流式传输所有内容:blockStreamingBreak: "message_end"(一次性刷新,如果内容很长可能会有多个块)。
  • 无块流式传输:blockStreamingDefault: "off"(仅最终回复)。

频道说明:除非显式将*.blockStreaming设置为true,否则块流式传输默认关闭。频道可以在没有块回复的情况下流式传输实时预览(channels..streaming)。

配置位置提醒:blockStreaming*默认值位于agents.defaults下,而不是根配置中。

预览流式传输模式

规范键:channels..streaming

模式:

  • off:禁用预览流式传输。
  • partial:单个预览,用最新文本替换。
  • block:预览以分块/追加步骤更新。
  • progress:在生成期间显示进度/状态预览,完成后显示最终答案。

频道映射

频道offpartialblockprogress
Telegram映射为partial
Discord映射为partial
Slack

仅限 Slack:

  • streaming=partial时,channels.slack.nativeStreaming切换 Slack 原生流式传输 API 调用(默认:true)。

旧键迁移:

  • Telegram:streamMode+ 布尔值streaming自动迁移到streaming枚举。
  • Discord:streamMode+ 布尔值streaming自动迁移到streaming枚举。
  • Slack:streamMode自动迁移到streaming枚举;布尔值streaming自动迁移到nativeStreaming

运行时行为

Telegram:

  • 在私聊和群组/主题中使用sendMessage+editMessageText进行预览更新。
  • 当显式启用 Telegram 块流式传输时,会跳过预览流式传输(以避免双重流式传输)。
  • /reasoning stream可以将推理写入预览。

Discord:

  • 使用发送 + 编辑预览消息。
  • block模式使用草稿分块(draftChunk)。
  • 当显式启用 Discord 块流式传输时,会跳过预览流式传输。

Slack:

  • partial在可用时可以使用 Slack 原生流式传输(chat.startStream/append/stop)。
  • block使用追加式草稿预览。
  • progress使用状态预览文本,然后显示最终答案。

链接标题# 流式传输 + 分块

OpenClaw 有两个独立的流式传输层:

  • 块流式传输(频道):在助手生成内容时,发出已完成的。这些是普通的频道消息(不是令牌增量)。
  • 预览流式传输(Telegram/Discord/Slack):在生成过程中更新一个临时的预览消息

目前没有真正的令牌增量流式传输到频道消息。预览流式传输是基于消息的(发送 + 编辑/追加)。

块流式传输(频道消息)

块流式传输在助手输出可用时,以粗粒度的块发送。

模型输出 └─ text_delta/events ├─ (blockStreamingBreak=text_end) │ └─ 分块器在缓冲区增长时发出块 └─ (blockStreamingBreak=message_end) └─ 分块器在 message_end 时刷新 └─ 频道发送(块回复)

图例:

  • text_delta/events:模型流事件(对于非流式模型可能很稀疏)。
  • 分块器EmbeddedBlockChunker应用最小/最大边界 + 断点偏好。
  • 频道发送:实际的出站消息(块回复)。

控制选项:

  • agents.defaults.blockStreamingDefault"on"/"off"(默认关闭)。
  • 频道覆盖:*.blockStreaming(以及每个账户的变体)可为每个频道强制设置"on"/"off"
  • agents.defaults.blockStreamingBreak"text_end""message_end"
  • agents.defaults.blockStreamingChunk{ minChars, maxChars, breakPreference? }
  • agents.defaults.blockStreamingCoalesce{ minChars?, maxChars?, idleMs? }(在发送前合并流式块)。
  • 频道硬性上限:*.textChunkLimit(例如,channels.whatsapp.textChunkLimit)。
  • 频道分块模式:*.chunkMode(默认为lengthnewline在长度分块前按空行(段落边界)分割)。
  • Discord 软性上限:channels.discord.maxLinesPerMessage(默认 17 行)分割过长的回复以避免 UI 裁剪。

边界语义:

  • text_end:一旦分块器发出就流式传输块;在每个text_end时刷新。
  • message_end:等待助手消息完成,然后刷新缓冲的输出。

即使使用message_end,如果缓冲的文本超过maxChars,仍然会使用分块器,因此可以在末尾发出多个块。

分块算法(低/高边界)

块分块由EmbeddedBlockChunker实现:

  • 低边界:在缓冲区 >=minChars之前不要发出(除非强制)。
  • 高边界:优先在maxChars之前分割;如果强制,则在maxChars处分割。
  • 断点偏好:paragraphnewlinesentencewhitespace→ 硬性分割。
  • 代码围栏:永远不会在围栏内部进行分割;当在maxChars处强制分割时,会关闭并重新打开围栏以保持 Markdown 有效性。

maxChars会被限制在频道的textChunkLimit内,因此你无法超过每个频道的上限。

合并(合并流式块)

启用块流式传输后,OpenClaw 可以在发送之前合并连续的块。这减少了“单行垃圾信息”,同时仍然提供渐进式输出。

  • 合并会在刷新前等待空闲间隔idleMs)。
  • 缓冲区受maxChars限制,如果超过该限制则会刷新。
  • minChars防止在积累足够文本之前发送微小片段(最终刷新总是会发送剩余文本)。
  • 连接符源自blockStreamingChunk.breakPreferenceparagraph\n\nnewline\nsentence→ 空格)。
  • 可通过*.blockStreamingCoalesce进行频道覆盖(包括每个账户的配置)。
  • 除非被覆盖,否则 Signal/Slack/Discord 的默认合并minChars会提高到 1500。

块之间的类人节奏

启用块流式传输后,你可以在块回复之间添加随机暂停(在第一个块之后)。这让多气泡回复感觉更自然。

  • 配置:agents.defaults.humanDelay(可通过agents.list[].humanDelay为每个代理覆盖)。
  • 模式:off(默认),natural(800–2500ms),customminMs/maxMs)。
  • 仅适用于块回复,不适用于最终回复或工具摘要。

“流式分块或一次性全部”

这对应于:

  • 流式分块:blockStreamingDefault: "on"+blockStreamingBreak: "text_end"(边生成边发出)。非 Telegram 频道还需要*.blockStreaming: true
  • 在末尾一次性流式传输所有内容:blockStreamingBreak: "message_end"(一次性刷新,如果内容很长可能会有多个块)。
  • 无块流式传输:blockStreamingDefault: "off"(仅最终回复)。

频道说明:除非显式将*.blockStreaming设置为true,否则块流式传输默认关闭。频道可以在没有块回复的情况下流式传输实时预览(channels..streaming)。

配置位置提醒:blockStreaming*默认值位于agents.defaults下,而不是根配置中。

预览流式传输模式

规范键:channels..streaming

模式:

  • off:禁用预览流式传输。
  • partial:单个预览,用最新文本替换。
  • block:预览以分块/追加步骤更新。
  • progress:在生成期间显示进度/状态预览,完成后显示最终答案。

频道映射

频道offpartialblockprogress
Telegram映射为partial
Discord映射为partial
Slack

仅限 Slack:

  • streaming=partial时,channels.slack.nativeStreaming切换 Slack 原生流式传输 API 调用(默认:true)。

旧键迁移:

  • Telegram:streamMode+ 布尔值streaming自动迁移到streaming枚举。
  • Discord:streamMode+ 布尔值streaming自动迁移到streaming枚举。
  • Slack:streamMode自动迁移到streaming枚举;布尔值streaming自动迁移到nativeStreaming

运行时行为

Telegram:

  • 在私聊和群组/主题中使用sendMessage+editMessageText进行预览更新。
  • 当显式启用 Telegram 块流式传输时,会跳过预览流式传输(以避免双重流式传输)。
  • /reasoning stream可以将推理写入预览。

Discord:

  • 使用发送 + 编辑预览消息。
  • block模式使用草稿分块(draftChunk)。
  • 当显式启用 Discord 块流式传输时,会跳过预览流式传输。

Slack:

  • partial在可用时可以使用 Slack 原生流式传输(chat.startStream/append/stop)。
  • block使用追加式草稿预览。
  • progress使用状态预览文本,然后显示最终答案。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 18:27:29

换背景颜色怎么操作?这款免费工具让你3秒搞定证件照和商品图

最近有个朋友问我,她要给淘宝店铺的商品图换背景,又要给儿子的证件照换底色,结果在网上找了半天,要么是收费的要么是效果差,问我有没有什么简单又好用的办法。说实话,这个问题我也经历过,尤其是…

作者头像 李华
网站建设 2026/5/3 18:27:27

一张图读懂Nginx常规报错,让处理报错信手拈来

上周帮一个同事排查问题,他说上传一个8M的图片报413,问我是不是Nginx出bug了。我一看,client_max_body_size默认是1M,改到100M就好了。但他说改完了还是不行——原来后端的PHP也没配,upload_max_filesize还是2M。一个4…

作者头像 李华
网站建设 2026/5/3 18:24:37

从CREO到URDF:机器人开发的终极自动化转换指南

从CREO到URDF:机器人开发的终极自动化转换指南 【免费下载链接】creo2urdf Generate URDF models from CREO mechanisms 项目地址: https://gitcode.com/gh_mirrors/cr/creo2urdf 在机器人设计与仿真领域,从CAD模型到仿真环境的转换一直是制约开发…

作者头像 李华
网站建设 2026/5/3 18:18:27

Transformer特征注入性问题与SIPIT算法解析

1. Transformer架构中的注入性问题剖析在自然语言处理领域,Transformer模型因其卓越的并行计算能力和长距离依赖捕捉特性,已成为各类NLP任务的基础架构。但在实际应用中,研究者们发现模型存在一个关键缺陷——不同层级的特征表示会相互干扰&a…

作者头像 李华