Chat Summarization - Virtual Agent
SkillAI & modelsSummarize virtual agent chat sessions with topic classification, resolution status, handoff context, and actionable insights for agent productivity
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Chat Summarization - Virtual Agent skill
What this skill tells your AI
The instructions your AI receives, as published by happy-technologies-llc/happy-platform-skills in skills/genai/chat-summarization-va/SKILL.md and read by ahel’s review.
Overview
This skill generates concise, structured summaries of virtual agent chat sessions to improve agent handoff quality, enable trend analysis, and create audit trails. Each summary includes topic classification, resolution status, captured data, and handoff context.
- Extract key information from virtual agent conversation transcripts
- Classify conversations by topic, intent, and outcome
- Determine resolution status: self-served, escalated, abandoned, or unresolved
- Build handoff context packages for seamless live agent takeover
- Identify captured slots and missing information for follow-up
- Generate batch summaries for trend reporting and quality analysis
When to use: When live agents need quick context on escalated chats, when management needs conversation analytics, or when building audit trails for virtual agent interactions.
Prerequisites
- Roles:
admin,va_admin,itil, orconversation_designer - Plugins:
com.glide.cs.chatbot(Virtual Agent),com.glide.interaction(Agent Workspace) - Access: Read on
sys_cs_conversation,sys_cs_message,sys_cs_topic,sys_cb_topic,sys_cb_action,sys_cs_context_entry - Knowledge: Familiarity with your Virtual Agent topic catalog and escalation paths
- Data: Active virtual agent deployment with conversation history
Procedure
Step 1: Select Conversations for Summarization
Query conversations by status, date range, or topic.
Using MCP (Claude Code/Desktop):
Tool: SN-Query-Table
Parameters:
table_name: sys_cs_conversation
query: sys_created_onONLast 24 hours@javascript:gs.daysAgoStart(1)@javascript:gs.daysAgoEnd(0)
fields: sys_id,number,topic,state,channel,opened_at,closed_at,close_reason,user,queue_time,handle_time,assigned_to
limit: 50
Using REST API:
GET /api/now/table/sys_cs_conversation?sysparm_query=sys_created_onONLast 24 hours@javascript:gs.daysAgoStart(1)@javascript:gs.daysAgoEnd(0)&sysparm_fields=sys_id,number,topic,state,channel,opened_at,closed_at,close_reason,user,queue_time,handle_time,assigned_to&sysparm_limit=50
For escalated conversations specifically:
Tool: SN-Query-Table
Parameters:
table_name: sys_cs_conversation
query: close_reason=escalated^sys_created_onONLast 24 hours@javascript:gs.daysAgoStart(1)@javascript:gs.daysAgoEnd(0)
fields: sys_id,number,topic,state,channel,opened_at,closed_at,close_reason,user
limit: 50
Step 2: Retrieve Full Message History
Get all messages for the conversation in chronological order.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sys_cs_message
query: conversation=[conversation_sys_id]^ORDERBYsys_created_on
fields: sys_id,body,type,sender_type,sys_created_on,is_hidden,formatted_body
limit: 200
Using REST API:
GET /api/now/table/sys_cs_message?sysparm_query=conversation=[conversation_sys_id]^ORDERBYsys_created_on&sysparm_fields=sys_id,body,type,sender_type,sys_created_on,is_hidden,formatted_body&sysparm_limit=200
Step 3: Extract Context and Captured Data
Retrieve all context entries (slot values) captured during the conversation.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sys_cs_context_entry
query: conversation=[conversation_sys_id]
fields: sys_id,name,value,source
limit: 50
Using REST API:
GET /api/now/table/sys_cs_context_entry?sysparm_query=conversation=[conversation_sys_id]&sysparm_fields=sys_id,name,value,source&sysparm_limit=50
Step 4: Identify Topic and Intent
Map the conversation to its designed topic and determine user intent.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sys_cb_topic
query: sys_id=[topic_sys_id]
fields: sys_id,name,description,goal,category
limit: 1
Using REST API:
GET /api/now/table/sys_cb_topic?sysparm_query=sys_id=[topic_sys_id]&sysparm_fields=sys_id,name,description,goal,category&sysparm_limit=1
Classify the conversation outcome:
| Outcome | Criteria | Code |
|---|---|---|
| Self-served | User issue resolved by bot without escalation | SS |
| Escalated - Requested | User explicitly asked for a live agent | ER |
| Escalated - Automated | Bot could not handle request, auto-escalated | EA |
| Abandoned | User left conversation before resolution | AB |
| Unresolved | Conversation closed without clear resolution | UR |
Step 5: Generate the Summary
Build a structured summary with the following template:
=== CHAT SESSION SUMMARY ===
Conversation: [number]
Date: [opened_at] - [closed_at]
Duration: [handle_time]
Channel: [channel]
User: [user display_value]
TOPIC & INTENT:
Topic: [topic name]
Primary Intent: [extracted user intent]
Secondary Intents: [any topic switches during conversation]
CONVERSATION FLOW:
1. [User initiated with: brief description of first message]
2. [Bot identified topic: topic name]
3. [Data collection: list of slots captured]
4. [Resolution attempt: what the bot tried]
5. [Outcome: resolution or escalation point]
CAPTURED DATA:
- [slot_name]: [value]
- [slot_name]: [value]
- [slot_name]: [value]
MISSING DATA:
- [required slot not captured]
RESOLUTION STATUS: [Self-Served | Escalated | Abandoned | Unresolved]
RESOLUTION DETAIL: [Brief description of how it was resolved or why it was not]
HANDOFF CONTEXT (if escalated):
Issue: [concise problem statement]
What was tried: [bot actions taken]
What is needed: [next steps for live agent]
Sentiment: [user sentiment at handoff point]
KEY QUOTES:
- User: "[most relevant user statement]"
- User: "[any frustration or clarification]"
Step 6: Check for Related Records
Identify any incidents, requests, or interactions created from this conversation.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: interaction
query: conversation=[conversation_sys_id]
fields: sys_id,number,type,state,assigned_to,opened_at
limit: 5
Using REST API:
GET /api/now/table/interaction?sysparm_query=conversation=[conversation_sys_id]&sysparm_fields=sys_id,number,type,state,assigned_to,opened_at&sysparm_limit=5
Step 7: Store the Summary
Write the summary to the conversation record or a related work note.
Using MCP:
Tool: SN-Update-Record
Parameters:
table_name: sys_cs_conversation
sys_id: [conversation_sys_id]
data:
work_notes: "[generated summary]"
Using REST API:
PATCH /api/now/table/sys_cs_conversation/{sys_id}
Content-Type: application/json
{
"work_notes": "[generated summary]"
}
Step 8: Generate Batch Analytics
Summarize patterns across multiple conversations for reporting:
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sys_cs_conversation
query: sys_created_onONLast 7 days@javascript:gs.daysAgoStart(7)@javascript:gs.daysAgoEnd(0)
fields: sys_id,topic,close_reason,handle_time,queue_time
limit: 500
Produce aggregate metrics:
| Metric | Value | Trend |
|---|---|---|
| Total conversations | 487 | +12% WoW |
| Self-service rate | 62% | +3% WoW |
| Escalation rate | 24% | -2% WoW |
| Abandonment rate | 14% | -1% WoW |
| Avg handle time | 4.2 min | -0.3 min WoW |
| Top escalation topic | VPN Issues | 31 escalations |
Tool Usage
| Tool | Purpose | When to Use |
|---|---|---|
SN-Query-Table | Retrieve conversations, messages, context, topics | Core data gathering |
SN-Natural-Language-Search | Find conversations by natural language criteria | Ad-hoc investigation |
SN-Update-Record | Store summaries on conversation records | Persisting results |
SN-Add-Work-Notes | Document summaries as work notes | Audit trail |
SN-Get-Table-Schema | Discover conversation table structures | Setup and exploration |
Best Practices
- Summarize at escalation -- generate summaries immediately when a conversation is escalated for fastest agent handoff
- Keep summaries concise -- aim for 10-15 lines maximum; agents need quick context, not transcripts
- Highlight missing data -- explicitly call out required slots not captured so the agent knows what to ask
- Include user sentiment -- note frustration, urgency, or confusion to help agents calibrate their approach
- Exclude hidden messages -- filter out
is_hidden=truemessages as they contain system-internal data - Batch summarize daily -- run aggregate summaries for trend reporting and topic optimization
- Preserve original transcripts -- summaries complement but never replace the full message history
- Tag summaries consistently -- use standard outcome codes (SS, ER, EA, AB, UR) for reliable analytics
Troubleshooting
"Conversation has no messages"
Cause: User connected but never sent a message, or messages are in a linked table
Solution: Check sys_cs_message with the conversation sys_id. If empty, classify as abandoned and note "No user messages recorded."
"Topic field is empty on conversation"
Cause: User disconnected before intent was matched, or the conversation used a fallback flow Solution: Attempt to infer topic from the first few user messages. Classify as "Unmatched Intent" if no topic is identifiable.
"Context entries do not match expected slots"
Cause: Topic design was updated after the conversation occurred, or slots were captured under different names
Solution: Cross-reference with the topic version active at conversation time. Use sys_cs_context_entry.source to trace slot origin.
"Summary is too long for work_notes field"
Cause: Conversation had many turns and the summary exceeds field limits Solution: Truncate to key sections: Topic, Resolution Status, Handoff Context. Store the full summary as an attachment if needed.
Examples
Example 1: Self-Served Password Reset
Conversation: CS0089001 - 6 turns, 2.1 minutes
Summary:
Topic: Password Reset | Status: SELF-SERVED
User requested password reset for corporate account. Bot verified identity
via security questions (3/3 correct), sent reset link to registered email.
User confirmed receipt and successful reset.
Captured: username=jsmith, email=jsmith@company.com, verification=passed
No missing data. No escalation needed.
Example 2: Escalated Software Installation
Conversation: CS0089002 - 14 turns, 8.3 minutes
Summary:
Topic: Software Request | Status: ESCALATED (User Requested)
User requested installation of Adobe Creative Suite. Bot collected
justification and manager approval details but user asked for live agent
after bot could not confirm license availability.
Captured: software=Adobe Creative Suite, justification=marketing deliverables,
manager=Jane Doe
Missing: cost_center, license_type
Handoff Context: User needs license availability check. Sentiment: mildly frustrated.
Example 3: Abandoned HR Inquiry
Conversation: CS0089003 - 3 turns, 0.8 minutes
Summary:
Topic: PTO Balance | Status: ABANDONED
User asked about remaining PTO balance. Bot requested employee ID for
lookup. User did not respond after 5 minutes. Session timed out.
Captured: none
Missing: employee_id
No handoff context. Recommend: add PTO lookup via SSO identity.
Related Skills
genai/conversation-evaluator- Evaluate conversation quality before summarizingcsm/chat-recommendation- Recommend responses during live chatitsm/incident-triage- Triage incidents created from escalated conversationsgenai/now-assist-qa- Quality assurance for AI-assisted conversationsknowledge/content-recommendation- Find KB articles referenced in conversations
Signals
- GitHub stars
- 37
- Forks
- 13
- Last commit
- Jul 2026
Advanced
- Catalog kind
- skill
- Gateway key
chat-summarization-va- Source
- github.com/happy-technologies-llc/happy-platform-skills