Skip to content

简介与架构总览

这是一篇以 pi 仓库为教材的 Agent 原理教程。在进入代码之前,我们先建立一张全局地图:pi 到底由哪些部分组成,它们之间如何协作。

给初学者

如果你对 "LLM、token、工具调用、Agent、ReAct" 这些词还不熟悉,先读 预备知识:从零认识 Agent,再用大白话把这些基础概念讲透。

pi 是什么

pi 是一个分层架构的 Agent 工程。它把"Agent 应由什么组成"拆解成了几个可独立演进、独立测试的包。理解它的最佳方式,是把整个系统想象成一条从"模型调用"到"用户交互"的流水线

┌─────────────────────────────────────────────────────────────┐
│  @pi/coding-agent  交互式编码 Agent CLI(把它串起来)          │
│   会话管理 · 内置工具 · 扩展系统 · 状态持久化 · 上下文压缩        │
├─────────────────────────────────────────────────────────────┤
│  @pi/tui           终端 UI(差分渲染)                          │
│  @pi/server/client 远程会话(跨进程序列化 Agent 会话)            │
├─────────────────────────────────────────────────────────────┤
│  @pi/agent-core    Agent 运行时(核心循环)                     │
│   观察→思考→行动→观察 的循环 · 工具调用 · 状态管理 · 事件流        │
├─────────────────────────────────────────────────────────────┤
│  @pi/ai            LLM 抽象层(最底层)                         │
│   统一消息模型 · Model/Provider · StreamFunction · 事件流       │
└─────────────────────────────────────────────────────────────┘

依赖方向是自底向上的:@pi/ai 不依赖任何上层;@pi/agent-core 依赖 @pi/ai@pi/coding-agent 依赖前面所有包。

为什么这样分层

把"调用模型"和"构建 Agent"分开,是 pi 最核心的设计决策:

  1. @pi/ai 只关心"怎么把一份会话上下文发给模型,并流式拿到回复"。它不知道什么是工具、什么是循环。
  2. @pi/agent-core 只关心"如何思考、如何调用工具、如何管理状态"。它不绑定任何具体模型厂商,通过一个 StreamFunction 接口与 @pi/ai 解耦。
  3. @pi/coding-agent 把两者结合,并加上交互、会话、扩展等产品能力。

这种分层的直接收益:

  • 换一家模型厂商,@pi/agent-core 的代码一行都不用改。
  • 想给 Agent 加一个新工具,只需按契约实现 execute
  • 可以把同一个 Agent 运行在本地、远程、甚至通过协议串行化成字节流。

一张图看懂"一次 Agent 会话"

以编码 Agent 收到用户一句"帮我改一下 README"为例,整条链路的时序大致如下:

  1. cli(coding-agent)解析参数,创建 AgentSession
  2. AgentSession 内部持有一个 Agent(来自 agent-core)。
  3. Agent.prompt() 进入 agent-loop
  4. loop 把会话上下文通过 StreamFunction 交给 @pi/ai,流式拿到助手回复
  5. 若回复里带 toolCall(例如"读取 README"),loop 找到对应工具并执行。
  6. 工具结果以 toolResult 消息回填上下文,loop 再次调用模型。
  7. 如此反复,直到模型给出最终答案(agent_end)。
  8. TUI 通过差分渲染把每一步的增量画到终端。

本教程的每一章,就是这条链路上的一环。

各包职责速查

目录一句话职责
@pi/aipackages/ai统一 LLM API,多厂商,流式事件协议
@pi/agent-corepackages/agent模型无关的 Agent 运行时与核心循环
@pi/protocolpackages/protocol远程会话的字节协议(定帧 + CBOR + Schema)
@pi/serverpackages/server承载远程 Agent 会话的服务端
@pi/clientpackages/client连接远程会话的传输无关客户端
@pi/tuipackages/tui终端 UI 库,差分渲染
@pi/coding-agentpackages/coding-agent交互式编码 Agent CLI,缝合上层
@pi/storagepackages/storageSQLite 存储(可选)

接下来的路线

  • 仓库结构:把这 8 个包在磁盘上的样子摸清楚。
  • 快速开始:跑一个真实的 Agent。
  • 然后按依赖顺序,从 @pi/ai 一路读到 @pi/coding-agent