【必読】なぜ今、Aura ではなく LWR を選ぶべきなのか?

LWR × Agentforce開発者ガイド:Context Passing Framework (Beta) の全貌 —— 技術仕様からビジネス戦略まで

この記事はバージョン Spring ’26 において執筆しています。
現在の動作と異なる場合がありますので、ご認識おきください。

Salesforce Spring ’26 (API 66.0) のリリースは、LWC開発者とアーキテクトにとって極めて重要な転換点となります。これまで「静的」だったチャットボットとの連携が、Context Passing Framework の登場によって「動的」かつ「文脈適応型」へと進化するからです。

本記事では、この新フレームワークの中核となる setSessionContext メソッドを使用し、LWRサイト上のLWCからAgentforceへ、現在のユーザー状況(コンテキスト)をリアルタイムに注入する実装方法を解説します。

イントロダクション:ステートレスなWebとAIの「記憶」

Webの基盤技術であるHTTPプロトコルは、本来「ステートレス(状態を持たない)」な性質を持っています。しかし、人間と対話するAIにとって、「文脈(Context)」の欠如は致命的です。「この製品について教えて」と問われたとき、ユーザーが今どの製品ページを見ているかを知らなければ、AIは的確な回答ができません。

これまでのSalesforce開発において、チャットボットへのコンテキスト渡しは Pre-Chat API(第2世代)が主流でした。しかし、これはセッション開始時に一度だけデータを送る静的な仕組みであり、SPA(Single Page Application)として動作するLWRサイトでの動的なユーザー行動を追跡するには力不足でした。

Spring ’26 (API v66.0) で導入される Context Passing Framework(第3世代)は、この課題に対する決定的な回答です。これは単なるデータ渡しではなく、Webのステートレス性とAIのコンテキスト維持をリアルタイムに同期させるための「神経系」と言えます。

特性Pre-Chat API (Legacy)Context Passing Framework (Spring ’26)
タイミングセッション開始時のみ(静的)ライフサイクル全体(動的・リアルタイム)
データ構造フラットな文字列(Key-Value)構造化データ (StructuredValue / JSON)
SPA対応困難(ページ遷移に対応できない)完全対応(動的更新・差分プッシュ)
AI統合文字列として解釈グラウンディング(事実)として解釈

技術アーキテクチャの核心:embeddedservice_bootstrap.utilAPI

このフレームワークの技術的中核は、クライアントサイド(ブラウザ)で動作する新しいJavaScript API、embeddedservice_bootstrap.utilAPI です。

setSessionContext メソッドの仕様

開発者が最も頻繁に使用することになるのが setSessionContext メソッドです。これはPromiseベースの非同期処理として設計されており、UIのレンダリングをブロックせず安全に呼び出すことができます。

embeddedservice_bootstrap.utilAPI.setSessionContext(contextVariables)
   .then(() => { /* Success */ })
   .catch((error) => { /* Error Handling */ })
   .finally(() => { /* Cleanup */ });

StructuredValue による構造化データの革新

従来のAPIでは、複雑な検索条件やショッピングカートの中身を渡す際、文字列結合などのハックが必要でした。今回導入された StructuredValue 型により、ネストされたJSONオブジェクトをそのままAIへ渡すことができます。

プロパティ説明
name変数名。Agentforce向けには予約語 _AgentContext の使用が強く推奨されます。
value値のコンテナオブジェクト。
value.valueType"StructuredValue" を指定することでJSON構造を維持します。
value.value実際のペイロード(任意のJSONオブジェクト)。
// 従来の苦しい実装(文字列化)
const context = "Product:A, Color:Red, Qty:2"; 

// Spring '26 (API 66.0) の実装:StructuredValueによる構造化データ渡し
const contextData = [
    {
        name: "_AgentContext", // Agentforceが参照するシステム変数名
        value: {
            valueType: "StructuredValue", // 構造化データであることを明示
            value: {
                // ここに任意のネストされたJSONを格納
                product: {
                    code: "XYZ-123",
                    variant: { color: "Red", size: "M" }
                },
                cart: {
                    totalAmount: 15000,
                    currency: "JPY"
                }
            }
        }
    }
];

// この配列構造をAPIにそのまま渡すことができる
// embeddedservice_bootstrap.utilAPI.setSessionContext(contextData);

この構造により、例えば「検索フィルターの配列」や「商品明細リスト」といったリレーショナルなデータを、フラット化せずにそのままAIの推論エンジンに渡すことが可能になります。

【重要】セッションライフサイクルとの同期メカニズム

Context Passing Frameworkが「フレームワーク」と呼ばれる所以は、単にデータを送るだけでなく、チャットセッションのライフサイクルを高度に管理している点にあります。特にLWRサイト(SPA)において、以下の2つの機能がUXを劇的に改善します。

遅延バインディング (Late Binding)

ユーザーがまだチャットボタンを押していない(チャットウィジェットが非表示の)段階で setSessionContext を呼び出すとどうなるでしょうか? フレームワークはデータをメモリ上にキャッシュ(待機)させます。そして、ユーザーがチャットを開始し、セッションIDが発行された瞬間に、自動的にこのデータをサーバーへ送信します。これにより、開発者は「チャットが開始されたか?」を常に監視するポーリング処理から解放されます。

動的更新 (Dynamic Updates)

SPAでは、URLが変わってもページのリロードは発生しません。ユーザーが「製品一覧」から「詳細ページ」へ移動した場合、セッション確立後であっても、再度 setSessionContext を呼ぶことで差分データがサーバーへプッシュされます。Agentforceはこれを「コンテキストの変化」として認識し、会話の途中で話題が変わっても即座に追従できるのです。

実装ガイド:LWCとShadow DOMの攻略

LWC (Lightning Web Components) は Shadow DOM によって外部からのアクセスを遮断していますが、Context Passing Framework はグローバルな window オブジェクトを介して通信します。

以下に、製品詳細ページに配置されたLWCコンポーネントが、現在の製品情報をAgentforceに注入する実装パターンを示します。

DXforce Point for Developers

注意: 以下のコードはSpring ’26 (API 66.0) 時点の仕様に基づいた実装サンプルです。実際の開発環境では、必ず最新の公式ドキュメントを参照してください。

コード例: ProductContextHelper.js

import { LightningElement, api, wire } from 'lwc';
import { getRecord } from 'lightning/uiRecordApi';

/**
 * Agentforceに製品コンテキストを渡すためのヘルパーコンポーネント
 * Spring '26 Context Passing Framework 対応
 */
export default class ProductContextHelper extends LightningElement {
    @api recordId; // 現在のレコードID(製品ID)
    @api objectApiName;

    // 製品情報を取得
    @wire(getRecord, { recordId: '$recordId', fields: ['Product2.ProductCode', 'Product2.Name'] })
    wiredProduct({ error, data }) {
        if (data) {
            this.pushContextToAgent(data);
        } else if (error) {
            console.error('製品情報の取得に失敗しました', error);
        }
    }

    /**
     * コンテキスト情報を構築し、Bootstrap API経由で送信する
     * @param {Object} productData - 取得した製品データ
     */
    async pushContextToAgent(productData) {
        // API仕様に準拠したペイロードの構築
        // 配列の中にStructuredValue型定義を含める必要がある
        const contextPayload = [
            {
                name: "_AgentContext", // サーバー側でマッピングされる変数名
                value: {
                    valueType: "StructuredValue",
                    value: {
                        // 実際にAIに渡したいビジネスデータ
                        currentContext: {
                            type: 'ProductDetail',
                            productCode: productData.fields.ProductCode.value,
                            productName: productData.fields.Name.value,
                            viewTimestamp: new Date().toISOString()
                        }
                    }
                }
            }
        ];

        try {
            // windowオブジェクトからAPIにアクセス
            // MEMO: API名はリリース時に変更される可能性があるため、存在チェックを行う
            if (window.embeddedservice_bootstrap && 
                window.embeddedservice_bootstrap.utilAPI && 
                window.embeddedservice_bootstrap.utilAPI.setSessionContext) {

                // 配列形式のペイロードを渡す
                await window.embeddedservice_bootstrap.utilAPI.setSessionContext(contextPayload);
                
                console.log('Agentforceへのコンテキスト送信に成功しました:', contextPayload);
            } else {
                console.warn('Agentforce Bootstrap APIがロードされていません。');
            }
        } catch (err) {
            console.error('コンテキストの設定中にエラーが発生しました:', err);
        }
    }
}

この実装により、LWCコンポーネントはDOMの壁を越えて、グローバルなメッセージングバスに参加できるようになります。

Agentforce側の脳内:Grounding(グラウンディング)とハイブリッド推論

クライアントサイドから送られたデータは、サーバーサイドでどのように処理されるのでしょうか? ここでSpring ’26リリースノートに記載されたサーバーサイド設定が関わってきます。

Context Service と Context Definition

送信されたJSONデータは、Data Cloudの基盤技術である Context Service によって受け取られます。システム管理者は「Context Definition」を使用して、受け取ったJSON(Input)をSalesforce上のオブジェクト(sObject)やApex定義型にマッピングします。これにより、単なるJSONが「意味のあるビジネスデータ」に変換されます。

グラウンディングによるハルシネーション抑制

変換されたデータは、Agentforceのシステム変数(例: _AgentContext)として格納されます。これがAIにとっての「Ground Truth(絶対的な事実)」となります。 例えば、productCode: "XYZ-123" というコンテキストが存在する場合、AIはこの値を前提として在庫確認アクションを実行します。LLMが勝手に製品IDを捏造したり、ユーザーに「どの製品ですか?」と聞き返したりすることを防ぎます。

フィルタリングによるプロンプト最適化

リリースノートにある「Optimize Sorting and Filtering of Prompt Data with Context Service」機能により、大量のコンテキストデータから必要な情報だけをフィルタリングしてプロンプトに注入できます。これにより、LLMのトークン消費を抑えつつ、回答精度を向上させることが可能です。

戦略的影響とビジネス価値の創出

Context Passing Frameworkの導入は、開発者の工数削減だけでなく、明確なビジネスKPIの改善に直結します。

KPIへの直接的インパクト

  • AHT (平均処理時間) の短縮:
    ユーザーの状況把握(「今どのページを見ていますか?」「型番は何ですか?」)にかかる往復のやり取りが消滅します。
  • FCR (初回解決率) の向上:
    正確な製品コンテキストに基づく回答により、エスカレーション率が低下します。
  • CSAT (顧客満足度) の向上:
    「自分のこと(今見ているページやカートの中身)を理解してくれている」という体験は、顧客ロイヤルティを大きく高めます。

データ駆動型改善

会話ログには、発言内容だけでなく「その時どのコンテキスト(ページ、フィルタ条件)にいたか」が構造化データとして記録されます。これにより、「特定の製品ページで、特定のフィルタをかけた時に問い合わせが増える」といった、より粒度の細かいUX分析が可能になります。

Agentic Commerce への進化

これが最も重要な視点です。AIは単なる「サポート担当」から「セールスアシスタント」へ進化します。カートの中身、閲覧履歴、現在の関心事をすべて把握したAgentforceは、ユーザーが迷っている瞬間に適切なクーポンを提示したり、代替品を提案したりする能動的なアクションが可能になります。これはまさに、Commerce CloudとAgentforceが融合する未来像です。

注意点とベストプラクティス

実装にあたっては、以下の点に注意してください。

PII(個人情報)の除外

クライアントサイドからJSONデータを送信するため、クレジットカード番号やパスワードなどの機微情報は絶対に含めないでください。これらは必ずサーバーサイドのセキュアなチャネルで処理すべきです。Context Passing Frameworkはあくまで「ナビゲーションの文脈」共有に留めるのが原則です。

タイミングの制御

LWRサイトは高速であるため、LWCの初期化時点で embeddedservice_bootstrap がまだロードされていない場合があります。本番環境では、window オブジェクトのイベントリスナーを使用し、チャットの準備完了イベントを待機する実装(Wait for Ready)が推奨されます。

パフォーマンスへの配慮

setSessionContext は非同期ですが、大量のデータを毎回送ることはネットワーク負荷になります。差分更新を意識し、必要なタイミング(ページ遷移時や重要なアクション時)でのみ呼び出す設計を推奨します。

APIバージョンの確認

setSessionContext は Enhanced Chat v2 (Spring ’26以降) 専用です。古いLive Agent環境では動作しません。

まとめ:Context-Aware AIの時代へ

Salesforce Spring ’26 の Context Passing Framework は、LWRサイトを単なる情報の表示装置から、AIに「視力」を与えるセンサーへと変貌させます 。

私たち開発者は、UIコンポーネントを作る際、常に「この画面上の情報は、AIエージェントにとってどのような価値があるか?」を考え、積極的にコンテキストを共有する設計を取り入れるべきです。それが、ユーザーにとって本当に役に立つ “Agentic Experience” を生み出す鍵となります。

この技術を使いこなし、ユーザーの「意図」を先回りする次世代の顧客体験を構築していきましょう。

参考URL

Salesforce Spring ’26 Release Notes

Context Passing Framework (Beta)

Context Events in Enhanced Web Chat v2

setSessionContext | utilAPI

A Developer’s Guide to Context Engineering with Agentforce

Carry Your Journey Across the Site with the Context Passing Framework

DXforceの管理人

福島 瑛二

2013年にJavaエンジニアとしてのキャリアをスタート。2019年にSalesforceと出会い、Salesforceエンジニアの道へ。

デザインや UI/UX の観点からもシステムを捉え、ユーザーにとって心地よい体験を実装することにやりがいを感じています。

CRM(顧客データ)や Data Cloud と連携した高度なサイトを目に見える形で表現できる Experience Cloud に大きな可能性を見出しており、バックエンドのデータ構造とフロントエンドの表現力を極めることがこれからの Salesforce エンジニアに求められるスキルだと確信しています。

Trailblazer: efukushima

福島 瑛二をフォローする

読者の声

タイトルとURLをコピーしました