見出し画像

【第551回】 Agentforce : AI エージェントがセッションをまたいで記憶を保持

2026 年 7 月の Data 360 の新機能リリースAgentic Memory and Context が登場しました。Agentic Memory and Context とは、AI エージェントの会話データを Data 360 へ取り込み、Session や Conversation をまたいで利用できるコンテキストを提供する仕組み です。

注意:今回、私はデモ環境を使用して本機能を検証しました。

本記事で紹介する API から初めて AI エージェントを登録すると、その登録処理に伴って、データストリーム、DLO、DMO、マッピング、リアルタイムデータグラフなどの関連コンポーネントが自動的に作成されるため、意図しないクレジットの消費が発生する恐れがあります。よって、構成やクレジット消費への影響を確認せず、本番環境でエージェントを登録することは避けてください。事前に Salesforce の担当者へ相談し、クレジット、データ量、運用方法などを確認した上で利用を開始してください。

Data 360 は「会話のメッセージ」や「Interaction 履歴」を保存するとともに、会話内容を定期的に分析し、主に次の情報を自動的に抽出します。

  • 利用者に関する重要な事実(Facts)

  • 利用者の好み(Preferences)

  • 会話の要約(Session Summaries)

これは、会話内容を 1 回の Session の中だけで保持するのではなく、複数のSession を 1 つの Conversation として管理し、さらに会話から抽出されたメモリを Unified Individual を中心に長期的に蓄積できる仕組みと考えると分かりやすいです。

概念的な関係は、次のようになります。

Unified Individual
├─ Conversation 1:京都への家族旅行
│  ├─ Session 1:最初の相談
│  └─ Session 2:後日の相談再開
├─ Conversation 2:ホテル予約の変更
└─ Conversation 3:別の問い合わせ

それぞれの単位は、次のように考えると分かりやすいです。

Unified Individual

  • 同じ利用者を長期的に識別する単位です。複数のデータソース、Conversation、Session、チャネルなどをまたいで、同じ利用者のメモリを管理する中心となります。

Conversation

  • 一連の目的や話題をまとめる単位です。例えば、1 件の問い合わせ、Case、商談、予約、旅行計画などが Conversation に相当します。

  • Conversationの 切り分けは Data 360 が会話内容から自動的に判断するものではありません。どのタイミングで新しい Conversation を作成するかは、連携システム側であらかじめルールを設計します。

Session

  • Conversation 内で実際に接続していた 1 回の対話単位です。チャットの中断と再開や、別の AI エージェントへの引き継ぎなどでは、同じConversation の配下に新しい Session を作成できます。


Conversation と Profile のコンテキスト

Agentic Memory and Context が提供するコンテキストを、分かりやすく整理すると、Conversation レベルと Profile レベルの 2 つの範囲に分けて捉えることができます。

なお、Salesforce が「2 段階のメモリ」と正式に定義しているわけではありません。本記事では、GetContext API が取得する Conversation と Profile という 2 つの sourceType を基に、このように整理して説明します。

① Conversation レベル

指定した Conversation に関連する最近のメッセージ、Session Summary、Interaction 履歴などを取得します。

1 つの Conversation には複数の Session を含めることができるため、最初のSession を終了した後でも、同じ Conversation の配下に新しい Session を作成することで、前回の会話履歴を引き継げます。

例えば、京都への家族旅行について、数日間にわたって相談する場合は次のようになります。

Conversation:京都への家族旅行の相談

  • Session 1:ホテルについて相談

  • Session 2:数日後に交通手段について相談

  • Session 3:予約内容を最終確認

この場合、Session 2 の開始時に GetContext API を呼び出す ことで、Session 1 で話した内容を Conversation コンテキストとして取得できます。

Conversation レベルでは、保存されたメッセージや Interaction 履歴を利用できるため、Facts や Preferences などのプロファイルメモリがまだ抽出されていない場合でも、同じ Conversation 内であれば過去の会話を参照できます。

② Profile レベル

会話から抽出された Facts、Preferences、Session Summary などを、Individual または Unified Individual に関連付けて管理します。

Profile レベルのコンテキストは、特定の Conversation だけに閉じたものではありません。同じ利用者が別の Conversation を開始した場合や、別の AI エージェントと会話した場合でも、Unified Individual に関連付けられたメモリを取得するために使用されます。

例えば、京都旅行の Conversation で「静かなホテルを好む」「禁煙ルームを希望する」といった情報がプロファイルメモリとして抽出されれば、後日、別の旅行について新しい Conversation を開始した場合にも、その好みを提案へ活用できます。

GetContext API は、これらの Conversation コンテキストと Profile コンテキストを必要に応じて組み合わせ、AI エージェントが利用しやすい形式で提供します。

つまり、同じ Conversation 内では複数の Session にまたがって会話履歴を継続し、さらに Profile レベルのメモリが生成されることで、Conversation や AI エージェントをまたいだ長期的な利用者理解が可能になります。


Agentic Memory and Context の主な特徴

Agentic Memory and Context の特徴をまとめます。

  • セッションをまたいだ会話の記憶
    過去に話した内容、決定事項、実行した対応などを、会話全文を読み直すことなく継続的に利用できます。

  • Facts、Preferences、Summaries の自動抽出
    Data 360 が会話内容を定期的に分析し、利用者に関する事実、好み、会話の要約を自動的に抽出します。

  • GetContext API によるコンテキストの提供
    過去の会話やメモリ、プロファイル情報を組み合わせ、AI エージェントが利用しやすい形式で提供します。

  • Data 360 のセキュリティモデルに準拠
    オブジェクトレベル、項目レベル、レコードレベルのアクセス権限を適用し、許可された情報だけを AI エージェントへ提供します。

  • AI エージェント間での会話の引き継ぎ
    Unified Individual に関連付けられたメモリを利用することで、別の AI エージェントへ引き継がれた場合でも、これまでの文脈を維持できます。

  • リアルタイムに近い情報取得
    取り込まれた会話や、抽出されたセッション要約、プロファイルメモリは、数秒以内にコンテキストとして取得できるようになります。


主なユースケース

Salesforce の公式ヘルプドキュメントでは、Agentic Memory and Context の主なユースケースとして、次のような例が紹介されています。

  • テクニカルサポートで、過去に試した手順や発生したエラーを記憶する

  • 営業活動で、過去の商談内容や顧客の好みを提案に活用する

  • Webエージェントが、閲覧履歴や検索履歴を考慮して商品を提案する

  • 別のAIエージェントへ引き継ぐ際に、利用者へ同じ説明を求めない

  • 社内向けAIアシスタントが、過去の休暇申請や福利厚生に関する相談内容を記憶する

このように、Agentic Memory and Context は単に「チャット履歴」を保存する機能ではありません。Data 360 が AI エージェントのコンテキストと長期的なメモリの基盤となり、利用者ごとの継続的な理解とパーソナライズを実現するまったく新しい仕組みです。


今回検証する内容

実務では、Conversation や Session の作成、会話データの取り込み、GetContext によるコンテキスト取得などを、AI エージェントやチャネルと連携して自動化する必要があります。

今回は、検証用の Service Agent を Data 360 へ登録し、Talend API Tester を使用して、会話データの取り込みから GetContext API によるコンテキスト取得までを手動で試します。

実務での処理は、次のような流れになります。

<実務で動かす全体像>

利用者がチャット開始
↓
Conversation/Session を作成
↓
GetContext で過去の記憶を取得
↓
取得した記憶を AI エージェントへ渡す
↓
利用者と AI エージェントが会話
↓
質問と回答を Add Entries で送信
↓
チャット終了時に Session を終了
↓
Data 360 がメモリを抽出
↓
次回の GetContext で再利用

Agentic Memory and Context を有効化しただけで、AI エージェントへ過去のコンテキストが自動的に渡されるわけではありません。Session の開始時などに GetContext API を呼び出し、取得したコンテキストを AI エージェントへ渡す連携が必要です。

また、Agentic Memory and Context へ Service Agent を登録しただけで、既存の Service Agent との通常の会話が自動的に取り込まれるわけではありません。

Conversation Management は API を中心とした仕組みです。そのため今回は、Agentic Memory and Context API を使用して会話データを手動で登録します。実務で利用する場合は、AI エージェントやチャネルから会話データを継続的に送信する自動化が必要です。

※ 今回は、事前に作成済みの Service Agent を使用して検証します。


検証手順

1. アクセストークンの取得

まずは、Client Credentials Flow 用のアクセストークンが必要ですので、以下の記事を参考に設定を行います。

  • External Client App Name の例:Agentic Memory and Context API

  • 必要なスコープ
    ・ Manage user data via APIs (api)
    ・ Manage Data Cloud Ingestion API data (cdp_ingest_api)
    ・ Manage Data Cloud profile data (cdp_profile_api)
    ・ Perform SQL queries on Data Cloud data (cdp_query_api)

  • 実行ユーザー:機能を試すだけの場合は、「Data Cloud アーキテクト」権限を持つ「システム管理者」で良いです。

今回は検証を簡単にするため、External Client Appの実行ユーザーに「システム管理者」を指定します。本番環境では、必要な Data 360 の権限だけを付与した専用の Integration User を使用してください。


2. AI エージェントの登録

まず、アクセストークンが取得できたら、すでに作成済みの Service Agent の Agentforce Builder で Service Agent の API 参照名(Developer Name)を確認してください。

続いて、以下を POST して、Agentic Memory and Context へ登録します。今回、私の環境では Unified Individual を使用するため、profileDmos[].name へ Unified Individual DMO の API 参照名を直接指定して試します。

--- メソッド 
POST 

--- エンドポイント
https://[私のドメイン名].my.salesforce.com/services/data/v67.0/ssot/agentic/agent

--- ヘッダー 
Content-Type: application/json
Authorization: Bearer [アクセストークン]

--- ボディ
{
  "dataspaceName": "default",
  "label": "Agentforce Service Agent",
  "name": "Agentforce_Service_Agent",
  "configuration": {
    "profileDmos": [
      {
        "name": "UnifiedIndividual__dlm"
      }
    ]
  }
}

注意:Create Agent API の公式リクエスト例には associatedDataGraph が含まれていますが、v67.0 で実行すると JSON_PARSER_ERROR が発生しました。そこで、今回のリクエストでは associatedDataGraph を使用せず、profileDmos の name に対象となるプロファイル DMO を指定します。

成功すると、次のようなレスポンスが返ります。

{
    "configuration": {
        "profileDmos": [
            {
                "name": "UnifiedIndividual__dlm"
            }
        ]
    },
    "createdBy": {
        "name": "005g7000003QvfFAAS"
    },
    "createdDate": "2026-08-01T14:21:00.000Z",
    "dataspaceName": "default",
    "id": "1lWg7000000ADlZEAW",
    "label": "Agentforce Service Agent",
    "lastModifiedBy": {
        "name": "005g7000003QvfFAAS"
    },
    "lastModifiedDate": "2026-08-01T14:21:00.000Z",
    "name": "Agentforce_Service_Agent",
    "status": "PROCESSING"
}

エージェントの登録に成功すると、最初は PROCESSING ステータスになります。この間に、会話やメモリを管理する DLO、DMO、マッピング、Data Graph などが自動的に作成されます。

数分後に以下の GET を実行し、ステータスが ACTIVE になったか確認してください。

--- メソッド 
GET

--- エンドポイント
https://[私のドメイン名].my.salesforce.com/services/data/v67.0/ssot/agentic/agent/[エージェントの API 参照名]

--- ヘッダー 
Content-Type: application/json
Authorization: Bearer [アクセストークン]

--- ボディ
なし

3. 自動生成された成果物を確認する

1. Real-Time Data Graph

以下の 3 つのリアルタイムデータグラフが生成されました。

  • 会話やセッション情報を保持するセッションデータグラフ

  • Individualを起点とするプロファイルデータグラフ

  • Userを起点とするプロファイルデータグラフ

それぞれは以下のような役割があります。

① AgenticConversation(プライマリ DMO:Conversation)

  • Conversation をプライマリ DMO とする、セッションレベルのデータグラフです。

  • 会話、セッション、参加者、メッセージ、インタラクション、実行ステップなど、AI エージェントとの会話履歴を管理します。

② AgenticIndividual(プライマリ DMO:Individual)

  • Individual をプライマリ DMO とする、プロファイルレベルのデータグラフです。

  • 顧客や見込み客など、Individual として識別される利用者に関するメモリを管理します。会話から抽出された事実、好み、セッション要約、長期メモリなどを、対象となる Individual に関連付けて取得するために使用されます。

③ AgenticUser(プライマリ DMO:User)

  • User をプライマリ DMO とする、プロファイルレベルのデータグラフです。

  • Salesforce ユーザーや従業員など、Userとして識別される利用者のメモリを管理します。社内向け AI アシスタントや Employee Agent などで、利用者が User として扱われる場合に使用されます。

※「Recently Viewed」では自動作成されたデータグラフがすべて表示されないことがあります。リストビューを「All Data Graphs」に変更します。

2. データストリーム / Connections

Agentic Memory 用の Ingestion API Connector や Data Stream が自動作成されているかを確認します。これらは、会話、メモリ、要約、実行トレースを取り込むための構成です。

  • AgenticConnector(種別:Server to Server)

  • AgenticConnector-AiAgentInteractionStep

  • AgenticConnector-AiAgentSession

  • AgenticConnector-AiParticipantInsight

  • AgenticConnector-AiAgentInteractionMessage

  • AgenticConnector-Conversation

  • AgenticConnector-AiAgentInteraction

  • AgenticConnector-AiAgentSessionParticipant

3. Data Lake Objects

エージェント登録によって、会話、セッション、参加者、メッセージ、インタラクション、実行ステップ、抽出済みメモリを格納する 7 つの DLO が自動的に作成されました。なお、セッション要約、利用者の好み、事実、長期メモリは、個別の DLO ではなく AiParticipantInsight に集約して保存されます。

  • 会話
    AgenticConnector-Conversation

  • セッション
    AgenticConnector-AiAgentSession

  • セッションの参加者
    AgenticConnector-AiAgentSessionParticipant

  • メッセージ
    AgenticConnector-AiAgentInteractionMessage

  • 会話のターンや処理単位
    AgenticConnector-AiAgentInteraction

  • LLM 実行や Function 実行などの実行トレース
    AgenticConnector-AiAgentInteractionStep

  • メモリ、利用者の好み、事実、セッション要約
    AgenticConnector-AiParticipantInsight

AiParticipantInsight の InsightType によって、次のように分類されます。

  • summary:セッション要約

  • preference:利用者の好み

  • memory:長期的に保持する記憶

  • insight:会話から抽出された事実や洞察

構造

Conversation
 └─ AiAgentSession
     ├─ AiAgentSessionParticipant
     └─ AiAgentInteraction(会話のターン)
         ├─ AiAgentInteractionMessage(発言内容)
         └─ AiAgentInteractionStep(LLM・Functionなどの実行過程)

会話から抽出
 └─ AiParticipantInsight(要約・事実・好み・メモリ)

4. Data Model Objects

セッションレベルとプロファイルレベルの DMO が作成されています。

AI Agent Interaction

  • セッション内で行われた 1 回のやり取りを管理します

  • 例えば、利用者からの質問と、それに対する AI エージェントの応答を 1 つのターンとして保持します。後述するメッセージや実行ステップをまとめる単位となります。

AI Agent Interaction Message

  • 利用者と AI エージェントの間で送受信されたメッセージを保持します

  • メッセージ本文のほか、入力または出力の区分、送信者、送信日時、関連する会話、セッション、インタラクションなどが記録されます。

AI Agent Interaction Step

  • AI エージェントが応答を生成するまでに実行した処理ステップを保持します

  • 主なステップには、利用者からの入力、LLM の実行、Function の実行などがあります。処理の入力値、出力値、実行時間、エラー内容なども記録できるため、AI エージェントの実行トレースに相当します。

AI Agent Session

  • 会話内で開始されたセッションを管理します

  • 開始日時、終了日時、セッションの所有者、関連する会話などを保持します。1 つの会話に複数のセッションを含めることができるため、会話の中断や再開、AI エージェント間の引き継ぎにも対応できます。

AI Agent Session Participant

  • セッションに参加した利用者、AI エージェント、Salesforce ユーザーなどを管理します

  • 参加者の ID、参加者の種類、セッション内での役割、参加・退出日時、AI エージェントの API 参照名などが記録されます。

AI Participant Insight

  • 会話から抽出されたメモリを保持する中心的な DMO です

  • セッション要約、利用者に関する事実、好み、長期的なメモリなどが保存されます。これらは InsightType によって、summary、preference、insight、memory などに分類されます。

  • また、メモリの内容だけでなく、信頼度、生成元の会話やセッション、有効・無効の状態、関連する Individual または User なども管理されます。

Conversation

  • AI エージェントとの会話全体を管理する最上位の DMO です

  • 会話ID、開始日時、終了日時、会話の状態、会話を開始した Individual または User などを保持します。1 つの Conversation の配下に、複数の AI Agent Session を含めることができます。

全体としては、次の関係になります。

Conversation
 └─ AI Agent Session
     ├─ AI Agent Session Participant
     └─ AI Agent Interaction
         ├─ AI Agent Interaction Message
         └─ AI Agent Interaction Step

会話から抽出されたメモリ
 └─ AI Participant Insight

5. マッピング

自動生成されたデータストリームから、各 DMO へのマッピングも自動的に生成されます。


4. Conversation の作成

ここからは、Agentic Memory and Context API を使用して、会話データを手動で登録します。

最初に、会話全体を管理する Conversation を作成します。Conversation は、この後に作成する Session、Participant、メッセージなどをまとめる最上位の単位(入れ物)です。

Conversation Owner に使用する Individual を確認

Conversation を作成するには、会話の所有者となる Individual または User の ID が必要です。

例:003g700000EXylJAAT

今回は顧客との会話を想定するため、Individual を使用します。また、後から Unified Individual を中心としたメモリを確認するため、Identity Resolution によって Unified Individual に関連付けられている Individual を使用します。

Conversation 作成用のアクセストークンを作る

先ほど作成したアクセストークンの構成をコピーして、Conversation 作成用のアクセストークン取得に使う新しい構成を作成してください。

--- メソッド 
POST

--- エンドポイント
https://[私のドメイン名].my.salesforce.com/services/a360/token

--- ヘッダー 
Content-Type: application/x-www-form-urlencoded

ボディの Form 形式では、以下の 4 つを設定します。

  • grant_type:urn:salesforce:grant-type:external:cdp

  • subject_token:1 で作成したアクセストークン

  • subject_token_type:urn:ietf:params:oauth:token-type:access_token

  • dataspace:default

これを実行すると、Conversation 作成用のアクセストークンが取得できます。instance_url も利用するので、メモします。

Conversation を作成

「Data 360 アクセストークン」を使用して、Talend API Tester で、次のリクエストを作成します。

--- メソッド 
POST 

--- エンドポイント
https://[instance_url]/api/v1/agentic/conversations

--- ヘッダー 
Content-Type: application/json
Authorization: Bearer [Data 360 アクセストークン]
agent_id: Agentforce_Service_Agent

--- ボディ
{
  "conversationId": "conv-agentic-memory-001",
  "conversationOwnerId": "[Individual ID]",
  "ownerType": "individual",
  "name": "Agentic Memory Test Conversation",
  "channel": {
    "type": "chat",
    "id": "talend-api-tester"
  }
}

ヘッダーの agent_id は、Agentic Memory and Context への登録時に指定したエージェントの name を使用します。この値は Conversation、Session、メモリを登録エージェントに関連付けるための連携識別子となるため、登録後は変更しない運用を推奨します

ボディの各項目には、次の値を指定します。

  • conversationId
    呼び出し元で設定する一意の Conversation ID です。同じ ID は再利用できないため、再度検証する場合は末尾の番号などを変更します。

  • conversationOwnerId
    先ほど確認した Individual ID を指定します。

  • ownerType
    顧客などの Individual を使用する場合は individual を指定します。Salesforce Userや従業員を使用する場合は employee を指定します。

  • name
    Conversationを識別するための任意の名称です。

  • channel
    会話が行われたチャネルを指定します。今回は Talend API Tester による手動検証のため、type を chat、id を talend-api-tester とします。

正常に作成されると、HTTP ステータス 201 Created とともに、次のようなレスポンスが返ります。

{
  "statusCode": "created",
  "conversationId": "conv-agentic-memory-001"
}

5. Session と Participant の作成

次は、この Conversation の配下に Session と初期 Participant を同時に作成します。Participant は Session 作成時に最低 1 件必要なので、今回は利用者と AI エージェントの両方を登録します。

--- メソッド 
POST 

--- エンドポイント
https://[instance_url]/api/v1/agentic/conversations/conv-agentic-memory-001/sessions

--- ヘッダー 
Content-Type: application/json
Authorization: Bearer [Data 360 アクセストークン]
agent_id: Agentforce_Service_Agent

--- ボディ
{
  "sessionId": "session-agentic-memory-001",
  "conversationOwnerId": "[Conversation 作成時に指定した Individual ID]",
  "ownerType": "individual",
  "participants": [
    {
      "id": "[Conversation 作成時に指定した Individual ID]",
      "type": "individual",
      "role": "owner"
    },
    {
      "id": "Agentforce_Service_Agent",
      "type": "agent",
      "role": "participant"
    }
  ]
}

注意点は次のとおりです。

  • conversationOwnerId は、Conversation 作成時に指定した Individual Id の値と同じにします。

  • 初期 Participant は Session と同時に作成できるため、今回は Participant 追加 API を別途呼び出す必要はありません。

  • Participant 追加 API は、主に途中で別のエージェントを参加させる場合や、エージェントを引き継ぐ場合に使用します。

成功すると、201 Created とともに次のようなレスポンスが返ります。

{
  "statusCode": "created",
  "conversationId": "conv-agentic-memory-001",
  "sessionId": "session-agentic-memory-001"
}

この段階では、Conversation という入れ物の中に、今回の連続したやり取りを表す Session と、その参加者が作成された状態です。まだ「発言」自体は登録されていません。


6. 会話メッセージの登録(Entries)

次は、利用者と AI エージェントの「発言」を Entries として登録します。

Add Entries API では、複数の Entry を 1 回のリクエストでまとめて送信することもできます。ただし今回は、実際の会話と同じように、利用者と AI エージェントの発言を 1 件ずつ、合計 4 回に分けて送信します。

Tips:この方法により、各 Entry の登録順序と送信時刻を確認しやすくなります。1 度に送ることもできますが、その場合、同じ timestamp となり、順番が分かりづらくなります。※ timestamp は公式 API 仕様では任意項目です。指定しない場合は、Data 360 側で各 Entry の送信時刻が付与されます。

今回登録する会話は、利用者に関する Facts や Preferences が含まれる内容とします。

会話の流れは次のとおりです。

① 利用者
私は東京に住んでいます。旅行の際は静かなホテルを好み、日本の伝統料理を楽しむのが好きです。来月、家族で京都へ旅行する予定です。
 ↓
② AI エージェント
承知しました。静かなホテルと、京都で日本の伝統料理を楽しめる旅行プランをご提案します。
 ↓
③ 利用者
子どもと一緒に旅行するため、禁煙ルームを希望します。旅行中の移動にはレンタカーを利用する予定です。
 ↓
④ AIエージェント
承知しました。禁煙ルームと便利な駐車場を備えた、家族向けのホテルを中心にご提案します。

1 件目:利用者の最初の発言

--- メソッド 
POST 

--- エンドポイント
https://[instance_url]/api/v1/agentic/conversations/conv-agentic-memory-001/entries

--- ヘッダー 
Content-Type: application/json
Authorization: Bearer [Data 360 アクセストークン]
agent_id: Agentforce_Service_Agent

--- ボディ
{
  "sessionId": "session-agentic-memory-001",
  "entries": [
    {
      "id": "entry-agentic-memory-001",
      "interactionId": "interaction-agentic-memory-001",
      "participantId": "[Individual ID]",
      "content": "I live in Tokyo. When traveling, I prefer quiet hotels and enjoy traditional Japanese cuisine. I am planning a family trip to Kyoto next month.",
      "type": "user_message",
      "category": "Message"
    }
  ]
}

2 件目:AI エージェントの回答

エンドポイントとヘッダーは、1 件目と同じものを使用します。

{
  "sessionId": "session-agentic-memory-001",
  "entries": [
    {
      "id": "entry-agentic-memory-002",
      "interactionId": "interaction-agentic-memory-001",
      "participantId": "Agentforce_Service_Agent",
      "content": "Understood. I will recommend quiet hotels and a travel plan that includes opportunities to enjoy traditional Japanese cuisine in Kyoto.",
      "type": "agent_response",
      "category": "Message"
    }
  ]
}

1 件目と 2 件目には、同じ interaction-agentic-memory-001 を指定します。これにより、利用者の発言と、それに対する AI エージェントの回答を同じ会話ターンとして関連付けます。

3 件目:利用者の追加情報

{
  "sessionId": "session-agentic-memory-001",
  "entries": [
    {
      "id": "entry-agentic-memory-003",
      "interactionId": "interaction-agentic-memory-002",
      "participantId": "[Individual ID]",
      "content": "I am traveling with my children, so I would prefer a non-smoking room. We are planning to use a rental car during the trip.",
      "type": "user_message",
      "category": "Message"
    }
  ]
}

4 件目:AI エージェントの回答

{
  "sessionId": "session-agentic-memory-001",
  "entries": [
    {
      "id": "entry-agentic-memory-004",
      "interactionId": "interaction-agentic-memory-002",
      "participantId": "Agentforce_Service_Agent",
      "content": "Understood. I will focus on family-friendly hotels that offer non-smoking rooms and convenient parking facilities.",
      "type": "agent_response",
      "category": "Message"
    }
  ]
}

3 件目と 4 件目には、同じ interaction-agentic-memory-002 を指定します。これにより、2 回目の利用者の発言と AI エージェントの回答を、もう一つの会話ターンとして関連付けます。

各リクエストが成功すると、202 Acceptedと次のようなレスポンスが返ります。

{
  "statusCode": "entriesAdded",
  "conversationId": "conv-agentic-memory-001",
  "sessionId": "session-agentic-memory-001"
}

これと同じレスポンスが 4 回とも返れば、4 件の Entry の登録は完了です。

※ なお、この 202 Accepted は Entry の保存処理が受け付けられたことを示すものであり、Facts や Preferences などのメモリ抽出が完了したことを示すものではありません

今回の会話からは、次のような情報が抽出されることを期待しています。

  • 東京に住んでいる

  • 来月、家族で京都へ旅行する予定がある

  • 子どもと一緒に旅行する

  • 静かなホテルを好む

  • 日本の伝統料理を好む

  • 禁煙ルームを希望している

  • レンタカーを利用する予定がある

ただし、実際にどの内容が Facts や Preferences として抽出されるかは、Data 360 のメモリ抽出結果によって異なります。


7. Session の終了とメモリ抽出

次は、現在の Session を終了して、残っているメッセージの最終メモリ抽出を開始します。

--- メソッド 
POST 

--- エンドポイント
https://[instance_url]/api/v1/agentic/conversations/conv-agentic-memory-001/sessions/session-agentic-memory-001/close

--- ヘッダー 
Content-Type: application/json
Authorization: Bearer [Data 360 アクセストークン]
agent_id: Agentforce_Service_Agent

--- ボディ
なし

今回、リクエストボディは必要ありません。Talend API Tester ではボディを空にしてください。

成功すると、202 Accepted と次のようなレスポンスが返ります。

{
  "statusCode": "closed",
  "conversationId": "conv-agentic-memory-001",
  "sessionId": "session-agentic-memory-001"
}

202 Accepted と statusCode: "closed" が返れば、Session の終了リクエストが受け付けられ、未処理のメッセージを対象とする最終抽出サイクルを開始する条件が整ったことを確認できます。

ただし、メモリ抽出は非同期で実行されます。そのため、このレスポンスが返った時点では、Session 要約や Facts、Preferences などの生成まで完了しているとは限りません。

ちなみに、今回はセッションをまたいだ文脈の継続を検証するシナリオになっているため、Conversation 自体は終了しません。現在の Session だけを終了しており、次の手順では同じ Conversation の配下に新しい Session を作成します。

なお、Unified Individual に関連付けられている「長期メモリ」を厳密に検証するには、その後、同じ Individual を指定した別の Conversation を作成し、GetContext API の結果にプロファイルレベルのメモリが含まれることも確認します。

↓ ↓ ↓ ↓ ↓

現時点では、私の環境では Unified Individual に関連付けられた長期メモリ(プロファイルレベルのメモリ)の作成が行われなかったため、そちらの検証は行いません。


8. 同じ Conversation に新しい Session 作成

前の手順で session-agentic-memory-001 を終了しましたが、Conversation 自体は終了していません。

ここでは、セッションをまたいだ文脈の継続を確認するため、同じ conv-agentic-memory-001 の配下に、新しい session-agentic-memory-100 を作成します。

Conversation には複数の Session を含めることができるため、会話の中断と再開や、別の AI エージェントへの引き継ぎなどを表現できます。

--- メソッド 
POST 

--- エンドポイント
https://[instance_url]/api/v1/agentic/conversations/conv-agentic-memory-001/sessions

--- ヘッダー 
Content-Type: application/json
Authorization: Bearer [Data 360 アクセストークン]
agent_id: Agentforce_Service_Agent

--- ボディ
{
  "sessionId": "session-agentic-memory-100",
  "conversationOwnerId": "003g700000EXylJAAT",
  "ownerType": "individual",
  "participants": [
    {
      "id": "003g700000EXylJAAT",
      "type": "individual",
      "role": "owner"
    },
    {
      "id": "Agentforce_Service_Agent",
      "type": "agent",
      "role": "participant"
    }
  ]
}

成功すると、201 Created と次のようなレスポンスが返ります。

{
  "statusCode": "created",
  "conversationId": "conv-agentic-memory-001",
  "sessionId": "session-agentic-memory-002"
}

statusCode: "created" が返れば、既存の Conversation の配下に新しい Session が作成されています。

この時点では、新しい Session に会話メッセージをまだ登録しません。次の手順では、新しいメッセージを追加する前に GetContext API を実行し、前の Session で行われた会話をコンテキストとして取得できるか確認します

同じ Conversation の配下であるため、まずは Conversation レベルの文脈が取得されることを確認します。

※ 今回の記事では、Unified Individual に関連付けられたプロファイルレベルのメモリは検証しません。今後、プロファイルレベルのメモリが生成され次第、検証を追記します。


9. GetContext API で会話履歴を取得

新しいセッションである session-agentic-memory-100 が作成できたら、新しい会話メッセージを登録する前に GetContext API を実行します

ここでは、終了済みの session-agentic-memory-001 で行われた会話を、同じConversation に作成した新しい Session へ引き継ぐためのコンテキストとして取得できるか確認します。

--- メソッド 
GET 

--- エンドポイント
https://[instance_url]/api/v1/agentic/context?agent_id=Agentforce_Service_Agent&conversation_id=conv-agentic-memory-001&owner_id=003g700000EXylJAAT&owner_type=individual

--- ヘッダー 
Authorization: Bearer [Data 360 アクセストークン]
Accept: application/json

--- ボディ
なし

※ GetContext API では、agent_id をヘッダーではなくクエリパラメーターとして指定する点に注意してください。

今回指定しているクエリパラメーターは次のとおりです。

  • agent_id
    Agentic Memory and Context へ登録した AI エージェントの API 参照名を指定します。今回は Agentforce_Service_Agent を指定します。

  • conversation_id
    コンテキストを取得する Conversation ID を指定します。今回は、前のSession と新しい Session が関連付けられている conv-agentic-memory-001 を指定します。

  • owner_id
    Conversation の所有者となる Individual ID を指定します。今回は、これまでの手順と同じ 003g700000EXylJAAT を指定します。

  • owner_type
    所有者の種類を指定します。今回は Individual を使用しているため、individual を指定します。

成功すると、200 OK と次のようなレスポンスが返ります。

{
    "contextId": "edefd468-f28e-4eeb-aec6-30c97102294f",
    "userContext": [
        {
            "entry": "INTERACTIONS[4]{TIME,TYPE,FROM,MESSAGE}\n  2026-08-02T03:46:37.000Z,agent_response,Agentforce_Service_Agent,Understood. I will focus on family-friendly hotels that offer non-smoking rooms and convenient parking facilities.\n  2026-08-02T03:46:37.000Z,user_message,003g700000EXylJAAT,I am traveling with my children, so I would prefer a non-smoking room. We are planning to use a rental car during the trip.\n  2026-08-02T03:46:37.000Z,agent_response,Agentforce_Service_Agent,Understood. I will recommend quiet hotels and a travel plan that includes opportunities to enjoy traditional Japanese cuisine in Kyoto.\n  2026-08-02T03:46:37.000Z,user_message,003g700000EXylJAAT,I live in Tokyo. When traveling, I prefer quiet hotels and enjoy traditional Japanese cuisine. I am planning a family trip to Kyoto next month.\n",
            "sourceType": "Conversation"
        }
    ]
}

実際のレスポンスでは、[Context ID] と [Timestamp] の部分に、Data 360 が生成した値が入ります。

今回確認する重要なポイントは、次の 2 点です。

  • sourceType に Conversation が返っている

  • session-agentic-memory-001 で登録した 4 件のメッセージが entry に含まれている

この結果により、Session を終了して新しい Session を作成した場合でも、同じ Conversation を継続することで、前の Session の会話履歴をGetContext API から取得できることが確認できました。成功です。

重要:GetContext API は、エージェント登録時に作成された Real-Time Data Graph を参照し、Conversation レベルの会話履歴や Profile レベルのメモリを取得する仕組みです。今回返された sourceType: "Conversation" は、Conversation Data Graph を介して取得されるコンテキストです。


いかがでしたでしょうか。

今回の記事では、Agentic Memory and Context への Service Agent の登録から、Conversation/Session の作成、会話メッセージの登録、GetContext API による履歴取得までを試しました。

すべての機能を確認できたわけではありませんが、同じ Conversation 内であれば、Session をまたいで過去の会話を引き継げることを確認できました。利用者が同じ内容を繰り返し説明する必要を減らし、より自然で継続的な対話を実現する重要な機能だと思います。

ただし、利用状況によってはクレジットが消費されます。冒頭でも触れたとおり、特に本番環境では構成やクレジットへの影響を事前に確認した上で、ぜひ試してみてください。

今回は以上です。


次の記事はこちら

前回の記事はこちら

私の note のトップページはこちら