afv-library/skills/observing-agentforce/references/stdm-schema.md
Willie Ruemmele 261abd679a
chore: rename topic to subagent for Agent Script v2 @W-21955450@ (#193)
* @W-21955450@ Rename topic to subagent for Agent Script v2

Aligns with Agent Script v2 naming standards where `topic` is renamed
to `subagent` across all skill documentation and templates.

Changes:
- Agent Script templates: topic keyword → subagent keyword
- References: @topic.* → @subagent.*
- Documentation: Updated all skill references and guides
- Natural language references preserved in comments/descriptions

* Rename start_agent topic_selector to agent_router

Completes the topic → subagent terminology alignment by:

1. Renaming start_agent from topic_selector to agent_router (15 agent files)
2. Updating template topic declarations: topic {{placeholder}} → subagent {{placeholder}} (5 files)
3. Updating all @subagent.topic_selector references to @subagent.agent_router (35 occurrences)
4. Updating documentation: prose, examples, and diagrams (10 markdown files)
5. Updating comments to use agent_router terminology

Files affected:
- 22 agent template files
- 10 documentation/reference markdown files
- Template component files

The agent_router name is more descriptive of its actual function
(routing to different subagents) and completes the Agent Script v2
terminology standardization.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* Rename files with "topic" to use "subagent" terminology

Completes the topic → subagent terminology alignment by renaming
files and updating all references:

**Files renamed (5):**
- multi-topic.agent → multi-subagent.agent
- template-single-topic.agent → template-single-subagent.agent
- template-multi-topic.agent → template-multi-subagent.agent
- topic-with-actions.agent → subagent-with-actions.agent
- agent-topic-map-diagrams.md → agent-subagent-map-diagrams.md

**References updated (6 docs):**
- Updated all filename references to point to new filenames
- Updated "Topic Map" → "Subagent Map" throughout documentation
- Updated "multi-topic"/"single-topic" → "multi-subagent"/"single-subagent"

Files modified:
- README.md, SKILL.md, agent-spec-template.md
- assets/agents/README.md, assets/README-legacy.md
- references/agent-design-and-spec-creation.md

This ensures consistent "subagent" terminology across filenames,
file content, and all documentation references.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* Complete topic-to-subagent terminology update across skills

Comprehensive update replacing "topic" with "subagent" terminology throughout
the developing-agentforce and testing-agentforce skills to align with Agent
Script's `subagent` block naming.

Key changes:
- "Topic Selector" → "Subagent Router" in all agent templates and docs
- "Topic/action" → "Subagent/action" in documentation
- "Topic map" → "Subagent map" in diagram references
- Updated all architecture documentation to use "subagent" terminology
- Updated 19 .agent template files with new labels and comments
- Updated 8 reference documentation files with consistent terminology

API contract preservation:
- Test spec YAML files preserve "topic" terminology to match Testing Center API
- Added clarifying comments explaining topic/subagent equivalence in YAML files
- Field names like `expectedTopic` unchanged (Salesforce API requirement)

Preserved terms:
- "off-topic" (standard phrase for out-of-scope)
- "expectedTopic" field (Testing Center API)
- "platform topics" (Salesforce guardrail features)

32 files changed, 379 insertions(+), 366 deletions(-)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* Complete comprehensive topic-to-subagent terminology update

Thorough update replacing all remaining "topic" references with "subagent"
terminology across developing-agentforce, testing-agentforce, and
observing-agentforce skills to fully align with Agent Script's `subagent`
block naming.

Key changes:
- Agent Script syntax: @topic.<name> → @subagent.<name>
- Agent Script syntax: topic.actions → subagent.actions
- Shell script patterns: ^topic → ^subagent
- Documentation: "topic instructions" → "subagent instructions"
- observing-agentforce skill: Updated all agent architecture references
- Template files: Updated all inline comments and descriptions
- Variable names in scripts: TOPIC → SUBAGENT

Specific updates:
- 45 files changed, 294 insertions, 294 deletions
- Updated all Agent Script code examples to use @subagent syntax
- Updated observing-agentforce issue classification guide
- Updated shell script patterns in diagnostic tools
- Updated Apex comments to clarify topic field maps to subagents

Preserved (as required):
- "off-topic" and "off_topic" (standard out-of-scope phrase)
- Testing Center API fields: expectedTopic, topic: in YAML
- API response fields: .topic, generatedData.topic, topic_assertion
- STDM field names: ssot__TopicApiName__c (with clarifying docs)
- Template placeholders in test specs (API values)
- "Topic hash drift" (API field behavior)
- "Email topic/purpose" (means email subject)
- Explanatory comments about API field mapping

All Agent Script syntax and documentation now consistently uses "subagent"
while preserving backward compatibility with platform API field names.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* a few more topic -> subagent replacements

---------

Co-authored-by: Steve Hetzel <shetzel@salesforce.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-04-27 12:42:18 -06:00

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.