Skip to main content
自定义策略能将你在追踪记录或审计中发现的故障模式,转化为 Agent 工作时实时执行的决策。策略可以允许某个操作、向 Agent 提供指导,或在操作引发新的问题之前将其拒绝。 当行为取决于你的工具、路径、命令、环境或操作规范时,请使用自定义策略。建议先查阅 Failproof AI 策略包,避免重复创建已有的控制规则。

编写自定义策略

  1. 前往 Admin → 策略编辑器,选择 新建策略,描述你希望防范的故障场景。
  2. 添加策略代码,然后在编辑器中测试预期匹配项和安全的非匹配项,解决所有验证错误。
  3. 保存草稿并选择 发布版本 以创建一个不可变版本。
  4. 前往 Admin → 执行,以 观察 模式将该版本部署到测试机器,并在 Observe → policy 下验证其决策,确认无误后再正式执行。 用于编写和发布自定义策略的策略编辑器。

从精确的规则开始

以下策略仅在命令指向生产环境时才会拦截破坏性的 Kubernetes 命令。不属于该故障模式的情况均返回 allow()。
好的策略应该精确到能用一句话说清楚。匹配可观测的操作——而非你期望 Agent 的意图——并在规则不适用时尽早返回 allow()。

选择决策类型

为需要恢复的 Agent 撰写说明原因。解释检测到了什么,以及应该改为做什么。
不要将 instruct() 用于安全边界。指导的传递方式因 Agent 运行环境而异。当操作必须被阻止时,请使用 deny()。

策略对象

请在 fn 内部过滤工具。match.toolNames 不属于公开的自定义策略类型。

策略上下文

每个策略都会接收一个 PolicyContext。 请将所有可选值视为真正可选。不同的 Agent 版本和事件类型并不一定提供相同的字段。

常用工具输入

Failproof AI 在支持的运行环境中对常用工具进行了标准化处理,因此策略通常可以使用统一的输入结构。 由于工具输入值的类型为 unknown,请使用防御性类型转换:

选择事件类型

事件可用性和拦截行为取决于 Agent 运行环境。在混合机群中依赖某个事件之前,请参阅 Agent 运行环境。
SessionStart、SessionEnd、UserPromptSubmit、PreToolUse、PermissionRequest、PermissionDenied、PostToolUse、PostToolUseFailure、Notification、SubagentStart、SubagentStop、TaskCreated、TaskCompleted、Stop、StopFailure、TeammateIdle、InstructionsLoaded、ConfigChange、CwdChanged、FileChanged、WorktreeCreate、WorktreeRemove、PreCompact、PostCompact、Elicitation、ElicitationResult、UserPromptExpansion、PostToolBatch 和 Setup。

常见策略模式示例

阻止对受保护路径的写入

提供非阻断性指导

对会话完成进行门控

被拒绝的 Stop 事件可能导致 Agent 重试。请只对 Agent 在当前环境中能够满足的条件进行门控,并为所有子进程或网络调用设置超时限制。

加载策略文件

约定文件

约定文件会自动加载:
  • 项目和用户策略目录均会被加载。
  • 文件在各目录内按字母顺序加载。
  • 文件名必须以 policies.js、policies.mjs 或 policies.ts 结尾。
  • 一个文件中支持多次调用 customPolicies.add()。
  • 支持从本地模块进行相对导入。
  • 项目策略可以提交到版本库,使相同规则随代码库一同传递。

显式文件

当验证或配置需要直接指定入口文件时,使用显式路径:
显式文件优先加载,其次是项目约定文件,最后是用户约定文件。同一个文件通过两种路径发现时只加载一次。

验证和测试

验证过程会通过生产加载器执行模块,并确认其至少注册了一个策略。
验证能捕获缺失的文件、语法错误、未解析的导入、顶层异常和模块加载超时。但它无法证明你的匹配逻辑是否正确。 至少测试以下场景:
  • 一个必须匹配并产生预期策略原因的操作。
  • 一个临近但安全、必须返回 allow() 的操作。
  • 缺失或格式错误的工具字段。
  • 不同的命令语法、路径、引号、大小写和空白字符。
  • 子进程或网络依赖不可用的情况。
在 Observe → policy 下将结果归因于你的自定义策略。如果决策是由其他内置策略做出的,则被拦截的测试不能算作有效验证。

运行时行为

  • 内置策略在自定义策略之前评估。
  • 第一个 deny 会停止后续的策略评估。
  • 当没有策略拒绝事件时,多个 instruct 结果可以合并。
  • 策略函数有 10 秒的执行时限。
  • 抛出的异常或超时会被记录日志并视为 allow()。
  • 加载失败的约定文件会被跳过;其他自定义文件和内置策略继续执行。
  • 顶层模块加载同样有 10 秒的时限。
  • 云端观察模式会运行策略,但会记录非 allow 决策而不实际执行拦截。
保持策略模块的确定性和高效性。避免顶层网络调用或服务启动。在 fn 内限制工作量、捕获依赖故障,并有意识地决定故障时应 allow 还是 deny 操作。

API 导出

TypeScript 导出 PolicyContext、PolicyResult、CustomHook、PolicyDecision 和 PolicyFunction。

部署自定义策略

发布版本、以观察模式部署、验证决策,然后切换到强制执行模式。