PKU harness

权限与授权

你可以针对每个插件的每种效果,决定助手可以直接执行、需要先询问,还是不能执行。定时任务只能读取。

在首次启动的引导中同意用户协议之后,助手就可以代表你操作已启用的插件。

不过,你可以细致地控制助手能做什么。每个插件对每种效果(effect)都有一个单独的授权方式。例如,你可以让助手直接查询校园卡余额,但在充值之前先问你。授权方式在「设置 → 插件 → 某个插件 → AI 权限」里修改。

三种授权方式

授权方式决定助手调用某类效果的工具时会发生什么。

授权方式结果
auto直接执行
ask先弹出审批提示
off拒绝执行

审批提示会显示插件、工具、效果和输入参数,并提供三个选项:允许、拒绝和始终允许。

授权方式为 off 时,调用会被拒绝,助手会被告知这个工具已被禁用。

默认的授权方式

不同类型的插件有不同的默认值。

插件类型readwritemoneypublic
内置插件autoautoautoauto
官方插件文档autoautoautoauto
社区插件文档autoaskaskask
远程插件autoaskaskask

插件可以用 defaultModes 修改自己的默认值。

  • 内置插件和官方插件文档如果设置了 defaultModes,就按它的声明执行,例如 { money: 'ask' }。没有声明的效果仍然是 auto。
  • 社区插件文档也可以设置 defaultModes,但只有比上表更严格的设置才会生效。

如果某个操作是用户可能想先确认的,请为它声明更严格的默认值:

definePlugin({
  // …
  defaultModes: { money: 'ask', public: 'ask' },
});

何时询问,询问谁

是否执行一次调用,只在宿主的 invoke 路径这一处决定。宿主按下面的顺序检查。

  1. 工具必须存在,它所属的插件必须可用(能力需求已满足)并且已启用。
  2. 如果工具标记了 userOnly,只有 actor === 'user' 时才放行,否则拒绝。
  3. 用工具的 zod schema 校验输入。
  4. 授权方式为 off 时,拒绝。
  5. 如果 actor === 'scheduler',而效果不是 read,拒绝。无人值守的运行只能读取。
  6. 如果授权方式为 ask,而 actor === 'scheduler',视为拒绝,因为这时没有人可以询问。
  7. 如果授权方式为 ask,而 actor === 'agent',弹出审批提示。你选择拒绝时,助手会收到一个「declined」错误。
  8. 如果 actor === 'user',从不弹出提示,因为点按钮本身就表达了你的意图。

总是询问的工具

有两类工具,助手每次调用都会询问,不受授权方式影响:auto 也不会跳过提示,off 照样拒绝调用,定时任务的调用一律拒绝。

  • grant 工具给助手它原本没有的访问权限,例如 copilot.requestApp 会把一个 App 加入 Copilot 的使用范围。它的提示提供「仅本次允许」「始终允许」和「不允许」。用户的回答以 ctx.grant('once' 或 'always')传给工具,不会改变插件的授权方式。
  • alwaysAsk 工具用于宿主无法根据观察到的目标来判断的操作。它的提示没有「以后不再询问」选项。

如果工具的 resolveEffect 给出了操作对象(例如 Copilot 将要点按的按钮),提示会把它作为标题显示,同样不提供「以后不再询问」选项。

除了工具调用,还有几类操作需要你单独授权。

校园服务。 你登录校园账号,就授权了 App 访问校园服务。插件要声明它访问的站点和服务(scopes),以及 requires: ['campus-session']。这些信息会显示在插件页面上。

PKU harness Cloud。 每个插件都有一个单独的允许云端开关。开关旁边会列出插件的 disclosure 说明,用通俗的话讲清它会在云端存什么。没有得到授权就调用云服务时,会抛出 CloudError('consent_required'),详见云服务。

文件。 只有你本人能选择文件。插件只能在页面里调用 services.files.pick,绝不能在助手调用的工具里使用它。你在对话里附上的文档会在手机上读成文字,助手通过核心插件 files 的工具翻页和搜索;这些工具返回第三方内容,调用后助手的这个回合会被标记为「已污染」。

通知和精确闹钟。 这两项由系统的授权弹窗决定。插件在你点击时调用 services.notify.fix(kind) 来弹出它。

记忆。 助手读到不可信的内容之后写入的记忆,会先保存为「待确认」状态。你在记忆页面批准后,它才会生效。

设置,包括授权方式本身。 助手可以通过核心插件 settings 修改设置:App 的外观、语言和时区,模型,每个插件的开关、授权方式和它自己的设置项。change 工具的效果是 write,所以它遵循 settings 插件自己的授权方式;和其他内置插件一样,默认是 auto。希望每次修改设置都确认的用户,可以把这一项设为 ask。密钥和需要用户亲手完成的步骤(API Key、校园账号、系统权限)标记为 uiOnly,助手只能打开它们所在的页面。详见架构 → 助手能操作一切。

插件作者须知

  • 必须如实声明每个工具的效果。money 和 public 这两种效果存在的意义,就是让你能把这类操作放在确认之后。
  • 不得在 read 工具里偷偷修改数据,例如「读取并标记为已读」。
  • 应当把 money 和 public 的 defaultModes 设为 ask,除非这个操作很容易撤销。
  • 应当把既读又写的工具拆成两个工具。
  • 必须用 userOnly 标记那些助手不能自己打开的操作,例如批准助手自己写入的记忆。

本页目录