メインコンテンツへスキップ
ガードレールが呼び出しを拒否すると、ゲートウェイは HTTP 400 とエラーコード guardrail_blocked であなたのアプリケーションに応答します。このページはその ひとつのエラーの着地リファレンスです:ボディがどう見えるか、なぜそのように 振る舞うか、そしてクライアントコードでどう扱うか。その背後のポリシーエンジンに ついては、ガードレール概要完全なリファレンスを参照してください。

1. guardrail_blocked が見えるとき

ガードレールは、ゲートウェイがリクエスト入力と モデル出力に対して実行する、順序付けられたルールのリストです。アクションが block のルールが発火すると、呼び出しは拒否されます — アップストリームモデルは 決して呼び出されない(入力ステージ)か、その回答が差し控えられる(出力ステージ)か のいずれかです。クライアントは guardrail_blocked を運ぶ 400 を受け取ります。 他のアクションはこのエラーを生成しません。mask はマッチをリダクトして サニタイズされたテキストを通し、flag はトラフィックを変えずにマッチを記録し、 プロンプト形成型アクション(annotatespotlight)はノートを付加したり 信頼されていないテキストを囲んだりしながら呼び出しを続行させます。5 つのアクションの うち、block のみが拒否します。アクションを参照。
guardrail_blockedコンテンツの拒否です(テキスト入力、テキスト出力)。 対をなすツールポリシーの拒否は、エージェントファイアウォール からの firewall_blocked です — 異なる形状の異なるエラーです。 ガードレール vs. ファイアウォールを参照。

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 スタイルのエンドポイント上のジェネリックなゲートウェイエラーの種類。 区別するシグナルは type ではなく code です。
ネイティブの Anthropic サーフェス(/v1/messages)では、エンベロープは Claude 形 — {"error": {"type": ..., "message": ...}} — で、guardrail_blockedtype フィールドに現れるため、ネイティブの Claude SDK はポリシー拒否を ジェネリックなゲートウェイ障害から区別できます。
ルールを出荷する前に正確な判定が欲しいですか?コンソールの Test タブは、 アップストリーム呼び出しなし、クォータなしで、サンプルテキストに対して現在の ポリシーを評価します — テストと evalを参照。

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. ブロックの確認とチューニング

発火したすべてのルール — ブロックを含む — は、その種類、アクション、ステージ、 detail 文字列とともにワークスペースの Matches フィードに着地します。そこが、 どのルールが特定の呼び出しを拒否したかを確認し、誤検知をトリアージする場所です。

マッチフィード

すべての block、mask、flag を type、action、stage とともに確認します。 マッチした部分文字列は Log raw content がオンのときのみ現れます。

ロギングとプライバシー

生コンテンツはデフォルトでオフです — プライバシー保守的な姿勢。トリアージの ために部分文字列が必要なときはガードレールごとにオンにします。

誤検知のチューニング

誤検知はチューニングのシグナルであって、ルールを無効化する理由ではありません。 マークし、パターンを絞り込みます。

バージョニング

ポリシーを変更して元に戻したいですか?任意の 2 バージョンを diff し、新しい バージョンとして revert します — 履歴は決して変更されません。
ストリーミングレスポンスでは、出力 block は依然として適用されます: スキャナは、ブロック対象のコンテンツがクライアントに到達する前に飛行中のストリームを 打ち切ります。出力 mask もストリーム上でインバンドに適用されます — スキャナは 安全なプレフィックスが発される前に、ローリングバッファ内でマッチを書き換えます。 ストリーミングカバレッジストリームセーフルールを参照。

7. 関連