跳轉到主要內容
如果你的應用程式串流,在你信任一個內容政策之前需要一個直接的答案:在一個 SSE 回應上實際強制執行什麼。 一個檢查整個回覆的防護欄容易推理;一個必須在 delta 沖向瀏覽器時對它們採取行動的防護欄則不然。本頁是串流防護欄覆蓋矩陣——每個動作,跨輸入與輸出階段,在串流與非串流流量上——撰寫得對每一格在一個實際串流上如何行為都很精確。 完整引擎——每種規則類型、欄位與路由——請見 防護欄。一個串流如何被切斷的機制,請見 串流安全規則

1. 串流防護欄覆蓋問題

一條防護欄規則攜帶一個階段inputoutputboth)與一個動作——五者之一:blockmaskflagannotatespotlight。階段決定閘道何時執行它;動作決定它做什麼。串流改變答案形狀的唯一地方是輸出階段——因為那是閘道在位元組抵達時就轉送給你客戶端、沒有機會先持有整個酬載的唯一階段。 所以矩陣有兩格串流有影響,而它們行為不同:輸出 block 在一個串流上完全強制執行(掃描器切斷它),但輸出 mask 僅在非串流回覆上強制執行。在一個串流回覆上,掃描器仍會偵測到匹配並能對一個封鎖決策採取行動,但它今天不會把遮罩後的文字改寫進串流——帶內串流輸出遮罩仍在規劃中。
輸入從來不是問題。 輸入階段規則在模型之前執行——閘道審查(且對 mask 而言改寫)你的請求,然後把淨化後的版本向上游轉送。回應是否會串流無關緊要;請求是閘道完整持有的一個完整酬載。輸入掃描在每個請求上都完全上線,包括遮罩

2. 覆蓋矩陣

由上往下讀。每個 block 格都已上線,包括串流——但 輸出 + 遮罩 + 串流 是那一個尚未在串流中強制執行的格:一條遮罩規則遮罩一個非串流回覆,而在一個串流回覆上它偵測到匹配但不改寫 delta(帶內輸出遮罩仍在規劃中)。
階段 · 動作非串流串流
input · block拒絕請求拒絕請求
input · mask改寫請求改寫請求
output · block拒絕回覆切斷串流
output · mask遮罩回覆偵測匹配;不帶內遮罩(規劃中)
any · flag僅記錄僅記錄
annotatespotlight 在不拒絕流量的情況下附上一則註記(或包裹匹配文字),且在實務上是輸入階段動作,所以它們不改變上方的輸出/串流格;它們像任何其他規則一樣記錄一個匹配。
輸入階段規則在上游模型執行之前審查請求。一個 block 會短路呼叫(HTTP 400 guardrail_blocked,在計量之前,所以不消耗配額)。一個 mask 會把提示中匹配到的欄位就地改寫——淨化後的文字就是向上游送出的東西,而模型永遠看不到原始內容。這些都不取決於回應是否串流。
在一個非串流回覆上,完成內容會在回傳前被完整審查——一個封鎖呈現為 HTTP 400 guardrail_blocked。在一個串流回覆上,一個串流掃描器會在 delta 流動時監看它們;當一條封鎖規則觸發時,它會切斷串流——封閉掃描器、發出一則簡短的替代通知以取代其餘部分,並在進一步被封鎖的內容抵達客戶端之前關閉 SSE 通道。由於 200 SSE 標頭到那時已經送出,一個串流封鎖無法傳回一個 400:它把封鎖作為一個最後的帶內 delta 而非一個 HTTP 錯誤來傳遞。
在一個非串流回覆上,一條 mask 規則會改寫完成內容——例如一個電子郵件變成 [EMAIL]——而淨化後的文字就是你客戶端得到的東西。在一個串流回覆上,串流掃描器仍會偵測到匹配並計算遮罩,但它不會把遮罩後的文字轉送進 delta——遮罩後的輸出被丟棄,且只對一個封鎖決策採取行動。所以一條遮罩規則今天不會遮罩一個串流回覆;帶內串流輸出遮罩仍在規劃中。如果你現在需要 PII 不進入一個串流回覆,把規則撰寫為 block(掃描器在匹配時切斷串流)或以非串流方式審查。
一條 flag 規則永不更改流量——它記錄一個匹配並放行位元組。階段與串流不改變它的行為。用它來在把一條規則晉升為 block 之前衡量它的命中率。
要記住的一行: 輸出 block 在兩種傳輸上都即時強制執行——包括串流——而輸入遮罩總是即時的。輸出 mask 僅遮罩非串流回覆;在一個串流上它偵測到匹配但尚未改寫 delta(帶內輸出遮罩仍在規劃中)。若要在今天讓 PII 不進入一個串流回覆,把規則撰寫為 block 或以非串流方式審查。

3. 一個具體範例——讓 PII 不進入一個串流回覆

假設模型可以從 RAG 情境中浮現一個客戶電子郵件,而你的應用程式會串流。輸出 mask 今天不會在串流中遮罩(帶內輸出遮罩仍在規劃中)——所以若要讓 PII 不進入一個串流回覆,把輸出規則撰寫為 block:掃描器會在一個匹配出現的那一刻終止串流。(輸出 mask 確實會在一個非串流回覆上遮罩。) 政策編輯是你主控台工作階段上的一個管理動作(把關到 Developer+);sk-orca-... 中繼金鑰只發送 /v1/* 流量,絕不編輯政策。
  • 開啟 /console/guardrailsNew guardrail,把它命名為 stream-pii-out
  • 新增一條規則:
    • 類型: PII detection
    • 階段: output
    • 動作: block ← 在匹配時切斷串流;在一個串流上 mask 只偵測(它遮罩非串流回覆)
  • 儲存,然後在 /console/token 透過金鑰的 Guardrail 下拉選單綁定它。
現在用 stream: true 像以前一樣呼叫閘道:
curl https://api.orcarouter.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-orca-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "stream": true,
    "messages": [
      {"role": "user", "content": "Email the customer from the record above"}
    ]
  }'
如果一個 delta 匹配,掃描器會切斷串流、發出一則替代通知,並關閉通道——客戶端永不收到其餘部分。如果回覆是乾淨的,每個 delta 都會原封不動地串流通過。
一個串流封鎖停止匹配之後的一切,但它無法收回在匹配落地之前已經沖出的位元組。如果你的政策要求沒有一個違規位元組曾抵達客戶端,請以非串流方式審查請求,此時整個完成內容會被持有直到政策放行它。

4. 跨矩陣的 PII Shield

PII Shield 預設是一條單一的 pii 規則,動作 mask,階段 both。把它對應到矩陣,覆蓋範圍正是你會從 §2 預期的:
  • 輸入階段——完全上線,無論串流與否。請求在模型看到之前被遮罩(輸入遮罩的頭條價值)。
  • 輸出階段,非串流——完成內容在回傳前被遮罩。
  • 輸出階段,串流——串流掃描器偵測到匹配但今天改寫 delta,所以遮罩後的形式不會抵達一個串流客戶端(帶內輸出遮罩仍在規劃中)。
所以遮罩預設本身涵蓋一個串流回覆中的 PII。若要讓 PII 不進入一個串流回覆,把那條規則撰寫為 block(或以非串流方式呼叫),這樣串流就會在匹配時被切斷。參見 PII Shield遮罩格式

5. 一個串流封鎖花費什麼

一個串流封鎖攜帶與任何輸出封鎖相同的記帳——模型已經執行,所以閘道會為你處理退還:
  • 在一個非串流回覆上,呼叫會傳回 HTTP 400 guardrail_blocked,並指名觸發的防護欄與規則。在一個串流回覆上,200 SSE 標頭已經在線上,所以封鎖會作為一個最後的帶內替代 delta 與一次乾淨的通道關閉抵達,而非一個 400
  • 不消耗任何配額。 輸入封鎖在計量之前觸發;輸出封鎖(無論串流與否)會在回覆被拒絕後退還已預先扣除的配額。無論哪種情況,呼叫方都不付費。
  • 請求被標記為 skip-retry——重跑同一個提示只會再次封鎖,所以閘道不會在另一個通道上燒掉一次重試。
每條觸發的輸出規則也會在工作區 Matches 動態(GET /api/guardrail/match,對任何 Member 開放)中記錄一個 match;匹配到的子字串只在防護欄的 Log raw content 切換開啟時才會擷取(預設為關閉)。完整詳情請見 guardrail_blocked 錯誤匹配動態

6. 出貨前先證明你的階段/動作組合

別猜測矩陣的哪一格套用於你的政策——驗證它。兩個工具都透過管理 API 在你的主控台工作階段上執行:

Test 分頁

每個防護欄編輯器都有一個 Test 分頁:貼上一個樣本,選擇階段,並在無上游呼叫、不消耗配額的情況下執行目前政策。查看裁決,以及(對於遮罩規則)渲染後的文字。Test 沙盒被把關到 Developer+(它可以發出付費的評審/接地呼叫與外向整合請求)。

Eval 分頁

Eval 分頁針對隨附或自訂的 JSONL 語料庫為一個防護欄評分——在你綁定金鑰之前用以確認一條封鎖規則捕捉到一個已知洩漏很有用。執行一次評測只需要讀取存取(viewer+)。
深入內容請見 測試與評測調校誤報

7. 下一步去哪裡

串流安全規則

掃描器如何於飛行途中切斷一個 SSE 串流,以及如何撰寫一個能在串流流量上成立的政策。

輸出階段

審查模型的回覆——block 對 mask、配額退還,以及接地。

輸入階段

在模型之前審查請求——包括遮罩,無論串流與否。

動作

深入 block、mask、flag、annotate 與 spotlight——每一個何時是正確的選擇。
防護欄——每種規則類型、欄位與路由,包括接地與 LLM 評審。