/api/guardrail/* 路由打交道。本页是逐路由的
防护栏 api 参考:每一个端点、它所需的工作区角色,以及它期待的认证。
关于一个防护栏是什么以及规则如何组合,请阅读
防护栏。本页是它的线缆级别(wire-level)搭档。
1. 认证与范围
每一个/api/guardrail/* 路由都是管理平面(management plane):它用
你的控制台会话或访问令牌(你用来登录控制台的同一身份)来认证,而非
一个中继密钥。
- 路由是工作区限定的——它们永远只看到活跃工作区的防护栏。没有任何 东西跨越租户边界。
- 每个路由都按你的 工作区角色 (Viewer / Developer / Admin / Owner)做 RBAC 门控。读取对 Viewer+ 开放;沙箱和所有写入需要 Developer+;误报端点需要 Admin(Admin 或 Owner)。
大多数团队从不直接调用这些路由——控制台驱动了它们全部。当你想把防护栏
放进源代码控制、放进 CI,或接进你自己的工具链时,才动用 REST 表面。
2. 一个具体调用——列出你的防护栏
读取是最简单的起点。以任意工作区成员(Viewer+)身份认证:3. 一张表里的角色模型
挑选层级的是你所采取的动作,而非路由。| 动作 | 最低角色 |
|---|---|
| 读取(列表/获取、历史、匹配、评测运行)、运行一次评测 | Viewer+ |
| 运行沙箱测试 | Developer+ |
| 创建、更新、删除、还原、上传/删除语料 | Developer+ |
| 标记 / 取消标记一条匹配为误报 | Admin |
guardrails:read 权限(Viewer 及以上持有);写入映射到
guardrails:write(Developer 及以上)。标记一条误报还额外需要 Admin 角色。
关于角色和权限如何组合,参见
范围、密钥与策略。
4. 按区域划分的路由
防护栏(CRUD + 沙箱)
防护栏(CRUD + 沙箱)
| 方法与路径 | 角色 |
|---|---|
GET /api/guardrail/ | Viewer+ |
GET /api/guardrail/meta | Viewer+ |
GET /api/guardrail/my-permissions | 任意成员 |
GET /api/guardrail/:id | Viewer+ |
GET /api/guardrail/:id/tokens | Viewer+ |
POST /api/guardrail/test | Developer+ |
POST /api/guardrail/ | Developer+ |
PUT /api/guardrail/ | Developer+ |
DELETE /api/guardrail/:id | Developer+ |
meta 返回引擎词汇——规则类型、阶段、动作、PII 实体、预设以及预设
类别——这样一个工具就能在不硬编码枚举的情况下构建表单。test 在一个
沙箱里对样本文本运行当前策略:不持久化任何内容,不发往上游。版本历史
版本历史
| 方法与路径 | 角色 |
|---|---|
GET /api/guardrail/:id/history | Viewer+ |
GET /api/guardrail/:id/history/diff | Viewer+ |
GET /api/guardrail/:id/history/:version | Viewer+ |
POST /api/guardrail/:id/revert | Developer+ |
revert 把一个
旧版本向前复制为一个新版本——历史永不被改动。评测与语料
评测与语料
| 方法与路径 | 角色 |
|---|---|
POST /api/guardrail/:id/eval | Viewer+ |
GET /api/guardrail/:id/eval/runs | Viewer+ |
GET /api/guardrail/eval/runs/:run_id | Viewer+ |
GET /api/guardrail/eval/corpora | Viewer+ |
POST /api/guardrail/eval/corpora | Developer+ |
GET /api/guardrail/eval/corpora/:id | Viewer+ |
DELETE /api/guardrail/eval/corpora/:id | Developer+ |
Matches 信息流
Matches 信息流
| 方法与路径 | 角色 |
|---|---|
GET /api/guardrail/match | 任意成员 |
GET /api/guardrail/match/grouped | 任意成员 |
GET /api/guardrail/match/stats | 任意成员 |
GET /api/guardrail/match/export | 任意成员 |
GET /api/guardrail/match/cap-status | 任意成员 |
GET /api/guardrail/match/:id | 任意成员 |
POST /api/guardrail/match/:id/mark-fp | Admin |
DELETE /api/guardrail/match/:id/mark-fp | Admin |
mark-fp 路由是 Admin 专属(Admin 或 Owner)且有速率限制。5. 解析:哪个防护栏生效
上面的路由管理策略;解析则决定在某次给定的中继调用上哪一个运行。这是一个 **显式或默认(explicit-or-default)**模型,对显式附加没有静默回退:- 密钥上的显式
guardrail_id→ 该防护栏生效,前提是它存在且已启用。 一个被禁用的附加就是那个关闭开关——它不会回退。 - 没有附加 → 工作区已启用的默认防护栏(
is_default)。 - 两者皆无 → 不执行。该请求与一个从未启用该功能的工作区字节相同。
guardrail_id;0/null 表示
“没有显式附加”。
6. 一次拦截返回什么
当一条block 动作规则触发时,中继调用(/v1/*,在你的中继密钥上)——
而非这些管理路由——返回:
| 字段 | 值 |
|---|---|
| HTTP 状态 | 400 |
| 错误码 | guardrail_blocked |
| 配额代价 | 一次输入阶段拦截在预扣之前触发,因此不收取任何配额 |
| 重试 | 标记为 skip-retry |
7. 动作、阶段与规则类型一览
meta 路由把它们作为枚举返回;这里列出以供快速参考。
- 动作:
block(拒绝,HTTP 400)、mask(脱敏匹配项,转发清理后的 文本)、flag(仅记录——在不改变流量的情况下观察)、annotate(非阻塞——记录匹配并向上游注入一条人类可读的备注,让模型在回答之前 被告知)、spotlight(非阻塞——把匹配到的不可信片段用分隔符包裹起来, 并告诉模型把它当作数据而非指令处理;一种提示注入防御,实践中作用于 输入阶段)。 - 阶段:
input(请求)、output(模型的响应)或both。 - 规则类型:
keyword、regex、pii、max_chars、external、llm_judge、grounding。
输出阶段规则在流式和非流式响应上都执行:一个
block 切断流,而一个
mask 会在分块流动时就地改写匹配的片段。在一个流上,已经刷出的字节无法
撤回,因此一条匹配只有在它缓冲到足够多时才会被处置——为了获得最强保证,
在输入阶段扫描,它会在模型看到请求之前对其消毒。先在沙箱里证明你
确切的阶段/流式组合。8. 相关参考
防火墙 API
动作平面的对等物——
/api/workspace/firewall/* 和网关路由。合规 API
/api/compliance/* —— 合规包、签名报告、数据居住、就绪度。错误码
每一个
*_blocked 错误码、它的 HTTP 状态,以及该怎么处理。防护栏(深入)
规则类型、PII 实体、预设、评测,以及完整的匹配信息流。
