流式传输与分块
Moltbot 有两个独立的”流式传输”层:
- 块流式传输(频道):助手写入时发出已完成的块。这些为正常频道消息(非 token 增量)。
- Token-ish 流式传输(仅 Telegram):生成时用部分文本更新草稿气泡;最终消息在结束时发送。
今日无真正的 token 流式传输到外部频道消息。Telegram 草稿流式传输为唯一部分流表面。
块流式传输(频道消息)
块流式传输在内容可用时以粗粒度块发送助手输出。控制:agents.defaults.blockStreamingDefault("on"/"off",默认 off);频道覆盖:*.blockStreaming(按频道强制 "on"/"off");agents.defaults.blockStreamingBreak("text_end" 或 "message_end");agents.defaults.blockStreamingChunk({ minChars, maxChars, breakPreference? });agents.defaults.blockStreamingCoalesce({ minChars?, maxChars?, idleMs? },发送前合并流式块);频道硬上限:*.textChunkLimit;频道分块模式:*.chunkMode(默认 length,newline 在长度分块前按空行(段落边界)拆分);Discord 软上限:channels.discord.maxLinesPerMessage(默认 17)拆分高回复以避免 UI 裁剪。
边界语义:
text_end:分块器发出时立即流式块;每个text_end刷新。message_end:等到助手消息结束,再刷新缓冲输出。
message_end 在缓冲文本超过 maxChars 时仍使用分块器,故可在最后发出多块。
分块算法(低/高界)
块分块由 EmbeddedBlockChunker 实现:低界(buffer >= minChars 前不发出,除非强制);高界(优先在 maxChars 前拆分;强制时在 maxChars 拆分);断点偏好(paragraph → newline → sentence → whitespace → 硬断);代码围栏(永不在围栏内拆分;强制在 maxChars 时关闭并重开围栏以保持 Markdown 有效)。maxChars 会被频道 textChunkLimit 限制,不会超过按频道上限。
合并(合并流式块)
启用块流式传输时,Moltbot 可在发送前合并连续块。减少”单行刷屏”,同时仍提供渐进输出。合并等待空闲间隙(idleMs)再刷新;缓冲区按 maxChars 限制并在超出时刷新;minChars 防止微小片段发送直到累积足够文本(最终刷新始终发送剩余文本);joiner 由 blockStreamingChunk.breakPreference 派生。
块间类人间隔
启用块流式传输时,可在块回复间(首块后)添加随机暂停,使多气泡响应感觉更自然。配置:agents.defaults.humanDelay(按代理覆盖经 agents.list[].humanDelay);模式:off(默认)、natural(800–2500ms)、custom(minMs/maxMs)。仅适用于块回复,非最终回复或工具摘要。
Telegram 草稿流式传输(token-ish)
Telegram 为唯一具备草稿流式传输的频道:在带话题的私聊中使用 Bot API sendMessageDraft;channels.telegram.streamMode: "partial" | "block" | "off"(partial:用最新流文本更新草稿;block:分块更新草稿(同分块器规则);off:无草稿流式传输);草稿块配置(仅 streamMode: "block"):channels.telegram.draftChunk(默认 minChars: 200、maxChars: 800);草稿流式传输与块流式传输分离;非 Telegram 频道上块回复默认关闭,仅通过 *.blockStreaming: true 启用;最终回复仍为正常消息;/reasoning stream 将推理写入草稿气泡(仅 Telegram)。草稿流式传输活跃时,Moltbot 为该回复禁用块流式传输以避免双重流式传输。