π Pi 轻松学
首页 / 第 6 篇

改造成你的 —— 扩展、技能与 SDK

30 秒版本: Pi "没有"的东西都是故意的——因为它把零件给了你。TypeScript 扩展能在运行中热改 Pi,技能按需教会它新本事,包把这一切打包分享,SDK 让你把整个引擎嵌进自己的应用。


自我扩展的 Agent

还记得第一章那个赌注吗:核心做小,把造东西的工具交给用户。这一章就是回报——Pi 给你的五根杠杆:

  1. 扩展(Extensions)——改变 Pi 行为的 TypeScript 代码
  2. 技能(Skills)——模型在相关时自己读的 markdown 手册
  3. 提示词模板(Prompt templates)——斜杠命令背后的可复用提示词
  4. 主题(Themes)——终端颜值,毕竟你要盯着它一整天
  5. 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