流式处理
流式处理是 Agent 系统的关键特性——让用户在 AI 生成回复时就能看到部分输出,而不必等待完整回复。OpenClaw 的流式处理涉及 delta 缓冲、block 合并和多种回调。
流式架构
Delta 处理流程
每个从模型收到的 delta(文本片段)经过以下处理:
- 追加到
deltaBuffer - 更新 inline code state(感知代码块)
- 检测 block state 标记(
<thinking>,<final>) - 推送到 BlockChunker 进行合并
- 触发
onPartialReply回调
Inline Code State
流式处理需要感知 Markdown 代码块状态,避免在代码块中间断开消息:
在代码块内部,分块器不会强制发射,而是等待代码块结束。
推理模式
Agent 支持三种推理模式:
| 模式 | 行为 | 用例 |
|---|---|---|
"off" | 丢弃 thinking 块 | 默认,快速响应 |
"on" | thinking 包含在最终输出 | 显示完整推理过程 |
"stream" | thinking 通过独立回调发送 | 实时显示推理 |
回调接口
流式处理通过回调将数据传递给上层:
| 回调 | 触发时机 | 用途 |
|---|---|---|
onBlockReply | BlockChunker 合并后 | 投递有意义的文本块 |
onPartialReply | 每个 delta 后 | 打字机效果 |
onReasoningStream | thinking 内容 (mode=stream) | 实时显示推理 |
onBlockReplyFlush | 工具调用前 / 完成时 | 强制刷新缓冲 |
onToolResult | 工具执行完成后 | 通知上层 |
回调时序
关键时序规则:
- onPartialReply 在每个 delta 后立即触发(用于打字机效果)
- onBlockReply 在 BlockChunker 合并后触发(用于实际投递)
- onBlockReplyFlush 在工具调用前强制触发(保持消息边界)
- onToolResult 在工具执行完成后触发
工具调用边界
在工具调用前,流式处理会强制 flush 所有缓冲内容,确保用户在看到"正在执行工具..."之前,已经收到了所有待发送的文本。
这种边界保持策略让消息流对用户更加清晰——AI 的文字回复和工具操作之间有明确的分界。
小结
- 流式处理包含三层:Delta 缓冲 → Block 合并 → 回调分发
- Inline Code State 感知代码块,避免在代码中间断开
- 推理模式(off / on / stream)控制 thinking 块的可见性
- 五个回调函数覆盖完整的流式生命周期
- 工具调用前 强制 flush,保持消息边界清晰
下一章:插件系统概述