skills/genai/chat-summarization-va/SKILL.md
Summarize virtual agent chat sessions with topic classification, resolution status, handoff context, and actionable insights for agent productivity
npx skillsauth add happy-technologies-llc/happy-servicenow-skills chat-summarization-vaInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.
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.
admin, va_admin, itil, or conversation_designercom.glide.cs.chatbot (Virtual Agent), com.glide.interaction (Agent Workspace)sys_cs_conversation, sys_cs_message, sys_cs_topic, sys_cb_topic, sys_cb_action, sys_cs_context_entryQuery 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
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
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
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 |
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]"
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
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]"
}
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 | Purpose | When to Use |
|------|---------|-------------|
| SN-Query-Table | Retrieve conversations, messages, context, topics | Core data gathering |
| SN-NL-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 |
is_hidden=true messages as they contain system-internal dataCause: 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."
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.
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.
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.
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 protected], verification=passed
No missing data. No escalation needed.
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.
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.
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 conversationstesting
Manage supplier onboarding, qualification, performance monitoring, and offboarding with auditable lifecycle controls
tools
Identify emerging risks, prioritize intake signals, and route candidates into formal GRC risk assessment workflows
documentation
Screen inbound documents for completeness, policy risk, and routing readiness before extraction or case workflows
testing
Generate concise task summaries with status, timeline, blockers, SLA risk, and recommended next actions