/agent/run・/agent/runs は、リクエストごとに redactionPolicyId を指定することで、
外部の LLM・embedding プロバイダへ送る前に会話履歴・検索クエリ・検索結果をマスキングできます。
マスキングの対象
redactionPolicyId を指定すると、次のすべてが対象になります。
- 会話履歴の全ロール(
user/assistant/system/developer/tool/activity/reasoning) - 文字列 content、マルチモーダル content の text、辞書内の文字列、ツール呼び出し引数(JSON)内の文字列、 文字列 metadata と参照 URL
- 親 run から復元した過去の会話履歴(run ごとに、そのとき指定したポリシーで再マスキングされます)
- ナレッジベース検索のクエリと検索結果(本文・タイトル・URL)
- Google Web 検索へ送るクエリと、後続の外部 LLM へ渡す検索結果(本文・タイトル・URL)
- 外部 Iceberg テーブルのスキーマ・クエリ結果
- エージェントが使うその他すべてのツールの実行結果
agent_runs に保存される内容、RUN_STARTED イベントは原文のままです。復元用の
マッピングは保存されません。
外部プロバイダへ送るコピーから除外されるもの(マスキングではなく削除):
forwardedPropsstate/tools/context/resume
agent_runs 側では保持されます。
対象外:
- システムプロンプト
検出する分類
組み込みポリシーで有効になる分類はポリシーごとに決まります。テナントポリシーでは9分類をすべて
有効にし、テナント管理者が変更できるのは
B(業務機密)の定義だけです。PIIや認証情報の分類を
無効化することはできません。入力した定義は分類用データとして安全なJSON境界へ置かれ、system
instructionや出力schemaを変更する自由記述プロンプトとしては扱われません。
テナントポリシーを管理する
管理APIは All roleのAPIキー専用です。App roleのAPIキーやDashboardのBearer認証では、一覧取得を 含む管理操作を実行できません。一方、ACTIVEにしたポリシーは同じテナントのApp roleのAPIキーからも AgentのredactionPolicyId として利用できます。
ポリシーは DRAFT → ACTIVE → ARCHIVED の順で管理します。本文は上書きせず、新しい版を追記します。
ACTIVE切替後も実行中のrunは開始時の版を使い続け、切替後に開始したrunだけが新しい版を使います。
1. CLI schemaを確認する
APIキーはコマンドラインへ書かず、QAIP_API_KEY 環境変数で渡してください。ポリシー本文もshell引数へ
直書きせず、権限を制限した一時JSON fileか標準入力を使います。
2. DRAFTを検証・作成する
policy.json は chmod 600 したfileとして用意します。enabledCategories、version、statusはサーバーが
決めるため入力しません。
policy.json
409 DRAFT_ALREADY_EXISTS になります。
3. ACTIVEにする
初回の切替ではACTIVE版がないことをCASで指定します。cas.json もfileまたは標準入力で渡します。
cas.json
4. Agentから利用する
5. 新しい版・rollback・archive
新しい本文からname を除いたJSON fileを作り、次版のDRAFTを追記します。
expectedActiveVersion に指定します。別の管理者が
先に切り替えた場合は 409 ACTIVE_VERSION_CONFLICT となり、部分更新は行われません。policy detailを
再取得してから、新しい期待版でやり直してください。
422 UNKNOWN_REDACTION_POLICY になります。既に作成済みのrunを同じrun IDや
idempotency keyで再送した場合は、ポリシーを再評価せず元のrunを返します。一度ACTIVEになった版は監査の
ためhard deleteできません。未有効化のDRAFTだけが delete-version --yes の対象です。
リクエスト例
マスキングなし(既定)
マスキングあり(既知のポリシー ID)
[氏名]さんの連絡先を教えてください として送信されます。ダッシュボードの
表示と保存内容は原文のままです。
未知のポリシー ID・空文字(422)
detail が配列)になります。
error.type にあります(UNKNOWN_REDACTION_POLICY /
AGENTCORE_REDACTION_UNSUPPORTED / REDACTION_UNAVAILABLE)。
いずれの場合も「マスキングなし」とは解釈されません。run は作成されず、外部プロバイダも呼ばれません。
AgentCore 実行モードとの併用(422)
サーバーが AgentCore 実行モードで動作している場合、redactionPolicyId との併用はできません。
redactionPolicyId を指定しない AgentCore 実行は従来どおり利用できます。
マスキング基盤が利用できない場合(503)
redactionPolicyId を指定したリクエストは、マスキング基盤が停止・timeout・失敗しても
原文送信にフォールバックしません。redactionPolicyId を指定しないリクエストと
/completions・/search・/extract は影響を受けず利用できます。
実行中にマスキングが失敗した場合(RUN_ERROR)
FAILED になり、失敗したマスキング境界より後の外部プロバイダ呼び出しは行われません。
たとえば検索クエリの失敗時は embedding / Google 検索を呼ばず、検索結果の失敗時は後続の
外部 LLM を呼びません。すでに完了した先行呼び出しは取り消されません。
補足
- 親 run のポリシーは継承されません。子 run でもマスキングが必要な場合は、その run で
redactionPolicyIdを明示してください。 - 外部 Iceberg テーブルのクエリ結果は行数が絞られます。 マスキングは 1 セルずつ処理する
ため、値の数が行数 × 列数で増えます。マスキングが制限時間内に終わる範囲まで結果を切り詰め、
切り詰めた場合は結果の
truncatedがtrueになります(絞らないとマスキングが間に合わず run 自体が失敗します)。スキーマは切り詰めません。 - 引用リンクが機能しなくなる場合があります。 検索結果の URL もマスキング対象なので、 URL のパスやクエリにマスキング対象(氏名など)が含まれていると、その部分が置換ラベルに 変わり、回答中の引用リンクが目的のドキュメントへ到達しません。署名付き URL のクエリに 認証情報が含まれるケースを外部プロバイダへ渡さないための仕様です。原文の URL は保持されず、 後からリンクを復元する手段はありません。
- モデルの応答に対する再識別・プレースホルダの復元は行いません。
- マスキングは処理失敗・不正応答・未対応入力の原文送信を防ぎますが、ローカルモデルの意味的な 見落としを完全に排除するものではありません。この残存リスクは、認証情報の決定的検出、 プロンプト安全対策、ポリシーごとに版管理した評価データセットでのリリース判定によって管理しています。

