> ## Documentation Index
> Fetch the complete documentation index at: https://adcp-docs-ja.pier1.co.jp/llms.txt
> Use this file to discover all available pages before exploring further.

# 実装ガイド

> Sales agent／オーケストレーター／ガバナンスエージェントとして Content Standards プロトコルを実装するためのステップバイステップガイド

このガイドは Content Standards プロトコルの実装パターンを 3 つの視点で説明します:

1. **Sales agents** - ブランド適合性スタンダードの受け入れと適用
2. **Orchestrators** - パブリッシャー横断でのコンテンツスタンダードの調整
3. **Governance agents** - コンテンツ評価サービスの提供

## 役割の整理

まず役割分担を把握します:

| Role                 | Examples                         | Responsibilities                                                  |
| -------------------- | -------------------------------- | ----------------------------------------------------------------- |
| **Orchestrator**     | DSP, トレーディングデスク、代理店プラットフォーム      | メディアバイを調整し、スタンダード参照をセラーへ渡し、検証用アーティファクトを受領                         |
| **Sales Agent**      | パブリッシャー Ad サーバー、SSP              | スタンダード受領、ローカルモデルのキャリブレーション、配信時の適用、アーティファクト送付                      |
| **Governance Agent** | IAS, DoubleVerify, ブランドセーフティサービス | スタンダードをホストし、`calibrate_content` と `validate_content_delivery` を実装 |

典型的なフロー:

```
1. ブランドがガバナンスエージェントでスタンダードを設定（オーケストレーター経由）
2. オーケストレーターが get_products/create_media_buy に standards_ref を含めて送信
3. セラーが能力に応じて受諾または拒否
4. セラーがガバナンスエージェントとキャリブレーション
5. セラーが配信時にスタンダードを適用
6. セラーがアーティファクトを提供（webhook でのプッシュ、または get_media_buy_artifacts でのプル）
7. オーケストレーターがアーティファクトをガバナンスエージェントへ転送して検証
```

***

## Sales Agent 向け

Sales Agent（パブリッシャー Ad サーバー、SSP 等）は、オーケストレーターのポリシーを受け入れ配信時に適用します。

### コアモデル

オーケストレーターが `content_standards_ref` を含めてきたら、次を行います:

1. ガバナンスエージェントからスタンダードを **取得し**、実行可能かを評価します
2. 能力に応じて買い付けを **受諾または拒否** します
3. ガバナンスエージェントの期待に合わせて評価モデルを **キャリブレーション** します
4. 配信時にスタンダードを **適用** します
5. 検証用にオーケストレーターへ **アーティファクトを提供** します

要件を満たせない場合は **買い付けを拒否** してください。順守できないキャンペーンを受けないこと。

### 実装すべきこと

**1. `get_products` と `create_media_buy` で content standards の参照を受ける**

オーケストレーターは参照経由でスタンダードを渡します:

```json theme={null}
{
  "content_standards_ref": {
    "standards_id": "nike_emea_brand_safety",
    "agent_url": "https://brandsafety.ias.com"
  }
}
```

受け取ったら:

* `agent_url` のガバナンスエージェントからスタンダード文書を取得します
* 要件を満たせるか評価します
* 満たせない場合はリクエストを拒否します
* 満たせる場合は受諾し、メディアバイとの関連付けを保存します

**2. 実行可能か判断する**

スタンダード文書には次が含まれます:

* Policy（許容/非許容コンテンツの自然言語記述）
* Calibration exemplars（エッジケース解釈のための合否例）
* Floor（外部基準となるベースラインセーフティスタンダードへの参照）

要件と自社の能力を突き合わせます。パブリッシャーごとに「adjacency」の定義は異なります（Reddit はコメント、YouTube は関連動画、ニュースサイトは記事本文など）。ブランド意図を実質的に担保できるなら受け入れて問題ありません。

対応できない場合（例: 屋外など adjacency が成立しないチャネルを要求された場合）は拒否します。

**3. 評価機構を構築する**

スタンダード文書を使ってコンテンツ評価システムをトレーニングまたは設定します。方法は:

* ルールをシステムプロンプトとした LLM
* キャリブレーション例でトレーニングしたクラシファイア
* 確定的評価のためのルールエンジン
* サードパーティのブランド適合性ベンダー

プロトコルは実装方法を規定しません。スタンダードを順守することが求められます。

**4. ガバナンスエージェントとキャリブレーションする**

買い付け受諾後、ガバナンスエージェントの `calibrate_content` を呼び出してローカルモデルをキャリブレーションします。自社インベントリのサンプルアーティファクトを送ると、ガバナンスエージェントがどう評価するかを返してくれます:

```json theme={null}
// インベントリのサンプルをガバナンスエージェントへ送信
{
  "standards_id": "nike_emea_brand_safety",
  "artifacts": [
    {
      "property_id": { "type": "domain", "value": "espn.com" },
      "artifact_id": "article_123",
      "assets": [{ "type": "text", "role": "title", "content": "Marathon Runner Collapses at Finish Line" }]
    }
  ]
}

// ガバナンスエージェントが解釈を返す
{
  "evaluations": [{
    "artifact_id": "article_123",
    "suitable": true,
    "confidence": 0.9,
    "explanation": "Sports injury coverage in athletic context - aligns with brand's sports marketing positioning"
  }]
}
```

返却結果を使ってローカルモデルを調整します。判定に異議があれば理由を確認し、追加質問で擦り合わせます。

**5. アーティファクトをオーケストレーターへ送る**

配信後、ガバナンスエージェントによる検証ができるようアーティファクトをオーケストレーターへプッシュします。メディアバイの `artifact_webhook` で設定します:

```json theme={null}
// アーティファクト webhook ペイロード（オーケストレーターへ送信）
{
  "media_buy_id": "mb_nike_reddit_q1",
  "batch_id": "batch_20250115_001",
  "timestamp": "2025-01-15T11:00:00Z",
  "artifacts": [
    {
      "artifact": {
        "property_id": { "type": "domain", "value": "reddit.com" },
        "artifact_id": "r_fitness_abc123",
        "assets": [{ "type": "text", "role": "title", "content": "Best protein sources" }]
      },
      "delivered_at": "2025-01-15T10:30:00Z",
      "impression_id": "imp_abc123"
    }
  ]
}
```

ポーリングを好むオーケストレーター向けに `get_media_buy_artifacts` もサポートします。

### 実装チェックリスト

* [ ] `get_products` と `create_media_buy` で `content_standards_ref` をパース
* [ ] ガバナンスエージェントからスタンダード文書を取得して評価
* [ ] 実行できない買い付けは拒否 — 順守できないキャンペーンを受け入れない
* [ ] スタンダード文書に基づくコンテンツ評価を構築
* [ ] ガバナンスエージェントの `calibrate_content` を呼び出して解釈を合わせる
* [ ] オーケストレーターが検証用コンテンツを取得できるよう `get_media_buy_artifacts` を実装
* [ ] プッシュ型アーティファクト配信のために `artifact_webhook` をサポート
* [ ] 配信メトリクスのために `reporting_webhook` をサポート

***

## オーケストレーター向け

オーケストレーター（DSP、トレーディングデスク、代理店プラットフォーム）は、ブランド・ガバナンスエージェント・パブリッシャー間でコンテンツスタンダードを調整します。

### オーケストレーションパターン

```
Brand → Orchestrator → Governance Agent (setup)
                    → Sales Agent (buying)
                    ← Sales Agent (artifacts)
                    → Governance Agent (validation)
                    → Brand (reporting)
```

**1. ブランドがガバナンスエージェントでスタンダードを設定するのを支援**

ブランドはガバナンスエージェントを通じてコンテンツスタンダードを作成します。あなたが仲介するか、ブランドが直接行う場合があります:

```json theme={null}
// ガバナンスエージェントに保存されるスタンダード
{
  "standards_id": "nike_emea_brand_safety",
  "name": "Nike EMEA Brand Suitability Policy",
  "brand_id": "nike",
  "policy": "Sports and fitness content is ideal. Avoid violence, adult themes, drugs.",
  "calibration_exemplars": {
    "pass": [
      { "type": "url", "value": "https://espn.com/nba/story/_/id/12345/lakers-win", "language": "en" }
    ],
    "fail": [
      { "type": "url", "value": "https://tabloid.example.com/celebrity-scandal", "language": "en" }
    ]
  }
}
```

#### 散文ポリシーをアドレス可能なエントリへ移行する

既存の散文ポリシーを持つブランドには2つの選択肢があります。すべてを散文ブロブ全体を持つ1つのポリシーエントリとして保持するか、ルールごとに1つのエントリに分割するかです。どちらも検証されます。

**散文ありの単一エントリ**（最も簡単、既存のオーサリングを保持）:

```json theme={null}
"policies": [
  {
    "policy_id": "acme_creative_standards_v1",
    "enforcement": "must",
    "policy": "No violent imagery. Minimum 72 DPI for display assets. Brand colors must match palette within 5% tolerance."
  }
]
```

**複数のアドレス可能なエントリ**（プログラム的な修正・再試行ループとルールごとのバージョニングに推奨）:

```json theme={null}
"policies": [
  { "policy_id": "no_violent_imagery",   "policy_categories": ["brand_safety"],     "enforcement": "must",   "policy": "No violent imagery." },
  { "policy_id": "min_display_dpi",      "policy_categories": ["imagery_quality"],  "enforcement": "should", "channels": ["display"], "policy": "Minimum 72 DPI for display assets." },
  { "policy_id": "brand_color_tolerance","policy_categories": ["brand_compliance"], "enforcement": "must",   "policy": "Brand colors must match palette within 5% tolerance." }
]
```

分割により、検出事項が特定のルールを（`policy_id` 経由で）参照でき、プログラム的な修正・再試行、およびバージョン間で安定した id が可能になります。ワークフローに合ったオーサリングモードを使ってください。

#### レジストリポリシー + ビスポークポリシー

`registry_policy_ids` と `policies` は同時に提供できます。評価器はそのすべてを適用します。ビスポークな `policy_id` 値はフラット（コロンやスラッシュなし）でなければなりません（MUST）。レジストリのポリシー id は常に名前空間付き（例: `garm:brand_safety:violence`）であるため、2つの名前空間が衝突することはありません。ガバナンスの検出事項が特定のポリシーを参照する場合、検出事項の `policy_id` はレジストリ id かビスポーク id のいずれかを運びます — 名前空間がどちらかを示します。

**2. 購入時にスタンダード参照を渡す**

プロダクト探索やメディアバイ作成時に、ガバナンスエージェント参照を含めます:

```json theme={null}
{
  "product_id": "espn_sports_display",
  "packages": [...],
  "content_standards_ref": {
    "standards_id": "nike_emea_brand_safety",
    "agent_url": "https://brandsafety.ias.com"
  },
  "artifact_webhook": {
    "url": "https://your-platform.com/webhooks/artifacts",
    "authentication": {
      "schemes": ["HMAC-SHA256"],
      "credentials": "your-shared-secret-min-32-chars"
    },
    "delivery_mode": "batched",
    "batch_frequency": "hourly",
    "sampling_rate": 0.25
  }
}
```

パブリッシャーが基準を満たせない場合は買い付けを拒否します。拒否を適切に扱い、代替在庫を探してください。

**3. Sales Agent からアーティファクトを受け取る**

Sales Agent は `artifact_webhook` にアーティファクトをプッシュします。これをガバナンスエージェントに転送して検証します:

```python theme={null}
# Sales Agent からの artifact webhook を受信
@app.post("/webhooks/artifacts")
async def receive_artifacts(payload: ArtifactWebhookPayload):
    # ガバナンスエージェントへ転送して検証
    validation_result = await governance_agent.validate_content_delivery(
        standards_id=get_standards_id(payload.media_buy_id),
        records=[
            {"artifact": a.artifact, "record_id": a.impression_id}
            for a in payload.artifacts
        ]
    )

    # 失敗を記録
    for result in validation_result.results:
        if any(f.status == "failed" for f in result.features):
            log_suitability_incident(payload.media_buy_id, result)

    return {"status": "received", "batch_id": payload.batch_id}
```

**4. ブランドへ報告**

検証結果をブランドに提示します:

* **Incidents**: 基準を満たさなかったコンテンツ
* **Coverage**: 配信のうち検証された割合
* **Trends**: コンテンツセーフティの経時変化

### 実装チェックリスト

* [ ] ガバナンスエージェントでのブランドセットアップを支援
* [ ] `get_products` と `create_media_buy` リクエストに `content_standards_ref` を含めます
* [ ] Sales Agent からアーティファクトを受信するために `artifact_webhook` を設定
* [ ] スタンダードを満たせないパブリッシャーからの拒否を処理
* [ ] `validate_content_delivery` を通じてガバナンスエージェントへアーティファクトを転送
* [ ] ブランド向けレポートを構築

***

## ガバナンスエージェント向け

ガバナンスエージェント（IAS、DoubleVerify など）はコンテンツ評価をサービスとして提供します。

### 実装するもの

**1. コンテンツスタンダードをホストし提供する**

スタンダード設定を保存し、`get_content_standards` で公開します:

```json theme={null}
// get_content_standards へのレスポンス
{
  "standards_id": "nike_emea_brand_safety",
  "version": "1.2.0",
  "name": "Nike EMEA - all digital channels",
  "policy": "Sports and fitness content is ideal. Lifestyle content about health is good...",
  "calibration_exemplars": {
    "pass": [...],
    "fail": [...]
  }
}
```

**2. `calibrate_content` を実装する**

Sales Agent はキャンペーン実行前にローカルモデルを合わせるためにこれを呼び出します。サンプルアーティファクトを送り、ブランドがどう評価するかを返します:

```python theme={null}
def calibrate_content(standards_id: str, artifacts: list) -> dict:
    standards = get_standards(standards_id)
    evaluations = []

    for artifact in artifacts:
        # ブランドのポリシーに照らして評価
        result = evaluate_against_policy(artifact, standards)
        evaluations.append({
            "artifact_id": artifact["artifact_id"],
            "suitable": result.suitable,
            "confidence": result.confidence,
            "explanation": result.explanation  # 判断理由を伝える
        })

    return {"evaluations": evaluations}
```

キャリブレーションは対話的です。追加質問やエッジケースに対応できるようにしてください。

**3. `validate_content_delivery` を実装する**

オーケストレーターが配信後にアーティファクトを検証するために呼び出します。大規模なバッチ評価:

```python theme={null}
def validate_content_delivery(standards_id: str, records: list) -> dict:
    standards = get_standards(standards_id)
    results = []

    for record in records:
        features = []
        for feature in ["brand_safety", "brand_suitability"]:
            evaluation = evaluate_feature(record["artifact"], standards, feature)
            features.append({
                "feature_id": feature,
                "status": "passed" if evaluation.passed else "failed",
                "value": evaluation.value,
                "message": evaluation.message if not evaluation.passed else None
            })
        results.append({
            "record_id": record["record_id"],
            "features": features
        })

    return {
        "summary": compute_summary(results),
        "results": results
    }
```

### 実装チェックリスト

* [ ] ブランドがポリシーを設定するために `create_content_standards` を実装
* [ ] Sales Agent がポリシーを取得するために `get_content_standards` を実装
* [ ] Sales Agent がモデルを合わせるために `calibrate_content` を実装
* [ ] オーケストレーターが配信を検証するために `validate_content_delivery` を実装
* [ ] キャリブレーションでの対話をサポート（追加質問、エッジケース）

***

## Content Access Pattern

3 つの役割すべてでコンテンツを安全にやり取りする必要がある場合があります。`content_access` パターンは URL 名前空間への認証付きアクセスを提供します:

```json theme={null}
{
  "content_access": {
    "url_pattern": "https://cache.example.com/*",
    "auth": {
      "type": "bearer",
      "token": "eyJ..."
    }
  }
}
```

* **url\_pattern**: このパターンにマッチする URL にこの認証を使用
* **auth.type**: 認証方式（`bearer`, `api_key`, `signed_url`）
* **auth.token**: 認証情報

以下に含めます:

* `get_content_standards` レスポンス（ガバナンスエージェント → Sales Agent: 「ここから例を取得してください」）
* `get_media_buy_artifacts` レスポンス（Sales Agent → オーケストレーター: 「ここからコンテンツを取得してください」）

これによりアセット単位のトークンを避け、安全なコンテンツ交換を可能にしながらペイロードを小さく保てます。
