从一个小 Agent 读懂 Pi

本系列文档基于 Pi v0.80.10 源码。我们不从一堆目录和术语开始,而是先做一个很小的 Agent,再一步步看 Pi 为了让它真正可用,增加了哪些能力。

如果你只想先抓住重点,请从 从一个最小 Agent 开始 开始。读完它,你应该能用自己的话解释:模型为什么需要工具、Agent 为什么需要循环,以及 Pi 的源码里这些东西分别在哪里。

系列导航

文档内容难度
前置知识与学习路径需要什么基础,以及应该怎样读源码入门
从一个最小 Agent 开始用一个小 Demo 理解模型、工具和 Agent Loop入门
环境搭建与调试把源码跑起来,学会用断点观察它入门
从终端到 TUIpi 如何启动,并把控制权交给 TUI核心
从输入到 LLM 循环一条消息如何变成模型调用和工具执行核心
核心架构与设计哲学Pi 为什么这样拆分,以及它的长处和取舍核心
pi-ai:Models 运行时与 Provider 架构模型、Provider 和 coding-agent 如何连接深入
项目信任与认证体系项目安全、凭证和登录流程深入
上下文压缩与会话分支长会话为什么需要摘要和分支深入

速览:Pi 是什么?

Pi 是一个终端 AI 编码智能体(Terminal AI Coding Agent)。它的核心理念:

┌────────────────────────────────────────────────────────────┐
│                        终端(Terminal)                       │
│                                                            │
│   ┌─────────┐    ┌──────────────────┐    ┌──────────────┐  │
│   │  用户    │◄──►│   TUI 界面        │◄──►│  Agent 循环   │  │
│   │  输入    │    │  (编辑器 / 渲染)   │    │              │  │
│   └─────────┘    └──────────────────┘    └──────┬───────┘  │
│                                                  │          │
│   项目信任 / 认证 / 模型解析 / 扩展 / Skill / 工具  │          │
│                                       ┌──────────▼───────┐  │
│                                       │  LLM Provider      │  │
│                                       │ (OpenAI / Anthropic│  │
│                                       │  / 30+ 自定义)     │  │
│                                       └──────────┬───────┘  │
│                                                  │          │
│                                       ┌──────────▼───────┐  │
│                                       │  工具执行         │  │
│                                       │ read / write /   │  │
│                                       │ bash / edit / ...│  │
│                                       └──────────────────┘  │
└────────────────────────────────────────────────────────────┘

先记住三个角色

角色它做什么先看哪里
模型根据上下文回答,或提出工具调用pi-aiModels / Provider
循环执行工具,把结果放回上下文,再请求模型packages/agent/src/agent-loop.ts
产品处理终端交互、会话、认证、项目安全和扩展packages/coding-agent

注意:pi-aipi-coding-agent 的文件数看起来很多,其中相当一部分是按 Provider 生成的模型目录providers/*.models.ts)和工具实现,手写核心逻辑仍然集中在几千行内。

一句话理解 Agent

用户问题
  → 模型决定“直接回答”还是“调用工具”
  → 程序执行工具并检查结果
  → 把结果交回模型
  → 重复,直到得到最终回答

Pi 的关键设计是把“决定下一步”和“真正执行”分开:Agent Loop 不直接处理 API key,也不绑定某一家模型,而是通过 streamFn 请求模型。coding-agent 再用 ModelRuntime 接上模型、认证、配置和 Provider。

读完后你会得到什么?

读完本系列,你将:

  1. 能用自己的话解释 Agent,而不是只会背 API 名称。
  2. 能写出一个带工具的简易 Agent,并知道它还缺少哪些生产能力。
  3. 能沿着一条真实请求读懂 Pi 的核心源码。
  4. 理解 Pi 为什么强调可扩展、可替换和把安全边界交给程序控制。
  5. 再按需要学习 Extension、Skill、Tool、自定义 Provider 和 TUI。

快速开始

# 1. 克隆源码(注意仓库已从 pi-mono 迁移到 pi)
git clone https://github.com/earendil-works/pi.git
cd pi

# 2. 安装依赖(不执行生命周期脚本)
pnpm install --ignore-scripts

# 3. 检查代码质量(类型 + lint + 依赖检查)
pnpm run check

# 4. 直接运行源码(无需构建)
npx tsx packages/coding-agent/src/cli.ts --help

Node.js 版本要求以源码仓库的 package.json 和 CI 配置为准。开发时可以直接用仓库提供的脚本运行检查;需要追踪单个入口时,再使用 tsx 运行 TypeScript 源码。

阅读建议

如果你只有半小时:

  1. 从一个最小 Agent 开始
  2. 只看 从输入到 LLM 循环 的“Agent Loop”部分。
  3. 回到这里,再选择你感兴趣的方向。

然后按需深入: