Files
analysis_claude_code/learn-pi-agent/README.md
2026-06-16 00:10:35 +08:00

5.4 KiB
Raw Permalink Blame History

learn-pi-agent

一套 Agent Harness 工程课程。用 TypeScript 从零累积实现一个机制健全、心智与 Pi 一致的 mini Pi。

12 节,每节只加一个机制。每节的 code.ts 是前一节的超集——学完 s12你手里有一个完整可运行的 mini Pi而不是 12 个互不相连的玩具。


mini Pi 的一轮,长什么样

12 个机制不是 12 个零件是一台机器。下面是完整的一轮turn执行链——每一步都标注了它来自哪一节

newTurn(userInput, trust):

  1. 按信任加载项目资料,组装进 systemPrompt
     systemPrompt = buildSystemPrompt(loader.load(trust))   ← s08 资源 + s11 trust

  2. 用户消息进入历史树
     session.append(user message)                           ← s07 历史树

  3. 一轮开始拍快照systemPrompt / tools 固定model 在 state
     snapshot = createTurnSnapshot(session, registry,
                                    loader, trust)          ← s06 快照

  4. 工具循环(上限 maxTurns
     while 未结束:                                          ← s04 循环 + R5 终止
       input  = buildProviderInput(snapshot, state)         ← s01/s02/s08model 从 state
       events = provider.stream(input)                      ← s03 事件流
       for event in events:
         tool_call → executeToolCall(registry, hooks, call) ← s05 hook出错不崩 R4
                        before → handler → after
         text_delta → 累加文本
       若本轮无 tool_call → 跳出循环

  5. assistant 消息进入历史树
     session.append(assistant)                           ← s07

  6. 输出core 产事件mode 决定怎么展示)
     mode.render(events)                                 ← s10 运行方式

  旁路:
     extension 通过 API 注册 tool / command              ← s09
     package 把一组能力打包、按清单分发                  ← s12

这一条链就是 mini Pi 的"心智"。每个机制都接在前一个上——加载、历史、快照、循环、执行、边界、输出,首尾相接。

注意trust 只决定项目资料是否加载;执行权限不在 core 内解决,系统级边界交给容器或沙箱。


12 节累积演进

每节只加一个机制,code.ts 是前一节的超集R8。精确契约见 EVOLUTION.md

主题 给 mini Pi 加的零件 Pi 边界
s01 Agent Core core + provider存一轮消息 provider 输入边界
s02 Tool Contract 工具拆成 spec给 provider+ handler留本地 工具契约边界
s03 Provider Event Stream provider 从一次性返回升级为事件流 provider 输出边界
s04 Evented Tool Loop tool_call → 执行 → 结果回写,带循环和终止保护 工具执行边界
s05 Tool Hook Boundary 执行前后插口before / after 工具插口边界
s06 Turn Snapshot 一轮开始拍快照systemPrompt/tools 固定model 在 state 一轮状态边界
s07 Session Tree 历史从数组升级为可分叉的树 会话历史边界
s08 Context Resources 项目资料作为独立维度进入输入 上下文资源边界
s09 Extension Runtime 外部代码通过 API 注册 tool / command 扩展 API 边界
s10 Runtime Modes core 产事件,外层 mode 决定展示 运行方式边界
s11 Trust and Execution 加载看 trust、执行靠 containerization、细化拦截靠 hook 执行权限边界
s12 Package Distribution 能力整理成带清单的包分发 能力分发边界

如何阅读

按顺序 s01 → s12。每节

  1. 读「问题」和「解决方案」——理解为什么需要这个机制
  2. 读「工作原理」——看机制怎么实现,末尾的点睛说清本质
  3. 运行 code.ts,对照「试一下」的输出
  4. 看「接入主线」——这节相对上节加了什么、焊在哪

每节只引入当前机制需要的术语;后续章节的术语会在对应章节第一次出现时再解释。


运行

npm install
npm run s01    # 从这里开始
npm run s02
# ...
npm run s12

所有章节用固定输入、fake provider 和内存数据,运行不依赖真实模型 API。


课程宪法

EVOLUTION.md 是工程对照基准,每节的 code.ts 和 README 都对照它:

  • 8 条元规则R1 字段只增、R2 方法只增、U1/U2 受控升级、R4 错误不崩、R5 循环终止、R6 加载/执行分离、R7 输出抽象、R8 累积
  • 核心类型字典:每个类型的稳定定义 + 引入节 + 演变
  • 12 节累积主表:每节加什么、保持什么不变
  • README 写作规范:问题驱动 + 五条写作规则(含词汇纪律、去 AI 味)

和 Pi 的关系

learn-pi-agent 不逐行解释 Pi 源码。每节先写一个最小机制再在折叠的「Pi 源码溯源」里说明它对应 Pi 的哪个设计位置。真实 Pi 更复杂,教学版只保留每个机制的最小主干——但机制之间的连接是齐全的,这就是上面那条 turn 执行链。