主题
流式输出与分块
概述
OpenClaw 支持流式输出(Streaming),让用户在 Agent 生成回复时就能逐步看到内容,而不是等全部生成完才发送。这对于长回复尤其重要——用户无需等待数十秒才能看到第一个字。
工作原理
text
用户发送消息
│
▼
OpenClaw 调用 LLM API(stream: true)
│
▼
模型逐 token 生成
│
▼
OpenClaw 分块缓冲
│
▼
通过频道 SDK 推送给用户
│
▼
聊天界面渐进显示三阶段流程
- Token 生成:LLM 按 token 逐个生成内容,每个 token 通过 SSE(Server-Sent Events)实时推送到 OpenClaw
- 分块缓冲:OpenClaw 将连续 token 按照策略聚合成「块」,避免频繁调用频道 API
- 推送显示:通过频道 SDK 将块发送到聊天平台,用户看到内容逐步出现
分块策略
由于不同聊天平台对消息编辑的支持不同,OpenClaw 会智能选择分块策略:
支持消息编辑的平台
适用平台:Telegram、Discord、Web 控制台
策略:实时更新同一条消息
- 收到第一个 token 后立即发送一条消息
- 后续 token 追加到同一条消息中,通过编辑消息 API 实时更新
- 生成完成后停止更新
json
{
"streaming": {
"mode": "edit",
"updateInterval": 300
}
}updateInterval:编辑消息的最小间隔(毫秒),避免触发平台限流
不支持消息编辑的平台
适用平台:WhatsApp、微信、QQ、iMessage
策略:等待生成完毕后一次性发送
由于这些平台不支持编辑已发送的消息,OpenClaw 会等待完整回复生成后再发送。对于特别长的回复,会按段落自动拆分为多条消息。
json
{
"streaming": {
"mode": "buffer",
"maxChunkLength": 2000
}
}混合模式
适用平台:飞书、Slack
这些平台支持消息编辑但有严格的 API 限流。OpenClaw 采用混合策略:
- 先缓冲一定量的内容
- 发送第一条消息
- 以较低频率编辑更新
- 避免触发限流
工具调用与流式输出
当 Agent 需要调用工具时,流式输出的行为有所不同:
text
用户:"帮我查一下北京天气"
[流式输出] 正在查询北京天气... ← 思考过程
[工具调用] 调用 weather API ← 暂停流式,等待工具返回
[工具结果] 返回天气数据 ← 获取结果
[流式输出] 北京今天晴,25°C... ← 继续流式输出最终回复- 工具调用期间,流式输出暂停
- 部分平台会显示「正在输入...」状态指示器
- 工具返回后,继续流式输出最终回复
配置参考
在 openclaw.json 中可配置流式输出相关参数:
json
{
"agents": {
"defaults": {
"streaming": {
"enabled": true,
"updateInterval": 300,
"maxChunkLength": 2000,
"showToolCalls": true
}
}
}
}| 参数 | 默认值 | 说明 |
|---|---|---|
enabled | true | 是否启用流式输出 |
updateInterval | 300 | 消息编辑最小间隔(毫秒) |
maxChunkLength | 2000 | 非编辑模式下单条消息最大长度 |
showToolCalls | true | 是否在流式输出中显示工具调用过程 |
常见问题
流式输出为什么有时不生效?
- 某些模型供应商不支持流式 API,OpenClaw 会自动回退到非流式模式
- 部分本地模型(通过 Ollama)在首次加载时可能不支持流式输出
消息闪烁问题
如果 Telegram/Discord 中消息频繁闪烁,可以增大 updateInterval 值(如 500 或 1000),减少编辑频率。