Skip to content

feat: 工具权限新增智能审批档位,由审批模型自动决定工具调用 - #914

Open
Aizosa wants to merge 3 commits into
AAswordman:mainfrom
Aizosa:feat/llm-auto-approval-permission
Open

feat: 工具权限新增智能审批档位,由审批模型自动决定工具调用#914
Aizosa wants to merge 3 commits into
AAswordman:mainfrom
Aizosa:feat/llm-auto-approval-permission

Conversation

@Aizosa

@Aizosa Aizosa commented Aug 9, 2026

Copy link
Copy Markdown

Changes

工具权限新增第四档「智能审批」(LLM)

  • PermissionLevel 新增 LLM 档位:命中时由审批模型阅读工具名称与参数后自动决定允许或拒绝;fromString 对旧存储值的解析行为不变,未知值仍回到 ASK
  • 审批提示词:随 FunctionalPrompts 统一维护(TOOL_APPROVAL_PROMPT / _CN 中英双语,沿用现有功能提示词的组织与文风),JSON 输出约束并入提示词正文,不对用户开放编辑;提示词末尾直接附上本次工具调用原文 <tool name="..."><param name="...">...</param></tool>
  • 审批口径偏放行:默认倾向 approve,明确放行读取查询、常规写入(含 git、构建、安装依赖)与用户预期的设备/应用操作;仅拒绝大范围破坏性操作、凭据外泄、下载脚本直接执行、关闭安全功能或清除审计日志
  • 调用方式:经 FunctionType.TOOL_APPROVAL 绑定的模型发起一次非流式请求,复用 GREP 功能既有的调用与 JSON 提取模式
  • 决定映射:approve 放行、deny 拒绝、ask 表示模型无法自主判断转人工;接口异常、输出无法解析或 decision 缺失/非法时同样转交现有询问弹窗由用户确认(该转交是本功能的产品设计,超时行为与 ASK 档一致)
  • 审批模型拒绝时,工具结果携带其理由反馈给 AI:The system has rejected this tool execution: <reason>. Either revise the parameters per the rejection reason and try again, or abort this tool invocation entirely.;用户手动拒绝的文案保持原样,两处调用点(ToolExecutionManager 与 package_proxy)行为一致
  • FunctionType 新增 TOOL_APPROVAL:默认映射与未映射回退逻辑自动覆盖,无需迁移;功能模型配置页补充显示名称与描述,用户可为审批绑定独立的低成本模型
  • 工具权限设置页:新增「智能审批」分组卡片(与 允许/禁止 分组交互一致)与提示词模板编辑卡片(保存/恢复默认)
  • ClassicChatSettingsBarAgentChatInputSection 的权限标签 when 补齐 LLM 分支
  • 新增文案提供中文(默认)与英文资源;其余语言依协作规范留待独立 i18n PR
  • 按协作规范添加 docs/TODO/llm_tool_approval_20260810/(index + 两个步骤文档)

Verification

  • 全仓静态排查:仅上述位置存在对 PermissionLevel / FunctionType 的穷尽 when,均已补齐分支;其余命中均为无关的 AndroidPermissionLevel
  • 依 AGENTS.md 约定未在本地执行构建,交由 CI 验证

🤖 Generated with Claude Code

@Aizosa
Aizosa force-pushed the feat/llm-auto-approval-permission branch 3 times, most recently from bd72ed6 to f6d04ea Compare August 10, 2026 00:36
@tuxKOH

tuxKOH commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

我感觉这个不错 早想加了 但是最好做一下本地验证 给一下截图什么的 如果可以的话 最好可以把审批的模型加到模型配置设置中

@tuxKOH

tuxKOH commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

噢 抱歉 看到了 已经有了 你做下本地验证及截图查看效果就行

PermissionLevel 新增 LLM 档位: 命中时读取可编辑的审批提示词模板
(支持 {tool_name}/{tool_parameters} 占位符), 附加系统固定的 JSON
输出约束, 经 FunctionType.TOOL_APPROVAL 绑定的模型发起一次非流式
请求, decision 为 approve 放行、deny 拒绝; 接口异常、输出无法解析
或 decision 缺失时转交现有询问弹窗由用户确认。

- FunctionType 新增 TOOL_APPROVAL, 默认映射与回退逻辑自动覆盖,
  功能模型配置页补充名称与描述
- 工具权限设置页新增智能审批分组卡片与提示词模板编辑卡片
- ClassicChatSettingsBar / AgentChatInputSection 权限标签补齐 LLM 分支
- 新增文案提供中文与英文资源; 旧存储值解析行为不变
- 按协作规范添加 docs/TODO/llm_tool_approval_20260810

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Aizosa
Aizosa force-pushed the feat/llm-auto-approval-permission branch from f6d04ea to 42d2d2c Compare August 10, 2026 02:14
@Aizosa

Aizosa commented Aug 10, 2026

Copy link
Copy Markdown
Author

请过目:
Screenshot_2026-08-10-10-27-57-013_com ai assistance operit debug
Screenshot_2026-08-10-10-27-25-055_com ai assistance operit debug
Screenshot_2026-08-10-10-27-13-606_com ai assistance operit debug

@Aizosa

Aizosa commented Aug 10, 2026

Copy link
Copy Markdown
Author

请过目: Screenshot_2026-08-10-10-27-57-013_com ai assistance operit debug Screenshot_2026-08-10-10-27-25-055_com ai assistance operit debug Screenshot_2026-08-10-10-27-13-606_com ai assistance operit debug

附:正常工具审批通过:
Screenshot_2026-08-10-10-29-50-840_com ai assistance operit debug

@CATMIAOZHI
CATMIAOZHI self-requested a review August 10, 2026 03:27

@CATMIAOZHI CATMIAOZHI left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审查基线:42d2d2c5(feat/llm-auto-approval-permission @ main,单 commit)

整体方向我认可,fail-closed 的回退设计(API 错误 / 输出无法解析 / decision 缺失都转人工而非放行)也与 #697 的思路一致。但结合 #697 之前讨论的 Auto-review 设计,以及我已经在 CATMIAOZHI/Operit 中实际实现并使用的 Guardian / permission reviewer 来看,当前版本还不适合合并。

TL;DR:3 个 P1(同消息注入、无授权上下文、无拒绝循环保护)建议先解决再合并;P2 与 proxy 注意点不阻塞,仅作演进提醒。

我的实现可以直接作为参考:https://github.com/CATMIAOZHI/Operit

我的 Guardian 最初也是沿着 #697 的思路继续实现的。实际做下来,我认为自动审批不能只是在权限分支里增加一次普通 LLM JSON 请求,因为 reviewer 本身已经成为权限安全边界,需要额外处理 prompt 隔离、用户授权上下文、结构化结果、并发、失败回退和拒绝绕过等问题。

详细问题见行内评论(3 个 P1 + 1 个 P2)。另外两个非阻塞点:

  1. proxy/package context binding:当前 PR 的调用路径(checkToolPermission(permissionTool, invocation.rawText) → 执行同一 invocation)是"审核即执行",没有问题。但后续如果引入 host 在审核后注入/替换参数,审批就会失效——审核的是一组参数,执行的却是另一组。建议把"reviewer 看到的 action 必须与最终执行的 action 完全一致"作为后续演进的硬约束(我的实现为此专门在 review 前先绑定 host-controlled proxy context)。

  2. 风险面提醒:Operit 是手机端 agent,在 root 权限下破坏性很大——一旦遭遇提示词注入,恶意文件或命令可能造成不可逆后果(清除用户数据、外发凭据、篡改系统设置等)。基于这个风险面,我倾向于这个功能不只是本 PR 的实现取舍,而需要开发组层面讨论清楚审批边界、默认策略和 fail-closed 语义后再决定合并。

所以我的建议不是否定这个功能,而是当前实现还把 Auto-review 当成 PermissionLevel -> 调一次 LLM -> 解析 JSON#697 描述、且我实际验证可行的模型更接近 Permission system -> isolated reviewer subagent -> canonical action + authorization context -> capability-bound structured submission -> host enforcement -> audit / circuit breaker。如果这个 PR 要继续推进,可以直接参考我仓库现有 Guardian 的实现思路,未必需要完整照搬,但至少应先解决 3 个 P1 再考虑合并。

Comment thread app/src/main/java/com/ai/assistance/operit/ui/permissions/ToolPermissionSystem.kt Outdated
Comment thread app/src/main/java/com/ai/assistance/operit/ui/permissions/ToolPermissionSystem.kt Outdated
Comment thread app/src/main/java/com/ai/assistance/operit/ui/permissions/ToolPermissionSystem.kt Outdated
@Aizosa
Aizosa requested a review from CATMIAOZHI August 10, 2026 05:06
@Aizosa
Aizosa marked this pull request as draft August 10, 2026 05:12
@CATMIAOZHI

Copy link
Copy Markdown
Collaborator

@Aizosa 我建议你先放缓一下,我们这边需要对这个功能进行安全性可行性评估
@luojiaping @AAswordman 我们讨论一下这个审核功能的方向

@luojiaping
luojiaping marked this pull request as ready for review August 10, 2026 23:58
@Aizosa

Aizosa commented Aug 12, 2026

Copy link
Copy Markdown
Author

@Aizosa 我建议你先放缓一下,我们这边需要对这个功能进行安全性可行性评估 @luojiaping @AAswordman 我们讨论一下这个审核功能的方向

已根据审阅意见完成安全架构调整,最新提交为 4e9c5cd

主要修改:

  • 审批策略与工具参数分层:策略使用独立 SYSTEM 消息,工具参数、父会话和工作区信息仅作为不可信 USER 证据
  • 增加父会话和用户授权上下文,分别判断风险级别与授权状态
  • 使用带 review_id 的严格结构化 JSON,解析异常或字段非法时转人工确认
  • Host 强制拒绝 critical、无用户授权及未明确授权的 high-risk 动作
  • 审核与执行绑定同一份最终规范化参数,覆盖普通工具、package proxy 和 CLI proxy
  • 移除共享的拒绝理由 side-channel,改为单次调用结构化返回
  • 增加动作指纹、拒绝历史和会话级连续拒绝保护
  • 连续两次拒绝后锁定本次用户消息内的所有后续工具调用,但不再直接终止 Agent;拒绝结果会回传主模型,要求其停止调用工具并请求用户书面授权
  • 任意一次审批通过会清除尚未触发锁定的连续拒绝计数

验证结果:

  • ToolApprovalReviewPolicyTest:通过
  • :app:compileDebugKotlin:通过
  • :app:assembleDebug:通过
  • Debug APK 已在 ARM64 测试设备上覆盖安装成功

麻烦基于最新提交重新审阅。Workflow 当前仍等待上游维护者批准运行。

@AAswordman AAswordman left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Request changes pending a clean candidate. The latest commits materially address the earlier reviewer-isolation, authorization-context, structured-result, and circuit-breaker concerns: policy and evidence are now separate prompt turns, host enforcement rejects critical/unauthorized cases, and the per-turn breaker is tested.\n\nHowever, Candidate checks currently fail at the initial Plan candidate checks step, so no hygiene, compilation, or unit-test stage ran for the latest merge candidate. Rebase/update the branch as needed and resolve the plan failure so Candidate checks runs successfully before this security-sensitive feature is reconsidered.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants