Article

我在用一个 AI 助手,它可以随时塞进新工具

adopt

我用 AI 的时间越来越长,但有一件事一直让我不舒服:

工具太散。

写稿在 Claude,出图要切到另一个地方,转录音频又是一个网站,配音又是另一个软件。每件事都要开一个窗口,登录,等待,下载,再切回来。

每次切换都是一次打断。打断多了,一上午就没了。

我想要的是:一个地方,说一句话,什么都能做。


找到了 pi

pi 是 @earendil-works 做的一个 AI agent 工具,全称 pi-coding-agent

第一眼看,有点像 Claude Code 或者 Cursor——在终端或者桌面 app 里跟 AI 对话,可以写代码、读文件、执行命令。

但有一个关键差异让我留下来了:

它支持注册自定义工具。

具体说:写一个 TypeScript 文件,放到 ~/.pi/agent/extensions/ 目录里,pi 启动时自动加载。从那一刻起,AI 就知道这个工具的存在——知道什么时候该调用它,怎么调用,结果怎么用。

这意味着什么?

意味着我可以把任何东西接进来。本地的模型、第三方的 API、自己写的脚本——只要能用命令行跑,就能包装成工具,让 AI 直接调用。


和其他 AI 助手的区别

市面上 AI 工具很多,我用过不少,说几个我觉得真正有差异的地方:

▎模型不绑死

Claude、GPT、Gemini、本地的 Qwen、Llama,配置文件里换一行就切换。不被任何一家厂商锁死,哪个模型适合做什么就用哪个。

▎工具完全开放

这是最核心的差异。Claude Code 有工具,但工具是官方定义好的。pi 的工具是你自己写的——可以调用任何东西,没有边界。

▎本地优先

没有强制云同步,没有数据上传。我的文件、我的 API key、我的声音数据,全在自己的机器上。

▎支持批处理

pi --print 模式可以当命令行工具用,塞进 shell 脚本、定时任务——AI 能力变成可编排的流程。


工具长什么样

一个最简单的 extension 大概是这个结构:

// ~/.pi/agent/extensions/my_tool.ts
export default function(pi: ExtensionAPI) {
  pi.registerTool({
    name: "my_tool",
    description: "告诉 AI 这个工具是做什么的,什么时候该用它",
    parameters: Type.Object({
      input: Type.String({ description: "参数说明" }),
    }),
    async execute(_id, params, _signal, onUpdate) {
      onUpdate?.({ content: [{ type: "text", text: "处理中..." }] });
      // 在这里调用任何东西:本地脚本、API、数据库……
      return {
        content: [{ type: "text", text: "结果" }],
      };
    },
  });
}

文件放进去,重启 pi,工具就注册好了。

AI 会读 description 来判断什么时候调用这个工具——不需要你主动说「用 my_tool 处理这个」,它自己判断。


我已经接了什么

最近几周陆续往 pi 里接了几个工具,每个都解决了一个具体的痛点:

本地语音转录:用 SenseVoice 模型,本地跑,不过云,10 秒转录 4 分钟的音频。敏感内容不用担心。

小红书配图生成:对话里说一句话,调 API 出图,直接存到本地文件夹,不用切软件。

声音克隆配音:把口播稿变成带打字机字幕的视频,用克隆的声音朗读,多规格输出,音频只合成一次。

这三个工具,我后面会分别写一篇,记录实现过程和踩过的坑。

这篇是整个系列的起点,先让大家知道 pi 是什么,值不值得花时间去了解。


我为什么觉得值得写

用 AI 工具的人越来越多,但大多数人还是在用「产品形态」的 AI——打开网页,输入,得到结果,关掉。

这没有问题,但有天花板。

当你把工具接进 AI 的上下文,它就不只是一个「问答机器」了——它变成了一个能真正执行事情的 agent。写完稿子,顺口说「帮我出配图」,图出来了。说「帮我把这 10 个视频转录成文档」,去喝杯水,回来全好了。

这种体验,和「打开网页输入」是完全不同的。


我会继续往里接工具,也会继续写。

如果你也在用 pi,或者有想接的工具,评论区聊。


pi 为 @earendil-works/pi-coding-agent,可在 npm 安装。

本系列后续文章会陆续发出,记录每个工具的接入过程。