扩展:把零件拼成你自己的 agent
工具、技能、提示词、hook、主题——这些都是「零件」。Extension 是把若干零件打包在一起的单元:装上它,pi 就多出一组能力;卸下它,干干净净。
一个 extension 长什么样(真实 API)
import { defineTool, type ExtensionAPI } from "@earendil-works/pi-coding-agent"
// 扩展是一个「拿到 pi 句柄」的函数,在函数体里注册能力
export default function myExtension(pi: ExtensionAPI) {
pi.registerTool(myTool) // 新增工具
pi.registerCommand("deploy", { ... }) // 新增斜杠命令
pi.registerMessageRenderer("my", render) // 自定义消息渲染
pi.on("turn_start", () => { ... }) // 订阅事件
pi.on("tool_call", (call) => { ... })
pi.on("tool_result", (res) => { ... })
}注意:扩展不是一个声明式配置对象,而是一个命令式注册函数——pi 把句柄 ExtensionAPI 交给你,你在函数体里 registerTool / registerCommand、用 pi.on(...) 订阅事件。真实示例见仓库里的 examples/extensions/learning-tour.ts。
装 / 卸都只是「合并 / 移除」
还记得 Resource Loader 的多源合并吗?扩展正是合并的参与者。装一个扩展,就是把它注册的工具、命令、事件订阅并进当前运行时;卸载则是从中拿掉。实时累计的 token 预算也随之增减——工具与技能装得越多,常驻 Context 越大。
基础能力 + extension A + extension B tools +myTool +deploy 命令 +/review +/k8s 事件订阅 +on(turn_start) +on(tool_call) ─────────────────────────────────────── 合并后的运行时(token 预算随之累加)
扩展机制让 pi 从「一个固定的 coding agent」变成「一个可塑的 agent 平台」——同一个引擎,换一套扩展,就是另一个专用助手。