- sf-ai-agentforce-observability: Agentforce Session Tracing Extraction & Analysis
- Expert in extracting and analyzing Agentforce session tracing data from Salesforce Data 360. Supports high-volume data extraction (1-10M records/day), Parquet storage, and Polars-based analysis for debugging agent behavior.
- Core Responsibilities
- Session Extraction
-
- Extract STDM (Session Tracing Data Model) data via Data 360 Query API
- Data Storage
-
- Write to Parquet format with PyArrow for efficient storage
- Analysis
-
- Polars-based lazy evaluation for memory-efficient analysis
- Debugging
-
- Session timeline reconstruction for troubleshooting agent issues
- Cross-Skill Integration
- Works with sf-connected-apps for auth, sf-ai-agentscript for fixes Document Map Need Document Description Quick start README.md Installation & basic usage Data model references/data-model-reference.md Full STDM schema documentation Query patterns references/query-patterns.md Data Cloud SQL examples Analysis recipes references/analysis-cookbook.md Common Polars patterns CLI reference references/cli-reference.md Complete command documentation Auth setup references/auth-setup.md JWT Bearer configuration Troubleshooting references/troubleshooting.md Common issues & fixes Analysis examples references/analysis-examples.md Session summary & debug timeline output Billing & issues references/billing-and-troubleshooting.md Credit consumption & common errors Builder trace API references/builder-trace-api.md Internal trace endpoint investigation & capture tooling Execution lifecycle references/agent-execution-lifecycle.md 6-phase model, script-to-trace mapping, timing analysis CRITICAL: Prerequisites Checklist Before extracting session data, verify: Check How to Verify Why Data 360 enabled Setup → Data 360 Required for Query API Salesforce Standard Data Model v1.124+ Setup → Apps → Packaging → Installed Packages Required for session tracing DMOs Einstein Generative AI enabled Setup → Einstein Generative AI Enables agent capabilities Session Tracing enabled Setup → Einstein Audit, Analytics, and Monitoring Must toggle ON to collect data JWT Auth configured Use sf-connected-apps Required for Data 360 API Official Setup Guide : Set Up Agentforce Session Tracing Auth Setup (via sf-connected-apps)
1. Create key directory
mkdir -p ~/.sf/jwt
2. Generate certificate (naming convention: {org}-agentforce-observability)
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \ -keyout ~/.sf/jwt/myorg-agentforce-observability.key \ -out ~/.sf/jwt/myorg-agentforce-observability.crt \ -subj "/CN=AgentforceObservability/O=MyOrg"
3. Secure the private key
chmod 600 ~/.sf/jwt/myorg-agentforce-observability.key
4. Create External Client App in Salesforce (see references/auth-setup.md)
Required scopes: cdp_query_api, refresh_token/offline_access
Key Path Resolution Order: Explicit --key-path argument App-specific: ~/.sf/jwt/{org}-agentforce-observability.key Generic fallback: ~/.sf/jwt/{org}.key See references/auth-setup.md for detailed instructions. T6 Live API Discovery Summary Validated: January 30, 2026 | 24 DMOs Found | 260+ Test Points Category DMOs Status Session Tracing 5 All Found (Session, Interaction, Step, Message, Participant) Agent Optimizer 6 All Found (Moment, Tag system) GenAI Audit 13 All Found (Generation, Quality, Feedback, Gateway) RAG Quality 3 Not Found (GenAIRetriever* DMOs don't exist) Key Discoveries: Field naming: API uses AiAgent (lowercase 'i'), not AIAgent Agent name location: Stored on Moment , not Session Channel types: E & O , Builder , SCRT2 - EmbeddedMessaging , Voice , NGC Participant roles: USER , AGENT (not Owner/Observer) Session Tracing Data Model (STDM) See references/data-model-reference.md for the complete field-level schema of all 5 core DMOs + 13 GenAI Audit DMOs. 5 Core DMOs — all field names use AiAgent prefix (lowercase 'i'): DMO Key Relationship Primary Fields AIAgentSession__dlm Id__c Root StartTimestamp, EndTimestamp, ChannelType, EndType AIAgentInteraction__dlm Id__c Session → N Turns TopicApiName, InteractionType, TraceId AIAgentInteractionStep__dlm Id__c Turn → N Steps StepType (LLM/ACTION), InputValue, OutputValue, Error AIAgentMoment__dlm Id__c Session (NOT Turn) AgentApiName lives here , RequestSummary, ResponseSummary AIAgentMessage__dlm Id__c Turn → Messages Content, Role, Timestamp 13 GenAI Trust Layer DMOs — detectors for toxicity, PII, prompt defense, instruction adherence: DMO Purpose Key Fields GenAIGatewayRequest__dlm LLM request details model, provider, tokens, safety flags GenAIGeneration__dlm LLM output responseText, links to Steps via GenerationId GenAIContentQuality__dlm Trust Layer assessment isToxicityDetected GenAIContentCategory__dlm Detector results detectorType, category, confidence value GenAIFeedback__dlm User feedback GOOD/BAD + detail comments Workflow (5-Phase Pattern) Phase 1: Requirements Gathering Ask the user to gather:
Question Options 1 Target org Org alias from sf org list 2 Time range Last N days / Date range 3 Agent filter All agents / Specific API names 4 Output format Parquet (default) / CSV 5 Analysis type Summary / Debug session / Full extraction Phase 2: Auth Configuration Verify JWT auth is configured: from scripts . auth import Data360Auth auth = Data360Auth ( org_alias = "myorg" , consumer_key = "YOUR_CONSUMER_KEY" )
Test authentication
token
auth . get_token ( ) print ( f"Auth successful: { token [ : 20] } ..." ) If auth fails, use the sf-connected-apps skill: "Setup JWT Bearer for Data 360" Phase 3: Extraction Basic Extraction (last 7 days): python3 scripts/cli.py extract \ --org prod \ --days 7 \ --output ./stdm_data Filtered Extraction: python3 scripts/cli.py extract \ --org prod \ --since 2026 -01-01 \ --until 2026 -01-28 \ --agent Customer_Support_Agent \ --output ./stdm_data Session Tree (specific session): python3 scripts/cli.py extract-tree \ --org prod \ --session-id "a0x..." \ --output ./debug_session Phase 4: Analysis Session Summary: from scripts . analyzer import STDMAnalyzer from pathlib import Path analyzer = STDMAnalyzer ( Path ( "./stdm_data" ) )
High-level summary
summary
analyzer . session_summary ( ) print ( summary )
Step distribution by agent
steps
analyzer . step_distribution ( agent_name = "Customer_Support_Agent" ) print ( steps )
Topic routing analysis
topics
- analyzer
- .
- topic_analysis
- (
- )
- (
- topics
- )
- Debug Specific Session:
- python3 scripts/cli.py debug-session
- \
- --data-dir ./stdm_data
- \
- --session-id
- "a0x..."
- Phase 5: Integration & Next Steps
- Based on analysis findings:
- Finding
- Next Step
- Skill
- Topic mismatch
- Improve topic descriptions
- sf-ai-agentscript
- Action failures
- Debug Flow/Apex
- sf-flow
- ,
- sf-debug
- Slow responses
- Optimize actions
- sf-apex
- Missing coverage
- Add test cases
- sf-ai-agentforce-testing
- CLI Quick Reference
- Extraction Commands
- Command
- Purpose
- Example
- extract
- Extract session data
- extract --org prod --days 7
- extract-tree
- Extract full session tree
- extract-tree --org prod --session-id "a0x..."
- extract-incremental
- Resume from last run
- extract-incremental --org prod
- Analysis Commands
- Command
- Purpose
- Example
- analyze
- Generate summary stats
- analyze --data-dir ./stdm_data
- debug-session
- Timeline view
- debug-session --session-id "a0x..."
- topics
- Topic analysis
- topics --data-dir ./stdm_data
- Common Flags
- Flag
- Description
- Default
- --org
- Target org alias
- Required
- --consumer-key
- ECA consumer key
- $SF_CONSUMER_KEY
- env var
- --key-path
- JWT private key path
- ~/.sf/jwt/{org}-agentforce-observability.key
- --days
- Last N days
- 7
- --since
- /
- --until
- Date range (YYYY-MM-DD)
- - / Today
- --agent
- Filter by agent API name
- All
- --output
- Output directory
- ./stdm_data
- --verbose
- Detailed logging
- False
- See
- references/cli-reference.md
- for complete documentation.
- Analysis Examples
- See
- references/analysis-examples.md
- for full session summary and debug timeline output examples.
- Session Summary
-
- Shows sessions by agent (count, avg turns, avg duration) and end type distribution (completed/escalated/abandoned).
- Debug Timeline
-
- Reconstructs a session step-by-step — input → topic routing → LLM steps → action steps → output — with timestamps and I/O payloads.
- Cross-Skill Integration
- Skill
- When
- How to Invoke
- sf-connected-apps
- Auth setup
- Use the
- sf-connected-apps
- skill: "JWT Bearer for Data Cloud"
- sf-ai-agentscript
- Fix topic routing issues
- Use the
- sf-ai-agentscript
- skill: "Fix topic: [issue]"
- sf-flow
- /
- sf-debug
- Debug action failures
- Use the
- sf-debug
- skill: "Analyze agent action failure"
- sf-ai-agentforce-testing
- Create test cases from patterns
- Use the
- sf-ai-agentforce-testing
- skill: "Add test cases"
- sf-ai-agentforce-testing
- Real-time agent trace analysis
- Use
- sf-ai-agentforce-testing
- Phase F: trace-enriched preview testing
- Key Insights
- Insight
- Description
- Action
- STDM is read-only
- Data 360 stores traces; cannot modify
- Use for analysis only
- Session lag
- Data may lag 5-15 minutes
- Don't expect real-time
- Volume limits
- Query API: 10M records/day
- Use incremental extraction
- Parquet efficiency
- 10x smaller than JSON
- Always use Parquet for storage
- Lazy evaluation
- Polars scans without loading
- Handles 100M+ rows
- ~24 records per LLM call
- Each round-trip generates ~24 records
- Factor into volume estimates
- Billing & Common Issues
- See
- references/billing-and-troubleshooting.md
- for credit consumption details and error resolution.
- Quick reference
- Session Tracing consumes Data 360 credits. ~24 records per LLM round-trip. 1,000 sessions/day × 4 turns × 24 = ~96K records/day. Use Digital Wallet for consumption tracking. Error Quick Fix 401 Unauthorized Refresh token or reconfigure ECA No session data Enable Session Tracing in Agent Settings Query timeout Add date filters, use incremental Memory error Use Polars lazy frames Output Directory Structure stdm_data/ ├── sessions/ # date=YYYY-MM-DD/part-0000.parquet ├── interactions/ # date=YYYY-MM-DD/part-0000.parquet ├── steps/ # date=YYYY-MM-DD/part-0000.parquet ├── messages/ # date=YYYY-MM-DD/part-0000.parquet └── metadata/ # extraction.json + watermark.json (incremental) Dependencies Python 3.10+ : polars>=1.0 , pyarrow>=15.0 , pyjwt>=2.8 , cryptography>=42.0 , httpx>=0.27 , rich>=13.0 , click>=8.1 , pydantic>=2.6 Install: pip install -r requirements.txt