Name

global.NluPredictOutcomeUtils

Description

No description available

Script

var NluPredictOutcomeUtils = Class.create();
NluPredictOutcomeUtils.prototype = {
  initialize: function() {},

  FAULTED_STATE: "faulted",
  CANCELED_STATE: "canceled",
  CLOSING: "closing",
  SKIPPED_WITH_NEW_UTTERANCE: "skipped_with_new_utterance",
  EXITED_WITH_NO_CONFIRMATION: "exited_with_no_confirmation",
  AI_SEARCH_FALLBACK: "ai_search_fallback",
  SEARCH_CATALOG_REQUESTED_EVENT: "ai_search_catalog_requested",
  SEARCH_RESULT_CLICKED: "ai_search_result_clicked",
  SEARCH_COMPLETED_EVENT: "ai_search_completed",


  updateNluOutcomeOnConversationEnd: function(sys_id, state) {
      var cancelTopic = false;
      var tasks = "";
      var payload = {};

      var messages = new GlideRecord("sys_cs_message");
      messages.addQuery("conversation", sys_id);
      messages.addQuery("direction", 'inbound');
      messages.orderByDesc("sequence");
      messages.query();
      while (messages.next()) {
          if (messages.getValue("payload").contains('cancelTopic')) {
              cancelTopic = true;
          }
          payload[messages.task.toString()] = messages.getValue("payload");
      }

      var tasksGr = new GlideRecord("sys_cs_conversation_task");
      tasksGr.query("conversation", sys_id);
      while (tasksGr.next()) {
          tasks = tasks + "," + tasksGr.getValue("sys_id");
      }

      this.updateNLUOutcome(tasks, cancelTopic, state, sys_id, payload);
  },

  updateNLUOutcome: function(tasks, cancelTopic, state, sys_id, payload) {
      var closeUtterance, utterance, lastUtterance, task;
      var closeConversation = false;
      var typedNewUtterance = false;
      var closingOutcomeUpdated = false;
      var aiSearchFallbackUtterances = [];
      var events = this.getAISearchFallbackEvents(sys_id);
      var topicId = sn_cs.VASystemObject.getContextProfileParamsForConversationId(sys_id, this.CLOSING);

      var open_nlu_predict_intent_feedback_gr = new GlideRecord("open_nlu_predict_intent_feedback");
      open_nlu_predict_intent_feedback_gr.addQuery("app_document", 'IN', tasks);
      open_nlu_predict_intent_feedback_gr.orderByDesc("sys_created_on");
      open_nlu_predict_intent_feedback_gr.query();

      while (open_nlu_predict_intent_feedback_gr.next()) {
          utterance = open_nlu_predict_intent_feedback_gr.getValue("utterance");
          task = open_nlu_predict_intent_feedback_gr.getValue("app_document");

          if (typedNewUtterance) {
              open_nlu_predict_intent_feedback_gr.setValue("nlu_discovery_outcome", this.SKIPPED_WITH_NEW_UTTERANCE);
              open_nlu_predict_intent_feedback_gr.update();
              typedNewUtterance = false;
          }

          typedNewUtterance = payload[task] && JSON.parse(payload[task])["searchText"] != null && JSON.parse(payload[task])["uiType"] == "Picker";

          if (open_nlu_predict_intent_feedback_gr.getValue("topic_switched") == topicId) {
              closeConversation = true;
              closeUtterance = utterance;
          }

          if ((cancelTopic || state === this.FAULTED_STATE || state === this.CANCELED_STATE) && !lastUtterance) {
              lastUtterance = {
                  "utterance": utterance,
                  "task": task
              };
          }

          if (!closingOutcomeUpdated && closeConversation && (utterance !== closeUtterance)) {
              open_nlu_predict_intent_feedback_gr.setValue("nlu_discovery_outcome", this.EXITED_WITH_NO_CONFIRMATION);
              open_nlu_predict_intent_feedback_gr.update();
              closingOutcomeUpdated = true;
          }

          if (events["idToUtteranceMap"] && events["idToUtteranceMap"][utterance]) {
              var searchId = events["idToUtteranceMap"][utterance];
              var eventMetrics = events[searchId] && events[searchId]["metrics"];
              // Priority of events to log.
              if (eventMetrics.indexOf("SEARCH_CATALOG_REQUESTED_EVENT") !== -1) {
                  aiSearchFallbackUtterances.push(utterance);
                  this.updateNluDiscoveryOutcome(open_nlu_predict_intent_feedback_gr, this.SEARCH_CATALOG_REQUESTED_EVENT);
              } else if (eventMetrics.indexOf("SEARCH_RESULT_CLICKED") !== -1) {
                  aiSearchFallbackUtterances.push(utterance);
                  this.updateNluDiscoveryOutcome(open_nlu_predict_intent_feedback_gr, this.SEARCH_RESULT_CLICKED);
              } else if (eventMetrics.indexOf("SEARCH_COMPLETED_EVENT") !== -1) {
                  aiSearchFallbackUtterances.push(utterance);
                  this.updateNluDiscoveryOutcome(open_nlu_predict_intent_feedback_gr, this.SEARCH_COMPLETED_EVENT);
              } else if (eventMetrics.indexOf("SEARCH_RESULT_DISPLAYED") !== -1) {
                  aiSearchFallbackUtterances.push(utterance);
                  this.updateNluDiscoveryOutcome(open_nlu_predict_intent_feedback_gr, this.AI_SEARCH_FALLBACK);
              }
          }
      }

      if ((cancelTopic && !closeConversation) || state === this.FAULTED_STATE || state === this.CANCELED_STATE) {
          if (aiSearchFallbackUtterances.indexOf(lastUtterance.utterance) === -1) {
              this.updateOutcomeWithNoConfirmation(lastUtterance);
          }
      }
  },

  updateNluDiscoveryOutcome: function(gr, value) {
      gr.setValue("nlu_discovery_outcome", value);
      gr.update();
  },

  updateOutcomeWithNoConfirmation: function(lastUtterance) {
      var nlu_predict_intent_feedback_gr = new GlideRecord("open_nlu_predict_intent_feedback");
      nlu_predict_intent_feedback_gr.addQuery("app_document", lastUtterance.task);
      nlu_predict_intent_feedback_gr.addQuery("utterance", lastUtterance.utterance);
      nlu_predict_intent_feedback_gr.query();
      if (nlu_predict_intent_feedback_gr.next()) {
          this.updateNluDiscoveryOutcome(nlu_predict_intent_feedback_gr, this.EXITED_WITH_NO_CONFIRMATION);
      }
  },

  getAISearchFallbackEvents: function(conversationId) {
      var events = {};
      var analytics = new GlideRecord("sys_ci_analytics");
      analytics.addQuery("conversation", conversationId);
      analytics.query();

      while (analytics.next()) {
          var metrics = analytics.getValue("metric");
          var metricsJSON = JSON.parse(metrics);
          var searchId = metricsJSON["Search Id"];
          var eventName = metricsJSON["Name"];

          if (events[searchId] == null) {
              events[searchId] = {
                  "metrics": [eventName]
              };
          } else {
              events[searchId]["metrics"].push(eventName);
          }
          if ("SEARCH_TRIGGERED" === eventName) {
              events["idToUtteranceMap"] = events["idToUtteranceMap"] == null ? {} : events["idToUtteranceMap"];
              var searchTerm = metricsJSON["Search Term"];
              events["idToUtteranceMap"][searchTerm] = searchId;
              events[searchId]["searchTerm"] = metricsJSON["Search Term"];
              events[searchId]["taskId"] = analytics.getValue("document_id");
          }
      }
      return events;
  },

  type: 'NluPredictOutcomeUtils'
};

Sys ID

18d763a9776921101b53c5ed3c5a9933

Offical Documentation

Official Docs: