> ## Documentation Index
> Fetch the complete documentation index at: https://wb-21fd5541-locadex-parallel-t9n-main-cs60c8p4o6ik99tylxgp3.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# リモート Scorer で Call をスコアリングする

> 自社のインフラストラクチャー上で実行する Scorer を使って W&B Weave の Call をスコアリングし、その結果を Call のフィードバックとして記録します。

export const GitHubLink = ({url, compact = false}) => <a href={url} target="_blank" rel="noopener noreferrer" className={compact ? "source-link" : "github-source-link"}>
    {compact ? "ソースを表示" : <>
    <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
      <path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" />
    </svg>
    GitHub のソース
      </>}
  </a>;

リモート Scorer は、W\&B Weave 内ではなくお客様のインフラストラクチャー上で実行される Scorer です。モニターが Call を選択すると、Weave のスコアリングワーカーが HTTP `POST` リクエストで Call をお客様の HTTPS エンドポイントに送信し、その応答を対象の Call のフィードバックとして記録します。社内データを使ったポリシーチェックや、自社でホストしているモデルなど、スコアリングロジックを Weave 内で実行できない場合は、リモート Scorer を使用してください。

このページでは、`@weave.op` でトレースされた Call 向けのリモート Scorer について説明します。Agents ビューでエージェントのターンをスコアリングする方法については、[リモート Scorer でエージェントのターンをスコアリングする](/ja/weave/guides/tracking/remote-scorer-signals) を参照してください。Call 向けのリモート Scorer は Python SDK で設定します。TypeScript SDK には `RemoteScorer` は含まれていません。

<h2 id="how-remote-scoring-works">
  リモートスコアリングの仕組み
</h2>

Call は次の順序でスコア付けされます。

1. モニター対象の Op への Call が終了します。
2. スコアリングワーカーは、対象の操作にその Op を含む実行中のモニターを検索し、各モニターのフィルターとサンプリング率を適用します。
3. 条件に一致したモニターの各 `RemoteScorer` について、ワーカーは Call を含む `schema_version: 1` のリクエストを構築します。次に Scorer の認証情報を解決し、エンドポイント URL が許可されたホストに含まれるかを確認したうえで、`POST` リクエストを送信します。
4. ワーカーは応答を検証し、その結果を Call のフィードバックとして書き込みます。また、成否にかかわらず、スコアリングの試行自体も Call として記録します。

リモート Scorer はモニター経由でのみ実行されます。`weave.Evaluation` や `call.apply_scorer()` では使用できません。どちらも Scorer の `score()` メソッドを呼び出しますが、リクエストを送信するのはスコアリングワーカーだけであるため、`RemoteScorer` ではこのメソッドが `NotImplementedError` を送出します。Weave UI の **Score calls** アクションでも `RemoteScorer` は使用できず、`RemoteScorer requires a monitor` というメッセージが表示されます。選択した Call ごとに 1 つのリクエストが生成され、送信は 1 回のみです。リクエストがタイムアウトした場合や応答がない場合でも、Weave は再試行しません。デフォルトのタイムアウトは 30 秒です。

<h2 id="enable-remote-scoring">
  リモートスコアリングを有効にする
</h2>

リモートスコアリングは、組織またはデプロイメントで有効化されるまでオフになっています。また、スコアリングワーカーが Scorer のエンドポイントを呼び出すのは、そのホストが許可リストに登録されている場合に限られます。有効化の方法はデプロイメントタイプによって異なります。

**Multi-tenant Cloud**

組織でリモート Scorer を有効にするには、組織管理者または請求管理者が次の手順を実行します。

1. `https://wandb.ai/account-settings/[ORG]/settings` を開きます。`[ORG]` は、ご利用の project を所有する組織の名前に置き換えてください。
2. **Remote scoring** タブを選択します。
3. **Enable remote scoring** をオンにします。
4. **Allowed hosts** で **Add host** をクリックし、リモート Scorer からの呼び出しを許可するホストをそれぞれ入力します。リモートスコアリングを有効にした状態で保存するには、ホストを 1 つ以上登録する必要があります。ポートを空欄のままにすると、そのホストのすべてのポートが許可されます。
5. **Save settings** をクリックします。

**専用クラウド**

W\&B に連絡し、デプロイメントでのリモートスコアリングの有効化と、許可するホストの設定を依頼してください。

**セルフマネージド**

W\&B Weave を [W\&B Self-Managed](/ja/platform/hosting/hosting-options/self-managed) デプロイメントで実行している場合は、各スコアリングワーカー (オンライン評価ワーカー、Call スコアリングワーカー、エージェントスコアリングワーカー) で `extraEnv` を使用して、以下の環境変数を設定してください。

| 環境変数                                                               | デフォルト   | 効果                                                                               |
| ------------------------------------------------------------------ | ------- | -------------------------------------------------------------------------------- |
| `WF_SCORING_WORKER_REMOTE_SCORING_ENABLED`                         | `false` | リモート Scorer へのアウトバウンドリクエストを有効にします。`false` の場合、他の設定にかかわらず、リモート Scorer は一切実行されません。 |
| `WF_SCORING_WORKER_REMOTE_HTTP_TIMEOUT_SECONDS`                    | `30`    | Scorer エンドポイントへの各リクエストのタイムアウトです。                                                 |
| `WF_SCORING_WORKER_REMOTE_SCORER_ALLOWED_HOSTS`                    | 空       | オペレーターが指定する許可リストです。`host` または `host:port` 形式のエントリをカンマ区切りで指定します。                  |
| `WF_SCORING_WORKER_REMOTE_SCORER_VALIDATE_HOSTS`                   | `true`  | 許可ホストリストを適用します。プライベートアドレス、ループバックアドレス、クラウドメタデータアドレスは、この設定にかかわらず拒否されます。            |
| `WF_SCORING_WORKER_REMOTE_SCORER_ALLOW_INSECURE_HTTP`              | `false` | `http://` のエンドポイント URL を許可します。                                                   |
| `WF_SCORING_WORKER_REMOTE_SCORER_ALLOWED_PRIVATE_CIDRS`            | 空       | リモート Scorer からの呼び出しを許可するプライベートアドレスの CIDR ネットワーク (`10.0.0.0/8` など) をカンマ区切りで指定します。 |
| `WF_SCORING_WORKER_REMOTE_SCORER_REQUIRE_STRUCTURED_RESULT_SCHEMA` | `true`  | `result` が構造化スコア形式になっていない応答を拒否します。                                               |

Weave UI にリモートスコアリングの設定と Scorer のオプションを表示するには、W\&B サーバーで `GORILLA_GATE_WEAVE_REMOTE_SCORING=true` も設定してください。

**許可ホストのルール**

スコアリングワーカーは、すべての Scorer エンドポイント URL を以下のルールに照らして検証します。Scorer が OAuth を使用する場合は、OAuth トークンエンドポイント URL も個別に検証します。

* エントリはホストに完全一致します。ポートは任意で指定できます。ポートを指定しないエントリは、そのホストのすべてのポートを許可します。
* `*.` で始まるエントリは、任意の階層のサブドメインに一致しますが、ドメイン自体には一致しません。`*.corp.example.com` は `a.corp.example.com` や `a.b.corp.example.com` に一致しますが、`corp.example.com` には一致しません。`*.` に続く接尾辞には 2 つ以上のラベルが必要なため、`*.com` は拒否されます。ワイルドカードは IP アドレスと組み合わせて使用できません。
* オペレーターの許可リストと組織の許可リストの両方が存在する場合、URL は両方の条件を満たす必要があります。オペレーターの許可リストが空の場合、追加の制限はありません。許可リストが一つも存在しない場合、ワーカーはすべてのホストを拒否します。
* ループバック、プライベート、内部、およびクラウドメタデータのアドレスは拒否されます。セルフマネージド環境では、`WF_SCORING_WORKER_REMOTE_SCORER_ALLOWED_PRIVATE_CIDRS` に指定されたネットワーク内のプライベートアドレスが許可されます。
* デプロイメントで非セキュアな HTTP が許可されていない限り、HTTPS が必須です。
* リダイレクトは追跡しません。

<h2 id="build-the-scorer-endpoint">
  Scorer エンドポイントを構築する
</h2>

エンドポイントは Weave から JSON の `POST` リクエストを受け入れ、JSON 形式でスコアを返します。リファレンス実装については、[サンプルコード](#sample-code)を参照してください。

<h3 id="request">
  リクエスト
</h3>

Weave は、スコアリング対象ごとに 1 件の HTTP `POST` を Scorer のエンドポイント URL に送信します。ヘッダーは次のとおりです。

| ヘッダー                     | 値                                           |
| ------------------------ | ------------------------------------------- |
| `Content-Type`           | `application/json`                          |
| `Authorization`          | `Bearer [TOKEN]`                            |
| `Idempotency-Key`        | スコアリング対象、モニターのバージョン、Scorer のバージョンから導出されるキー。 |
| `X-Correlation-ID`       | このリクエストの相関 ID。                              |
| `X-Weave-Schema-Version` | `1` または `2`。本文の `schema_version` と同じ値です。    |

Weave は同じスコアリング試行を複数回配信する場合があります。必要に応じて、エンドポイント側で `Idempotency-Key` を使用して重複を排除してください。このキーはリクエストのバージョンごとに一定であるため、同じ Call に対する V1 リクエストと V2 リクエストではキーが異なります。

すべてのリクエスト本文には、次のトップレベルフィールドが含まれます。

| フィールド                                 | 説明                                                                                     |
| ------------------------------------- | -------------------------------------------------------------------------------------- |
| `schema_version`                      | 整数。`1` または `2`。                                                                        |
| `scoring_call_id`, `scoring_trace_id` | このスコアリング試行の識別子。                                                                        |
| `monitor`                             | 対象を選択したモニターの `name` と `version_digest`。                                                |
| `scorer`                              | `name`、`ref`、および省略可能な `config`。`config` は `RemoteScorer` に設定されたマッピングで、変更されずにそのまま渡されます。 |
| `triggered_at`                        | 省略可能な ISO 8601 タイムスタンプ。                                                                |

Weave は、値のない省略可能なフィールドを `null` として送信せず、フィールド自体を省略します。また、バージョン番号を変更せずに省略可能なフィールドを追加する場合があるため、認識できないフィールドは無視してください。

リクエスト本文と応答本文はそれぞれ 1 MiB までに制限されており、JSON テキストのみで構成されます。画像、オーディオ、動画が含まれることはありません。これらの制限を超える対象は送信されないため、スコアリングされません。1 件のリクエストに含まれる対象は 1 つです。

Call の場合、`schema_version` は `1` で、スコア付け対象の Call はトップレベルの `original_call` に格納されます。

| フィールド                    | 説明                                        |
| ------------------------ | ----------------------------------------- |
| `project_id`             | `[YOUR-TEAM]/[YOUR-PROJECT]` 形式の project。 |
| `call_id`, `trace_id`    | スコア付け対象の Call の識別子。                       |
| `op_name`                | スコア付け対象の Call の Op ref。                   |
| `inputs`                 | Call の入力。                                 |
| `output`                 | Call の出力。                                 |
| `started_at`, `ended_at` | ISO 8601 形式のタイムスタンプ。                      |

```json lines theme={null}
{
  "schema_version": 1,
  "original_call": {
    "project_id": "[YOUR-TEAM]/[YOUR-PROJECT]",
    "call_id": "018f8d6c-8d5f-7000-8000-000000000001",
    "trace_id": "018f8d6c-8d5f-7000-8000-000000000002",
    "op_name": "weave:///[YOUR-TEAM]/[YOUR-PROJECT]/op/sample_remote_scorer_target:*",
    "inputs": {
      "message": "test message for scoring"
    },
    "started_at": "2026-06-08T12:00:00+00:00",
    "ended_at": "2026-06-08T12:00:01+00:00",
    "output": {
      "reply": "received: test message for scoring",
      "status": "ok"
    }
  },
  "scoring_call_id": "018f8d6c-8d5f-7000-8000-000000000003",
  "scoring_trace_id": "018f8d6c-8d5f-7000-8000-000000000004",
  "monitor": {
    "name": "example_remote_scorer_monitor",
    "version_digest": "monitor-version-digest"
  },
  "scorer": {
    "name": "example_remote_scorer",
    "ref": "weave:///[YOUR-TEAM]/[YOUR-PROJECT]/object/example_remote_scorer:scorer-version-digest",
    "config": {
      "example_threshold": 0.8
    }
  },
  "triggered_at": "2026-06-08T12:00:02+00:00"
}
```

<h3 id="response">
  応答
</h3>

次の 2 つのフィールドを含む JSON オブジェクトを、HTTP `200` で返します。

* `schema_version`: リクエストの `schema_version` と同じ値の整数。
* `result`: 1 つのスコアオブジェクト、スコアオブジェクトのリスト、または `{"scores": [...]}` 形式のオブジェクト。

スコアオブジェクトには次のフィールドがあります。

| フィールド        | 必須  | 説明                                                    |
| ------------ | --- | ----------------------------------------------------- |
| `value`      | はい  | タグ (最大 36 文字の string) 、または評価 (`0.0` から `1.0` までの数値) 。 |
| `reason`     | いいえ | スコアの根拠を説明する string。                                   |
| `confidence` | いいえ | `0.0` から `1.0` までの数値。                                 |

Weave は、`200` 以外の応答をすべて Scorer の失敗として扱い、その試行のフィードバックは記録しません。また、リダイレクトには従わず、失敗として扱います。エラー応答の本文は解析されません。エンドポイントが受け入れることのないリクエストには `4xx` を、一時的な問題には `5xx` を返してください。

Call リクエストの場合、応答の `schema_version` は `1` です。この応答は、rating とタグをそれぞれ 1 つずつ返します。

```json lines theme={null}
{
  "schema_version": 1,
  "result": [
    {
      "value": 1.0,
      "reason": "Message is 32 characters; concise messages score best.",
      "confidence": 1.0
    },
    {
      "value": "concise",
      "reason": "Message length category is concise.",
      "confidence": 0.9
    }
  ]
}
```

<h2 id="authenticate-requests-from-weave">
  Weave からのリクエストを認証する
</h2>

Weave は、ベアラートークンを使用してエンドポイントへの認証を行います。リクエストには W\&B の認証情報は含まれません。このトークンは、リクエストが Weave から送信されたものであることをエンドポイントに証明するためのものであり、その逆の証明には使用されません。各 `RemoteScorer` は、次の 2 つのモードのいずれかを使用します。

| モード                        | Weave が行う処理                                                                                                                                                    | 設定する項目                                                               |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| `oauth_client_credentials` | クライアントクレデンシャルグラントを使用して、OAuth トークンエンドポイントにトークンをリクエストします。その際、クライアント ID とシークレットを HTTP Basic 認証 (`client_secret_basic`) で送信します。その後、取得したトークンを Scorer エンドポイントに送信します。 | トークンエンドポイントの URL、クライアント ID、クライアントシークレットを格納するシークレットの名前、およびスコープ (省略可)。 |
| `static_bearer`            | 固定トークンを Scorer エンドポイントに送信します。                                                                                                                                  | トークンを格納するシークレットの名前。                                                  |

Scorer を登録する前に、クライアントシークレットまたはベアラートークンを、project を所有するチームのシークレットストアに保存してください。`RemoteScorer` の設定に保持されるのはシークレット名のみです。実際の値は、スコアリングワーカーがスコアリング時に解決します。

<h2 id="register-a-remote-scorer">
  リモート Scorer を登録する
</h2>

リモート Scorer は、モニターに関連付けられた `RemoteScorer` オブジェクトです。Python SDK を使用して作成します。

まず `RemoteScorer` を公開し、次に `Monitor` を有効化します。この `Monitor` では、`scorers` に公開した Scorer を指定し、`op_names` にスコア付けの対象となる Ops を指定します。`endpoint_url` は必須です。`config` と `auth_config` は省略可能です。

```python lines theme={null}
import weave
from weave.flow.monitor import Monitor
from weave.scorers.remote_scorer import (
    OAuthClientCredentialsConfig,
    RemoteScorer,
    StaticBearerAuthConfig,
)

weave.init("[YOUR-TEAM]/[YOUR-PROJECT]")

# 静的な Bearer トークン。WEAVE_REMOTE_SCORER_BEARER_TOKEN という名前のチームシークレットから読み込まれます
auth = StaticBearerAuthConfig(
    mode="static_bearer",
    bearer_secret_name="WEAVE_REMOTE_SCORER_BEARER_TOKEN",
)

# OAuth クライアント認証情報を使用する場合は、代わりに以下を使用します:
# auth = OAuthClientCredentialsConfig(
#     mode="oauth_client_credentials",
#     token_endpoint_url="https://idp.example.com/oauth2/token",
#     client_id="weave-remote-scorer",
#     client_secret_name="WEAVE_REMOTE_SCORER_CLIENT_SECRET",
#     scope="score:remote",
# )

scorer = RemoteScorer(
    name="policy_remote_scorer",
    endpoint_url="https://scoring.example.com/weave/score",
    config={"threshold": 0.9},  # scorer.config としてエンドポイントに送信されます
    auth_config=auth,
)
weave.publish(scorer, name="policy_remote_scorer")

monitor = Monitor(
    name="policy_remote_monitor",
    scorers=[scorer],
    op_names=["generate_response"],  # このプロジェクト内の Op 名、または完全な weave:/// 形式の Op ref
    sampling_rate=1.0,
)
monitor.activate()
```

コードを実行すると、`monitor.activate()` によってモニターが有効な状態で公開され、Op 名のみで指定された箇所が現在の project の完全な Op ref に展開されます。

<h2 id="sample-code">
  サンプルコード
</h2>

<GitHubLink url="https://github.com/wandb/weave/tree/master/examples/remote_scorer" />

`weave` リポジトリの [`examples/remote_scorer`](https://github.com/wandb/weave/tree/master/examples/remote_scorer) ディレクトリには、このページで説明するリクエストおよび応答の形式のリファレンス実装が含まれています。Python と FastAPI で記述されていますが、エンドポイントの言語、フレームワーク、ホストは自由に選択できます。Call を対象とする場合は、次のファイルを使用します。

* `remote_scorer_app.py`: `GET /health` と `POST /score` を提供する FastAPI アプリです。
* `scoring_logic.py`: フレームワークに依存しないリクエストの解析とスコアリングの処理です。独自のサービスにそのままコピーして使用できるように記述されています。Call の場合は、`inputs.message` の値をスコアリングします。
* `auth.py`: `REMOTE_SCORER_DEV_BEARER_TOKEN` 環境変数を使用して Bearer トークンを検証する、開発専用のチェックです。
* `register_remote_scorer.py --op-name`: `RemoteScorer` を公開し、Op に対して `Monitor` を有効化します。
* `trigger_test_trace.py`: モニターの選択対象となる、トレースされた Call を作成します。
* `sample_request.json`: Call 用の完全な V1 リクエストです。

Weave を使用せずにローカルでエンドポイントをテストするには、アプリを起動してから、サンプルリクエストを送信します。

```bash lines theme={null}
python3 -m venv .venv && source .venv/bin/activate
python -m pip install -r requirements.txt
export REMOTE_SCORER_DEV_BEARER_TOKEN="dev-token"
uvicorn remote_scorer_app:app --host 127.0.0.1 --port 8000
```

```bash lines theme={null}
curl -sS http://127.0.0.1:8000/score \
  -H "Authorization: Bearer dev-token" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: local-contract-check" \
  -H "X-Correlation-ID: local-contract-check" \
  -H "X-Weave-Schema-Version: 1" \
  --data @sample_request.json
```

このサンプルには Weave `0.53.0` 以降が必要です。ローカルでの run で検証できるのは、エンドポイントに定義したリクエストと応答の動作のみです。  Weave のスコアリングワーカーはループバックアドレスを拒否します。また、ホスト型のデプロイでは安全でない HTTP は許可されていません。

<h2 id="test-the-scorer">
  Scorer をテストする
</h2>

テストの前に、許可されたホストに含まれる HTTPS URL にエンドポイントをデプロイし、登録してください。

スコア付け対象の Call をトリガーし、結果を確認します。

1. モニター対象の Op を 1 回以上呼び出します。
2. エンドポイントがリクエストを受信したことを確認します。スコアリングは非同期で行われるため、リクエストは Call の終了後に届きます。
3. **Traces** タブで Call を開き、フィードバックを確認します。

エンドポイントは `original_call` に Call が格納された V1 リクエストを受信し、Weave はその結果を該当する Call のフィードバックとして記録します。

<h2 id="troubleshooting">
  トラブルシューティング
</h2>

| 症状                                  | 確認事項                                                                                                                                                                           |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| UI にリモート Scorer のオプションが表示されない       | 所有元の組織の **Remote scoring** 設定、またはデプロイメント管理者によって、リモートスコアリングが有効になっていることを確認してください。                                                                                                |
| エンドポイント URL が拒否される                  | Scorer のホスト (OAuth の場合はトークンエンドポイントのホストも) が、許可されたホストに含まれていることを確認してください。また、ポートの不一致、HTTPS 以外の URL、プライベートアドレスや内部アドレスの使用がないかも確認してください。                                              |
| エンドポイントが `401` または `403` を返す        | シークレット名、OAuth クライアントの認証情報、オーディエンス、スコープ、およびエンドポイント側のトークン検証を確認してください。                                                                                                            |
| トークンリクエストは成功するがスコアリングが失敗する (またはその逆) | 各 URL を個別に確認してください。トークンエンドポイントと Scorer エンドポイントはそれぞれ独立して検証されるため、異なるホストを使用できます。                                                                                                  |
| フィードバックが表示されない                      | スコアリングは非同期で実行されます。Call がモニターの operation、フィルター、サンプリング率の条件に一致していることを確認してください。Weave はすべての試行を Scorer の Call として **Traces** タブに記録します。失敗した試行は、失敗理由を含むエラー状態の Scorer の Call として表示されます。 |
| `200` 応答が返されてもフィードバックが表示されない        | 応答の `schema_version` がリクエストの値と一致していること、および `result` が 3 種類の構造化形式のいずれかになっていることを確認してください。                                                                                        |
