How Pi Works · 互动图解
Day 1 配套互动教材 · 基于第一性原理

Pi 到底是怎么运转的?

抛开复杂的表层概念,Pi 的本质其实是一个四方协调器:它把用户消息放进会话树,组装好上下文发给模型,执行模型请求的工具,再把结果记录下来,循环往复直到任务完成。点击下方四个核心部件,看看它们各自负责什么:

模型请求(Model Requests):Pi 通过选定的模型供应商(Provider)发送结构化请求并接收流式响应,响应里既可以有给用户看的文本,也可以有请求调用工具的指令(Tool Calls)。
01 / Agent Loop 模拟器

看懂 Turn(轮)与 Run(运行)的本质区别

选一个场景,点“下一步”逐步观察:模型每响应一次并执行完工具,就是 1 个 Turn;从提交消息到再也不需要请求模型为止,才构成 1 次完整的 Run。

当前状态
待开始
Turn / Run 计数
Turn 0 · Run 0
消息队列
空
① 提交消息写入活跃分支
② 请求模型组装上下文发送
③ 流式响应文本 / Tool Calls
④ 执行工具记录 Tool Result
⑤ 循环判定继续 Turn 或结束 Run

一轮(Turn)是什么?

Pi 发一次模型请求 → 收到助手响应 → 执行这次响应里的工具并记下结果,这就完成了一个 Turn。

一次运行(Run)是什么?

从用户提交消息起,只要工具结果或队列消息还需要继续问模型,就自动开启下一个 Turn,直到模型不再调用工具且队列清空,本次 Run 才结束。
02 / Context 上下文组装实验室

发给大模型的请求,究竟是怎么拼出来的?

模型没有“记忆”,每次请求都是 Pi 从活跃分支、系统指令、工具定义和按需加载的资源里现场拼出来的。勾选左侧积木,观察右侧请求体和上下文构成的变化。

模拟请求体预览(Model Request) ~1,650 tokens
蓝:系统与规则 · 黄:工具与技能 · 珊瑚红:会话历史与输入

        
03 / Session Tree & Compaction

为什么说 Pi 的会话是一棵“树”,而不是列表?

持久化会话文件是 .jsonl,每条记录都有 id 和 parentId。点击树上的任意节点切换“当前条目”,看看活跃分支和上下文重建如何立刻变化。

提示:带蓝框的是当前的活跃分支(Active Branch);带红晕的是当前条目(Current Entry);被压缩替代的老消息在树中依然保留(带删除线仅表示“不再发给模型”)。

重建后的模型上下文(发给模型的历史)
04 / 接口统一性 · 扩展 · 信任边界

五种外壳共用同一颗内核,启动顺序决定安全边界

Interfaces:换壳不换核
Trust & Extensions:为什么顺序不能反?
Step 1 · 解析信任

先判断 Project Trust

在加载任何项目配置、扩展或文件前,Pi 先决定是否信任当前项目目录,防止恶意仓库自动执行代码。

Step 2 · 加载资源与扩展

Extensions / Skills / Themes

Extensions 作为 TypeScript 模块直接加载进 Pi 进程,注册工具、命令、快捷键与自定义 UI;可与 Skills、模板、主题一起通过 npm / git 分发。

Step 3 · 权限边界

进程级 OS 权限

之后才加载上下文文件。所有启用的工具与扩展共享 Pi 进程本身的操作系统权限,因此隔离(容器/沙盒)与信任检查非常关键。

05 / Day 1 理解自测

3 道题检验你是否真的看懂了

Q1. 模型返回了 2 个 tool calls,Pi 执行完这 2 个工具并把结果发回模型后,模型才给出最终文字回复。这次过程一共包含几个 Turn、几次 Run?
解析:第 1 次请求返回 2 个 tool calls + 执行并记录结果 = 第 1 个 Turn;把结果发给模型得到最终纯文本回复 = 第 2 个 Turn。它们共同完成这 1 次用户任务,所以是 2 个 Turn,1 次 Run。
Q2. 执行 Compaction(上下文压缩)之后,原本更早的对话条目在 JSONL 会话文件里会怎样?
解析:Pi 的会话树是只增不毁的历史记录。Compaction 只是插入一条摘要条目,在重建后续模型上下文时替代老消息,原始条目依然留在树里。
Q3. 如果你在 Agent 正在忙着调用工具时发了一条 Steering(引导)消息,它会在什么时候进入对话?
解析:Steering 在当前 Turn 结束后就立刻介入纠偏;等 Agent 做完所有待处理工作才插入的叫 Follow-up。