- Subscribe to RSS Feed
- Mark as New
- Mark as Read
- Bookmark
- Subscribe
- Printer Friendly Page
- Report Inappropriate Content
What is the Group Action Framework β and why does it exist?
When an AI agent handles a support ticket in isolation, it has context for only that one record. It cannot see that forty similar incidents were logged in the past two weeks, what resolution worked across that cluster, or what pattern of short descriptions signals a specific infrastructure problem. That single-record blindspot limits the quality of AI-generated summaries, resolution steps, and recommendations.
Group Action Framework (GAF) is a feature on the Now Platform that clusters related records β incidents, cases, KB articles β using machine learning, then executes LLM-driven actions on those clusters to generate summaries, resolution steps, and pattern-level insights. It gives Now Assist AI agents and Agentic Workflows access to cross-record knowledge rather than single-record context.
GAF operates through five modular skills that run in sequence:
| Skill | What it does |
|---|---|
| Grouping skill | Clusters related records using machine learning techniques |
| Topic-labeling skill | Applies LLM-generated, human-readable names to each cluster (e.g., "Email server down") |
| Action strategy skill | Selects representative records from each cluster for deeper processing |
| Action mapper skill | Runs LLM inference on the selected representative records to extract insights |
| Action reducer skill | Consolidates mapper outputs into a single cluster-level summary |
This output β cluster-level summaries and representative record sets β is what Now Assist AI agents and Agentic Workflows consume. Skills like Generate Resolution Plan and Suggested Steps for ITSM rely on GAF to surface patterns across similar tickets before generating a recommendation. Without GAF running, those skills operate on single-record context only, or return no output at all.
You activated GAF β but is it actually running?
You followed the setup guide, ran the activation script, and ticked all the checkboxes. But when you navigate to the clustering output table, it is empty. The scheduled jobs may or may not be there. The skill config records exist, but nothing is clustering.
When this happens β skill configs seeded but activation incomplete β sn_gaf_record_group stays empty and agents receive no cluster-level context. Working through each prerequisite layer in sequence is the only way to isolate where activation stalled.
This article walks through every verification layer in the order the official documentation prescribes.
Five things teams get wrong about GAF
| Misconception | Reality |
|---|---|
"If sn_nowassist_skill_config records exist, GAF is active" |
Those records confirm GAF is seeded, not activated. Activation requires running the GAFUtils background script with valid skill IDs, and AI Search must be indexed first. |
| "GAF works automatically after installing Now Assist for ITSM" | GAF requires explicit activation via a background script and AI Search configuration before it produces any clustering output. |
"An empty sn_gaf_record_group means activation failed" |
Most often it means the offline flow has not run yet, or fewer than 2,000 eligible records exist in the target table β both recoverable conditions, not failures. |
"predictGroup() can verify clustering for any record" |
predictGroup() only works on new or unclustered records. It returns undefined for records already processed by the offline flow β that is expected behavior, not an error. |
| "Both offline and online scheduled jobs are always created after activation" | Only GAF β Run Offline Flow is confirmed in official documentation. A second online flow job may appear depending on instance configuration and use case, but it is not guaranteed on all instances. |
GAF Activation Verification Runbook
Work through these steps in order. Each step confirms one layer of the activation chain. Do not skip to later steps before the earlier ones are confirmed β a missing prerequisite silently invalidates everything downstream.
Required role: sn_aia.admin plus admin
Before you start β confirm AI Search is ready
Step P1 β Verify AI Search status
Navigate to All > AI Search > AI Search Status and confirm the page reads "AI Search is ready." If it does not, request AI Search installation. Installation can take between 2 and 24 hours.
Step P2 β Install Now Assist for AI Search
Install a Now Assist application that includes Now Assist in AI Search. Refer to the Install Now Assist in AI Search guide in the official ServiceNow documentation.
Step P3 β Activate the embedding model
Navigate to the Semantic Index Configuration table:
Navigate to:
ais_semantic_index_configuration.list
Filter by Indexed Source for the table you want to cluster (for example, Incident) and by the Semantic Index Name for that table. Set Active to true.
To find the correct Semantic Index Name: open the Indexed Source record for your target table and read the value in the Name field. For the Incident table, the documented value is body.
Step P4 β Index the target table
Navigate to All > AI Search > AI Search Index > Indexed Source, filter by the name of your target table, open the record, and click Index All Tables.
Step P5 β Confirm indexing completed
Check the Indexed Source History related list on that record. Both Keyword Ingestion State and Semantic Ingestion State must show Indexed before proceeding to Step 1.
Step 1: Check for skill config records
Navigate to:
sn_nowassist_skill_config.list
Filter by Name contains grouping. You should see records such as GAF ITSM grouping and GAF HR grouping if GAF has been seeded for those applications.
Step 2: Confirm the activation script was run
Navigate to System Definition > Scripts - Background. Before running the script, retrieve the groupSkillId and actionSkillId values from the sn_nowassist_skill_config table β copy the sys_id of the grouping skill record and the action strategy skill record for your use case.
Activation script (from official documentation):
var groupSkillId = ""; // Replace with sys_id of GAF grouping skill config var actionSkillId = ""; // Replace with sys_id of GAF action strategy skill config var topicSkillId = "43bce9e477e012103f075cea5b5a998f"; // Constant β do not change new sn_gaf.GAFUtils().activate(groupSkillId, topicSkillId, actionSkillId, "run_once");
The topicSkillId value 43bce9e477e012103f075cea5b5a998f is a platform-provided constant confirmed in the official configure-gaf documentation. Do not replace it. On a test instance, this sys_id corresponds to the GAF topics skill config record β the topic-labeling skill responsible for applying LLM-generated, human-readable names to clusters.
After execution, the system log may display entries similar to the following:
sn_gaf_sysauto_script insert sys_trigger insert GAFutils activated skill config IDs for Group skill with ID ...
sysauto_script insertions, the script executed successfully. Absence of these specific strings does not indicate failure β confirm scheduled job creation in Step 3.Step 3: Verify scheduled jobs
Navigate to:
sysauto_script.list
Filter by Name contains GAF. On a test instance, a successful activation produces the following job types β all confirmed in sysauto_script:
- GAF β Run Offline Flow β the primary clustering job; may appear as multiple records with different schedules (Periodically every ~28 days, Once, or On Demand) depending on how many times activation was run
- GAF ML Training Job β created per activation run with run type "Once"; handles ML model training for clustering
- List GAF group process new records β runs Daily; processes newly created records against existing clusters
Remediation if no GAF scheduled jobs appear: Re-run the activation script from Step 2 with valid groupSkillId and actionSkillId values. Scheduled jobs are created as part of activation script execution β if they are missing, the script either was not run or ran with empty skill IDs.
Step 4: Run the offline flow (if needed)
If the offline flow has not run since activation, execute it manually:
- Navigate to
sysauto_script.list - Search for GAF β Run Offline Flow
- Open the record and click Execute Now
- Wait a few minutes, then proceed to Step 5
Step 5: Check for clustering output
Navigate to:
sn_gaf_record_group.list
Look for:
- Recent entries matching the last offline flow run date
- Populated Description fields containing LLM-generated, human-readable cluster names β for example, on a test instance: "Login failure after Alectri update", "Mobile app performance and access issues", "Delayed price updates in cart causing checkout errors". The number of groups and their sizes will vary by instance depending on data volume and clustering criteria
- Group Skill ID referencing the grouping skill (for example, GAF ITSM grouping)
- Non-empty Group size field. Note: the Quality field is empty on all records on a test instance β do not rely on it as a confirmation signal
If sn_gaf_record_group is empty, no clustering has been executed yet. Remediation steps:
- Go to
sysauto_script.list - Search for GAF β Run Offline Flow
- Open the record and click Execute Now
- Wait a few minutes, then check:
sn_gaf_record_groupβ for group clusterssn_gaf_record_group_detailβ for record-to-group mappings
If still empty after running the flow, verify:
- The skill config is correctly linked to a valid task table (for example, incident, case)
- There are at least 2,000 eligible records in that table with meaningful short descriptions
- The
groupSkillIdused in the activation script was not left blank - The
topicSkillIdwas not modified from the platform-provided constant
Step 6: Confirm record assignment
Navigate to:
sn_gaf_record_group_detail.list
Confirm that incident records are listed with Group Skill ID referencing the grouping skill (for example, GAF ITSM grouping) and Active set to true.
On a test instance, the Document ID column in this table renders as a display value in the format Incident: INCxxxxxxx (for example, Incident: INC0822569). When querying this field programmatically in Step 7, you must use the underlying sys_id of the incident record β not the INC number.
Step 7: Verify group membership for a specific record
Use this script in Scripts - Background to confirm whether a specific record has been assigned to a group. Replace <incident_sys_id> with the sys_id of the record you want to check.
Check group membership for a record:
var gr = new GlideRecord('sn_gaf_record_group_detail');
gr.addQuery('document_id', '<incident_sys_id>');
gr.query();
while (gr.next()) {
gs.info("Record is part of group: " + gr.getValue('record_group'));
}
The document_id field links the clustered record (for example, an incident) to its group. If the script returns group IDs, the record is clustered. Each output line references the sys_id of a group in sn_gaf_record_group:
*** Script: Record is part of group: 48f40abc0fb2aa10ba24c9d530d1b2e0 *** Script: Record is part of group: 22f81def3b4f6a50c74142c643e45ab2 *** Script: Record is part of group: 7d68e5f03bb22e10c74142c643e45a47 *** Script: Record is part of group: b3f642dc3ba66610c74142c643e45aa5 *** Script: Record is part of group: ece642d80faee210ba24c9d530d1b29b *** Script: Record is part of group: 5d7b0b7d3b6a2610c74142c643e45a00
It is possible for a single record to appear in multiple groups if:
- The clustering logic was run more than once (for example, manually triggered multiple times)
- The record matched more than one clustering criterion (overlapping topics or similarity thresholds)
- Multiple skill configs or flows are active simultaneously (for example, ITSM and HR grouping)
To inspect a specific group, navigate to:
https://<InstanceName>.service-now.com/sn_gaf_record_group_list.do?sysparm_query=sys_id=<group_id>
Optional: Use predictGroup() for new records
Use predictGroup() only for new or unclustered records. It will return undefined for records already processed by the offline flow β this is expected behavior, not an error. To test prediction logic on a new, unclustered record:
Prediction test for a new, unclustered record:
var gaf = new sn_gaf.GAFPrediction();
var result = gaf.predictGroup("<new_record_sys_id>", "<groupSkillId>");
gs.info("GAF Prediction Result: " + JSON.stringify(result));
Troubleshooting reference
| Problem | Likely cause | Fix |
|---|---|---|
sn_gaf_record_group is empty after running the offline flow |
Fewer than 2,000 eligible records in the target table, or groupSkillId was blank when activation script ran |
Verify record count and re-run activation script with a valid groupSkillId |
No GAF scheduled jobs in sysauto_script |
Activation script ran with empty skill IDs, or was never run | Re-run activation script with both groupSkillId and actionSkillId populated |
| GAF produces no results despite jobs being active | AI Search prerequisites not completed β embedding model inactive or tables not indexed | Complete prerequisite Steps P1βP5 in the AI Search section above |
predictGroup() returns undefined |
Record was already processed by the offline flow β expected behavior | Use the sn_gaf_record_group_detail GlideRecord script in Step 7 instead |
| Only one scheduled job appears after activation | Online clustering not enabled for this use case β offline flow is the confirmed default | No action needed if you only require offline clustering |
Resources
| Resource | Where |
|---|---|
| Configure Group Action Framework | ServiceNow Docs β configure-gaf (Yokohama) |
| Set up AI Search for GAF | ServiceNow/ServiceNowDocs β setup-ai-search-gaf.md (GitHub) |
| Group Action Framework overview | ServiceNow Docs β group-action-framework |
| GAF FAQ | ServiceNow Community β GAF FAQ |
| Group-Action Framework plugin | ServiceNow Store β sn_gaf |
Three takeaways
- AI Search is a hard dependency, not optional. GAF produces no results if AI Search is not enabled and the target table is not indexed with both Keyword and Semantic Ingestion State at "Indexed." This prerequisite is stated explicitly in official documentation and is the leading cause of silent GAF failures.
- Skill config records confirm seeding, not activation. Running the
GAFUtilsbackground script with valid skill IDs is what creates the scheduled jobs and triggers clustering. Seeding and activation are separate states. - An empty
sn_gaf_record_groupis a starting point, not a verdict. Work through the checklist in order β AI Search indexing, activation script execution, scheduled job presence, record count, and flow execution β before concluding that activation failed.
Start here: Navigate to All > AI Search > AI Search Status and confirm "AI Search is ready" before touching anything else. If AI Search is not ready, everything downstream β scheduled jobs, clustering, prediction β will silently produce nothing.
- 3,815 Views
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.