mirror of
https://github.com/forcedotcom/afv-library.git
synced 2026-07-30 03:09:50 +08:00
190 lines
11 KiB
Markdown
190 lines
11 KiB
Markdown
# STDM Schema Reference
|
|
|
|
Data Model Object (DMO) schemas, field mappings, query patterns, and data quality notes for the Session Trace Data Model.
|
|
|
|
---
|
|
|
|
## Data Hierarchy
|
|
|
|
```
|
|
AiAgentSession (1)
|
|
+-- AiAgentSessionParticipant (N) -- agent planner IDs and user IDs linked to this session
|
|
+-- AiAgentInteraction (N) -- one per conversational turn
|
|
| +-- AiAgentInteractionMessage (N) -- user and agent messages
|
|
| +-- AiAgentInteractionStep (N) -- internal steps (LLM, actions)
|
|
+-- AiAgentMoment (N) -- one per intent/moment in the session
|
|
| +-- AiAgentMomentInteraction (N) -- junction: links moments to interactions
|
|
| +-- AiAgentTagAssociation (N) -- junction: links moments to tags (quality scores)
|
|
| +-- AiAgentTag (1) -- score value (1-5)
|
|
| +-- AiAgentTagDefinition (1)-- tag type definition
|
|
AiRetrieverQualityMetric (N) -- RAG quality scores, linked via gateway request ID
|
|
```
|
|
|
|
**Quality score join chain:** `AiAgentTagAssociation` (FK `AiAgentMomentId` + FK `AiAgentTagId`) -> `AiAgentTag.Value` (1-5 integer). The `AssociationReasonText` field contains the LLM-generated reasoning for the score.
|
|
|
|
---
|
|
|
|
## Key Fields
|
|
|
|
### AiAgentSession (`ssot__AiAgentSession__dlm`)
|
|
- `ssot__Id__c` -- Session ID
|
|
- `ssot__StartTimestamp__c` / `ssot__EndTimestamp__c` -- Session timing -> `session.duration_ms`
|
|
- `ssot__AiAgentChannelType__c` -- Channel -> `session.channel`
|
|
- `ssot__AiAgentSessionEndType__c` -- How the session ended: `USER_ENDED`, `AGENT_ENDED`, or null -> `session.end_type`
|
|
- `ssot__VariableText__c` -- Final variable snapshot for the session -> `session.session_variables`
|
|
|
|
### AiAgentSessionParticipant (`ssot__AiAgentSessionParticipant__dlm`)
|
|
- `ssot__AiAgentSessionId__c` -- Session this participant belongs to
|
|
- `ssot__AiAgentApiName__c` -- API name of the agent (primary filter field -- no SOQL needed)
|
|
- `ssot__ParticipantId__c` -- GenAiPlannerDefinition ID (key prefix `16j`) for agents, `005...` for users. May be 15-char or 18-char.
|
|
|
|
### AiAgentInteraction (`ssot__AiAgentInteraction__dlm`)
|
|
- `ssot__TopicApiName__c` -- Subagent/skill that handled this turn (API field name `TopicApiName` maps to Agent Script subagent) -> `turn.topic`
|
|
- `ssot__StartTimestamp__c` / `ssot__EndTimestamp__c` -- Turn timing -> `turn.duration_ms`
|
|
- `ssot__TelemetryTraceId__c` -- Distributed tracing ID -> `turn.telemetry_trace_id`
|
|
|
|
### AiAgentInteractionMessage (`ssot__AiAgentInteractionMessage__dlm`)
|
|
- `ssot__AiAgentInteractionMessageType__c` -- `Input` (user) or `Output` (agent) -> `message.message_type`
|
|
- `ssot__ContentText__c` -- Message text -> `message.text`
|
|
|
|
### AiAgentInteractionStep (`ssot__AiAgentInteractionStep__dlm`)
|
|
- `ssot__AiAgentInteractionStepType__c` -- `TOPIC_STEP`, `LLM_STEP`, `ACTION_STEP`, `SESSION_END`, `TRUST_GUARDRAILS_STEP` -> `step.step_type`
|
|
- `ssot__Name__c` -- Step or action name -> `step.name`
|
|
- `ssot__ErrorMessageText__c` -- Error text (null if none) -> `step.error`
|
|
- `ssot__InputValueText__c` / `ssot__OutputValueText__c` -- Input/output data -> `step.input` / `step.output`
|
|
- `ssot__PreStepVariableText__c` / `ssot__PostStepVariableText__c` -- Variable snapshots -> `step.pre_vars` / `step.post_vars`
|
|
- `ssot__GenerationId__c` -- Links to `GenAIGeneration__dlm` -> `step.generation_id` (non-null on LLM_STEP)
|
|
- `ssot__GenAiGatewayRequestId__c` -- Links to `GenAIGatewayRequest__dlm` -> `step.gateway_request_id` (non-null on LLM_STEP)
|
|
|
|
### Einstein Audit & Feedback DMOs (joined via `getLlmStepDetails()`)
|
|
|
|
**`GenAIGeneration__dlm`** -- LLM generation records:
|
|
- `generationId__c` -- Join key to `ssot__GenerationId__c` on the step DMO
|
|
- `responseText__c` -- The full LLM response text -> `LlmStepDetail.llm_response`
|
|
|
|
**`GenAIGatewayRequest__dlm`** -- Raw gateway requests sent to the LLM:
|
|
- `gatewayRequestId__c` -- Join key to `ssot__GenAiGatewayRequestId__c` on the step DMO
|
|
- `prompt__c` -- Full prompt text including system instructions -> `LlmStepDetail.prompt`
|
|
|
|
These two DMOs are only populated when Einstein Audit & Feedback is enabled in the org's Data Cloud setup.
|
|
|
|
### AiAgentMoment (`ssot__AiAgentMoment__dlm`)
|
|
|
|
Each moment represents a distinct user intent within a session. One session may have multiple moments.
|
|
- `ssot__Id__c` -- Moment ID
|
|
- `ssot__AiAgentSessionId__c` -- FK to AiAgentSession
|
|
- `ssot__StartTimestamp__c` / `ssot__EndTimestamp__c` -- Moment timing -> `MomentData.duration_ms`
|
|
- `ssot__RequestSummaryText__c` -- LLM-generated summary of user intent -> `MomentData.request_summary`
|
|
- `ssot__ResponseSummaryText__c` -- LLM-generated summary of agent response -> `MomentData.response_summary`
|
|
- `ssot__AiAgentApiName__c` -- Agent API name that handled this moment
|
|
- `ssot__AiAgentVersionApiName__c` -- Agent version API name
|
|
|
|
### AiAgentMomentInteraction (`ssot__AiAgentMomentInteraction__dlm`)
|
|
|
|
Links moments to the interactions (turns) they span. One moment may cover multiple turns.
|
|
- `ssot__Id__c` -- Junction record ID
|
|
- `ssot__AiAgentMomentId__c` -- FK to AiAgentMoment
|
|
- `ssot__AiAgentInteractionId__c` -- FK to AiAgentInteraction
|
|
- `ssot__StartTimestamp__c` -- When this moment-interaction link was created
|
|
|
|
### AiAgentTagAssociation (`ssot__AiAgentTagAssociation__dlm`)
|
|
|
|
The key junction table for quality scores. Links a moment to a tag (score 1-5) with LLM reasoning.
|
|
- `ssot__Id__c` -- Association ID
|
|
- `ssot__AiAgentMomentId__c` -- FK to AiAgentMoment
|
|
- `ssot__AiAgentTagId__c` -- FK to AiAgentTag (join to get the score value)
|
|
- `ssot__AiAgentSessionId__c` -- FK to AiAgentSession (denormalized for efficient filtering)
|
|
- `ssot__AiAgentInteractionId__c` -- FK to AiAgentInteraction
|
|
- `ssot__AiAgentTagDefinitionAssociationId__c` -- FK to TagDefinitionAssociation
|
|
- `ssot__AssociationReasonText__c` -- LLM-generated reasoning for the quality score -> `MomentData.quality_reasoning`
|
|
- `ssot__IsPassed__c` -- Whether the moment passed quality threshold
|
|
|
|
Quality score query: `TagAssociation JOIN Tag ON TagId -> Tag.Value` gives the 1-5 integer score per moment.
|
|
|
|
### AiAgentTag (`ssot__AiAgentTag__dlm`)
|
|
|
|
Contains the 5 quality score levels (1-5). Each tag has a numeric value.
|
|
- `ssot__Id__c` -- Tag ID
|
|
- `ssot__AiAgentTagDefinitionId__c` -- FK to tag definition
|
|
- `ssot__Value__c` -- Score value (e.g. "1", "2", "3", "4", "5") -> `MomentData.quality_score`
|
|
- `ssot__Description__c` -- Score description (null in current orgs)
|
|
- `ssot__IsActive__c` -- Whether this tag is active
|
|
|
|
### AiAgentTagDefinition (`ssot__AiAgentTagDefinition__dlm`)
|
|
|
|
Defines tag categories per agent. Each agent gets its own tag definition.
|
|
- `ssot__Id__c` -- Tag Definition ID
|
|
- `ssot__Name__c` -- Display name (e.g. "Optimization Request Category")
|
|
- `ssot__DeveloperName__c` -- API name (e.g. "AIE_Request_Category_MyServiceAgent")
|
|
- `ssot__DataType__c` -- Data type (e.g. "Text")
|
|
- `ssot__EngineType__c` -- Engine that generates the tags
|
|
- `ssot__Status__c` -- Definition status
|
|
|
|
### AiRetrieverQualityMetric (`ssot__AiRetrieverQualityMetric__dlm`)
|
|
|
|
Per-retrieval quality metrics for agents using knowledge retrieval. Links to sessions via gateway request ID.
|
|
- `ssot__Id__c` -- Metric ID
|
|
- `ssot__AiGatewayRequestId__c` -- FK to GenAIGatewayRequest
|
|
- `ssot__AiRetrieverRequestId__c` -- Retriever request ID
|
|
- `ssot__RetrieverApiName__c` -- API name of the retriever
|
|
- `ssot__UserUtteranceText__c` -- User utterance that triggered retrieval
|
|
- `ssot__AgentGeneratedResponseText__c` -- Agent response text
|
|
- `ssot__FaithfulnessRelevancyScoreNumber__c` -- Faithfulness score (0-1)
|
|
- `ssot__AnswerRelevancyScoreNumber__c` -- Answer relevance score (0-1)
|
|
- `ssot__ContextPrecisionScoreNumber__c` -- Context precision score (0-1)
|
|
|
|
Only populated when the agent uses knowledge retrieval actions. May have 0 rows if the agent has no RAG actions.
|
|
|
|
---
|
|
|
|
## TRUST_GUARDRAILS_STEP
|
|
|
|
A safety/compliance step that measures whether the agent's response followed its instructions:
|
|
- `step.name` is typically `InstructionAdherence`
|
|
- `step.output` is a Python-style dict string (not JSON). Actual format:
|
|
```
|
|
{'name': 'InstructionAdherence', 'value': 'HIGH', 'explanation': 'This response adheres to the assigned instructions.'}
|
|
```
|
|
Check for adherence by searching for `'value': 'LOW'` in the output string.
|
|
- `step.input` contains the raw `input_text` and `output_text` that were evaluated
|
|
- `step.error` may contain the literal string `"None"` (not a real error)
|
|
- Does **not** count toward `action_error_count`
|
|
|
|
---
|
|
|
|
## Data Quality Notes
|
|
|
|
**`NOT_SET` sentinel.** Data Cloud uses `"NOT_SET"` for null/absent values. `AgentforceOptimizeService` strips this sentinel -- any field returning `null` in the JSON should be treated as absent.
|
|
|
|
**`TRUST_GUARDRAILS_STEP` error field.** May have the Python string `"None"` in the error field. This is **not** a real error -- treat it as absent. `action_error_count` is only incremented for `ACTION_STEP` errors.
|
|
|
|
**Null `end_time` / `duration_ms`.** Sessions and turns may have `null` for `end_time` when no session-end event was recorded. This is common and does not indicate a problem.
|
|
|
|
**`LLM_STEP` input/output format.** The `input` and `output` fields on `LLM_STEP` contain raw Python dict strings (the internal LlamaIndex representation), not valid JSON. Do not attempt to `JSON.parse()` these values. Only `ACTION_STEP` input/output is structured JSON.
|
|
|
|
**Participant ID format inconsistency.** The `ssot__AiAgentSessionParticipant__dlm` DMO stores `ssot__ParticipantId__c` as either 15-char or 18-char Salesforce IDs, inconsistently. `AgentforceOptimizeService.resolvePlannerIds()` automatically handles both formats.
|
|
|
|
---
|
|
|
|
## Data Space Name
|
|
|
|
Always run Phase 0 first to discover the correct Data Space `name` for the org. Use `sf api request rest "/services/data/v63.0/ssot/data-spaces" -o <org>` (no `--json` flag -- unsupported on this beta command). Never assume `'default'` without checking -- it is only a fallback if the API call fails.
|
|
|
|
---
|
|
|
|
## Agent Name Resolution Reference
|
|
|
|
The only Salesforce metadata object that should be queried directly is `GenAiPlannerDefinition` -- used exclusively for agent name resolution in the Routing step.
|
|
|
|
| Object | Purpose | When to query |
|
|
|---|---|---|
|
|
| `GenAiPlannerDefinition` | The agent definition | Routing step only -- to resolve `MasterLabel`, `DeveloperName`, and `Id` |
|
|
| `DataKnowledgeSpace` | Knowledge base container | Phase 1.5b Step 5 only -- if knowledge gaps are detected |
|
|
|
|
**Do NOT query these objects directly** -- use the `.agent` file instead:
|
|
- `GenAiPluginDefinition` (subagents) -- read from `.agent` file `subagent:` blocks
|
|
- `GenAiPluginInstructionDef` (instructions) -- read from `.agent` file `reasoning: instructions:` blocks
|
|
- `GenAiFunction` (actions) -- read from `.agent` file `reasoning: actions:` blocks
|
|
|
|
The `.agent` file is the single source of truth. All fixes should be applied to it and deployed via the Phase 3 deployment chain.
|