能力需求
插件在 `requires` 里声明它需要手机提供哪些能力。手机满足不了时,框架会隐藏这个插件,并告诉用户原因。
手机和电脑不同。插件在手机上没有 shell,也没有用户可见的文件系统,后台运行的时间也有限。另外,有些校园网站只能在校园网内访问。
所以,每个插件都要说明自己需要手机提供哪些能力。插件在 PluginDef.requires 里列出这些能力,注册表条目里的 requires 也一样。框架会把这份列表和手机实际提供的能力做比较。只要有一项不满足,插件就会对助手隐藏,它的工具调用会被拒绝,设置页会显示原因。
例如,财务插件需要已登录的校园会话,还需要校园网:
definePlugin({
id: 'finance',
// …
requires: ['campus-session', 'campus-network'],
});能力列表
| 能力 | 含义 | 目前是否提供 |
|---|---|---|
network | 普通的互联网访问 | 是 |
campus-network | 只能在北大校园网内访问的网站 | 是(见下文) |
campus-session | 通过宿主发出的、已登录的校园请求 | 仅 Android |
notifications | 本地通知 | 是 |
background | 定期在后台运行 | 是 |
cloud | 已配置 PKU harness Cloud 服务 | 配置了服务时提供 |
ongoing | 常驻通知或前台服务 | 仅 Android |
phone-control | 操作手机上的其他 App(Copilot,通过 services.phone) | Android 12 及以上 |
shell | 命令行 shell | 手机上永远没有 |
filesystem | 文件系统 | 不向插件开放 |
下面是几项需要补充说明的能力。
network指直接用fetch访问互联网。campus-network在 App 里始终声明为可用。但如果手机不在校园网内,请求会失败。campus-session指通过宿主的services.campus发出已登录的校园请求,账号密码不会暴露给插件。它依赖原生的 campus-http 模块,所以目前只在 Android 上提供。iOS 要等这个模块移植到 Swift 之后才能提供。cloud会随你的配置实时变化。你配置了 Cloud 服务,它就可用;你移除配置,它就不可用。ongoing对应services.ongoing,用来显示常驻通知或运行前台服务。shell在手机上永远不会提供。需要 shell 的插件只能做成远程插件。filesystem不向插件开放。如果需要用户选择的文件,请使用services.files.pick。
规则
- 必须列出插件的工具依赖的每一项能力。调用
services.campus.request的插件需要campus-session。如果它还访问只在校园网内可用的网站,还需要campus-network。 - 内置插件不得要求
shell或filesystem。繁重的工作,例如抓取大量页面、文字识别(OCR)或长时间运行的任务,应该放到远程插件里。 - 远程插件运行在服务器上,所以
shell对它们来说不是手机需要提供的能力。注册表的校验工具会拒绝远程插件条目里的requires: ['shell']。 - 应当在使用可选服务之前先检查它是否存在。没有
ongoing能力时,services.ongoing为undefined。宿主不支持云服务时,ctx.cloud为undefined。 - 如果插件不依赖云服务也能工作,应当声明
cloud.optional: true,而不是要求cloud。使用前请检查ctx.cloud?.available。