predictive-intelligence

Predictive Intelligence for ServiceNow

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "predictive-intelligence" with this command: npx skills add groeimetai/snow-flow/groeimetai-snow-flow-predictive-intelligence

Predictive Intelligence for ServiceNow

Predictive Intelligence uses machine learning to automate categorization, routing, and recommendations.

PI Capabilities

Capability Use Case

Classification Auto-categorize incidents, cases

Similarity Find similar records

Clustering Group related items

Regression Predict numeric values

Recommendation Suggest next actions

Key Tables

Table Purpose

ml_solution

ML solution definitions

ml_solution_definition

Solution configuration

ml_capability_definition

Capability settings

ml_model

Trained models

ml_prediction_result

Prediction results

Classification (ES5)

Configure Classification Solution

// Create classification solution (ES5 ONLY!) // Note: Usually done via UI, shown for understanding

var solution = new GlideRecord("ml_solution") solution.initialize()

solution.setValue("name", "Incident Category Classifier") solution.setValue("label", "Incident Category Classifier") solution.setValue("table", "incident") solution.setValue("active", true)

// Capability type solution.setValue("capability", "classification")

// Target field to predict solution.setValue("target_field", "category")

// Input fields for training solution.setValue("input_fields", "short_description,description")

solution.insert()

Get Classification Prediction

// Get classification prediction for record (ES5 ONLY!) function getClassificationPrediction(tableName, recordSysId, solutionName) { var predictor = new sn_ml.ClassificationPredictor(solutionName)

var gr = new GlideRecord(tableName) if (!gr.get(recordSysId)) { return null }

try { var result = predictor.predict(gr)

return {
  predicted_value: result.getPredictedValue(),
  confidence: result.getConfidence(),
  top_predictions: result.getTopPredictions(5),
}

} catch (e) { gs.error("Prediction failed: " + e.message) return null } }

Apply Prediction to Record

// Auto-apply classification prediction (ES5 ONLY!) // Business Rule: before, insert, incident

;(function executeRule(current, previous) { // Skip if already categorized if (current.category) { return }

var solutionName = "incident_category_classifier"

try { var predictor = new sn_ml.ClassificationPredictor(solutionName) var result = predictor.predict(current)

// Only apply if confidence is high enough
if (result.getConfidence() >= 0.8) {
  current.category = result.getPredictedValue()
  current.work_notes =
    "Category auto-assigned by Predictive Intelligence " +
    "(Confidence: " +
    Math.round(result.getConfidence() * 100) +
    "%)"
}

} catch (e) { gs.warn("Classification prediction failed: " + e.message) } })(current, previous)

Similarity (ES5)

Find Similar Records

// Find similar incidents (ES5 ONLY!) function findSimilarIncidents(incidentSysId, maxResults) { maxResults = maxResults || 5

var incident = new GlideRecord("incident") if (!incident.get(incidentSysId)) { return [] }

try { var similarity = new sn_ml.SimilarityPredictor("incident_similarity") var results = similarity.findSimilar(incident, maxResults)

var similar = []
for (var i = 0; i < results.length; i++) {
  var match = results[i]
  similar.push({
    sys_id: match.getRecordSysId(),
    similarity_score: match.getSimilarityScore(),
    record: match.getRecord(),
  })
}

return similar

} catch (e) { gs.error("Similarity search failed: " + e.message) return [] } }

Similar Record Widget

// Widget Server Script for similar records (ES5 ONLY!) ;(function () { if (!input || !input.table || !input.sys_id) { data.similar = [] return }

var solutionName = input.table + "_similarity"

try { var gr = new GlideRecord(input.table) if (!gr.get(input.sys_id)) { data.similar = [] return }

var similarity = new sn_ml.SimilarityPredictor(solutionName)
var results = similarity.findSimilar(gr, 5)

data.similar = []
for (var i = 0; i < results.length; i++) {
  var match = results[i]
  var record = match.getRecord()

  data.similar.push({
    sys_id: match.getRecordSysId(),
    score: Math.round(match.getSimilarityScore() * 100),
    number: record.getValue("number"),
    short_description: record.getValue("short_description"),
    state: record.state.getDisplayValue(),
  })
}

} catch (e) { data.error = "Similarity search unavailable" data.similar = [] } })()

Clustering (ES5)

Get Cluster Assignment

// Get cluster for record (ES5 ONLY!) function getClusterAssignment(tableName, recordSysId, solutionName) { var gr = new GlideRecord(tableName) if (!gr.get(recordSysId)) { return null }

try { var clustering = new sn_ml.ClusteringPredictor(solutionName) var result = clustering.predict(gr)

return {
  cluster_id: result.getClusterId(),
  cluster_label: result.getClusterLabel(),
  confidence: result.getConfidence(),
}

} catch (e) { gs.error("Clustering failed: " + e.message) return null } }

Analyze Clusters

// Get cluster statistics (ES5 ONLY!) function getClusterStats(solutionName) { var stats = []

var cluster = new GlideRecord("ml_cluster") cluster.addQuery("solution.name", solutionName) cluster.query()

while (cluster.next()) { stats.push({ cluster_id: cluster.getValue("cluster_id"), label: cluster.getValue("label"), size: parseInt(cluster.getValue("record_count"), 10), keywords: cluster.getValue("keywords"), }) }

return stats }

Training Models (ES5)

Trigger Model Training

// Trigger retraining of ML solution (ES5 ONLY!) function retrainSolution(solutionName) { var solution = new GlideRecord("ml_solution") if (!solution.get("name", solutionName)) { gs.error("Solution not found: " + solutionName) return false }

try { // Queue training job var trainer = new sn_ml.MLTrainer() trainer.train(solution.getUniqueValue())

gs.info("Training queued for solution: " + solutionName)
return true

} catch (e) { gs.error("Training failed: " + e.message) return false } }

Check Training Status

// Check model training status (ES5 ONLY!) function getTrainingStatus(solutionName) { var model = new GlideRecord("ml_model") model.addQuery("solution.name", solutionName) model.orderByDesc("sys_created_on") model.setLimit(1) model.query()

if (model.next()) { return { model_id: model.getUniqueValue(), status: model.getValue("state"), accuracy: model.getValue("accuracy"), trained_on: model.getValue("sys_created_on"), record_count: model.getValue("training_record_count"), } }

return null }

Prediction Results (ES5)

Store Prediction Feedback

// Record prediction feedback for model improvement (ES5 ONLY!) function recordPredictionFeedback(predictionSysId, wasCorrect, actualValue) { var prediction = new GlideRecord("ml_prediction_result") if (!prediction.get(predictionSysId)) { return false }

prediction.setValue("feedback", wasCorrect ? "correct" : "incorrect") prediction.setValue("actual_value", actualValue) prediction.setValue("feedback_date", new GlideDateTime()) prediction.setValue("feedback_user", gs.getUserID())

prediction.update()

return true }

Analyze Prediction Accuracy

// Get prediction accuracy stats (ES5 ONLY!) function getPredictionAccuracy(solutionName, days) { days = days || 30

var startDate = new GlideDateTime() startDate.addDaysLocalTime(-days)

var ga = new GlideAggregate("ml_prediction_result") ga.addQuery("solution.name", solutionName) ga.addQuery("sys_created_on", ">=", startDate) ga.addNotNullQuery("feedback") ga.addAggregate("COUNT") ga.groupBy("feedback") ga.query()

var stats = { correct: 0, incorrect: 0 }

while (ga.next()) { var feedback = ga.getValue("feedback") var count = parseInt(ga.getAggregate("COUNT"), 10) stats[feedback] = count }

var total = stats.correct + stats.incorrect stats.accuracy = total > 0 ? Math.round((stats.correct / total) * 100) : 0 stats.total = total

return stats }

MCP Tool Integration

Available Tools

Tool Purpose

snow_query_table

Query ML tables

snow_execute_script_with_output

Test predictions

ml_predict_change_risk

Predict change risk

ml_detect_anomalies

Anomaly detection

Example Workflow

// 1. Query ML solutions await snow_query_table({ table: "ml_solution", query: "active=true", fields: "name,table,capability,target_field", })

// 2. Check model status await snow_query_table({ table: "ml_model", query: "solution.active=true", fields: "solution,state,accuracy,sys_created_on", })

// 3. Test prediction await snow_execute_script_with_output({ script: var result = getClassificationPrediction('incident', 'inc_sys_id', 'incident_classifier'); gs.info(JSON.stringify(result)); , })

Best Practices

  • Quality Data - Clean training data is essential

  • Feature Selection - Choose relevant input fields

  • Confidence Thresholds - Only apply high-confidence predictions

  • Feedback Loop - Collect user feedback

  • Regular Retraining - Update models periodically

  • Monitor Accuracy - Track prediction performance

  • Fallback - Have manual process when prediction fails

  • ES5 Only - No modern JavaScript syntax

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

scheduled-jobs

No summary provided by upstream source.

Repository SourceNeeds Review
General

document-management

No summary provided by upstream source.

Repository SourceNeeds Review
General

reporting-dashboards

No summary provided by upstream source.

Repository SourceNeeds Review