> For the complete documentation index, see [llms.txt](https://tinyhumans.gitbook.io/openhuman/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://tinyhumans.gitbook.io/openhuman/zh/gong-neng/approval-gate.md).

# 审批门

审批闸门是代理与外部世界之间的检查点。每当代理想要运行一个会对现实世界产生影响的工具（发布到 Slack、发送电子邮件、创建日历事件、运行 shell 命令、安装软件包）时，闸门都会拦截该调用，准确显示即将发生的内容，并在任何东西运行之前等待你的决定。

默认开启。任何会产生外部影响的内容都不会在你没有明确同意的交互式聊天中离开你的机器。

***

## 什么会触发提示

每次执行型工具调用都会被分类为一个 **命令类别**，而你的 **自治级别** 决定该类别是静默运行、提示，还是被阻止。

| 命令类别 | 涵盖内容                        |
| ---- | --------------------------- |
| 读取   | 可证明只读 / 仅观察（精选允许列表）         |
| 写入   | 会改变状态；对任何无法识别的内容采用默认拒绝      |
| 网络   | 会接入网络（curl、wget、ssh、scp、……） |
| 安装   | 安装操作系统或全局语言包                |
| 破坏性  | 灾难性 / 不可逆 / 提权              |

该级别来自 **设置 → 代理访问** (`[autonomy].level`):

| 级别         | 读取 | 写入 | 网络 / 安装 / 破坏性 |
| ---------- | -- | -- | ------------- |
| 只读         | 允许 | 阻止 | 阻止            |
| 受监督 *（默认）* | 允许 | 提示 | 提示            |
| 完整         | 允许 | 允许 | 提示            |

任何落到 **提示** 的都会被停放在闸门处。 `阻止` 会被直接拒绝：任何级内审批都不能授权它。分类采用默认拒绝。凡是无法证明只读的命令都会至少被视为 `写入`，并且在管道命令中以最高类别为准（因此 `ls | curl …` 是 `网络`).

***

## 流程

```
代理想要执行
        │
        ▼
 分类命令 ──► 阻止 ──► 拒绝
        │
     提示
        │
        ▼
 在“始终允许”列表中？ ──► 是 ──► 立即运行
        │ 否
        ▼
 停放调用 · 持久化待处理行 · 发出 approval_request
        │
        ▼
 ┌──────────────┬───────────────┬────────────┐
 ▼              ▼               ▼            ▼
批准     始终允许      拒绝      10 分钟 TTL
(一次)    (+ 允许列表)                     │
 │             │               │            ▼
 ▼             ▼               ▼          拒绝
 运行           运行           拒绝   （默认拒绝）
```

当调用被停放时，一个 **审批请求卡片** 会显示在聊天输入框上方。它显示工具名称、对操作的安全单行摘要，以及（已脱敏的）命令。三个选项：

* **批准**：仅执行这一次调用。
* **始终允许**：执行它，并将该工具加入你的 `auto_approve` 列表，以便下次跳过提示。
* **拒绝**：拒绝这次调用。

你也可以直接在聊天中输入 **是** / **否** 。回复会路由回已停放的请求。

***

## 始终允许

以 **始终允许** 批准会将工具名称持久写入 `[autonomy].auto_approve` （配置保存 + 实时策略重载），因此闸门会对未来轮次中该工具直接短路为 *允许* 。该列表默认预先批准安全的只读工具（`file_read`, `memory_search`, `memory_list`, `get_time`, `list_dir`, `glob`, `grep`）并且可在 **设置 → 代理访问**中编辑。移除其中一项即可重新开始提示。

***

## 默认拒绝行为

所有非批准路径最终都会落到 **拒绝**:

* **超时**：一个已停放的请求会保留 10 分钟；如果未决，则会转入终态 `拒绝`.
* **持久化失败** 或通道丢失：拒绝。
* 超时路径会先重新读取已存储的决定，因此在竞态中已提交的批准仍然会生效。

待处理请求存储在 SQLite（`{workspace_dir}/approval/approval.db`）中，并且 **可在核心重启后继续保留**。已批准工具执行完成后，闸门会记录一次写入即生效的执行结果（成功/错误，错误文本已脱敏并截断）作为持久审计轨迹。所有被持久化或广播的内容都会先脱敏：PII 和聊天内容会被清理，主目录路径会被移除。

***

## 后台和 cron 绕过

该闸门是 **仅交互式**。后台、分诊和 cron 轮次不携带聊天上下文，因此没有人可以回应提示。这些轮次会被预授权并直接通过（无记录、无事件）。审批只对实时聊天轮次强制执行。（Subconscious 循环有其自己独立的升级卡片审批，用于 *未请求的* 写入；见下文。）

***

## 配置与 RPC

* **`OPENHUMAN_APPROVAL_GATE`**：设置为 `0` / `false` 即可完全跳过安装闸门。没有闸门时， `提示`-类调用会无提示运行。默认开启。
* **`[autonomy].level`** 以及 **`[autonomy].auto_approve`**：级别和允许列表，通过 `config.update_autonomy_settings` RPC 或 设置 → 代理访问。

这个 `审批` 控制器提供三个 JSON-RPC 方法：

| 方法                                         | 目的                                                         |
| ------------------------------------------ | ---------------------------------------------------------- |
| `openhuman.approval_list_pending`          | 已停放请求的实时队列。                                                |
| `openhuman.approval_list_recent_decisions` | 已决策/已执行审计行（`限制` 1 到 500，默认 50）。在 **设置 → 审批历史**.            |
| `openhuman.approval_decide`                | 应用一个决定（`approve_once` / `approve_always_for_tool` / `拒绝`). |

`list_pending` / `list_recent_decisions` 当未安装闸门时返回空（不是错误）； `decide` 在闸门缺失、请求未知或已决定时返回错误。

***

## 另请参阅

* [隐私与安全](/openhuman/zh/gong-neng/privacy-and-security.md)：自治级别、可信根和路径加固。
* [潜意识循环](broken://pages/8f1b13c03e1006c2498f2a57983552beefceb5ac)：后台循环及其单独的升级审批。
* [安全架构](/openhuman/zh/kai-fa-zhong/architecture/security.md)：命令分类和策略内部机制。
