权限与授权
你可以针对每个插件的每种效果,决定助手可以直接执行、需要先询问,还是不能执行。定时任务只能读取。
在首次启动的引导中同意用户协议之后,助手就可以代表你操作已启用的插件。
不过,你可以细致地控制助手能做什么。每个插件对每种效果(effect)都有一个单独的授权方式。例如,你可以让助手直接查询校园卡余额,但在充值之前先问你。授权方式在「设置 → 插件 → 某个插件 → AI 权限」里修改。
三种授权方式
授权方式决定助手调用某类效果的工具时会发生什么。
| 授权方式 | 结果 |
|---|---|
auto | 直接执行 |
ask | 先弹出审批提示 |
off | 拒绝执行 |
审批提示会显示插件、工具、效果和输入参数,并提供三个选项:允许、拒绝和始终允许。
授权方式为 off 时,调用会被拒绝,助手会被告知这个工具已被禁用。
默认的授权方式
不同类型的插件有不同的默认值。
| 插件类型 | read | write | money | public |
|---|---|---|---|---|
| 内置插件 | auto | auto | auto | auto |
| 官方插件文档 | auto | auto | auto | auto |
| 社区插件文档 | auto | ask | ask | ask |
| 远程插件 | auto | ask | ask | ask |
插件可以用 defaultModes 修改自己的默认值。
- 内置插件和官方插件文档如果设置了
defaultModes,就按它的声明执行,例如{ money: 'ask' }。没有声明的效果仍然是auto。 - 社区插件文档也可以设置
defaultModes,但只有比上表更严格的设置才会生效。
如果某个操作是用户可能想先确认的,请为它声明更严格的默认值:
definePlugin({
// …
defaultModes: { money: 'ask', public: 'ask' },
});何时询问,询问谁
是否执行一次调用,只在宿主的 invoke 路径这一处决定。宿主按下面的顺序检查。
- 工具必须存在,它所属的插件必须可用(能力需求已满足)并且已启用。
- 如果工具标记了
userOnly,只有actor === 'user'时才放行,否则拒绝。 - 用工具的 zod schema 校验输入。
- 授权方式为
off时,拒绝。 - 如果
actor === 'scheduler',而效果不是read,拒绝。无人值守的运行只能读取。 - 如果授权方式为
ask,而actor === 'scheduler',视为拒绝,因为这时没有人可以询问。 - 如果授权方式为
ask,而actor === 'agent',弹出审批提示。你选择拒绝时,助手会收到一个「declined」错误。 - 如果
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标记那些助手不能自己打开的操作,例如批准助手自己写入的记忆。