首页
看点啥
插画图片
首页 看点啥 按下回车之后,Claude Code 在 100ms 内做了什么?

按下回车之后,Claude Code 在 100ms 内做了什么?

2026-07-29 0

1. 字逐个显示出来

你在终端输入一句话并按下回车,屏幕便逐字显示内容;其间还会自动执行几个命令、读取几份文件、修改一两个文件,最后给出一段总结。整个过程有时只需一两秒,有时则要几十秒。

那么,这一秒内究竟发生了什么?

理解 Claude Code 这类 Agent,关键恰恰在于这些问题。那么答案究竟是什么?

2. 答案是一条流水线

答案其实并不神秘:把完整流程展开,就是一条普通流水线,再加上一个 while 循环。让模型能够实际动手的这套脚手架,名为 Harness。

概括成一句话:一次回合 = 一个 while 循环 + 一条流式事件管道。

这里需要记住两个关键词:其一是“循环”,Agent 的全部“自主性”由此产生;其二是“流式”,打字机效果、工具实时进度以及可被 Ctrl+C 中断的能力,都建立在 yield 这个字之上。接下来的三节,将逐层拆解并说明这句话。

3. 核心骨架只有8行

要拆解这套机制,最省力的切入点并不是直接阅读源码—src/query.ts 它有 1700+ 行,仅 queryLoop 就超过上千行,直接读下去很容易迷失。应先抽出骨架:移除 hook、权限校验、压缩、计费与日志等外壳后,其本质与一个 8 行玩具 Agent 并无不同。

以下内容就是 Harness 单次回合的最小骨架:

# 极简版:harness 行动回路的最小实现messages = [{"role": "user", "content": prompt}]while True:resp = client.messages.create(model=MODEL, messages=messages, tools=tools)messages.append({"role": "assistant", "content": resp.content})if resp.stop_reason != "tool_use": # 模型不再要工具 → 说完了breakresults = run_tools(resp.content)# 执行模型要的工具messages.append({"role": "user", "content": results})# 结果塞回去

盯住三个关键点:

记住这三点,后续开展Harness工程实践时,就不容易被各类 hook、权限、压缩和子 Agent 干扰;它们只是 Harness 为骨架增加的“器官”,骨架本身仅有这三行。

还需注意一个细节:这个极简版本采用“同步”方式——create 调用结束并取得完整 resp 后才继续执行。Claude Code 的真实实现则采用流式方式,模型一边输出 token,循环一边接收。不过骨架并未改变,只是把“一次性 resp”替换为按时间顺序抵达的一连串事件。流式影响体验与响应速度,却不改变结构。

4. Harness 五脏速览

理解骨架后,再把 Claude Code 的真实实现叠加上去。下图呈现一次完整回合的全景,也概览了 Harness 五脏在这一秒中的工作。每个节点都对应一个“器官”,后文将分别放大说明;此处先记住这张图,因为它是后续内容的导览。

下面逐一查看节点,同时辨认各个器官:

一句话概括该图:回车 → 加工 → queryqueryLoop(模型与工具反复接力)→ 流式 yield → 渲染。生产级系统的全部关键机制都集中在中间的循环,而这个循环正是行动回路。

5. 回到最初的悬念

现在重新审视第 1 节留下的悬念——“Harness 究竟做了什么”。答案分布在图中的各个节点,并呈现为你能观察到的三类现象:

可以发现,这三类现象没有一项由 Harness “思考”产生。Harness 只把模型决策转换成动作,再把动作结果送回模型;智能始终位于模型一侧。

6. 把 Harness 理解为一个值班室

可以将整套 Harness 理解成一个值班室。

你作为送件人,把工单(输入)交到窗口。值班员(queryLoop)收到工单后只做一件事:致电专家(模型)询问:“这个该如何处理?”

专家回答:“我需要查看 X 文件。”值班员不会亲自查,而是安排助理(工具)查询并带回结果,随后再次致电专家:“已经查到,内容如下,接下来呢?”专家又说:“再看看 Y。”流程如此循环。

直到某一次,专家表示:“可以了,我明白了,答案就是这个。”——end_turn。值班员整理最终答案后,再从窗口递交给你。

关键在于明确分工:值班员和助理都属于 Harness,专家才是 Agent(模型)。值班员不负责思考,只负责传话与派活(行动回路);助理不做判断,只负责执行(工具系统);真正决策的只有专家。循环驱动且职责清晰,这就是 Harness 的本质。Claude Code 的 query.ts 那 1700+ 行代码,主要是在为值班员、专家和助理分别增加护栏与助手:为值班员配置恢复机制(避免循环崩溃)、为专家整理上下文(工作记忆)、为助理增加权限审批(护栏)。

还有一个常被忽视的细节:值班员与专家之间采用双工通话——专家边说,值班员边向外传递(流式 yield),而不是等专家结束通话后再统一汇报。这就是终端内容逐字出现的原因。这个比喻恰好对应 TypeScript 中的 async function*for await 这组语法:它们本来就是为“边生产、边消费”的流式管道设计的。

7. 智能并不在代码中

回到最初的错觉:Claude Code 的智能不在代码内部。代码属于 Harness,Agent则是模型。一次回合只是 Harness 借助一个 while 循环把模型决策转化为动作,再以流式形式显示到屏幕——query.ts 那 1700+ 行代码,都是为这个循环配置的器官与护栏。

而 Harness 的这些器官,恰好构成整个系列的地图:

请记住这张地图,它就是整个Harness的五脏六腑。

8. 后记

重新回顾一次会话的处理过程,会发现其中还有一个问题:如果专家始终要求调用工具,从不说“说完了”,该怎么办?更现实的情况是,对话过长、上下文窗口即将耗尽、工具运行失败或权限遭到拒绝,此时循环如何自救?那个 8 行的 while True 完全 hold 不住这些情况,要么会无限循环,要么会崩出一段 stack trace。

8 行的 demo 循环与 1700+ 行的生产级 queryLoop之间,差异就在于“如何避免崩溃”。这正是 Harness 工程的核心难题之一:可靠性。

下一篇,我们将深入 queryLoop 这个节点,查看一个循环中的 7 种 continue——其中每一行 continue 都代表一种自救动作:工具失败后如何重试、上下文接近上限时怎样压缩、配额超限后如何降级、模型越界时如何纠正。只有理解这 7 条路径,你才会真正相信:Agent 不会在执行途中卡死。

Let's go!

喜欢(0)

上一篇

ComfyUI Canny 边缘检测完整教程

ComfyUI Canny 边缘检测完整教程

下一篇

一篇文章,多样呈现:我用 Seed Evolving 制作知识卡片

一篇文章,多样呈现:我用 Seed Evolving 制作知识卡片
猜你喜欢