详解 Claude Code 源码
赛博浮世绘 · 晓风乾 · 24 站拆解
回首页
详解 Claude Code 核心引擎 2.1 · AsyncGenerator 管道
篇章二 · 2.1

AsyncGenerator 流式管道

篇章二进心脏。先建立这门课最重要的一个心智模型:从 API 到你的终端,数据流过五层「能暂停的函数」。后面三站都是在某一层里放大看。

整个系统,是一条套一条的传送带

Claude Code 里没有「调一次 API 拿完整结果」这回事。模型每吐出一个 token 片段,消息就沿着五层 AsyncGenerator 逐层上浮,每层都能看一眼、改一改、或者喊停。

30 秒懂 AsyncGenerator

普通函数:调用 → 干完 → 一次性返回。AsyncGenerator(async function*):每算出一件东西就 yield 出去等下游来取,取一件给一件,随取随有——像流水线上一个一个传下来的零件。

async function* source() {
  yield '第 1 块';   // 吐出来,停住,等下游取
  yield '第 2 块';
}
for await (const item of source()) { console.log(item) }  // 逐件消费

关键在嵌套:外层用 yield* 接管内层,数据就穿过多层——每层都是中间商。

一条消息的上浮之旅 点击发送,看数据怎么穿过五层
withRetry最内层 · 出错时拦截重试
API StreamSSE 事件 → 消息块
queryLoop组装一轮对话
QueryEngine会话状态管理
REPLReact/Ink 逐字渲染
⚡ retry: attempt 2, waiting 1.0s…
▌token
打开开关再点发送,每种能力看效果
这个设计买到三种能力
01
可拦截

任何中间层都能对路过的数据做变换:API 层把 SSE 增量攒成消息块,压缩层把旧工具结果清空替换。

02
可注入

中间层能自己造消息塞进流里:重试层 yield 一条「正在重试(第2次)…」的状态消息,UI 立刻显示——不用任何全局事件总线。

03
可取消

你按 Esc 中断回答,一个 AbortController 信号沿管道逐层传播,每一层收到信号就地释放资源。没有 kill -9 式的粗暴终止。

本站要点:记住「传送带」这个模型——流式、拦截、注入、取消,全部由同一个机制买单。下一站我们钻进第三层 queryLoop,看这条传送带的「驱动轮」:一个 while(true) 循环。