96SEO 2026-08-13 04:25 0
在 Claude Code 的交互循环里模型请求与响应的细节往往隐藏在层层包装之中。下面按顺序拆解调用链,逐步呈现流式数据如何被拼装、错误如何被回滚、使用者中断如何被处理。并把开发者最关心的痛点嵌入每个环节。
至于主线只有三步,queryLoop 发起调用 → queryModel 组装 API 碎片 → 返回给 REPL 与 Agent。接下来直接进入这三个关键位置。

deps.callModel 是谁
源码位置:
src/query/deps.ts:
export type QueryDeps = { callModel: typeof queryModelWithStreaming /* …*/ }
export function productionDeps { return { callModel: queryModelWithStreaming } }
解释:
deps.callModel 默认指向 queryModelWithStreaming,可以在测试时替换为假函数。
源码位置:
src/services/api/claude.ts:
export async function* queryModelWithStreaming {
return yield* withStreamingVCR {
yield* queryModel
} )}
"真正请求 API 的地方是下面的
源码位置:
src/services/api/claude.ts:
async function* queryModel {
let stream;// ... 构造 params 并开启流式返回
const result = await anthropic.娱乐a.messages.create;// stream:true
stream = result.data;// 原始事件流
"stream: true"代表着 API 会持续推送事件,而不是一次性返回完整答案。下面展示事件结构及其拼装过程。
// src/services/api/claude.ts
async function* queryModel {
for await {
// part 类型:message_start / content_block_start / content_block_delta / content_block_stop / message_stop
// ...
}
}
# 使用者痛点 # 1️⃣ 当你看到 “content_block_start” 和 “content_block_delta” 时很难判断它们到底是哪一块内容。3️⃣ 如果出现网络断连,已有的部分结果会残留。导致 UI 上出现重复信息或工具被执行两次。
// src/services/api/claude.ts
switch {
case 'content_block_start': {
switch {
case 'tool_use':
contentBlocks = {
...part.content_block。input: '',// 参数还未收完
};break,case 'text':
contentBlocks = {
...part.content_block。text: '',},break;按理说,}
break,}
}
**主要原因**:
1️⃣ 当 `delta.type === 'text_delta'` 时将文本追加到 `contentBlock.text`。说起来,2️⃣ 当 `delta.type === 'input_json_delta'` 时把 JSON 字符串拼接到 `contentBlock.input`。**使用者痛点**:
🔍 **“参数怎么拆成多段?”** — 开发者需要手动追踪每一次 `input_json_delta` 的累积结果,否则容易误认为参数已完整。---
### ``:正式生成 AssistantMessage
case 'content_block_stop': {
const contentBlock = contentBlocks;const message = {
message: normalizeContentFromAPI。type: 'assistant',uuid: randomUUID,timestamp: new Date.toISOString,};newMessages.push;
yield message;}
**说明**
- 每个内容块结束时才产出一条 ``;如果回答包含文字+工具,则会分别产生两条消息。**使用者痛点**
⚡️ **“为什么我看到两条 AssistantMessage?是否代表两轮对话,按理说,”** — 只是同一次回答里的不同内容块。---
## StreamEvent 与 AssistantMessage 的双重用途
// src/services/api/claude.ts
for await {
// ...
yield { type:'stream_event',event: part };}
1️⃣ **实时 UI 更新** – REPL 接收到 `` 后立即渲染文本或工具参数。2️⃣ **后端流程控制** – 同一事件也会被转发到 ``,用于判断是否触发 Tool 执行。### REPL 如何处理这些事件?// src/utils/messages.ts
function handleMessageFromStream{
switch{
case 'content_block_delta':
if {
onStreamingText;}
if {
onStreamingToolUses(items=>{
const cur=items.find;ifreturn items;return,});}
break,// …其实,}
}
---
## 异常处理与回滚
### Streaming Fallback
// src/services/api/claude.ts
catch{
if{
throw streamingError;}
// ,其他错误逻辑…yield* executeNonStreamingRequest;// 非流式一次性返回完整结果
}
#### Tombstone 撤销旧结果
// src/query.ts
if{
for{
yield{type:'tombstone',message:old};}
}
### Model Fallback
// src/query.js / withRetry
if && consecutive529Errors>=MAX_529_RETRIES && options.fallbackModel){
throw new FallbackTriggeredError;按理说,}
#### 在 `queryLoop` 中捕获并重试
catch{
if{
currentModel=fallbackModel;attemptWithFallback=true;// 清空当前尝试产生的数据结构,接下来重新发起请求。}
}
---
## 使用者主动中断
1️⃣ **创建 AbortController 并传递给 SDK**
// REPL 创建 AbortController 并注入查询流程。const controller=createAbortController;void onQuery;2️⃣ **AbortSignal 被触发**
abortController?.abort,3️⃣ **SDK 抛出 APIUserAbortError 并终止流**
catch{
if{
throw streamingError;// 不走 fallback,仅停止当前请求。其实,}
}
4️⃣ **补充缺失的 Tool Result**
if{
yield* yieldMissingToolResultBlocks;return { reason:'aborted_streaming' };}
这样即使工具已经被调度,也能得到对应的失败结果。话说回来,---
## 小结
-
MVP Flow: .
-
Tombstone + Non‑stream Fallback: .
-
User abort: .
-
Error recovery: .
-
Cleans up: .
通过以上拆解。你可以快速定位问题所在:无论是调试实时输出、排查重复 Tool 执行还是调整异常恢复策略,都能从代码层面找到对应入口。希望这份全景图能帮你把 Claude Code 的复杂调用链理清楚,让日常开发更高效、更可控。
Series update by cc.windliang.wang | ©2026 All rights reserved.
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback