安全护栏行为
安全护栏会在 AISIX 转发受支持的网关流量之前、上游返回响应之后,或在这两处添加内容策略检查。其共用运行时控制项决定哪些路由和内容会被检查、匹配是否会阻止流量,以及调用方和操作员能够观测到什么。
内置关键词和 PII 安全护栏在网关内部评估内容。语义筛查会调用配置好的向量嵌入模型,自定义脚本则运行运维自定义的逻辑。服务提供方集成会把提取出的内容发送到审核服务,并应用其决策。选择安全护栏服务提供方比较了这些选项。
所有类别都使用本页所述的行为。适用的检查无法完成时,通常由失败设置决定会发生什么;部分流式和解码路径则有更严格或固定的处理方式。
检查位置
安全护栏的检查位置决定 AISIX 在哪里执行检查,以及阻断内容时会发生什么:
| 检查位置 | AISIX 检查内容 | 被阻断时的效果 |
|---|---|---|
input | AISIX 发送到服务提供方之前的调用方请求。 | 不会调用服务提供方。 |
output | AISIX 返回给调用方之前的响应内容。 | 调用方不会收到被阻断的响应。 |
both | 请求和响应内容。 | 在路由支持的两侧都应用同一个安全护栏。 |
输入安全护栏覆盖标准推理路由中包含文本的部分,包括 Chat Completions、Completions、Responses、Messages、Embeddings、图像生成与编辑、视频生成、音频语音及重排请求。AISIX 还会扫描可选的音频转录和翻译提示词、Realtime 文本帧、MCP tools/call 参数以及 A2A 消息文本。相同的输入检查也覆盖 Batch 和 Fine-tuning 请求载荷,以及透传路由请求体。输入为 token ID 的嵌入请求不包含文本,因此输入安全护栏没有可扫描的内容,会放行该请求,参见向量嵌入。
输出安全护栏会扫描 Chat Completions、Completions、Responses、Messages、音频转录和翻译返回的文本。它们还会扫描 Realtime 文本帧、MCP tools/call 结果、Batch 和 Fine-tuning 响应载荷,以及透传路由响应体。A2A、Embeddings、图像生成与编辑、视频生成、音频语音、重排和 Count Tokens 只运行输入侧检查。Realtime 二进制帧会直接中继,不执行安全护栏内容检查。对于带音频输出的 Chat Completions,输出安全护栏会扫描返回的消息文本,但不会检查 message.audio 或流式 delta.audio 中生成的音频,包括嵌套在其中的转录文本;参见聊天音频。
在原生 /v1/responses 上,输出扫描覆盖消息文本,以及每个工具调用的名称、参数和输入。托管工具的结果(例如 mcp_call.output、File Search 结果和 Code Interpreter 日志)不会被扫描或脱敏,refusal 片段和托管工具的代码或操作文本同样不会。
在 /v1/chat/completions、/v1/messages、/v1/messages/count_tokens、/v1/responses 以及承载可识别信封的透传路由上,护栏在输入和输出两个方向都从不扫描工具调用 ID。这里的 ID 指将工具调用与其结果关联起来的 id、call_id、tool_use_id 或 tool_call_id,包括其中携带的 Gemini 思维签名。函数名称、参数和工具结果仍会被扫描。因此,只匹配工具调用 ID 内部文本的规则不会触发。
在透传路由上,安全护栏通过 passthrough_route 挂载作用域生效,并与调用方 API Key、团队和环境作用域并列。扫描文本遵循识别出的正文信封。携带可识别 LLM 信封(Chat、Completions、Responses)的请求会扫描提取出的消息或提示词文本,以及与这些字段一起转发的普通 JSON 字符串。工具调用 ID 以及安全护栏扫描范围列出的其他不透明句柄不会被扫描。提取范围包括工具调用参数以及 Anthropic Messages 流量的内容;各信封读取哪些内容,请参见安全护栏扫描范围。
如果 AISIX 识别出信封但无法解码,AISIX 不会回退到扫描原始正文。这可防止类型化的不透明媒体被重新解释为文本。对于透传路由承载的可识别 Responses 信封,输出扫描仅覆 盖可识别的可见文本、refusal 和工具字段。已知媒体、推理和未知输出项仍不透明。格式错误的可识别缓冲输出无法评估,并按已配置的失败策略处理。未知的 Responses 流事件仍不透明。
对于不透明的缓冲流量,如果正文是 JSON,则扫描已解码的 JSON 字符串值;否则扫描文本正文。不透明 SSE 流只能扫描单独的 JSON 字符串。其他承载内容的载荷形态无法评估,因为 AISIX 无法可靠地将其文本与之前的流内容关联。
请求在转发前扫描。阻断判定会返回 422,并且不会接触上游。内置 pii 安全护栏无法把掩码结果写回服务提供方原生正文,因此仅配置 mask 动作时,匹配内容会不经掩码原样转发,并按无法执行脱敏的接入面所述记录。如果匹配内容绝不能到达上游,请使用 block 动作。Presidio、Lakera 等安全护栏类型则会在可掩码的结果没有回写通道时给出阻断判定。有一种情况会覆盖上述全部规则。Anthropic thinking 块内部的掩码命中,对所有安全护栏类型都会原样转发,因为该块是带签名的。参见推理与思考内容。
非流式响应会在中继前完整缓冲,AISIX 会扫描其符合条件的内容。阻断判定会返回 422,并扣下上游响应体。流式响应按护栏链的流式输出策略增量中继。hold-back 护栏会按窗口或全量缓冲帧,只有扫描文本通过后才释放;阻断判定会以一个终止性 SSE error 帧结束流,并丢弃被扣住的帧。各接口面使用各自协议的错误形态,并没有一个统一的帧。Chat Completions 携带 content_filter。/v1/messages 使用嵌套的 Anthropic 形态,错误类型取 Anthropic 合法值,error.code 为 content_filter 或 guardrail_unavailable。透传路由跟随其所中继流的协议:Anthropic Messages 流使用 Anthropic 形态,其他流使用 Chat Completions 形态。/v1/responses 则按上游区分:上游原生提供 Responses API 时,被保留的流会以 422 而不是一个帧被拒绝;AISIX 为不提供该 API 的服务提供方做桥接时,拒绝才是那个扁平的 Responses 错误事件。参见安全护栏拒绝。
Choice、拒答与对数概率
在 /v1/chat/completions 上,输出安全护栏会扫描响应中的每个 choice、refusal 文本和旧版 function_call 的参数,脱敏安全护栏会改写其中每一项。流式响应中,AISIX 分别保存每个 choice 已扫描的文本,因此一个 choice 的 delta 夹在另一个 choice 的 delta 之间到达时,不会把被拦截的字面量拆开或拼接起来。
脱敏安全护栏不会改写 logprobs。因此,请求了 logprobs 的调用方会收到未脱敏的上游 token 文本,即使同一段文本在消息内容中已被脱敏。如果脱敏内容不能到达可以请求 logprobs 的调用方,请使用拦截动作而不是脱敏。
无法执行脱敏的接入面
以下接入面中继的内容,AISIX 没有改写通道:
- 透传路由的请求和响应。
/a2a消息。- Batch 和 Fine-tuning 的请求体,以及为其返回的上游正文。
/v1/realtime双向的文本帧。/v1/videos的提示词。
pii 脱敏规则在这些接入面上命中时,内容不经修改放行,AISIX 会在用量记录中记录这次命中:
| 执行模式 | AISIX 记录的内容 |
|---|---|
block | 一条 action 为 mask_unsupported 的执行命中,附带检测器计数。guardrail_blocked 保持为 false;由于没有内容被脱敏,redacted_entity_counts 不计入该命中。 |
monitor | 一条 action 为 would_mask_unsupported 的监控命中,取代 would_mask,因为强制执行该规则同样不会脱敏任何内容。 |
如果匹配内容绝不能通过,请使用 block 动作。Presidio、Lakera、AWS Bedrock、阿里云 AI 安全护栏和自定义脚本不会在这些接入面上放行脱敏结果,而是拒绝该内容。其他运行安全护栏的接入面会改写需要脱敏的内容,本页其他部分所述的例外除外。
决策端点不做筛查
安全护栏不会在决策端点 /v1/systemone 和 /v1/decisions 上运行。无论请求作用范围内挂载了什么,输入和输出检查 都不会执行,也不会做任何脱敏。这些请求的用量事件不携带安全护栏证据。
Files 路由不做筛查
安全护栏完全不作用于 Files API。POST /v1/files、GET /v1/files、GET /v1/files/{id}、DELETE /v1/files/{id} 和 GET /v1/files/{id}/content 既不运行输入侧检查也不运行输出侧检查,无论请求作用域内挂了什么安全护栏、fail_open 取什么值。上传的文件会按调用方书写的样子原样离开网关,下载的文件也会按服务提供方存储的样子原样到达调用方。同一段文本放在对话消息里会被关键词、PII 或远程安全护栏拒绝,放在这里则根本不会被看到。
遥测不会反映这个缺口。 Files 的用量事件不会为这次缺失的安全护栏检查留下任何标记:安全护栏证据字段全是空的。因此即使在环境上挂了一条关闭式失败的安全护栏,也不会有任何信号提示这些路由没有被覆盖。Files 事件上空白的安全护栏证据部分并不能证明安全护栏覆盖到了它。如果上传内容必须经过筛查,请在它到达网关之前完成。
/v1/batches 和 /v1/fine_tuning/jobs 不受影响。它们的请求体是调用方提交的结构化 JSON,而不是上传的二进制块,这些请求体和对应的响应仍然会被扫描。