改造成你的 —— 扩展、技能与 SDK
30 秒版本: Pi "没有"的东西都是故意的——因为它把零件给了你。TypeScript 扩展能在运行中热改 Pi,技能按需教会它新本事,包把这一切打包分享,SDK 让你把整个引擎嵌进自己的应用。
自我扩展的 Agent
还记得第一章那个赌注吗:核心做小,把造东西的工具交给用户。这一章就是回报——Pi 给你的五根杠杆:
- 扩展(Extensions)——改变 Pi 行为的 TypeScript 代码
- 技能(Skills)——模型在相关时自己读的 markdown 手册
- 提示词模板(Prompt templates)——斜杠命令背后的可复用提示词
- 主题(Themes)——终端颜值,毕竟你要盯着它一整天
- Pi 包(Pi packages)——以上一切的打包,从 npm 或 git 安装
前两根杠杆干重活,篇幅给它们。
扩展:边飞边修飞机
扩展是一个 TypeScript 文件,Pi 启动时加载。它能注册新工具、斜杠命令、快捷键、事件监听、主题——而且支持热重载:会话进行中改文件,改动立即生效。
热重载听起来像个便利功能,直到你意识到它解锁了什么:你可以让 Pi 改进 Pi。"给我写个扩展,禁止写入 main 分支的文件"——Pi 写出文件,外壳捡起来,新规则已经在生效。不用重启,不用重新构建。扩展系统就是 Pi 社区用来造出那些 Pi 拒绝内置的功能的方式:计划模式、权限门禁、MCP 桥接、沙箱。
扩展长什么样——注册一个小工具的完整示例:
import type { PiExtension } from "@earendil-works/pi-coding-agent";
const extension: PiExtension = {
name: "weather",
register(pi) {
pi.registerTool({
name: "weather",
label: "Weather",
description: "Get the current weather for a city",
parameters: { city: { type: "string" } },
execute: async (_id, { city }) => {
const res = await fetch(`https://wttr.in/${city}?format=3`);
return { content: [{ type: "text", text: await res.text() }] };
},
});
},
};
export default extension;
(真实扩展能干更多——挂事件、渲染自定义 UI、拦截工具调用——但形状就是这个:拿到注册句柄,想拧什么拧什么。)
因为扩展还能挂上第二章讲的事件流,一切"旁观与拦截"的逻辑都有了官方安放处:审计日志、编辑后自动格式化、轮次结束发通知。核心保持干净,你的观点住在外围。
技能:按需加载的知识
技能是温柔一些的杠杆。扩展加能力(新工具、新行为),技能加知识——某类任务该怎么做。
一个技能就是一个带 SKILL.md 的目录:名字、描述、说明(外加可选的辅助脚本和参考文档)。Pi 实现了开放的 Agent Skills 标准,意味着技能跨外壳通用——Pi 甚至能直接加载 Claude Code 和 Codex 目录里的技能。
魔法在于加载方式,记忆章见过的那个:提示词里只放每个技能的名字和描述,全文等任务匹配时按需读取。十个技能的索引花几百 token,而不是几万 token 的嵌入全文。
最小技能长这样:
---
name: changelog
description: Generate changelog entries from recent git commits
---
# Changelog generation
1. Run `git log --oneline v{last-tag}..HEAD`
2. Group commits by feature / fix / chore
3. Write entries in the style of CHANGELOG.md
...
放到 ~/.pi/agent/skills/changelog/SKILL.md(或项目的 .pi/skills/,或 ~/.agents/skills/ 与其他外壳共享),以后你说"写 changelog",Pi 自动用它。
包:打包分发
上面的一切——扩展、技能、模板、主题——都能装进一个 pi 包,像其他依赖一样安装:
pi install npm:@someone/pi-extras
pi install git:github.com/someone/pi-goodies
这就闭环了生态赌注:Pi 不内置的功能没有消失——它们活在社区包里,一条命令的事。
SDK:把 Pi 当引擎
最后一根杠杆,也可能是最有力的:你完全可以不用 Pi 的终端。coding-agent 包同时就是 SDK——把整个引擎(循环、工具、会话、压缩)嵌进你自己的应用:
import { createAgentSession, ModelRuntime, SessionManager } from "@earendil-works/pi-coding-agent";
const modelRuntime = await ModelRuntime.create();
const { session } = await createAgentSession({
sessionManager: SessionManager.inMemory(),
modelRuntime,
});
session.subscribe((event) => {
if (event.type === "message_update" &&
event.assistantMessageEvent.type === "text_delta") {
process.stdout.write(event.assistantMessageEvent.delta);
}
});
await session.prompt("What files are in the current directory?");
十五行左右,一个无头 Agent。在此基础上你可以造 Web UI、Slack 机器人、CI 审查员、拷问 Agent 行为的测试框架——任何东西。还有 RPC 模式(stdin/stdout 上的 JSON)让 TypeScript 之外的语言驱动 Pi,以及给流水线用的 JSON 流式模式。
注意架构上的含义:终端产品和你自定义的产品,用的是同一个引擎。Pi 变强,两边一起变强。
带走的话
大多数工具递给你的是功能,Pi 递给你的是杠杆——五条官方认可的改造路径,从一个 markdown 文件到完整的 SDK 嵌入。维护者自己的标题总结得最好:这是一个自我扩展的编码 Agent。而它最妙的地方不在于"可扩展"本身——一个能改写自己的 Agent,恰恰也是最容易被真正看懂的 Agent。
看懂它,正是这整个网站想做的事。
资料来源: Extensions · Skills · SDK · Pi packages