Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Expand
titleНажмите здесь, чтобы развернуть пример сценария
Code Block
//
// Приветственный сценарий с авторизацией пользователя и отправкой проверочного кода на почту
//
// Настройки сценария
// Укажите адреса для API вызовов  
установитьПеременную("get_user_url", "https://itsm.company.ru/api/v1/getUser")+
установитьПеременную("post_url", "http://porter/api/postman/mail")+
//
// Укажите API ключ для запросов на получение данных о пользователях
установитьПеременную("apikey", "ХХХХХХХХХ==")+
//
// Сценарий считывает табельный номер из профиля пользователя
установитьПеременную("user_tabNumber", "{userPayload.tabNumber}") +
//
// Если табельный номер проставлен, то сценарий сразу передает запрос в базы знаний без процедуры аутентификации
// В дальнейшем сбда можно вставить проверку времени действия аутентификации или проверку на увольнение сотрудника
если("{user_tabNumber} != ").то(
  завершитьСНовымЗапросом("{platformInMessageQuery}")
)+
//
// Приветственное сообщение для неавторизованных пользователей
сообщениеПользователю.сШаблоном("Привет, я - бот-помощник. Для работы с ботом приготовьте, пожалуйста, свой табельный номер и проверьте доступ к рабочей электронной почте.") +
//
// Задаем пользователю вопрос с просьбой ввести табельный номер, для того чтобы использовать его в сервисах для получения данных о пользователе.
задатьПользователюВопрос("Введите свой табельный номер.").сохранитьРезультат("entered_tabNumber") +
//
// Запрос в ITSM систему на получение данных о пользователе по табельному номеру
вызвать.внешнийСервис("{get_user_url}","GET").сПараметрами(("tabNumber","{entered_tabNumber}")).сЗаголовками(("Content-Type", "application/json"),("apikey","{apikey}")).сохранитьРезультатКакСтроку("answer") +
//
// Проверка результатов запроса, в случае ошибки сценарий сообщит об ошибке, завершится и закроет диалог
если("{http_code} > 200").то(  
    комментарий("При запросе на поиск пользователя возникла ошибка {http_code}, текст ошибки {answer}")+
    сообщениеПользователю.сШаблоном("При поиске учетной записи возникла ошибка {http_code}. Обратитесь в техническую поддержку.")+ 
    завершитьИЗакрытьДиалог()  
  )+
//
// Разбор ответа от ITSM системы, получение адреса электронной почты пользователя и генерация проверочного кода
// В дальнейшем можно добавить получение и сохранение данных пользователя помимо электронной почты
выполнитьJs("""
var error = 0;
var user_email = '';

try {
    var answerParced = JSON.parse(answer);
} catch(err) {    
    var answerParced = {};
}  

if (answerParced.hasOwnProperty('email')) {
  user_email = answerParced.email;
  var splited = user_email.split('@');
  
  var firstPart = splited[0];
  if (firstPart.length > 4) {
    var tempString = firstPart.slice(2,firstPart.length-2);
    var draftString = '***************************************'.slice(0,tempString.length);
    var firstPartString = firstPart.slice(0,2) + draftString + firstPart.slice(firstPart.length-2,firstPart.length);
  }   

  if (firstPart.length == 4) {var firstPartString = firstPart.slice(0,1) + '**';}
  if (firstPart.length == 3) {var firstPartString = firstPart.slice(0,1) + '*';}
  if (firstPart.length == 2) {var firstPartString = firstPart[0] + '*';}
  if (firstPart.length < 2) {var firstPartString =  '*';}

  var res = firstPartString+'@'+splited[1];

  var pass_code = Math.floor(Math.random() * (9999 - 1000 + 1) + 1000);
} else {
  error = 1;
}
    
var exit = {'error':error, 'user_email':user_email, 'user_email_hidden':res, 'pass_code':pass_code};
exit;
""") +
//
// Если при разборе ответа от ITSM системы возникли ошибки, то сценарий сообщит пользователю, завершится и закроет диалог
если("{error} == 1").то(
  комментарий("При разборе ответа возникла ошибка, текст ответа {answer}")+
  сообщениеПользователю.сШаблоном("При поиске учетной записи возникла ошибка. Обратитесь в техническую поддержку.")+ 
  завершитьИЗакрытьДиалог()
) +
//
// Сценарий отправляет письмо с кодом на адрес полученный из ITSM системы
вызвать.внешнийСервис("{post_url}","POST").сЗаголовками(("Content-Type", "application/json")).сТеломСообщения("""{"to": "{user_email}","from":"no-reply@autofaq.ai", "subject":"Подключение к боту","body":"Кто-то пытается подключиться к боту используя ваш табельный номер. Если это сделали не Вы, то обратитесь пожалуйста в службу технической поддержки. Если это вы, то введите этот секретный код {pass_code}. <br>Внимание! Никому не сообщайте этот код!"}""").сохранитьРезультатКакСтроку("answer_email") +
//
// Проверка результатов запроса, в случае ошибки сценарий сообщит об ошибке, завершится и закроет диалог
если("{http_code} > 200").то(  
    комментарий("При отправке письма с проверочным кодом возникла ошибка {http_code}, текст ошибки {answer_email}")+
    сообщениеПользователю.сШаблоном("При отправке письма с проверочным кодом возникла ошибка {http_code}. Пожалуйста, попробуйте подключиться к боту позднее.")+ 
    завершитьИЗакрытьДиалог()  
)+
//
// Сценарий выводит отправленный пользователю пароль и адрес почты в комментарий диалога для администратора сервиса
комментарий("Пользователю на адрес {user_email} был отправлен код {pass_code}")+
//
// Метка для повторного ввода кода
установитьМетку("point_password_enter") +
//
// Сценарий просит пользователя ввести секретный код
задатьПользователюВопрос("На вашу электронную почту {user_email_hidden} был отправлен код. Пожалуйста введите его").сохранитьРезультат("entered_pass_code") +
//
// ПЕрвая проверка корректности введенного кода, если код введен неверно то сценарий переход на метку для повторного ввода, но не более 3 раз
если("{entered_pass_code} != {pass_code}").то(
  сообщениеПользователю.сШаблоном("Вы ввели неверный код. Попробуйте ввести еще раз. Максимальное число попыток - 3.")+  
  перейтиНаМетку("point_password_enter").неБольше(3)
) +
//
// Финальная проверка корректности кода, если на этом этапе код указан неверно, то сценарий сообщит об ошибке, завершится и закроет диалог
если("{entered_pass_code} != {pass_code}").то(
  сообщениеПользователю.сШаблоном("Вы три раза ввели неверный код. Обратитесь в техническую поддержку.")+  
  завершитьИЗакрытьДиалог() 
) +
//
// В случае успешного ввода кода сценарий сохраняет адрес электронной почты и табельный номер в профиле пользователя
установитьПеременнуюПользователю("userPayload.tabNumber", "{entered_tabNumber}") +
установитьПеременнуюПользователю("userEmail", "{user_email}") +
сообщениеПользователю.сШаблоном("Вы успешно подключились к боту.") +
// 
// Проверка наличия ответа на запрос пользователя в базах знаний
запросВБазыЗнаний("{platformInMessageQuery}", "botKnows")+
//
// В базах знаний есть прямой ответ, сценарий передает запрос в базы знаний
если("{botKnows} == true").то(  
  завершитьСНовымЗапросом("{platformInMessageQuery}")
)+
//
// В базах знаний нет прямого ответа на запрос пользователя, сценарий предоставляет выбор основных вариантов действий - пользователь может выбрать один из вариантов или написать запрос еще раз
задатьПользователюВопрос("Не совсем поняла, чем помочь. Вот основные варианты действий - выбери вариант или напиши свой запрос иначе.").сВариантамиОтвета("Создать заявку","Посмотреть список заявок").сохранитьРезультат("userChoice") +
//
// Сценарий передает выбор пользователя в базы знаний и завершается
завершитьСНовымЗапросом("{userChoice}")

Генерируем ответ для общих вопрос из GPT

Сценарий интеграции на поступление диалога в систему проверяет последовательно каждый вопрос пользователя, пока уровень уверенности предоставленного ответа из БЗ болталка будет равен или выше заданного уровня.

Для подключения сценария необходимо наличие токена для авторизации в GPT

Expand
Code Block
// Адрес API ендпойнтов для отправки вопроса пользователя в БЗ болталка 
установитьПеременную("kb_qna_enpoint", "https://<url_сервиса>/core-api/query/api/v1/query")+
// Укажите токен авторизации для отправки запроса в базы знаний 
установитьПеременную("autorizationToken", "<ID_токен_сервиса>")+
// Укажите порог уверенности, при котором обращаемся в GPT
установитьПеременную("mConfidence", "0.9") +
// Данные БЗ болталка - ИД БЗ болталка и токен БЗ болталка
установитьПеременную("kb_ids", "<ID_БЗ_болталка>")+
установитьПеременную("kb_tokens", "<токен_БЗ_болталка>")+
// Сохраняем текст запроса для отправки в базы знаний
установитьПеременную("queryText", "{platformInMessageQuery}")+
//Адрес API ендпойнтов GPT и токен авторизации 
установитьПеременную("gpt","https://api.openai.com/v1/chat/completions")+
установитьПеременную("autorizationTokengpt","<токен_gpt>")+
//отправляем вопрос пользователя в БЗ болталка
установитьМетку("запросвболталку")+
выполнитьJs("""
var tag = {"service_id":kb_ids,"service_token":kb_tokens,"query":queryText,"top_k":"1"};
var exit = {'tag':JSON.stringify(tag)};
exit;
""")+
вызвать.внешнийСервис("{kb_qna_enpoint}","POST").сЗаголовками(("Content-Type", "application/json"),("charset", "utf-8"),("AUTOFAQ-User-Token", "{autorizationToken}")).сТеломСообщения("{tag}").сохранитьРезультатКакСтроку("uanswer")+
// Проверка резльтатов запрос, если запрос завершился с ошибкой сценарий оставляет комментарий для администратора сервиса 
если("{http_code} != 200").то(  
 комментарий("При запросе на классификацию возникла ошибка {http_code}, текст ошибки {uanswer}")
)+
//
комментарий("{uanswer}")+
//получаем уровень уверенности ответа топ 1 и сравниваем c заданным нами порогом
выполнитьJs("""
var a;
var result = JSON.parse(uanswer);
var score = result.results[0].score;
if (score >= mConfidence){
  a = 1;
}
else {
  a = 0;
}
var exit = {'score':result.results[0].score, 'a':a};
exit;
""")+
//пропускаем обращение в GPT
если("{a} == 0").то(
  завершитьСНовымЗапросом("{queryText}")
)+
//обращаемся в GPT и проверяем следующий вопрос пользователя на наличие ответа в болталке
если("{a} == 1").то(
выполнитьJs("""
var taggpt = {"model":"gpt-3.5-turbo","temperature":0.7,"messages":[{"role":"system","content":"Я умный чатбот, который является почетным представителем компании Autofaq.ai. На вопрос я дам ответ. На оскорбительный вопрос или оскорбления я отвечу вежливо и учтиво. Email для связи с компанией Autofaq.ai - info@autofaq.ai."},{"role": "user","content":queryText}]};
var exit = {'taggpt':JSON.stringify(taggpt)};
exit;
""")+
вызвать.внешнийСервис("{gpt}","POST").сЗаголовками(("Content-Type", "application/json"),("Authorization","Bearer {autorizationTokengpt}")).сТеломСообщения("{taggpt}").сохранитьРезультатКакСтроку("answer")+
выполнитьJs("""
var result = JSON.parse(answer);
var exit = {'gptanswer':result.choices[0].message.content};
exit;
""")+
сообщениеПользователю.сШаблоном("{gptanswer}")+
задатьПользователюВопрос("Подскажите, чем я могу вам помочь?").сохранитьРезультат("queryText")+
перейтиНаМетку("запросвболталку")
)

Работа с API вызовами

Создание инцидента в ITSM системе через REST API

...