POST でターンをお客様のエンドポイントに送信し、その応答をターンのフィードバックとして記録します。結果は、Agents ビューの Signals タブにタグまたは評価として表示されます。
このページでは、エージェントのターンを対象とするリモート Scorer について説明します。@weave.op でトレースした Call をスコアリングする方法については、リモート Scorer で Call をスコアリングするを参照してください。リモート Scorer は Python SDK または Weave UI で設定します。TypeScript SDK には RemoteScorer は含まれていません。
エージェントのターンのスコアリングの仕組み
エージェントのターンは、次の順序でスコアリングされます。- ターンが終了します。ルートスパン (親を持たないスパン) が終了すると、Weave はそれを完了したターンとして扱い、
weave.genai.turn_endedイベントを発行します。 - エージェントスコアリングワーカーが、project 内で
weave.genai.turn_endedを対象とする有効なシグナルを読み込み、各シグナルのフィルターとサンプリング率を適用します。 - 条件に一致したシグナルの各
RemoteScorerについて、ワーカーはターンのスパンからメッセージを含むschema_version: 2リクエストを構築し、Scorer の認証情報を解決します。さらに、エンドポイント URL を許可されたホストと照合したうえでPOSTを送信します。 - ワーカーは応答を検証し、その結果をターンのフィードバックとして書き込みます。タグと評価は Signals タブに表示されます。
op_names が ["weave.genai.turn_ended"] である Monitor です。
試行が失敗すると、ワーカーは同じ Idempotency-Key を使用して再試行します。試行回数は、最初の試行から 30 秒以内で最大 3 回です。5xx、408、429 の応答は再試行の対象です。タイムアウトの場合は 30 秒をすべて使い切るため、再試行されません。その他の 4xx 応答も再試行されません。エンドポイントが時間内にターンをスコアリングできない場合は、リクエストをタイムアウトさせずに、すぐに 503 を返してください。これにより Weave が再試行します。Weave はタグと評価を型付きのフィードバック列として保存するため、エージェントのターンのスコアリングには構造化された結果形式が必要です。
リモートスコアリングを有効にする
リモートスコアリングは、組織またはデプロイメントで有効化されるまでオフになっています。また、スコアリングワーカーが Scorer のエンドポイントを呼び出すのは、そのホストが許可リストに登録されている場合に限られます。有効化の方法はデプロイメントタイプによって異なります。 Multi-tenant Cloud 組織でリモート Scorer を有効にするには、組織管理者または請求管理者が次の手順を実行します。https://wandb.ai/account-settings/[ORG]/settingsを開きます。[ORG]は、ご利用の project を所有する組織の名前に置き換えてください。- Remote scoring タブを選択します。
- Enable remote scoring をオンにします。
- Allowed hosts で Add host をクリックし、リモート Scorer からの呼び出しを許可するホストをそれぞれ入力します。リモートスコアリングを有効にした状態で保存するには、ホストを 1 つ以上登録する必要があります。ポートを空欄のままにすると、そのホストのすべてのポートが許可されます。
- Save settings をクリックします。
extraEnv を使用して、次の環境変数を設定してください。
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 が必須です。
- リダイレクトは追跡しません。
Scorer エンドポイントを構築する
エンドポイントは Weave から JSON 形式のPOST リクエストを受け入れ、JSON 形式でスコアを返します。リファレンス実装については、サンプルコードを参照してください。
Request
Weave は、スコアリング対象ごとに 1 件の HTTPPOST を Scorer のエンドポイント URL に送信します。ヘッダーは次のとおりです。
Weave は同じスコアリング試行を複数回配信する場合があります。必要に応じて、エンドポイント側で
Idempotency-Key を使用して重複を排除してください。このキーはリクエストのバージョンごとに一定であるため、同じ Call に対する V1 リクエストと V2 リクエストではキーが異なります。
すべてのリクエスト本文には、次のトップレベルフィールドが含まれます。
Weave は、値のない省略可能なフィールドを
null として送信せず、フィールド自体を省略します。また、バージョン番号を変更せずに省略可能なフィールドを追加する場合があるため、認識できないフィールドは無視してください。
リクエスト本文と応答本文はそれぞれ 1 MiB までに制限されており、JSON テキストのみで構成されます。画像、オーディオ、動画が含まれることはありません。これらの制限を超える対象は送信されないため、スコアリングされません。1 件のリクエストに含まれる対象は 1 つです。
エージェントのターンのリクエストには、2 つのバージョン番号が含まれます。トップレベルの schema_version はエンベロープのバージョンで、エージェントのターンの場合は 2 です。スコアリング対象のデータは scoring_target に格納されます。これは次の 3 つのフィールドを持つタグ付きユニオンです。
type: 対象の種類です。ターンの場合はagent_turnです。コントラクトではcallも定義されていますが、エージェントのターンのスコアリングで送信されることはありません。schema_version: そのタイプのペイロードのバージョンです。エンベロープのバージョンとは独立して採番されます。agent_turnのペイロードはペイロードバージョン1です。payload: そのタイプのデータです。
scoring_target.type と scoring_target.schema_version の組み合わせを確認して、ペイロードのスコアリング方法を決定してください。エンドポイントで処理しない組み合わせ (たとえば、エージェントのターンのみをスコアリングする場合の call など) には 4xx を返してください。
ペイロードバージョン 1 の agent_turn ペイロードには、次のフィールドがあります。
明示的なステータスが設定されずに終了したターンは、
status.code が UNSET の状態で届きます。UNSET は正常に完了したターンとして、ERROR は失敗を示すシグナルとして扱ってください。input と output の各メッセージには、role、content、finish_reason が含まれます。content は通常プレーンテキストですが、ツール呼び出しなどの構造化コンテンツを含むメッセージの場合は、パーツの配列を JSON エンコードした文字列になります。
1 として V2 ユニオンに追加されます。
応答
次の 2 つのフィールドを含む JSON オブジェクトを、HTTP200 で返します。
schema_version: リクエストのschema_versionと同じ値の整数。result: 1 つのスコアオブジェクト、スコアオブジェクトのリスト、または{"scores": [...]}形式のオブジェクト。
Weave は、
200 以外の応答をすべて Scorer の失敗として扱い、その試行のフィードバックは記録しません。また、リダイレクトには従わず、失敗として扱います。エラー応答の本文は解析されません。エンドポイントが受け入れることのないリクエストには 4xx を、一時的な問題には 5xx を返してください。
エージェントのターンリクエストの場合、応答の schema_version は 2 になります。次の例では、スコアオブジェクトを 1 つ返します。
Weave からのリクエストを認証する
Weave は、ベアラートークンを使用してエンドポイントへの認証を行います。リクエストには W&B の認証情報は含まれません。このトークンは、リクエストが Weave から送信されたものであることをエンドポイントに証明するためのものであり、その逆の証明には使用されません。各RemoteScorer は、次の 2 つのモードのいずれかを使用します。
Scorer を登録する前に、クライアントシークレットまたはベアラートークンを、project を所有するチームのシークレットストアに保存してください。
RemoteScorer の設定に保持されるのはシークレット名のみです。実際の値は、スコアリングワーカーがスコアリング時に解決します。
リモート Scorer シグナルを作成する
シグナルは Weave UI または Python SDK を使用して作成できます。どちらの方法でも、weave.genai.turn_ended を対象とするモニターに関連付けられた RemoteScorer が作成されます。
Weave UI
Agents ビューからシグナルを作成します。- Weave のプロジェクトのサイドバーで、Agents をクリックします。
- タブバーで Signals をクリックします。
- New signal をクリックし、続いて Remote scorer をクリックします。
- Remote scorer ドロワーでは、Scored by が Remote scorer に設定されています。次のフィールドを設定します。
- Scorer name: Signals 表の Scorer 列に表示される名前です。最大 128 文字まで指定できます。
- Scoring endpoint URL: Weave が
POSTリクエストを送信する URL です。 - Authentication: Static bearer または OAuth client credentials を選択します。Static bearer の場合は、Bearer token secret name を選択または入力します。OAuth の場合は、Token endpoint URL、Client ID、Client secret name、および必要に応じて Scope を入力します。シークレットのフィールドには、値ではなくチームのシークレット名を指定します。
- Config (JSON, optional):
scorer.configとしてエンドポイントに渡される JSON オブジェクトです。 - Only score turns matching (任意): Advanced を展開し、フィルターを追加して、シグナルのスコア付け対象となるターンを絞り込みます。たとえば、エージェント名、エージェントのバージョン、オペレーション名、ツール名、ステータスコードで絞り込めます。すべてのターンをスコア付けする場合は、空欄のままにします。複数のフィルターを指定すると、Weave はそれらを
AND条件で結合します。 - Sample rate (任意): Advanced を展開し、条件に一致するターンのうち、シグナルがスコア付けする割合を設定します。
- Create signal をクリックします。
Python SDK
RemoteScorer を公開してから、Monitor を有効化します。この Monitor では、scorers に公開した Scorer を指定し、op_names で weave.genai.turn_ended を対象に設定します。
OAuthClientCredentialsConfig を auth_config に渡します。
サンプルコード
weave リポジトリの examples/remote_scorer ディレクトリには、このコントラクトのリファレンス実装が含まれており、サンプルコードの正式な参照元となります。このサンプルでは、1 つのエンドポイントで V1 Call リクエスト、V2 Call リクエスト、V2 エージェントのターンリクエストのすべてを受け入れます。エージェントのターンに関係するファイルは次のとおりです。
remote_scorer_app.py:GET /healthとPOST /scoreを提供する FastAPI アプリです。auth.py:REMOTE_SCORER_DEV_BEARER_TOKEN環境変数と照合する、開発専用のベアラートークン検証です。scoring_logic.py:extract_scoring_targetでいずれかのエンベロープを展開し、ターンの最後の出力メッセージをスコアリングします。sample_request_v2_agent_turn.json: V2 エージェントのターンリクエストの完全な例です。register_remote_scorer.py --agent-turn:RemoteScorerを公開し、完了したエージェントのターンを対象とするモニターを有効化します。trigger_test_agent_turn.py:weave.conversation.log_turnを使用して 1 つのターンをログします。
0.53.0 以降が必要です。ローカルで run した場合は、コントラクトの検証のみが行われます。
シグナルをテストする
テストの前に、許可されたホストに含まれる HTTPS URL にエンドポイントをデプロイし、登録しておいてください。 完了したターンを 1 つログしてから、Signals タブを確認します。スコアリングは非同期で実行されるため、結果が表示されるまでに少し時間がかかります。scoring_target.type が agent_turn に設定された V2 リクエストを受信します。Weave はその結果を、該当するターンのフィードバックとして記録します。