> 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 回合不携带聊天上下文，因此没有人来回答提示。这些回合是预授权的，会直接通过（无记录、无事件）。审批仅对实时聊天回合强制执行。

***

## 配置与 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)：自治级别、可信根和路径加固。
* [安全架构](/openhuman/zh/kai-fa-zhong/architecture/security.md)：命令分类和策略内部机制。
