ZH

 


扩展:把零件拼成你自己的 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 平台」——同一个引擎,换一套扩展,就是另一个专用助手。