Skip to main content

簡潔な回答

リクエストがプロバイダーの安全性ポリシーに抵触した場合、Claude はエラーを返しません。API は引き続き HTTP 200 を返しますが、以下のようになります。
  • content は空の配列 [] となり、output_tokens は 0 になります。
  • stop_reason は refusal になります。
  • stop_details には拒否カテゴリ(例えば cyber)が示され、短い英語の説明が含まれます。
これはモデルの挙動であり、API の障害ではありません。message.content[0] を直接読み取るコードは IndexError を発生させます。OpenAI 互換フォーマットでは空の文字列が返され、finish_reason は refusal になります。 拒否の応答は通常1〜2秒以内に返されます。課金されるかどうかはカテゴリによって異なります。cyber カテゴリ(およびその他の一部のカテゴリ)では、出力が行われる前の拒否は課金されません — 詳細は後述の「課金ルール」をご参照ください。

拒否(Refusal)時のレスポンス例

以下は、サイバー関連の拒否(cyber refusal)をトリガーする同一のリクエストを、4つの方法で呼び出した例です(2026-09-29測定、IDはマスク処理済み):
POST /v1/messages、stream: false:
拒否はストリーミングの途中にも発生する可能性があります。テキストの一部が先にストリーミングされ、その後レスポンスがstop_reason: "refusal"で終了します。この部分的な出力は不完全であるため、破棄する必要があります。

拒否カテゴリ

stop_details.category には現在、5つの値があります: 拒否が名前付きカテゴリにマッピングされない場合、category と explanation の両方が null になります — これは正常な値です。explanation のテキストは随時変更される可能性があるため、表示のみを行い、文字列マッチングには使用しないでください。

よくあるトリガー

category: "cyber" は、開発者が最も頻繁に遭遇するものです。Claude にはサイバーセキュリティのリクエストに対するリアルタイムのセーフガードが備わっており、以下のタスクはすべてこれをトリガーする可能性があります:
  • コード内のバグの検出、コードに「脆弱性がある」かどうかの判定、または脆弱性の種類(CWE)の特定をモデルに依頼すること
  • エクスプロイトコードの作成や補完、またはペネトレーションテストの手順の作成
  • 悪意のあるコードの解析や書き換え
バッチ評価とデータセットの蒸留が最も影響を受けます。 脆弱性データセット全体をモデルで1件ずつ処理すると、かなりの割合のサンプルが拒否されることがよくあります。content[0] が常に存在することを前提としたスクリプトは、拒否された項目でクラッシュするため、「API が時々しか動作しない」ように見えてしまいます。

課金ルール

プロバイダーの規則に基づきます(2026年9月現在。プロバイダーが誤検知率を測定しながら調整する可能性があります): 課金の有無にかかわらず、拒絶されたリクエストもレート制限にカウントされます。usageには引き続き token 数が表示されますが、これはカウントであり、必ずしも課金されるとは限りません。

検知と処理の方法

1

コンテンツを読み取る前に stop_reason を確認する

ネイティブ形式では stop_reason == "refusal" を確認し、OpenAI 互換形式では finish_reason == "refusal" を確認します。拒絶を除外した後にのみ content を読み取ります。
2

拒絶を結果タイプとして記録する

拒絶は呼び出しの成功であり、ネットワークエラーではありません。評価作業では、リトライ対象の失敗としてカウントするのではなく、stop_details.category とともに「refused」として個別に記録します。
3

同じコンテンツをリトライしない

同じコンテンツを再送信しても通常は同じ拒絶が発生し、レート制限を消費し続け、一部のカテゴリでは毎回課金されます。
4

マルチターン会話でコンテキストをリセットする

ターンが拒絶された後は、続行する前にそのターンを削除または書き直すか、履歴をクリアしてください。リセットしないと、以降のリクエストも拒絶され続けます。
5

どのコンテンツが拒絶されたかを確認する

拒絶を category ごとにグループ化してどのタスクが拒絶をトリガーしたかを確認し、そのコンテンツを別のモデルに送信するかどうかを決定します。
拒絶のカテゴリが必要な場合は、ネイティブの /v1/messages 形式を呼び出してください。OpenAI 互換形式では finish_reason: "refusal" のみが保持され、stop_details はありません。

正当なセキュリティ研究についてはどうですか?

拒否テキストに記載されている Cyber Verification Program(サイバー検証プログラム) は、正当なセキュリティ業務を対象としたプロバイダーの無料申請プログラムです。本人確認後、エクスプロイトや攻撃ツールの開発などの「高リスクなデュアルユース」タスクの制限が緩和される場合があります。ランサムウェアの開発や大量のデータ持ち出しなどの「禁止された用途」は、いかなる場合でもブロックされます。 本プログラムは、組織の管理者がプロバイダーのファーストパーティアカウントから申請します。サードパーティプラットフォームについて、プロバイダーは「すべてのプラットフォームが参加しているわけではない」と明記しており、現在 APIYI では本プログラムへのアクセスを提供していません。 そのため、APIYI を経由して呼び出す際、拒否されたサンプルについては以下のように対応してください。
  • 評価結果にカテゴリ別に分類し、ありのまま「拒否」として記録する。
  • または、そのコンテンツを別のモデルで処理する。
APIYI はプロバイダーのセーフティポリシーを調整することはできず、また調整することもありません。

OpenAIの拒否との違い

OpenAIの拒否がどのようなものかについては、OpenAIモデルの拒否はどのようなものですか? を参照してください。

よくある質問

カテゴリとタイミングによって異なります。cyber、general_harms、またはnullにおける出力前の拒否は課金されません。bio、frontier_llm、およびreasoning_extractionでは入力分が課金されます。ストリーミング途中の拒否では、入力分に加えてすでにストリーミングされた出力分が課金されます。詳細は上記の「課金ルール」を参照してください。
いいえ、できません。拒否はプロバイダーのモデルが自身の安全ポリシーに基づいて判断するため、APIYIが無効化したり、その厳格さを変更したりすることはできません。拒否されたコンテンツは拒否結果として記録するか、別のモデルで処理してください。
セーフガードは各リクエストの内容を個別に判定します。コードスニペット自体やpromptの言い回しの双方が結果に影響を与えるため、通常はデータセットの一部のみが拒否されます。弊社のテストでは、拒否された同一のサンプルを再送信した場合でも一貫した結果が得られました。
モデルが生成を開始する前に停止したため、出力は0となり、入力のみがカウントされます。これは拒否とmax_tokensによる中断を区別する方法でもあります。後者ではstop_reason: "max_tokens"となり、出力tokensが設定した制限値と一致します。

関連ドキュメント

Claude のレスポンス処理

ストリーミングおよび非ストリーミングのレスポンス構造、stop_reason の値

OpenAI モデルの拒否とはどのようなものですか?

GPT による拒否の挙動とその検出方法

コンテンツの安全性とコンプライアンスはどのように確保されていますか?

プラットフォームのコンテンツ安全性とコンプライアンスポリシー