别把 Agent 的工具调用当作执行许可:用 RBEK 给外部动作加一道可审计的闸门
Agent 能决定“下一步想做什么”,不等于它应当直接拥有网络、数据库或内部 API 的执行权限。一个常见的实现把模型、编排框架和工具函数连在一起:模型输出工具调用,框架就执行函数。这样开发很快,但授权判断往往散落在工具代码、提示词和环境变量里;当工作流从“查天气”扩展到“写工单、改配置、调用支付接口”时,很难回答三个基础问题:这次动作为什么被允许?被拒绝的动作是否真的没有执行?执行后能留下什么证据?
RBEK 把这个问题收敛为一个独立的执行边界。它不负责替 Agent 规划任务,而是放在应用逻辑和真实外部动作之间:Agent 或工作流提交执行请求,RBEK 先作策略准入决定;只有允许的请求才能进入受控执行路径,并生成证据。项目目前公开的 Developer 版稳定版本为 0.2.0,Python 包元数据将其标为 Alpha;同时,仓库明确说明公开内容是文档、示例和安装指引,完整运行时源码不在这个仓库中。因此它适合被理解为一个可公开试用的受治理执行产品,而不是可自行审计全部核心源码的开源安全组件。
不要把“模型会调用工具”误当作授权模型
提示词可以要求模型“只有在安全时才调用工具”,但提示词不是执行层的强制控制。更实际的做法是把权限表达成可检查的策略,再让工具适配层把实际请求交给边界组件。RBEK 的公开示例用 provider 与 capability 描述可执行对象:provider 是已登记的执行提供方,capability 是它声明的能力。策略同时列出允许的 provider 和 capability,并要求提供方已登记。
下面的 JSON 结构来自项目的天气工具示例,关键不是 HTTP 本身,而是将“谁可以执行什么”显式写入策略:
{
"policy_version": 1,
"name": "ai-agent-external-tool-policy",
"effect": "ALLOW",
"allowed_providers": ["http-json"],
"allowed_capabilities": ["http.json"],
"require_registered_providers": true
}
与之对应的工作流步骤也指定同一个 provider 与 capability。若某一步需要的 capability 不在允许列表里,示例的离线证明会把它判为拒绝;示例随后检查拒绝路径没有产生外部执行证据。这个模式的价值在于:把“模型提议的动作”与“系统获准执行的动作”分开。模型即使选错了工具,执行边界仍可阻断请求,而不是指望模型自我纠正。
这也解释了为什么 provider 注册不能只是一个字符串约定。公开离线示例把 provider 配置写入项目的 .rbek/providers/ 目录,声明其能力、网络是否允许以及执行边界;随后对配置的规范化 JSON 计算 SHA-256 摘要,作为 registration_digest。这不等于完整的供应链证明,但至少让策略判断依赖一个可登记、可复查的提供方描述,而非任意工具函数临时拼接出的名称。
从计划到闸门:把一次动作拆成可观察阶段
RBEK 的快速开始不是直接让 Agent 发请求,而是先建立本地项目,再通过 CLI 执行。官方文档给出的最小流程如下:
curl -fsSL https://releases.rbekplatform.com/cli/stable/install.sh | bash rbek-cli --version rbek-cli doctor --strict rbek-cli init ./rbek-demo rbek-cli run ./rbek-demo
安装脚本来自官方稳定发布通道;文档称安装器会解析当前稳定版并验证发布归档。生产环境不应仅因为示例使用管道安装就跳过内部的软件分发审查:先在受控环境验证二进制来源、版本和企业代理策略,再把它纳入标准镜像或软件仓库流程更稳妥。
更值得关注的是公开 demo 展现的细粒度命令顺序。它先用 execution plan 根据项目、工作流和策略生成计划;对允许的计划执行 execution dry-run,写出证据;再用 execution gate 根据计划与证据生成授权结果。公开脚本只在计划状态为 READY、dry-run 状态为 PASS、gate 状态为 AUTHORIZED 时继续。也就是说,“ALLOW”不是工具函数立即执行的同义词,而是一个可拆开的决策—验证—闸门流程。
离线 demo 可以在无 API Key、无外部网络动作的条件下验证两条路径:未授权请求得到 DENY,且不执行;授权请求得到 ALLOW,完成受治理 dry-run,并取得 AUTHORIZED 闸门结果。它还会生成 evidence/summary.json,记录这次证明中哪些动作被拒绝、是否发生网络执行。对于接入评估,这是一种比“模型回答说已经遵守策略”更有用的起点:可以把 JSON 结果接入 CI 或日志管道,针对状态和证据文件做自动断言。
与 LangGraph 集成时,边界要放在工具函数里
RBEK 提供了 LangGraph 的参考集成。它的设计不是要求替换 LangGraph:StateGraph 和 ToolNode 仍然负责编排;工具函数 governed_weather 则通过 rbek-cli execution external-run 提交外部动作。该命令携带项目根目录、已生成的 plan、gate、消息 JSON 和 evidence 文件;示例还显式要求 --acknowledge-external-execution。
这种位置选择很关键。若让 LangGraph 的工具节点直接访问 Open-Meteo,策略只能在调用前依赖应用代码自行判断;参考实现则让工具节点调用 RBEK,RBEK 决定这次已计划、已过闸门的请求能否真正越过外部边界。示例在默认模式故意构造无效 gate,断言结果为 BLOCKED 且 network_execution_performed 为 false;只有 --live 模式才使用有效 gate,要求结果为 PASS,并检查网络与外部 API 执行标记为 true。
LangGraph ToolNode
↓
RBEK execution plan / dry-run / gate
↓
允许:external-run → 外部 API → evidence
拒绝:BLOCKED → 不执行外部动作
这比“在工具函数里加一个 if”多了一层可交付物:计划、dry-run 证据、gate 文件与外部执行证据可以分开保存。不过不要因此夸大它的范围。Docker 解决进程在哪里运行、容器有什么 OS 级隔离;RBEK 的公开材料将自身定位为决定动作是否可执行、如何受治理以及用何种证据证明结果。两者可组合,不是替代关系。RBEK 的公开安全说明还称其以 fail-closed 为设计原则,但具体核心实现未公开,所以接入前仍应自行演练超时、损坏证据、provider 配置变更、CLI 不可用和凭据泄露等失败路径。
适合先从单个高风险动作试点
最合适的起点不是把所有 Agent 工具一次性迁移,而是挑一个边界清晰、影响可逆、现有审计不足的外部动作:例如测试环境的工单创建、受限 API 查询,或只读的运维信息获取。先定义 provider、capability、默认拒绝的策略和证据保留位置;再分别测试错误 capability、未登记 provider、有效授权和运行时不可用四种情况。只有当拒绝路径确实没有副作用、允许路径的证据能被团队消费后,再扩大范围。
RBEK 的价值不在于让 Agent “更聪明”,而在于把执行许可从模型决策中拿出来,变成可检查、可失败关闭、可留下证据的系统环节。对于已经在生产中让 Agent 接触外部工具的团队,这条边界通常比再补一段更长的提示词更值得优先建设。
还有一个容易忽略的取舍:策略粒度不能只追求“越细越安全”。如果 capability 命名过宽,例如把所有对外请求都归入一个 http.json,策略很容易重新变成全有或全无;如果每一个 URL、字段和业务动作都做成独立 capability,注册、审批和变更成本又会迅速升高。更可行的做法是先按业务影响和副作用划分能力域:只读查询、创建外部记录、修改生产配置、资金或身份相关动作分别建模;然后为高影响域增加更严格的 provider 登记、dry-run 和人工变更流程。能力名称、provider 配置和策略文件都应纳入代码审查,不能把它们当作一次性部署脚本。
证据同样需要运营设计。RBEK 示例强调输出证据文件,但证据文件本身不自动等于可审计性:团队仍要规定保存周期、访问权限、与任务或请求 ID 的关联方式,以及发生事故时如何还原“计划—授权—执行”的顺序。对包含业务参数的记录,还需避免把令牌、个人数据或完整载荷原样写入日志。先把这些边界规定清楚,受治理执行才会从 demo 中的正确状态码,变成真正可维护的工程控制。