总体架构

最后更新:2026-10-10

Pi 架构最值得学习的地方,是它把「不稳定的外部世界」和「稳定的核心循环」分开了。

大模型供应商会变,工具会变,UI 会变,用户想安装的扩展也会变。但 Agent Loop 的本质相对稳定:准备上下文、请求模型、处理工具、写回结果、继续或停止。把这两类东西分开,是 Pi 能长期演进的根基,也是它「可自我扩展」名字的来源——外设可以变,内核不动。

三层分工

Layer 1 · 交互层
TUI / RPC / SDK

用户或外部系统通过终端界面、远程调用或直接 SDK 提交 prompt(text)。这一层只负责「发声」,不关心模型是谁。

Layer 2 · 运行层
AgentSession → Agent

Session 展开技能与模板、检查模型和认证,再把消息交给 Agent;Agent 把事件回调给 Session,Session 负责把消息与工具结果写入存储,并向上层回传 AgentSessionEvent。

Layer 3 · 核心循环
Agent Loop → pi-ai → 工具 → SessionManager

核心循环调用 streamSimple(model, context) 请求模型,收到 toolCall 后执行工具得到 AgentToolResult,再继续,直到给出最终答案或停止。

一次端到端调用

UI        → Session.prompt(text)
Session   → 展开技能/模板,检查模型与认证
Session   → Agent.prompt(messages)
Agent     → AgentLoop.runAgentLoop(context, config)
AgentLoop → AI.streamSimple(model, context)
AI        → message_update / toolCall
AgentLoop → Tool.execute(args)
Tool      → AgentToolResult
AgentLoop → AgentEvent
Agent     → 事件回调
Session   → Store.appendMessage / appendToolResult
Session   → AgentSessionEvent(回传 UI)
为什么这样分:每一层都可以独立替换与测试。换供应商只动 pi-ai,换界面只动 SDK/TUI,核心循环始终不动——这正是 Pi 可长期演进的关键。

分层带来的工程收益

分层的价值不在术语,而在它让每一层可以独立替换、独立测试。下面是一些具体场景:

这也是 Pi 能保持「可自我扩展」的原因:外设变化是常态,内核稳定是前提。想从零理解这套分层,可对照 快速上手 与上游教学版。

与「教学版」的关系

上游有一份教学版目标项目(参考 how-pi-agent-works),用最小依赖还原了同样的三层:Express 后端 + JSONL 会话存储 + MockModel + 工具注册表,帮助读者从零理解 Pi 的运行时。真实仓库在此基础上演进,增加了流式、扩展加载与多供应商适配。各层的实际代码归属,可对照 核心包 一文。

相关阅读

常见问题(FAQ)

为什么 Pi 要把系统分成三层?

因为模型供应商、工具、UI、扩展都在快速变化,而代理循环本质稳定。分层后,换供应商只动 pi-ai,换界面只动 SDK/TUI,核心循环始终不动,系统因此可以长期演进、独立测试与替换。

交互层、运行层、核心循环各自负责什么?

交互层只负责发声(TUI/RPC/SDK 提交 prompt),不关心模型是谁;运行层由 AgentSession 与 Agent 组成,展开技能模板、检查模型与认证、把消息与工具结果写入存储;核心循环调用模型、执行工具、回写结果直到给出最终答案。

换模型供应商需要改核心循环吗?

不需要。核心循环只依赖 pi-ai 的抽象,供应商差异被收敛在 pi-ai 内部。换模型通常只改配置,详见模型供应商一篇。

AgentSession 和 Agent 有什么区别?

AgentSession 处在运行层、面向用户与存储,负责展开技能模板、检查模型与认证、把消息与工具结果持久化并向上回传事件;Agent 处在运行层与核心循环之间,负责把消息交给核心循环并把事件回调给 Session。

教学版的三层和真实仓库一致吗?

一致。教学版用最小依赖还原同样的三层:Express 后端、JSONL 会话存储、MockModel 与工具注册表。真实仓库在此基础上演进,增加了流式、扩展加载与多供应商适配。

微信群二维码

扫码加入
Pi Agent 微信交流群

💬