你的代理决定删掉一个你从没提过的文件夹。在模型和你的 shell 之间,总得有个东西说"不"。
10月15日,OpenRouter 上线了 beta 版 Armor,就是来当这个"不"的。它是一个安全分类器,坐在模型和你的应用之间,用你写的自然语言规则检查每一次工具调用。被标记的调用不会被执行,模型还会被告知它撞了哪条规则。GIGAZINE 在10月16日跟进了这次发布。
但有一个模式下,"不会被执行"这句话得打个折扣——它取决于你。
在 Messages API 上,也就是为 Claude Code 构建的那个模式里,Armor 会把被标记的 tool_use 留在响应里,只做标记。文档写得很直白:"在 claude_code_compatibility 下,你的应用才是拦住调用的那一环。"在文档描述的流程里,Claude Code 就是这个应用:它读取被标记的判定,拒绝调用,并写回一个 is_error 的工具结果。缺口在于——如果你自己写了个 Messages 客户端,却从不读这个判定,那这道闸就是虚设。
它用什么在查
对每一次工具调用,OpenRouter 会把调用、你的规则和对话一起发给一个决策模型,模型返回该调用匹配每条规则的概率,Armor 再把这些折成一个判定:flagged 或 not_flagged。
发布帖点名了模型:TypeSafe 的 Jev。Jev 是一个结构化决策模型,返回带概率的类型化答案,而不是生成文本,相关指南把 typesafe/jev-1.14 列为当前版本。
为什么用模型而不是模式列表?OpenRouter 的说法是"基于正则的过滤往往不足以检测不受欢迎的工具调用"。发布帖还称 Armor 在性能和成本上优于 Claude Code 自带的 auto 模式分类器。explainx.ai 上的一篇评测指出,OpenRouter 并没有公布支撑这一说法的测试集或数字。
三档规则
规则分三层:hard_deny 用于"无论用户说什么都绝不能发生"的动作;soft_deny 用于"通常不对但有时会被正当请求"的动作,命中后会阻止调用,除非同时命中一条 allow 规则,或者用户在该对话中明确要求对那个确切目标做那个确切操作;allow 本身从不阻止任何东西,它定义的是 soft-deny 规则的例外。
Armor 还内置了一条 soft-deny,针对用户在对话中设定且尚未解除的限制,比如"我审阅之前别推送"。每条规则接受 id、可选的 name、instructions 和可选的 threshold。默认阈值是 deny 规则 0.6、allow 规则 0.7。
用 "mode": "audit" 时,Armor 给每次调用打分但不拦任何东西,方便你先拿真实流量调规则,再转为强制执行。审计模式不能和 claude_code_compatibility 同时使用。
被拦下的调用去哪了
拦截长什么样取决于 output_mode。前两种模式下,被拦的调用根本到不了你的代码,模型会被告知该调用"被 OpenRouter Armor 按它命中的规则阻止,未被执行",还会被告知"不要用相同参数重试"。
第三种模式不一样。一个带有 dangerous_tool_use 类型 safeguards 条目的 Messages 请求会自动选中它,不需要 plugins 条目。文档随即警告:"忽略 safeguard_results 的 Messages 客户端会执行被标记的 tool_use。"如果你的客户端可能不检查,文档建议改用 "output_mode": "text"。
如果你要自己写 Messages 客户端,执行前先检查。safeguard_results 是顶层数组,每个条目的 status.tool_uses 以工具调用 id 为键,带有 type、outcome 和可选的 explanation。只有当 Armor 评估过且没有标记时,才运行该调用。
失败时关门还是开门
决策模型可能超时、报错,或者请求大到无法判断。此时判定为 unavailable,由 on_error 决定后续:block(默认)还是 log。这个设置管不到 Claude Code 模式——在那里,按文档说法,"unavailable 的调用总是带着可见判定被放行",由你的客户端决定。
还有几个边界,都来自文档:
- Armor 目前不支持 HIPAA、零数据保留或数据区域限制下的请求,这些场景的插件请求会被 403 拒绝。Claude Code 请求则会带着 unavailable 判定放行,Claude Code 回退到自己的本地 auto 模式检查。
- 决策模型会产生误报和漏报,每条规则的 threshold 就是调节旋钮。
- 加载 Claude Code 兼容规则集后,Armor"在中位数上增加了 279 毫秒延迟,90 分位上是 334 毫秒"。
- "beta 期间评估不收费。"OpenRouter 表示定价会在正式可用前公布,配置字段、safeguard_results 对象和 openrouter:armor_blocked 条目类型仍可能变动。
第三条是每次工具调用的成本。一个代理回合如果连发多次工具调用,每一次都可能要付这笔延迟。
把 Claude Code 跑在它后面
Armor 的 Claude Code 路径走 Ori,这是 OpenRouter 的启动器,把你已有的代理 CLI 跑在 OpenRouter 上。它用 OAuth 登录而不是粘贴密钥,支持 Claude Code、Codex、OpenCode、Cline 等。Armor 文档随后在一个非 Anthropic 模型上以开启 auto 模式启动 Claude Code,并说明不需要 plugins 条目。
在 Claude Code 的 auto 模式里,"第二个模型,也就是分类器,代替你审阅动作"。GIGAZINE 报道称,通过 Ori,OpenRouter 上的模型可以使用这套审批机制,由 Armor 来做审阅。
如果你这周打算试 Armor,先定三件事:从 "mode": "audit" 开始,先读你自己流量上的判定再让任何东西拦截;在 Chat Completions 和 Responses 上,有意识地选 on_error——block 让一个死掉的检查器无法放行调用,log 让一个死掉的检查器无法卡住你的代理;如果你拥有一个 Messages 客户端,在每次 tool_use 前检查 safeguard_results,或者用 "output_mode": "text"。
你愿意在代理的每一次工具调用前放第二个模型,每次大约 300 毫秒吗?还是更信一个权限提示和你自己的眼睛?
热门跟贴