跳轉到主要內容
當一個防護欄拒絕一次呼叫時,閘道會以 HTTP 400 與錯誤代碼 guardrail_blocked 回應你的應用程式。本頁是那一個錯誤的落地參考:主體長什麼樣、它為何如此行為,以及如何在客戶端程式碼中處理它。它背後的政策引擎請見 防護欄總覽完整參考

1. 何時你會看到 guardrail_blocked

一個 防護欄 是閘道會針對請求輸入與模型輸出執行的一份有序規則清單。當一條動作為 block 的規則觸發時,呼叫會被拒絕——上游模型永不被呼叫(輸入階段)或它的答案被扣留(輸出階段)。客戶端會收到一個攜帶 guardrail_blocked 的 400。 沒有其他動作會產生這個錯誤。mask 遮罩匹配項並讓淨化後的文字通過,flag 在不改變流量的情況下記錄一個匹配,而塑形提示的動作(annotatespotlight)則讓呼叫繼續,同時附上一則註記或包裹不可信文字。在五種動作中,只有 block 拒絕。參見 動作
guardrail_blocked 是一次內容拒絕(文字進、文字出)。配套的工具政策拒絕是來自 代理防火牆firewall_blocked——一個形狀不同的不同錯誤。參見 防護欄與防火牆

2. 回應主體

封鎖會以閘道標準的 OpenAI 形狀錯誤封包傳回。在一個 OpenAI 風格的端點(/v1/chat/completions/v1/responses)上:
{
  "error": {
    "message": "request blocked by guardrail \"pii-shield\": pii(ssn)",
    "type": "orcarouter_api_error",
    "param": "",
    "code": "guardrail_blocked"
  }
}
你要依據的欄位:
穩定的機器識別碼。依據這個分支,而不是訊息字串。它在每個端點上都是相同的值,且永不本地化。
人類可讀。其形式為 request blocked by guardrail "<name>": <detail>,其中 <detail><type>(<rule-detail>) 形式摘要觸發的規則類型——例如 pii(pii: ssn)keyword(matched 1 keyword(s))。一個輸出階段的封鎖讀作 response blocked by guardrail "<name>": <detail>,所以動詞會告訴你是哪個階段拒絕了呼叫。訊息在離開閘道前會先經過敏感資訊遮罩,所以別期望在這裡看到原始匹配子字串。
OpenAI 風格端點上的通用閘道錯誤類型。用以辨別的訊號是 code,不是 type
在原生 Anthropic 介面(/v1/messages)上,封包是 Claude 形狀的——{"error": {"type": ..., "message": ...}}——而 guardrail_blocked 出現在 type 欄位中,所以一個原生 Claude SDK 可以把政策拒絕與通用閘道失敗區分開來。
想在出貨一條規則前得到確切的裁決?主控台 Test 分頁會在無上游呼叫、不消耗配額的情況下針對樣本文字評估目前政策——參見 測試與評測

3. 為何 guardrail_blocked 不消耗配額

一個被封鎖的請求是免費的——它永不從你的點數餘額扣款。
階段封鎖何時觸發配額效果
input在上游呼叫之前、計量之前不計量任何東西
output在模型回答之後、答案回傳之前退還已預先扣除的配額
所以輸入封鎖不被計費是因為計量還沒發生,而輸出封鎖則逆轉了閘道在轉送前放置的保留額度。無論哪種情況,呼叫方都是以一個 400 而非點數來為封鎖付出代價。參見 輸入階段輸出階段

4. 為何 guardrail_blocked 跳過重試

該錯誤被標記為 skip-retry。閘道自己的路由不會把這個請求容錯轉移到另一個通道,因為封鎖是你內容與政策的一個屬性——重跑同一個提示只會在下一個通道上再次封鎖並浪費那次嘗試。
也別把 guardrail_blocked 放進你客戶端的重試迴圈。它是確定性的:針對同一份政策的同一個提示每次都封鎖。重試會為一個無法改變的結果燒掉延遲。把它當作一個終端拒絕——修正輸入,或修正政策。

5. 在客戶端程式碼中處理它

依據 code 欄位分支,並向終端使用者呈現一則有用的訊息,而不是重試。
import httpx

resp = httpx.post(
    "https://api.orcarouter.ai/v1/chat/completions",
    headers={"Authorization": "Bearer sk-orca-..."},
    json={
        "model": "openai/gpt-4o-mini",
        "messages": [{"role": "user", "content": "My SSN is 123-45-6789"}],
    },
)

if resp.status_code == 400:
    err = resp.json().get("error", {})
    if err.get("code") == "guardrail_blocked":
        # Terminal — do not retry. Tell the user what to change.
        raise ValueError(f"Blocked by policy: {err['message']}")

resp.raise_for_status()
這裡的 sk-orca-... 金鑰是一把中繼金鑰——它只攜帶 /v1/* 流量。你絕不用它編輯防護欄;撰寫與綁定政策是你工作階段上的一個主控台/管理 API 動作,而建立或編輯防護欄需要 Developer+ 角色。

6. 確認與調校一個封鎖

每條觸發的規則——包括封鎖——都會落入工作區 Matches 動態,附上它的類型、動作、階段,以及一個詳情字串。那就是你確認哪一條規則拒絕了某次呼叫並分流誤報的地方。

匹配動態

查看每個 block、mask 與 flag 的類型、動作與階段。匹配到的子字串只在 Log raw content 開啟時才出現。

日誌與隱私

原始內容預設為關閉——隱私保守姿態。當你需要子字串進行分流時,逐個防護欄開啟它。

調校誤報

誤報是一個調校訊號,不是停用規則的理由。標記它並收窄模式。

版本控制

變更了政策並想還原它?比對任意兩個版本並以新版本還原——歷史永不可變。
在一個串流回應上,輸出 block 仍然套用:掃描器會在飛行途中切斷串流,然後才有任何被封鎖的內容抵達客戶端。輸出 mask 在串流上也帶內套用——掃描器會在安全前綴被發出之前,在滾動緩衝區中改寫匹配項。參見 串流覆蓋串流安全規則

7. 相關