概述
ModelRiver 输入护栏在请求转发给 AI 提供商之前,于网关层扫描用户提供的文本。护栏在所有支持的入口点上自动运行——原生 API、流式传输、异步、Playground 和 OpenAI 兼容路由。
被拦截的请求永远不会到达提供商,不会产生计费,也不会在日志或错误响应中保留原始提示。
护栏如何工作
每个请求都会经过分层决策流程:
- 文本提取 — 扫描
messages、prompt和input字段。当存在文本部分时,支持多模态消息内容。 - 始终开启的未成年人检查 — 无论项目设置如何,CSAM 和未成年内容都会被拦截。
- 本地分类器 — 快速的基于正则表达式的模式检测明显违规。
- 远程审核 — 当远程审核启用时,模糊情况会升级到 OpenAI
omni-moderation-latest。 - 决策 — 根据项目策略允许、拦截,或在监控模式下记录并允许。
- 审计日志 — 记录类别、来源、延迟和操作。被拦截请求的 request body 永远不会被存储。
重复提示会按项目策略进行指纹化和缓存,以减少相同输入的延迟。
策略模式
在 Settings → Project settings → Content Safety 中按项目配置执行模式:
| 模式 | 行为 |
|---|---|
enforce | 违规请求被拦截,返回 HTTP 403(或 OpenAI 兼容的 400) |
monitor | 违规被记录,但请求继续发往提供商 |
disabled | 可配置类别关闭;未成年人保护仍然强制执行 |
新项目默认使用 enforce 模式,并启用全部四个可配置类别。自托管部署可设置 GUARDRAILS_FORCE_ENFORCE=true,强制所有项目使用执行模式。
内容类别
每个项目可配置四个类别:
| 类别 | 描述 |
|---|---|
sexual | 露骨或色情内容 |
self-harm | 自杀或自残指令 |
hate | 侮辱性言论、种族灭绝或种族清洗 |
violence | 武器、爆炸物、谋杀或尸体处理 |
未成年人/CSAM 保护始终强制执行,无法禁用。即使项目模式为 disabled 或全局 GUARDRAILS_ENABLED 标志关闭,此保护仍然有效。
配置护栏
- 在控制台中打开项目
- 进入 Settings → Project settings
- 滚动到 Content Safety
- 选择模式:Enforce、Monitor 或 Disabled
- 切换要强制执行的类别
- 点击 Save
访问控制
- 仅限所有者/管理员:只有组织所有者和管理员可以削弱护栏——从执行切换到监控/禁用,或移除类别
- 成员可加强策略:成员可以重新启用类别或切换回执行模式
- 按项目隔离:护栏策略按项目独立配置
覆盖的入口点
护栏在以下位置自动运行:
- 原生同步:
POST /api/v1/ai - 原生异步:
POST /api/v1/ai/async - 流式传输:SSE 开始前进行预检
- OpenAI 兼容:
POST /api/v1/chat/completions - 控制台 Playground(同步和异步)
仅包含图片或空文本的请求返回 not_checked,在没有文本分类的情况下继续处理。护栏仅适用于输入——AI 输出不会在服务端被审核。
错误处理
在执行模式下,被拦截的请求会显示清晰的错误:
| API | 状态 | 错误代码 | 消息 |
|---|---|---|---|
| 原生 API | 403 | content_policy_violation | Request blocked by content policy. |
| OpenAI 兼容 | 400 | content_policy_violation | Request blocked by content policy. |
| 流式传输(预检) | 403 | content_policy_violation | SSE 开始前的 JSON 响应 |
| 滥用节流 | 429 | rate_limited | 重复拒绝后的冷却期 |
被拦截的响应在可用时包含触发的 categories。原始提示永远不会在错误正文中返回。当同一 API 密钥或用户反复在执行模式下被拒绝后,ModelRiver 会返回带有 Retry-After 标头的 HTTP 429(默认:每个项目 900 秒窗口内 5 次拒绝)。
隐私与计费
- 无提示泄露:被拦截的提示不会存储在请求日志中,也不会在 API 错误中返回
- 无提供商计费:被拦截和节流的请求不会增加组织请求计数器,也不会消耗提供商 Token
- 审计而不暴露:护栏日志记录
guardrail_result、guardrail_action、guardrail_source、guardrail_categories和guardrail_latency_ms,且request_body: nil
在监控模式下,违规请求会继续发往提供商,但护栏决策仍会记录为 guardrail_action: allow。
最佳实践
- 从监控模式开始:在对生产流量强制执行拦截之前,先观察违规率
- 保持执行模式为默认:面向公众的应用和生产 API 密钥应使用执行模式
- 将削弱权限限制给管理员:使用组织角色,确保只有所有者/管理员可以禁用或削弱护栏
- 审查护栏日志:使用控制台请求日志审计类别和延迟,无需访问被拦截的提示文本
下一步
- 合规 (Compliance):审计轨迹和监管考虑
- 数据保留 (Data retention):了解请求数据如何存储和管理
- API 密钥:管理身份验证凭据
- 可观测性 (Observability):监控并审计请求日志