Implement Conversation Insights
To produce conversation data as XDM Experience Events and ensure that these conversation experience events end up in Adobe Experience Platform as datasets, instrument your agent application or service to use Conversation Insights.
This article documents the required implementation steps.
- You must have an Experience Platform environment (organization and sandbox) available to collect the data.
- Your Adobe organization must be enabled for the agentic and conversation field groups.
Schema and datasets
Configure datasets for the primary conversation events: prompt, response, feedback. The prompt, response, and feedback datasets must extend the XDM Experience Event base schema with the Conversation Event field group and can optionally include the Agentic Information field group and other additional field groups.
You can define separate datasets for prompts, responses, and feedback or combine data into datasets. For example, use one dataset for prompts and responses and another dataset for feedback. Or use a separate dataset for each type of conversation event as illustrated in How it works.
To illustrate, use:
-
Discrete dataset implementation. Separate datasets for prompt, response, and feedback events. Follow this implementation approach if you:
- Want to maintain less state on your client implementation.
- Send prompt data regardless of a delayed or non-existent response.
-
Combined dataset implementation. For example, a combined prompt and response events dataset and a separate feedback events dataset. Follow this implementation approach if you:
- Want to reduce calls because your implementation supports complete turns.
- Do not care about latency when waiting for responses to arrive.
Dataset layout and the delivery of conversation events into these datasets are separate concerns. Send each conversation event as soon as data is available to ensure stable conversation identifiers and turn identifiers. Stable identifiers facilitate proper correlation by the Conversation Blender service across datasets.
Conversation Event field group
The Conversation Event field group is a required field group and uses the conversation object.
The conversation object captures data for:
Conversation
A unique conversationID identifies a conversation. For example: conversationID = "conv-001". The conversationID allows all related turns events to be grouped into the same conversational experience.
The schema also supports conversationName. A human-readable name that describes the overall context of the conversation, such as: France Geography Q&A. The conversation name is auto generated but you can update the generated name. The conversation name is also populated to signals[].name. Adobe populates the conversationName with the same value as the signals[].name = “title” signal. You can set the conversation.conversationName on any dataset you populate and overwrite the Adobe provided value.
Turn
A turn is one interaction cycle within a conversation.
turnID A unique turnID identifies a turn. For example:
conversationID = "conv-001"turnID = "turn-001"
The same conversationID and turnID are used to correlate the prompt, response, and feedback associated with that turn. That correlation works across records that are delivered separately or end up in different datasets. A turnId only needs to be unique within the same conversation but can be reused across conversations. For example, you can have both turn-001 as the turnID in conversations with conversationID conv-001 and conv-002.
Prompt
A prompt is the input submitted to the agent. In most customer scenarios, this input is the user’s question, request, instruction, or message.
The prompt uses the following representation: conversation.prompt
Important prompt fields include:
prompt.sourceprompt.raw[]prompt.raw[].textprompt.raw[].purposeA prompt can contain multiple raw segments. For example, a user enters text and includes a URL.
-
Prompt"What is the capital of France""https://example.com/france"
Response
A response is the content returned by the agent or another responding party.
conversation.response A unique responseID represents the response.
Important response fields include:
response.sourceresponse.raw[]response.raw[].textresponse.raw[].purposeThe documented source types include:
botcannedconciergeend-userFeedback
Feedback is the user’s explicit evaluation or reaction to the interaction.
The feedback structure includes: conversation.feedback.
Examples:
feedback.raw[].text: "Great help"feedback.rating.score:1feedback.rating.classification:"Thumbs Up"feedback.rating.reasons[]: ["Accurate", "Quick response"]
The documented rating score range is from -1.0 to 1.0.
A feedback event can be represented as a feedback-only event using: eventType = "conversation.feedback".
When feedback applies to a particular turn, preserve the appropriate conversationID and turnID so that the conversation blender can associate the feedback with the relevant interaction.
Signal
A signal is a structured analytical observation about conversation content. The Signal extraction service provides out of the box signals. No action is required to provide signals, but you can add signals as part of the integration.
A signal has the following fields.
scopenametypevalues[]stringValuenumberValuebooleanValueconfidencequalifiers[]metadata[]The signal extraction service populates the signals object for the signals dataset.
The previous signals[].attributes.{subjects,intents,tones,sentiment} container is deprecated.
Source type
You need to set a value for source for each prompt, response, or feedback object in an event. Any value is acceptable. Use values that help you to understand where data originates from. For example:
end-useragentbotcanned-promptconciergePurpose type (raw text)
You need to set a value for the purpose attribute on any element of the raw object in a prompt, response, or feedback object. Any string value is acceptable. This field is used to differentiate what is stored in the raw text. Useful values are below, other values are equally valid:
free-form-textscreenshotattachmentlinkurlimage-linkcitationmediaConversation
See below for the full details of a conversation object.
| table 0-row-4 1-row-4 2-row-4 3-row-4 4-row-4 5-row-4 6-row-4 7-row-4 8-row-4 9-row-4 10-row-4 11-row-4 12-row-4 13-row-4 14-row-4 15-row-4 16-row-4 17-row-4 18-row-4 19-row-4 20-row-4 21-row-4 22-row-4 23-row-4 24-row-4 25-row-4 26-row-4 27-row-4 28-row-4 29-row-4 30-row-4 31-row-4 32-row-4 33-row-4 34-row-4 35-row-4 36-row-4 37-row-4 38-row-4 39-row-4 40-row-4 | |||
|---|---|---|---|
| Field Path (Dot Notation) | Type | Example Value | Notes |
conversationID |
string | "conv-001" |
Groups multiple turns together. |
conversationName |
string | "France Geography Q&A" |
New. Name given to a conversation representing its overall context. |
turnID |
string | "turn-001" |
Unique ID for this turn. |
prompt.source |
string | "end-user" |
Source of prompt, other options might include a cached value, canned value, etc. |
prompt.raw[] |
array | See raw object below | Raw prompt data. |
prompt.raw[].text |
string | "What is the capital of France?" |
Actual text content. |
prompt.raw[].purpose |
string | "User Input" |
Purpose of this text segment. |
response.source |
string | "bot" |
Source of response. |
response.raw[] |
array | See raw object below | Raw response data. |
response.raw[].text |
string | "The capital of France is Paris." |
Response text content. |
response.raw[].purpose |
string | "main" |
Purpose of response segment, other options might include links, pictures, etc. |
feedback.source |
string | "end-user" |
Source of feedback. |
feedback.raw[] |
array | See raw object below | Raw feedback data . |
feedback.raw[].text |
string | "Great help" |
Feedback text. |
feedback.raw[].purpose |
string | "free-form text" |
Purpose of feedback segment, other options might include screen-shots, media, etc. |
feedback.rating.score |
number | 1 |
Numerical rating score from -1.0 to 1.0. |
feedback.rating.classification |
string | "Thumbs Up" |
Rating classification. |
feedback.rating.reasons[] |
array | ["Accurate", "Quick response"] |
Array of rating reasons. |
signals[] |
array | See signal object below | Derived signals based on this event and the conversation to date. Each entry is a single named signal with its own scope. |
signals[].scope |
string | "turn" |
Scope of inputs from which this set of signals is derived (turn, conversation-to-date, last-N-turns, feedback). |
signals[].attributes |
object | See attributes below | Deprecated. Container for signal attributes. Each attribute is an object with value or values in it. This is to accommodate the anticipated need to support population of ML/agent information used to generate the signal. |
signals[].attributes.subjects |
object | See subjects below | Deprecated. Subjects container. |
signals[].attributes.subjects.values[] |
array | See subject values below | Deprecated. Array of subject values. |
signals[].attributes.subjects.values[].phrase |
string | "product pricing" |
Deprecated. A phrase or keyword extracted from the scoped input. |
signals[].attributes.subjects.values[].qualifiers[] |
array | ["important", "urgent"] |
Deprecated. List of qualifiers for the phrase |
signals[].attributes.intents |
object | See intents below | Deprecated. Intents container. |
signals[].attributes.intents.values[] |
array | ["make a purchase", "learn more"] |
Deprecated. Intents derived from the scoped input. |
signals[].attributes.tones |
object | See tones below | Deprecated. Tones container. |
signals[].attributes.tones.values[] |
array | ["thrilled", "contemplative"] |
Deprecated. Tones derived from the scoped input. |
signals[].attributes.sentiment |
object | See sentiment below | Deprecated. Sentiment container. |
signals[].attributes.sentiment.value |
number | 0.71 |
Deprecated. Score from -1 (negative) to 1 (positive) indicating sentiment. |
signals[].name |
string | "sentiment" |
New (replaces the deprecated attributes container). Identifier for this signal, e.g. “subjects”, “intents”, “tones”, “sentiment”, or any producer-defined name. Producers can add new signal types without a schema change. |
signals[].type |
string | "number" |
New. Data type of this signal’s values (string, number, or boolean). Tells consumers which typed value field is populated on each entry of values[]. |
signals[].values[] |
array | See values object below | One or more values for this signal. |
signals[].values[].stringValue |
string | "curious" |
Populated when type is string. A categorical value such as an intent, tone, or extracted phrase/ |
signals[].values[].numberValue |
number | 0.71 |
Populated when type is number. For example a sentiment score from -1 to 1, or an intensity/ |
signals[].values[].booleanValue |
boolean | true |
Populated when type is boolean. A true / false flag |
signals[].values[].confidence |
number | 0.9 |
New. Confidence the producer assigns to this value, from 0 to 1. |
signals[].values[].qualifiers[] |
array | ["important", "urgent"] |
Additional descriptors for this value, similar to keywords but more meaningful/ |
signals[].values[].metadata[] |
array | See parameters below | New. Producer-defined metadata for this value as key/value pairs, e.g. context about the ML/agent that generated the signal/ |
Agentic Information field group
The Agentic Information field group is an optional field group and uses the agenticExperience object. Consider using this field group if you want to track agentic information.
| table 0-row-4 1-row-4 2-row-4 3-row-4 4-row-4 5-row-4 6-row-4 7-row-4 8-row-4 9-row-4 10-row-4 11-row-4 12-row-4 13-row-4 14-row-4 15-row-4 16-row-4 17-row-4 18-row-4 19-row-4 20-row-4 21-row-4 22-row-4 23-row-4 24-row-4 25-row-4 26-row-4 27-row-4 28-row-4 29-row-4 30-row-4 31-row-4 32-row-4 33-row-4 34-row-4 35-row-4 | |||
|---|---|---|---|
| Field Path (Dot Notation) | Type | Example Value | Notes |
conciergeID |
string | "concierge-abc123" |
New. Unique identifier for the concierge |
name |
string | "Brand Concierge" |
Name of the concierge combining a set of agents |
version |
string | "1.0.0" |
Version of the concierge combining a set of agents |
environment |
string | "prod" |
Environment this event originated from (dev, stage, prod) |
mode |
string | "release" |
Mode the agent is in (test, preview, release) |
agents[] |
array | See agent object below | Array of agents used |
agents[].agentID |
string | "agent-001" |
New. Unique identifier for the agent, referenced by skills[].agentID below |
agents[].name |
string | "Chatbot Assistant" |
Agent name |
agents[].version |
string | "2.1.3" |
Agent version |
agents[].score |
number | 0.92 |
Agent confidence score in its the returned values |
agents[].skills[] |
array | See skill object below | Deprecated. Use the top-level skills[] array below instead, which owns the full ordered list of skill calls and links each one to its agent via agentID |
agents[].skills[].name |
string | "Intent Recognition" |
Skill name (deprecated array) |
agents[].skills[].version |
string | "1.0.0" |
Skill version (deprecated array) |
agents[].skills[].score |
number | 0.95 |
Skill confidence score (0-1) (deprecated array) |
agents[].skills[].parameters[] |
array | See parameters below | Parameters sent to the skill (key-value pairs) (deprecated array) |
agents[].skills[].parameters[].key |
string | "language" |
Parameter key |
agents[].skills[].parameters[].value |
string | "en-US" |
Parameter value |
skills[] |
array | See skill invocation object below | New, experimental. Full, ordered list of skill invocations for this experience, across all agents. Replaces the deprecated per-agent agents[].skills[] array |
skills[].skillID |
string | "skill-intent-recognition" |
Identifier of the skill definition that was called |
skills[].skillInvocationID |
string | "inv-9f2a-001" |
Unique identifier for this individual skill invocation, consistent even with redeliveries. De-duplication key when merging skill arrays downstream |
skills[].name |
string | "Intent Recognition" |
Name of the skill that was called |
skills[].version |
string | "1.0.0" |
Version of the skill that was called |
skills[].agentID |
string | "agent-001" |
Identifier of the agent that invoked this skill, correlating to agents[].agentID. Grouping key consumers use to order skills within an agent, since subagents run in parallel |
skills[].invocationSource |
string | "main" |
Whether invoked by the main agentic loop (main) or by a subagent (subagent) |
skills[].score |
number | 0.95 |
Score resulting from matching the skill |
skills[].failed |
boolean | false |
Flag stating that the skill execution failed |
skills[].errorReason |
string | "timeout" |
Reason the skill failed, when failed is true |
skills[].sequenceNumber |
integer | 1 |
Monotonically increasing index of this skill call within a single agent execution. This index is not turn-global, since subagents run in parallel. Consumers order by agentID, then sequenceNumber, then timestamp as tiebreaker. Optional |
skills[].timestamp |
string (date-time) | "2026-09-11T00:03:15Z" |
Time the skill was invoked, ISO 8601 UTC. Ordering key used after sequenceNumber. Producers should always populate this |
skills[].skillSource |
string | "inline" |
How the skill definition was delivered to the runtime: inline (loaded inline into context) or deferred (loaded on demand) |
skills[].executionContext |
string | "inline" |
Where the skill executes relative to the calling agent: inline or forked (runs in a forked sub-agent context) |
skills[].reasoning.narration |
string | "Recognized an intent to verify a geography fact" |
Natural-language explanation of why this skill was called |
skills[].parameters[] |
array | See parameters below | Parameters passed in to the skill |
skills[].parameters[].key |
string | "language" |
Parameter key |
skills[].parameters[].value |
string | "en-US" |
Parameter value |
To implement events propagating the Agentic Information field group with data, you should ensure:
-
Agent configuration
- Each agent has a unique agentID, name, and version combination.
- Agent scores are normalized between
0.0and1.0. - Use the
agentIDto reference agents by skill invocation.
-
Skills invocation
- Emit only one entry per skill call, across all agents, instead of nesting skills under each agent.
- Populate skillInvocationID so downstream blending can remove duplicate redelivered events.
- Order consumers properly. Group by
agentID, then sort bysequenceNumber, falling back totimestamp. Ordering is required because subagents can execute in parallel - Use
invocationSourceandexecutionContextto distinguish primary versus subagent skills and inline versus forked execution. - Avoid using the deprecated
agents[].skills[]array. If you have used the array in the past, treat the array as a read-only object.
-
Skill Parameters
- Parameters use the Adobe XDM key-value datatype and use common parameter types for language settings, thresholds, model configurations. For example,
"key":"language", "value":"en-US".
- Parameters use the Adobe XDM key-value datatype and use common parameter types for language settings, thresholds, model configurations. For example,
| code language-json |
|---|
|
Additional field groups
You can add optional field groups to the schema you use for prompt, response, and feedback datasets. For example:
- Web Details field group. To capture details of the web page the conversation was embedded in.
- Commerce Details field group. To capture the product details of the recommended product mentioned as part of the conversation.
The customer is responsible for producing the source conversation events. Adobe performs signal extraction and data blending. The customer does not need to implement the signal-extraction or blending services.
Event type
You need to set one of the following values for eventType (String) for each conversation event:
conversation.turnconversation.recommendationconversation.feedbackExample
See below for example usage of the Conversation Event field group in various scenarios.
| tabs | |||
|---|---|---|---|
| Turn event example |
|
||
| Response event example |
|
||
| Feedback event example |
|
||
| Product recommendations event example |
|
Data collection
Use the following data collection strategy for Conversation Insights.
Event types
Your agent application or service sends an event as soon as possible. Ensure the app or service does not wait for a response before sending the prompt across with the information available at the time of the event.
This recommendation implies that:
- Prompt, response, and feedback objects are populated independently and should not be forced to be part of a single event.
- Multiple events with the same
conversationIDandturnIDare expected across datasets.
Event correlation
The agent application or service must preserve stable identifiers across all related events.
conversation.conversationIDconversation.turnID_idtimestampeventType-
The same
conversationIDmust be used for all events belonging to the same conversation. -
The same
turnIDmust be used for the prompt, response, and any feedback associated with the same turn. Multiple events with the sameturnIDcan exist across the prompt, response, and feedback datasets.
The agent application or service generates IDs that remain stable during retries or redelivery. This allows downstream processing to associate events correctly and avoid unintended duplicate events.
Signal extraction
Signal extraction takes place after data collection. Your agent application or service can populate additional signals.
Signal name
You need to set a value for signals[].name. Any string value is acceptable; however, Adobe populates the following names during the signal extraction process. Avoid using these values for name for any signals you send in because these values will be overwritten.
intentssentimenttonestopicskeywordstitle
Signal scope
Any string value is acceptable; however, Adobe populates the following scopes during the signal extraction process. Avoid using these values for scope for any signals you send in because these values will be overwritten.
turnfeedback
| code language-json |
|---|
|
Data blending
The conversation blender service merges events from prompt, response, feedback, and signal events datasets into a dedicated blended conversation events dataset. That dataset is used in Customer Journey Analytics as part of a connection. The components within that dataset are added to the data views you have specified for a Conversation Insights configuration.