批准前也要跑输入护栏
Agent 的人工批准不应该是第一道安全闸,而应该是“已经通过机器校验之后”的授权动作。OpenAI Agents Python v0.17.6 新增的 pre_approval_tool_input_guardrails 很小,但它把一个常见运行时漏洞说清楚了:如果模型提出的工具调用本身就不合规,系统不应该先弹出 human approval,让人类在噪声里判断,更不应该把“人点了批准”当成输入已经安全的证明。
这个机制的顺序是:本地 function tool 准备触发人工批准前,先跑一次 input guardrails;如果护栏拒绝,SDK 直接把拒绝原因作为 tool output 回给模型,不产生 approval request,也不执行工具;如果护栏放行,才进入 pending approval。更关键的是,批准之后、真正执行之前还会再跑同一套输入护栏一次,避免“批准时合法,恢复执行时环境/策略/参数已变化”的时间差问题。
放到 OPC 或任何 Agent 平台里看,approval ticket 应该只承载“是否允许这个已成形动作发生”,不应该混杂 schema 校验、租户权限、路径能力、金额上限、目标对象存在性这些机器可判定的事情。一个删除资源、转账、发消息、改配置的工具调用,最好先经过 typed schema、policy guardrail、risk classifier 和 resource binding,再生成给人的审批卡片;人批准后也要用同一个 call_id、输入摘要、policy version 和 actor scope 重新校验,而不是直接 resume。
常见误区是把 human-in-the-loop 当成万能兜底:只要有人看过,就可以少做前置验证。实际上这会制造两类问题:一是把大量显然非法的调用推给人,降低审批质量;二是批准事实和执行输入脱钩,后续 replay/resume 时很难证明“被批准的就是将要执行的”。更稳的做法是把批准建模成服务端能力票据:它引用已校验的工具调用身份,而不是替代工具调用验证。
你现在设计的高风险工具里,哪些 approval request 其实应该在创建审批卡片之前就被 guardrail 拦掉?哪些在用户批准之后、执行之前还需要重新验证一次?