ポリシー
英語の原文 -- 翻訳は技術レビュー待ちです
Supported modes: Hosted Hybrid Local Available in: Free Solo Teams (audit retention is a configured window by tier: Free 7 days, Solo 90 days, Teams 365 days, see Feature Availability)
ポリシーは、AI エージェントが「できること」と「できないこと」を定めるルールです。このページでは、ポリシーの作り方、SDK 呼び出しとの結び付き、評価順序、ワイルドカード、条件、暗号化、キャッシュまで、すべてを取り上げます。
基本概念
ポリシーは、名前を付けたルールの集合です。各ルールは、「エージェントがリソース Y に対してアクション X を実行しようとしたとき、答えは allow または deny である」と定めます。
{
"name": "my-policy",
"rules": [
{
"effect": "allow",
"action": "llm:generate",
"resource": "model/gpt-4"
}
]
}
SDK のコードが cz.guard("llm", method="generate", args={"model": "gpt-5.4"}) を呼び出すと、SDK はこのルールを見つけ、エフェクトが allow であることを確認して、アクションの実行を許可します。
アクション文字列の形式: ポリシールール内のアクション文字列は、コロン区切りの形式(
tool:method)を使います。SDK 呼び出しではtoolとmethodを別々のパラメーターとして渡し、tool:methodとしてマッチングされます。例:llm:generate、tool:call、data:read、api:request。
SDK 呼び出しがポリシールールに対応する仕組み
これが、理解すべき最も重要な点です。guard() 呼び出しは、ツール名とメソッドをポリシーのアクションに、args をポリシーの条件に対応付けます。
SDK call: Policy rule:
cz.guard( {
"llm", "action": "llm:generate",
method="generate", --> "resource": "model/gpt-5.4",
args={ --> "conditions": {
"model": "gpt-5.4", "agent_id": "agent-*"
"agent_id": "agent-001", },
}, "effect": "allow"
) }
- ツール名とメソッドが、ポリシーのアクション文字列になります(例:
"llm"+"generate"="llm:generate")。 - args ディクショナリは、ルールの
conditionsオブジェクト(存在する場合)に対してマッチングされます。 - すべてのフィールドが一致すれば、ルールの
effectが結果を決めます。
ポリシーを作る: ステップごとの手順
ステップ 1: アクションを選ぶ
アクションは、エージェントが何をしようとしているかを表します。命名規則は自分で定義します。一般的なパターンは次のとおりです。
| アクション | 意味 | 使用する場面 |
|---|---|---|
llm:generate | テキスト生成のために LLM を呼び出す | chat.completions.create() や messages.create() の呼び出しの前 |
llm:embed | エンベディングを生成する | embeddings.create() の呼び出しの前 |
tool:call | ツールや関数を呼び出す | LLM が要求したツールを実行する前 |
mcp.tool:call | MCP ツールを呼び出す | MCP プロトコル経由でツールを呼び出す前 |
mcp.resource:read | MCP リソースを読み取る | MCP 経由でデータを読み取る前 |
data:read | データソースから読み取る | データベースやベクトルストアにクエリする前 |
data:write | データソースに書き込む | データを挿入または更新する前 |
file:read | ファイルを読み取る | ディスク上のファイルにアクセスする前 |
file:write | ファイルを書き込む | ファイルを書き込みまたは変更する前 |
api:request | 外向きの HTTP リクエストを行う | 外部 API を呼び出す前 |
* | すべてのアクション | キャッチオールのルール |
独自のアクション名を作ることもできます。これらは単なる文字列です。SDK とポリシールールは同じ文字列を使い、それによって両者が結び付きます。
ステップ 2: リソースを選ぶ
リソースは、アクションの対象を表します。命名規則は自分で定義します。
| リソースのパターン | 対象 | SDK 呼び出しの例 |
|---|---|---|
model/gpt-5.4 | 特定の LLM モデル | guard("llm", method="generate", context={"resource": "model/gpt-5.4"}) |
model/claude-* | すべての Claude モデル(ワイルドカード) | guard("llm", method="generate", context={"resource": "model/claude-sonnet-4-6"}) |
tool/search_web | 特定のツール | guard("tool", method="call", context={"resource": "tool/search_web"}) |
mcp://filesystem/read_file | 特定の MCP ツール | guard("mcp.tool", method="call", context={"resource": "mcp://filesystem/read_file"}) |
mcp://filesystem/* | MCP サーバー上のすべてのツール | filesystem サーバー上のあらゆるツールに一致します |
vectorstore/documents | データコレクション | guard("data", method="read", context={"resource": "vectorstore/documents"}) |
https://api.example.com/* | API エンドポイント | guard("api", method="request", context={"resource": "https://api.example.com/v1/users"}) |
* | すべてのリソース | キャッチオール |
ステップ 3: エフェクトを設定する
各ルールには effect があり、allow または deny のいずれかです。
[
{ "effect": "allow", "action": "llm:generate", "resource": "model/gpt-5.4" },
{ "effect": "deny", "action": "llm:generate", "resource": "model/gpt-4*" }
]
ステップ 4: 条件を追加する(任意)
条件を使うと、SDK から渡される実行時の値に基づいてルールを絞り込めます。条件はローカルのポリシーエンフォーサー(Python、Node、Go)に実装されているため、Hosted モードでも Local のみのモードでも動作します。
{
"effect": "allow",
"action": "llm:generate",
"resource": "model/gpt-4",
"conditions": {
"agent_id": "support-*",
"environment": "production"
}
}
マッチングの詳しい仕様については、下の専用の条件セクションを参照してください。
検証
ポリシーバージョンを公開または保存するとき、プラットフォームはすべてのルールのすべての actions[*] エントリを、正規のアクションセットとエイリアステーブル(正規ツール名を参照)に照らして検証します。不明なアクション(タイプミス、でたらめな名前)を対象とするルールは、did_you_mean の候補リストを伴う 422 validation_failed レスポンスで拒否されます。これにより、「ルールは登録されたのに一度も発火しない」という無言のバグが、本番に出荷された後ではなく、作成時に検出されます。
ルールが database:queryy(タイプミス)を対象としている場合のレスポンス例:
{
"error": "validation_failed",
"unknown_actions": ["database:queryy"],
"suggestions": {
"database:queryy": ["database:query (legacy)"]
}
}
ダッシュボードのルールエディターは、問題のあるルールを赤い枠で表示し、候補ごとに「database:query を使用」というワンクリックのボタンを表示します。(legacy) と付いた候補は、正規化前のルール向けのエイリアスシムに由来します。タグのない候補は、現行の正規クラスです(新しいルールにはこちらを優先してください)。
SDK は、ポリシーの読み込み時に同じバリデーターを警告として実行するため、ローカルポリシーモード(プラットフォームバックエンドなし)のユーザーもタイプミスに気付けます。SDK の警告はブロックしません。ポリシーは引き続き読み込まれるため、SDK がまだ認識していないカスタムツールを使うお客様は作業を続けられ、本物のタイプミスについては did-you-mean が表示されます。
バリデーターが既知とするアクションの集合は、正規の SDK エクストラクターのツール、ホストツールのエイリアス(例: Read は file_read に解決されます)、4つの正規 SQL セマンティッククラス(database:read|write|admin|exec)、すべてのレガシー SQL エイリアス(database:query、database:SELECT、database:DROP など)、ワイルドカード(*、tool:*、*:method)の和集合です。SDK のエイリアステーブルを更新すると、バリデーターが受け入れる範囲は自動的に広がります。
ルールフィールドのリファレンス
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
effect | "allow" または "deny" | はい | ルールがアクションを許可するかブロックするか |
action | string | はい | マッチさせるアクション。ワイルドカード(*)に対応 |
resource | string | はい | マッチさせるリソース。ワイルドカード(*)に対応 |
conditions | object | いいえ | リクエストのコンテキストにすべて一致する必要があるキーと値のペア。値は glob パターンに対応 |
clients | list of strings | いいえ | ルールを特定の AI クライアント(cursor、claude-code、gemini-cli、codex-cli、windsurf、python-sdk など)に限定します。空または未指定の場合は、すべてのクライアントに一致します。glob パターンに対応。#175 で追加。 |
projects | list of strings | いいえ | ルールを特定のプロジェクト ID に限定します。空または未指定の場合は、すべてのプロジェクトに一致します。glob パターンに対応。#175 で追加。 |
セレクターの意味論(clients / projects)
空でない clients リストを持つルールは、リクエストで検出されたクライアント名がいずれかのエントリに一致しない限り、スキップされます。projects も同様です。両方のセレクターが、リクエストを明示的に選び取る必要があります。空の client_name は clients: ["cursor"] に一致しません。first-match-wins は引き続き適用されます。暗黙の「最も具体的なものが優先」という並べ替えはありません。優先順位は、より具体的なルールをより一般的なルールの前に書くことで表現します。
rules:
- allow: delete_* # cursor-only override fires first
clients: ['cursor']
- deny: delete_* # global default applies to everything else
glob 構文の注意: clients / projects の glob 対応は、action / resource のルールと同じです。Rust と Go では *、prefix*、*suffix、Python では加えて ? と [seq](fnmatch.fnmatchcase 経由)が使えます。これは SDK 間で以前から存在する挙動のクラスで、アクションとリソースにも当てはまります。移植性のために、最も共通性の高い構文(完全一致、prefix*、*suffix)に絞ることをお勧めします。