Skip to content

Cell - Ta Extensions ​

Ta 自带的 pi 包(默认开启,可在 设置 → 扩展 关闭):告诉用户可以用自然语言做扩展,负责扩展的分享,并提供扩展市场。不改 Ta 的核心,由三部分组成:

  • 技能(pi.skills,skills/ta-package):Ta 按用户的描述做、改 pi 包(pi 扩展、Web 扩展、技能、提示模板),以及按用户的话导出、导入扩展。终端里的 Ta 也有;关掉这个包,技能也随之去掉。
  • Web 扩展(pi.web,web-src/index.tsx → web/index.js):导航栏里的"扩展"页,顶部两个标签:"我的"和"市场"(页面右上角菜单也能直接打开市场)。
    • 顶部一句话说明回答结束就生效;输入框下是四种扩展(卡片、页面、命令、技能)的示意图(web-src/pictures.tsx,只用页面的 CSS 变量,跟随主题),点一个就做它的示例。发出后开一个新对话(openSession + switchSession)把"做一个扩展:……"发给 Ta。
    • "我的扩展":extensions/ 目录里的包(Ta 做的、从文件导入的),显示名称、版本、内容标签和说明,右侧是开关(setPackageEnabled,停用的变淡);悬停出现修改(问一句想怎么改,再开新对话交给 Ta)、导出、移除。
    • "安装的扩展":packages 设置里的包(npm、Git),同样有开关,可复制来源、移除。
    • 导入:按钮、页面右上角菜单或把文件拖到页面上;弹窗里选 .tgz 文件,或填 npm:… / Git 地址安装(installPackage,即 ta install)。导入、安装、移除后调用 reloadExtensions,当前对话和页面马上用上。
    • "分享给别人":导出 → 发送 .tgz 文件 → 对方导入 三步图示,下面一行说明也支持 npm、Git 来源或直接对 Ta 说。
    • "市场"(market-view.tsx、market-detail.tsx):npm 上带 pi-package 关键词的包,也就是 pi 官网包目录收录的那些。
      • 搜索框(输入停 300 ms 后搜索)和几个常用话题;没有关键词时按 npm 的综合排序(下载量占大头)列出,滚动到底自动加载下一页。
      • 每张卡片是名字首字母头像(同名同色)、名称(scope 变淡)、作者、月下载量、说明、类别标签和发布时间,右侧一个"安装"按钮:一键安装为用户级的 npm:<名字>(installPackage,不锁版本,ta update 能更新),安装中转圈,装好后显示"已安装",随 Ta 提供的显示"内置"。安装在离开页面后继续。
      • 点卡片进入详情页(Esc 或"返回"回到列表,滚动位置不变):头像、名称、说明、作者/版本/下载量/许可证/时间、安装或移除、npm/源代码/主页链接,pi.video / pi.image 预览,以及 README。
  • 服务端(pi.host,web-src/host.ts → host/index.mjs):页面经 callHost(TaPackageServer.callPackageHost)调用。
    • exportPackage(id):把包目录打成一个 .tgz(gzip 的 tar,顶层是包目录,去掉 node_modules、.git 和链接),用 base64 交给页面下载。和 tar -czf <名字>.tgz <名字> 的格式相同,没有 Ta 也能用 tar 解开。
    • searchMarket(query, from?)、marketPackage(name)(market.ts):在服务端查 npm,因为包也装在服务端;结果缓存 5 分钟,同一请求合并。搜索走 /-/v1/search?text=<词> keywords:pi-package;npm 对有关键词的搜索仍会把所有 pi-package 排在后面,所以只保留名称、说明或关键词里含有每个词的包,出现第一个不相关的就结束分页。详情不取 npm 的整份包文档(发版频繁的包有几十 MB),只取 /<名字>/latest 清单、上月下载量,README 先从 jsDelivr 取发布的那一版,没有再取 GitHub 仓库的;README 里的 HTML 图片、链接、标题转成 Markdown(Ta 的 Markdown 不渲染 HTML),去掉徽章,相对链接指向 GitHub 仓库。
    • importPackage(data, overwrite?):检查文件(只有一个顶层目录、里面有 package.json、路径不出目录、不超过 5000 个文件和 20 MB;跳过链接和 macOS tar 附带的 ._*),放进 agent 目录的 extensions/<包名去掉 scope>,pi 无需设置就会加载。同名目录已存在时返回 exists,页面问过用户再带 overwrite 重来;先写到隐藏的临时目录再换上,会话不会加载到一半的文件。npm pack 打出的包(顶层是 package/)也能导入。

限制 ​

  • 导出、导入文件需要 ta serve(页面和服务端都在 ta serve 里);单独运行 ta 时,按技能里的说明让 Ta 用 tar 和 ta install 完成。
  • 从文件导入的扩展只放进用户的 extensions/;要给一个项目用,把目录放进项目的 .ta/extensions/ 并提交。
  • 扩展会在本机运行代码:导入别人给的扩展前,页面提示只导入信任的来源,技能也要求 Ta 先读一遍再说明它做什么。市场的安装是一键的(照 pi 的做法不弹审批),列表底部和详情里都可以先看介绍和源代码。
  • 市场只认 npm 官方源(搜索、清单、下载量都在 registry.npmjs.org),README 依赖 jsDelivr 或 GitHub;连不上时页面显示原因和"重试",不影响已安装的扩展。安装仍走 pi 的 npm 安装,遵循用户自己的 npm 配置。
  • npm 的数据大多是英文,按中文搜不到;话题按钮用英文关键词。