mcpField
O
observing-agentforce

observing-agentforce

github.com/forcedotcomエージェントワークフロー1.1k3.6k 回インストール1 日前に更新
リポジトリ

observing-agentforce について

セッションデータ、プレビュー、`.agent` 設定を使って Agentforce エージェントを診断・改善するスキルです。STDM で過去のセッションを分析でき、利用できない場合はテストスイートとローカルトレースを使います。

主な機能

  1. 01STDM セッションデータの照会
  2. 02会話詳細と指標の分析
  3. 03ライブプレビューで問題を再現
  4. 04ローカルトレースと Agent ファイルの確認
  5. 05変更の編集、検証、公開

活用シーン

  1. 01セッション内のルーティングやアクションのエラー発見
  2. 02遵守状況や検索品質の調査
  3. 03報告された会話問題の再現
  4. 04公開後の Agent 変更の検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/forcedotcom/sf-skills --skill observing-agentforce

インストール後、Claude Code で/observing-agentforceを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

apex/
AgentforceOptimizeService.cls
AgentforceOptimizeService.cls-meta.xml
references/
improve-reference.md
issue-classification.md
reproduce-reference.md
stdm-queries.md
stdm-schema.md

詳細

Agentforce オブザーバビリティ

セッショントレースデータとライブプレビューのテストを使用して、Agentforce エージェントを改善します。

3 フェーズのワークフロー:

  • 観察 -- Data Cloud から STDM セッションをクエリします(利用可能な場合)。それ以外の場合は、フォールバックとしてテストスイートを実行し、ローカルトレースでプレビューします
  • 再現 -- sf agent preview を使用して、問題のある会話をライブでシミュレートします
  • 改善 -- .agent ファイルを直接編集し、検証して、公開し、確認します

プラットフォームに関する注意事項

  • 以下のシェルの例では bash 構文を使用しています。Windows では、PowerShell の同等のコマンドまたは Git Bash を使用してください。
  • Windows では、python3 を python に置き換えてください。
  • /tmp/ を $env:TEMP\(PowerShell)または %TEMP%(cmd)に置き換えてください。
  • jq がインストールされていない場合は、jq を python -c "import json,sys; ..." に置き換えてください。

ルーティング

開始する前に、以下の入力を収集してください。

  • 組織のエイリアス(必須)
  • エージェント API 名(プレビューとデプロイに必須。指定されていない場合は確認してください)
  • エージェントファイルのパス(任意)-- .agent ファイルへのパス。通常は force-app/main/default/aiAuthoringBundles/<AgentName>/<AgentName>.agent です。指定されていない場合は自動検出します。
  • セッション ID(任意)-- 特定のセッションを分析します。指定されていない場合は、過去 7 日間のセッションをクエリします。
  • 遡る日数(任意。デフォルトは 7)

ユーザー入力から目的を判断してください。

  • 具体的なアクションの指定なし -> 3 つすべてのフェーズを実行します:観察 -> 問題を明らかにする -> 再現および/または改善を希望するかユーザーに確認します
  • 「分析」/「セッション」/「問題は何か」 -> フェーズ 1 のみを実行し、次のステップを提案します
  • 「再現」/「テスト」/「プレビュー」 -> フェーズ 2(問題がまだ特定されていない場合は、まずフェーズ 1 を実行します)
  • 「修正」/「改善」/「更新」 -> フェーズ 3(問題がまだ特定されていない場合は、まずフェーズ 1 を実行します)
エージェント名を解決する

STDM にクエリする前に、ユーザーが指定したエージェント名を組織内で照合し、正確な MasterLabel と DeveloperName を取得してください。

sf data query --json \
  --query "SELECT Id, MasterLabel, DeveloperName FROM GenAiPlannerDefinition WHERE MasterLabel LIKE '%<user-provided-name>%' OR DeveloperName LIKE '%<user-provided-name>%'" \
  -o <org>
  • MasterLabel = STDM の findSessions および Agent Builder UI で使用される表示名(例:「Order Service」)
  • DeveloperName = メタデータで使用される、バージョンの接尾辞を含む API 名(例:「OrderService_v9」)
  • sf agent preview/activate/publish の --api-name フラグでは、_vN の接尾辞を除いた DeveloperName を使用します(例:「OrderService」)

次の値を保存してください。

  • AGENT_MASTER_LABEL -- findSessions() のエージェントフィルター用
  • AGENT_API_NAME -- _vN を除いた DeveloperName。sf agent CLI コマンド用
  • PLANNER_ID -- このエージェントの Salesforce レコード ID
.agent ファイルの場所を特定する

ステップ 1 -- ローカルで検索する:

find <project-root>/force-app/main/default/aiAuthoringBundles -name "*.agent" 2>/dev/null

ユーザーがエージェントファイルのパスを指定した場合は、そのパスを直接使用してください。それ以外の場合は、AGENT_API_NAME に一致するファイルを検索してください。

ステップ 2 -- ローカルで見つからない場合は、組織から取得する:

sf project retrieve start --json --metadata "AiAuthoringBundle:<AGENT_API_NAME>" -o <org>

既知のバグ: sf project retrieve start は、二重にネストされたパス force-app/main/default/main/default/aiAuthoringBundles/... を作成します。取得後、直ちに修正してください。

if [ -d "force-app/main/default/main/default/aiAuthoringBundles" ]; then
  mkdir -p force-app/main/default/aiAuthoringBundles
  cp -r force-app/main/default/main/default/aiAuthoringBundles/* \
    force-app/main/default/aiAuthoringBundles/
  rm -rf force-app/main/default/main
fi

ステップ 3 -- 取得したファイルを検証する:

.agent ファイルを読み込み、適切な Agent Script 構造になっていることを確認してください。

  • instructions: を含む system: ブロック
  • developer_name: を含む config: ブロック
  • reasoning: instructions: を含む start_agent または subagent ブロック
  • 各サブエージェントに、それぞれ異なる instructions: の内容が設定されていること(サブエージェント間で同一ではないこと)

解決したパスを AGENT_FILE として保存し、フェーズ 3 で使用してください。


フェーズ 0:データスペースの特定

STDM クエリを実行する前に、正しい Data Cloud Data Space API 名を特定します。

sf api request rest "/services/data/v63.0/ssot/data-spaces" -o <org>

注:sf api request rest はベータ版コマンドです。--json はサポートされておらず、エラーになるため追加しないでください。

レスポンスの形式は次のとおりです。

{
  "dataSpaces": [
    {
      "id": "0vhKh000000g3DjIAI",
      "label": "default",
      "name": "default",
      "status": "Active",
      "description": "Your org's default data space."
    }
  ],
  "totalSize": 1
}

name フィールドは、AgentforceOptimizeService に渡す API 名です。

判定ロジック:

  • コマンドが失敗した場合(404 や権限エラーなど)は、'default' にフォールバックし、仮定であることを明記します。
  • status: "Active" のエントリのみを対象にします。
  • アクティブな Data Space がちょうど 1 つの場合は自動的に使用し、ユーザーに「使用する Data Space:<name>」と確認します。
  • アクティブな Data Space が複数ある場合は、一覧(ラベル + 名前)を表示し、どれを使用するかユーザーに尋ねます。

選択した name の値を DATA_SPACE として保存し、以降のすべての手順で使用します。

前提条件の確認:STDM DMO

ヘルパークラスをデプロイした後(手順 1.0)、簡単なプローブを実行して、STDM Data Model Object が Data Cloud に存在することを確認します。

sf apex run -o <org> -f /dev/stdin << 'APEX'
ConnectApi.CdpQueryInput qi = new ConnectApi.CdpQueryInput();
qi.sql = 'SELECT ssot__Id__c FROM "ssot__AiAgentSession__dlm" LIMIT 1';
try {
    ConnectApi.CdpQueryOutputV2 out = ConnectApi.CdpQuery.queryAnsiSqlV2(qi, '<DATA_SPACE>');
    System.debug('STDM_CHECK:OK rows=' + (out.data != null ? out.data.size() : 0));
} catch (Exception e) {
    System.debug('STDM_CHECK:FAIL ' + e.getMessage());
}
APEX

STDM_CHECK:FAIL の場合: STDM が有効になっていません。ユーザーに知らせ、フェーズ 1-ALT に切り替えます。

この組織では STDM(Session Trace Data Model)を利用できません。有効にするには、Setup -> Data Cloud -> Data Streams に移動し、「Agentforce Activity」が有効であることを確認してください。フォールバックに進みます:テストスイート + ローカルトレース。

**STDM_CHECK:OK の場合は、**フェーズ 1(STDM パス)に進みます。


フェーズ 1-ALT:STDM を使用せずに観察する(フォールバックパス)

STDM を利用できない場合は、テストスイートと sf agent preview --authoring-bundle を使用し、ローカルトレースを分析します。

データソース使用する状況メリットデメリット
STDM(フェーズ 1)本番環境の過去の分析実際のユーザーデータ、データ量Data Cloud が必要、15 分の遅延
テストスイート + ローカルトレース(フェーズ 1-ALT)開発の反復、STDM のない組織即時に実行可能、LLM プロンプト全体、変数の状態プレビューのみ、実際のユーザーデータなし
1-ALT.1 既存のテストスイートを実行する(利用可能な場合)
sf agent test list --json -o <org>
sf agent test run --json --api-name <TestSuiteName> --wait 10 --result-format json -o <org> | tee /tmp/test_run.json
JOB_ID=$(python3 -c "import json; print(json.load(open('/tmp/test_run.json'))['result']['runId'])")
sf agent test results --json --job-id "$JOB_ID" --result-format json -o <org>
1-ALT.2 .agent ファイルからテスト用発話を導き出す(テストスイートがない場合)

テストスイートがない場合は、発話を導き出します。エントリー以外のサブエージェントごとに 1 つ(description: のキーワードから)、主要なアクションごとに 1 つ、ガードレールテストを 1 つ、複数ターンのテストを 1 つ作成します。

1-ALT.3 --authoring-bundle でプレビューする(ローカルトレース)

各テスト用発話をプレビューにかけ、ローカルトレースファイルを生成します。

sf agent preview start --json --authoring-bundle <BundleName> -o <org> | tee /tmp/preview_start.json
SESSION_ID=$(python3 -c "import json; print(json.load(open('/tmp/preview_start.json'))['result']['sessionId'])")

sf agent preview send --json --session-id "$SESSION_ID" --authoring-bundle <BundleName> \
  --utterance "$UTT" -o <org> | tee /tmp/preview_response.json

sf agent preview end --json --session-id "$SESSION_ID" --authoring-bundle <BundleName> -o <org>

トレースファイルの場所: .sfdx/agents/{BundleName}/sessions/{sessionId}/traces/{planId}.json

1-ALT.4 ローカルトレースの診断
問題の種類トレースコマンド
サブエージェントの誤ルーティングjq -r '.plan[] | select(.type=="NodeEntryStateStep") | .data.agent_name' "$TRACE"
アクションが呼び出されないjq -r '.plan[] | select(.type=="EnabledToolsStep") | .data.enabled_tools[]' "$TRACE"
遵守度が LOWjq -r '.plan[] | select(.type=="ReasoningStep") | {category, reason}' "$TRACE"
変数の取得に失敗jq -r '.plan[] | select(.type=="VariableUpdateStep") | .data.variable_updates[]' "$TRACE"
指示が曖昧jq -r '.plan[] | select(.type=="LLMStep") | .data.messages_sent[0].content' "$TRACE"

DefaultTopic のトレースに関する注意点: --authoring-bundle を使用すると、ルーティングが機能している場合でも、ルートの .topic フィールドに "DefaultTopic" と表示されることがよくあります。実際のサブエージェントの連鎖を確認するには、必ず NodeEntryStateStep.data.agent_name を使用してください。

エントリーが直接回答する(SMALL_TALK パターン): start_agent のトレースに SMALL_TALK のグラウンディングが表示され、遷移ツールも確認できるのに、いずれも呼び出されていない場合は、start_agent の指示に「あなたはルーターのみです。質問に直接回答してはいけません。」を追加します。

1-ALT.5 分類して提示する

references/issue-classification.md のカテゴリを使用して問題を分類します。調査結果を提示した後、自動的にエージェント設定の根拠分析に進みます。


フェーズ 1:観察 -- STDM のクエリ

STDM クエリの詳細、Apex サービスのデプロイ、レスポンスの解析については、references/stdm-queries.md を参照してください。

1.0 ヘルパークラスのデプロイ(組織ごとに1回)

AgentforceOptimizeService Apex クラスを組織にデプロイします。まず、すでにデプロイされているか確認してください。

sf data query --json --query "SELECT Id, Name FROM ApexClass WHERE Name = 'AgentforceOptimizeService'" -o <org>

デプロイされていない場合は、スキルディレクトリからコピーしてデプロイします。詳しい手順は references/stdm-queries.md を参照してください。

1.1 セッションを検索する

findSessions() を使って最近のセッションをクエリします。Apex デバッグログから DEBUG|STDM_RESULT: を解析します。findSessions が空の結果を返す場合は、Phase 1-ALT に切り替えます。

1.2 会話の詳細を取得する

最大5件のセッション(最新のものから)について、getMultipleConversationDetails() を使います。メッセージ、ステップ、トピック、アクション結果を含む、ターンごとのデータが返されます。

1.2b LLM のプロンプトと応答を取得する(任意)

LOW adherence が検出された場合は、getLlmStepDetails() を使って実際の LLM プロンプトと応答を取得します。

1.2c 集計メトリクスを取得する(推奨される最初のステップ)

getAggregatedMetrics() を使って、セッション率、上位インテント、品質分布、RAG 平均値を含む、全体的な健全性ダッシュボードを取得します。

1.2d モーメントインサイトを取得する(セッションごとの詳細)

getMomentInsights() を使って、セッションごとのインテントの概要、品質スコア(1~5)、リトリーバーのメトリクスを取得します。

1.2e 可観測性クエリを実行する(RAG の詳細分析)

runObservabilityQuery() を使って、KnowledgeGap、Hallucination、RetrievalQuality、AnswerRelevancy、Leaderboard を対象とした RAG 分析を行います。

1.3 会話を再構成する

各セッションについて、ConversationData JSON からターンごとのタイムラインを表示します。

1.4 問題を特定する

問題パターンの一覧表と分類カテゴリの詳細は、references/issue-classification.md を参照してください。

各セッションで次の問題を確認します:アクションエラー、サブエージェントの誤ルーティング、アクションの欠落、誤った入力、変数の取得失敗、遷移なし、アクションの遅延、LOW adherence、セッションの放棄、応答のないサブエージェント、公開時のドリフト、ハブが応答しないアンチパターン、エントリーでの直接回答、安全性の問題。

優先度:P1 = アクションエラー、誤ルーティング、LOW adherence。P2 = アクションの欠落、変数のバグ、ナレッジギャップ。P3 = パフォーマンス、セッションの放棄。

1.5 調査結果とエージェント設定の根拠を提示する

分析したセッション、根本原因カテゴリ別に分類した問題、改善効果の推定値を提示します。その後、自動的に .agent ファイルの分析に進み、根本原因を確認します。

構造分析の全チェック項目、相互参照の手順、公開時のドリフト検出の詳細は、references/issue-classification.md を参照してください。

組織から .agent ファイルを取得し、自動チェック(サブエージェント数とアクションブロック数の比較、応答しないハブの検出、孤立したアクション、サブエージェント間の変数依存関係)を実行して、STDM の症状とファイル構造を相互参照します。


Phase 2: 再現 -- ライブプレビュー

プレビューの全手順、トレース診断コマンド、分類基準の詳細は、references/reproduce-reference.md を参照してください。

Phase 1 で確認した問題ごとにテストシナリオを1つ作成します。--authoring-bundle を指定して、各シナリオを sf agent preview で実行します(ローカルのトレースが生成されます)。各シナリオを3回実行して、次のように分類します。

判定基準
[CONFIRMED]3回中3回で同じ障害が発生
[INTERMITTENT]3回中1~2回で障害が発生
[NOT REPRODUCED]3回中3回で成功

[CONFIRMED] と [INTERMITTENT] の問題のみ Phase 3 に進みます。

主要なコマンド:

sf agent preview start --json --authoring-bundle <Name> -o <org>
sf agent preview send --json --session-id "$SID" --utterance "<text>" --authoring-bundle <Name> -o <org>
sf agent preview end --json --session-id "$SID" --authoring-bundle <Name> -o <org>

トレースの場所: .sfdx/agents/{Name}/sessions/{sessionId}/traces/{planId}.json


Phase 3: 改善 -- .agent ファイルを直接編集する

事前確認、修正内容の対応付け、指示の原則、回帰の防止、デプロイチェーン、検証、安全性の再検証、テストケースの作成に関する全手順は、references/improve-reference.md を参照してください。

3.0 事前確認

編集する前に、すべてのアクションの対象が存在し、組織に登録されていることを確認します。対象がない場合は、スタブのデプロイ、アクションの削除、UI による登録、ルーティングのみの修正を続行する、という選択肢を提示します。

3.1-3.3 問題のマッピング、編集、指示の原則

確認済みの各問題を、.agent ファイル内の修正箇所(説明、指示、アクション、バインディング、遷移)にマッピングします。対象を絞って変更するには Edit ツールを使用します。指示の原則に従い、アクションを明示的に指定し、前提条件を示し、範囲を絞り、ペルソナは system: 内のみに記述します。

3.4 リグレッションの防止

編集前にベースラインを確立します。編集は最小限にします。編集のたびに直ちにテストします。公開サイクルごとに修正は1つにします。サブエージェント間の依存関係を確認します。隣接するサブエージェントもテストします。

3.5 修正の適用

.agent ファイルを読み取り、Edit ツールで編集します(インデントにはタブを使用します)。差分を表示します。

3.6 検証、デプロイ、公開、有効化
# Validate (dry run)
sf agent validate authoring-bundle --json --api-name <AGENT_API_NAME> -o <org>

# Publish (compile + deploy + activate)
sf agent publish authoring-bundle --json --api-name <AGENT_API_NAME> -o <org>

公開に失敗した場合は、デプロイと有効化によるフォールバックを使用します(注:reasoning: actions: がライブメタデータに反映されないため、不完全です)。

3.7 検証

修正後にフェーズ2のシナリオを実行します。トレースを確認し、ルーティング、グラウンディング、ツール、変数が正しいことを確認します。24~48時間後にフェーズ1を再実行し、ベースラインと比較します。

3.7b 安全性の再検証(必須)

変更した .agent ファイルに対して、安全性レビュー(/developing-agentforce のセクション15)を再実行します。BLOCK の指摘を引き起こす変更は元に戻します。

3.8 Testing Center のテストケースを更新

確認済みの問題から、Testing Center の YAML 形式でリグレッションテストケースを作成します。sf agent test create でデプロイし、以前失敗していたすべてのシナリオが合格することを確認します。


参照ファイル

参照先内容
references/stdm-queries.mdSTDM クエリの手順、Apex サービスのデプロイ、レスポンスの解析
references/issue-classification.md問題パターンの表、根本原因のカテゴリ、構造分析のチェック
references/reproduce-reference.mdフェーズ2のプレビュー手順、トレース診断、分類基準
references/improve-reference.mdフェーズ3の編集、デプロイチェーン、検証、安全性、テストケース
references/stdm-schema.mdDMO フィールドスキーマ、データ階層、品質に関する注意事項、エージェント名の解決

コメント