Skip to content

流式输出与分块

概述

OpenClaw 支持流式输出(Streaming),让用户在 Agent 生成回复时就能逐步看到内容,而不是等全部生成完才发送。这对于长回复尤其重要——用户无需等待数十秒才能看到第一个字。

工作原理

text
用户发送消息


OpenClaw 调用 LLM API(stream: true)


模型逐 token 生成


OpenClaw 分块缓冲


通过频道 SDK 推送给用户


聊天界面渐进显示

三阶段流程

  1. Token 生成:LLM 按 token 逐个生成内容,每个 token 通过 SSE(Server-Sent Events)实时推送到 OpenClaw
  2. 分块缓冲:OpenClaw 将连续 token 按照策略聚合成「块」,避免频繁调用频道 API
  3. 推送显示:通过频道 SDK 将块发送到聊天平台,用户看到内容逐步出现

分块策略

由于不同聊天平台对消息编辑的支持不同,OpenClaw 会智能选择分块策略:

支持消息编辑的平台

适用平台:Telegram、Discord、Web 控制台

策略:实时更新同一条消息

  1. 收到第一个 token 后立即发送一条消息
  2. 后续 token 追加到同一条消息中,通过编辑消息 API 实时更新
  3. 生成完成后停止更新
json
{
  "streaming": {
    "mode": "edit",
    "updateInterval": 300
  }
}
  • updateInterval:编辑消息的最小间隔(毫秒),避免触发平台限流

不支持消息编辑的平台

适用平台:WhatsApp、微信、QQ、iMessage

策略:等待生成完毕后一次性发送

由于这些平台不支持编辑已发送的消息,OpenClaw 会等待完整回复生成后再发送。对于特别长的回复,会按段落自动拆分为多条消息。

json
{
  "streaming": {
    "mode": "buffer",
    "maxChunkLength": 2000
  }
}

混合模式

适用平台:飞书、Slack

这些平台支持消息编辑但有严格的 API 限流。OpenClaw 采用混合策略:

  1. 先缓冲一定量的内容
  2. 发送第一条消息
  3. 以较低频率编辑更新
  4. 避免触发限流

工具调用与流式输出

当 Agent 需要调用工具时,流式输出的行为有所不同:

text
用户:"帮我查一下北京天气"

[流式输出] 正在查询北京天气...     ← 思考过程
[工具调用] 调用 weather API        ← 暂停流式,等待工具返回
[工具结果] 返回天气数据            ← 获取结果
[流式输出] 北京今天晴,25°C...     ← 继续流式输出最终回复
  • 工具调用期间,流式输出暂停
  • 部分平台会显示「正在输入...」状态指示器
  • 工具返回后,继续流式输出最终回复

配置参考

openclaw.json 中可配置流式输出相关参数:

json
{
  "agents": {
    "defaults": {
      "streaming": {
        "enabled": true,
        "updateInterval": 300,
        "maxChunkLength": 2000,
        "showToolCalls": true
      }
    }
  }
}
参数默认值说明
enabledtrue是否启用流式输出
updateInterval300消息编辑最小间隔(毫秒)
maxChunkLength2000非编辑模式下单条消息最大长度
showToolCallstrue是否在流式输出中显示工具调用过程

常见问题

流式输出为什么有时不生效?

  • 某些模型供应商不支持流式 API,OpenClaw 会自动回退到非流式模式
  • 部分本地模型(通过 Ollama)在首次加载时可能不支持流式输出

消息闪烁问题

如果 Telegram/Discord 中消息频繁闪烁,可以增大 updateInterval 值(如 500 或 1000),减少编辑频率。

基于 MIT 协议发布