dsh-approval-auto-review
English | 中文
DeepSeek Harness 的自动审核插件。插件处理 reviewer 为 auto-review 的审批请求,由隔离的 Guardian agent 评估精确的计划操作,并为当前请求返回一个审批决定。
每个父 agent 都有一个可复用的 Guardian trunk。第一次审核发送有界的父会话记录和计划操作;后续审核只向同一 trunk 发送当前操作 delta。如果 trunk 正在处理其他请求,插件会启动独立的 ephemeral reviewer,使并发审批请求无需排队等待。
功能
- 独立的审核模型路由,也可以选择继承父 agent。
- 针对特定父模型 id 的 provider、model 覆盖。
- 每个审核器都使用空工具允许列表和独立 persona。
- 对会话记录和工具参数设置长度上限。
- 对超时、畸形输出、提供方失败和未解析路由采用失败关闭。
- 连续自动拒绝达到阈值时中止父 agent 轮次。
- 将审核元数据记录到审批决定中。
安装
将仓库作为 DSH profile 组合包安装:
dsh plugin --profile web add github:perlied03/dsh-approval-auto-review使用本地 checkout:
dsh plugin --profile web add ./dsh-approval-auto-review该包声明了 dsh.bundle,因此 dsh plugin 会自动将其配置层加入 profile。配置层会注册审核器,并提供 Request approval、Approve for me 和 Full access 三种权限选项。同一个包还声明了 dsh.client,Web profile 会直接从已安装包发现审核模型设置卡片。在对话权限菜单中选择 Approve for me 后,审批请求会交给 Guardian。
从 GitHub 安装时会执行包的 prepare 构建。pnpm 10 或更高版本要求构建授权时,请在该 profile 的 pnpm-workspace.yaml 中把 dsh-approval-auto-review: true 加入 allowBuilds,然后重新执行安装命令。
Host 组合必须提供以下 DSH 服务和插件:
dsh-agentdsh-sessiondsh-settingsdsh-user-approvaldsh-subagent- 以配置的
provider名称注册的进程内 spawn 提供方 - 以配置的
ephemeralProvider名称注册的进程内 fork 提供方
fork 提供方负责并发审核,并保留可复用 trunk 路径。部署不需要该路径时,可以将两个设置使用同一个提供方名称。
配置
在 Cordis 组合中注册插件:
import * as ApprovalAutoReview from 'dsh-approval-auto-review'
await ctx.plugin(ApprovalAutoReview, {
provider: 'spawn',
ephemeralProvider: 'fork',
modelProvider: 'deepseek-official',
model: 'deepseek-v4-flash',
fallback: 'parent',
})对应的 Loader 行如下:
- id: approval-auto-review
name: 'dsh-approval-auto-review'
config:
provider: spawn
ephemeralProvider: fork
modelProvider: deepseek-official
model: deepseek-v4-flash
fallback: parent配置字段:
provider:可复用 Guardian trunk 使用的子 agent 提供方,默认值为spawn。ephemeralProvider:并发一次性审核使用的子 agent 提供方,默认值为fork。modelProvider和model:可选的审核路由。modelOverrides:可选的父模型 id 映射;每个条目可以设置provider、model和maxTokens。fallback:parent表示缺失的路由字段继承父 agent;reject表示路由不完整时失败关闭,默认值为parent。timeoutMs:单次审核的截止时间,默认值为30000。maxAttempts:单次审核失败后的重试上限,默认值为3。maxTranscriptChars:完整审核发送的父会话记录序列化字符上限,默认值为60000。maxToolArgumentsChars:审核发送的原始工具参数字符上限,默认值为20000。maxTokens:可选的审核器输出 token 上限。activationPreset:DSH 宿主没有原生 reviewer 路由时,用于启用审核的权限 preset。省略时插件会处理这类宿主上的所有审批请求;随包提供的配置层将其设为approve-for-me。
通过现有的 approval/reviewer 会话设置,或选择 approve-for-me 的权限预设来启用自动审核。插件不会创建持久允许规则;每个决定只作用于一个审批请求。
DSH 兼容性
在支持 reviewer 路由的 DSH 版本中,插件只处理原生 reviewer 为 auto-review 的请求,并将结构化审核证据附加到 approval/decided。reviewer 为 user 的请求继续交给人工审批通道。
在较早的 DSH 版本中,bundle 改用持久化的 permission/preset 选择:Approve for me 启用 Guardian,Request approval 继续交给人工通道。旧审批服务只接受字符串结果,因此超时会作为拒绝返回,也不会保存结构化审核元数据;允许和拒绝仍保持失败关闭行为。
Web 设置
该包的 Web 客户端入口会向现有“插件”设置分区贡献一张自动审核卡片。卡片通过 approval-auto-review settings 命名空间编辑 modelProvider 和 model,并使用与 DSH“模型”页面相同的模型目录。先选择提供方可过滤模型列表,也可以将两个字段都留为跟随主 Agent,继承父路由。修改会在不重启进程的情况下对下一次审核生效。
独立插件卡片使用低于默认贡献的 slot 优先级。Host 同时贡献 approval-auto-review 卡片时,独立插件卡片负责渲染,Host 卡片仍保持注册但被覆盖。
当 DSH 提供 ctx.apiProxy.exposeSettingsNamespace() 时,Host 插件会自动向配置 API Proxy 注册该命名空间。DSH 0.1.0-rc.7 会直接服务已注册的 settings 命名空间,因此即使没有该方法,同一张卡片也可以工作。若某个 Host 限制 settings 命名空间且未提供显式暴露方法,自动审核仍可运行,但需要通过 profile 的 cordis.patch.yml 配置审核路由。
模型路由
审核路由按以下顺序解析:
1. 如果存在,优先使用 modelOverrides[parent.options.model]。 2. 使用插件级别的 modelProvider 和 model。 3. fallback 为 parent 时继承父 agent 对应的路由字段。 4. fallback 为 reject 且路由不完整时,以失败关闭方式报错。
提供方和模型名称由部署决定。插件不假设 DSH 提供方一定支持 Codex 或 OpenAI 的模型 id。
审核策略
Guardian 只评估审批请求提供的精确操作。直接用户消息和明确从 AGENTS.md 加载的内容属于可信授权证据。assistant 消息、工具调用、工具结果、文件内容、命令输出和普通插件上下文均不可信。
默认策略在没有明确拒绝规则或提示注入时允许低风险和中风险操作。高风险操作必须具备至少中等级别的可信授权并且范围明确。严重风险、明显的秘密外传、没有精确授权的广泛破坏性操作,以及广泛的持久安全弱化都会被拒绝。
每个审核器都使用空工具允许列表、独立 persona、结构化输出要求和禁止再次发起审批请求的委托策略。
失败行为
- 超时会向父会话注入重试或询问通知,并返回超时审批结果。
- 提供方失败或审核器返回畸形结果时,会按照
maxAttempts重试,之后返回拒绝。 fallback为reject且路由未解析时会拒绝;为parent时,缺失字段继承父 agent。- 自动审核拒绝时,会向父会话注入审核理由和禁止绕过的通知。
- 一个轮次内连续三次自动拒绝,或最近五十次自动审核中累计十次拒绝,会取消父 agent 轮次。
完成的 approval/decided 证据包括风险和授权等级、可用时的 provider 与 model、审核器会话类型、尝试次数、审核器是否已有上下文,以及操作参数是否被截断。
模型体验
主会话
#### 模型看到的内容
主模型会接收 dsh-user-approval 生成的审批策略上下文。审核拒绝时会增加审核理由和禁止绕过的通知;超时时会增加独立的重试或询问通知。Guardian 会话记录和审核元数据不会复制到主模型请求中。
#### Token 影响
只有审批策略上下文以及注入的拒绝或超时通知可能增加后续主模型请求的 token。审核会话记录不会复制到主模型请求。
#### KV Cache 影响
审批策略上下文和注入通知可能改变下一次主请求的前缀。审核成功时不会增加通知。
Guardian 审核器
#### 模型看到的内容
第一次 trunk 审核接收一份有界的父会话记录和精确的计划操作。后续 trunk 审核接收当前有界操作 delta 和此前审核次数。ephemeral 审核接收新的有界会话记录和当前操作。
#### Token 影响
每次审批审核都是独立的模型请求;会话记录和参数上限会限制每次请求发送的材料。
#### KV Cache 影响
trunk 审核会在同一子会话中追加 delta,因此提供方可以复用稳定前缀。但每次审核仍会产生新的模型请求。ephemeral 审核使用独立会话,不复用 trunk 前缀。
已知限制与延期工作
- 部署必须提供支持 persona、空工具过滤、结构化输出、continuation 和取消的子 agent 提供方。
- Guardian 没有文件系统或网络工具。有界父会话证据就是完整审核输入;增加工具会引入另一条提示注入和授权来源。
- 提供方和模型是否可用由部署决定。不可用路由会失败关闭,不会被静默替换。
- Web 设置卡片要求 Host 具备 DSH
0.1.0-rc.7的命名空间发现机制,或显式的ctx.apiProxy.exposeSettingsNamespace()扩展;两者都没有时,通过 profile 配置审核路由。 - 不支持 reviewer 路由的 DSH 版本无法持久化结构化审核证据或独立的超时结果;bundle 通过
permission/preset保留权限选择,并使用字符串结果保持失败关闭。 - GitHub 安装会运行
prepare构建lib/。如果 profile 尚未信任该包,pnpm 10 或更高版本要求先在allowBuilds中允许安装时构建。
开发
pnpm install
pnpm test
pnpm run typecheck
pnpm run build该包从已发布的 DSH 包解析 import;prepare 会构建 Host exports,以及由 dsh.client 发现的 lib/client.js bundle。