switch
Тип ответа switch
позволяет перевести звонок или диалог в текстовом чате на оператора.
подсказка
Вы также можете переводить диалоги и звонки на оператора с помощью тегов действий
TransferToOperator
и TransferCallToOperator
.Свойства
В текстовых каналах
Для текстовых каналов все свойства необязательны.
Свойство | Тип | Описание |
---|---|---|
firstMessage | Строка | Текст сообщения, которое будет отправлено оператору после перевода диалога на него. Значение по умолчанию — последняя фраза пользователя. |
lastMessage | Строка | Текст сообщения, которое будет отправлено пользователю при завершении диалога с оператором с помощью команды, указанной в свойстве closeChatPhrases . |
closeChatPhrases | Массив | Список команд, с помощью которых пользователь может закрыть чат с оператором и вернуться к боту. При отправке команды чат закрывается. Команда обрабатывается в сценарии бота в контексте стейта, из которого произошел перевод на оператора. |
appendCloseChatButton | Логический | С помощью этой кнопки пользователь может прекратить общение с оператором и вернуться к диалогу с ботом. Текст кнопки берется из первого элемента массива closeChatPhrases . Если указано true , но массив closeChatPhrases пуст, кнопка не выводится. |
destination | Строка | Идентификатор группы операторов, на которую нужно перевести диалог. Свойство используется только для Aimychat и Operator API. |
theme | Строка | Тема обращения. Используется для подсчета статистики обращений пользователей в Aimychat. |
sendMessagesToOperator | Логический | Передавать ли оператору историю сообщений пользователя. Значение по умолчанию — false . |
sendMessageHistoryAmount | Число | Количество последних сообщений пользователя, которые будут переданы оператору. Указывайте это свойство, только если для sendMessagesToOperator вы передали значение true . |
attributes | Объект | Информация о пользователе, которую необходимо передать оператору. Укажите значение в формате: • Ключ — название поля, которое ожидает операторский чат. • Значение — информация, которую нужно передать оператору при переводе. Свойство используется только для операторских каналов LiveTex и Operator API. |
hiddenAttributes | Объект | Информация о пользователе, которую не нужно передавать оператору. Формат значения аналогичен свойству attributes . Свойство используется только для операторских каналов LiveTex и Operator API. |
ignoreOffline | Логический | Свойство определяет дальнейшие действия, если в момент перевода диалога нет свободных операторов: • true — выполнить принудительный перевод и ожидать свободных операторов. • false — не выполнять перевод. Значение по умолчанию — false . |
oneTimeMessage | Логический | Если указано true , то диалог не будет переведен на оператора. Вместо этого ему будет отправлено сообщение с текстом из свойства firstMessage , из которого он может получить информацию о пользователе. Значение по умолчанию — false . |
В телефонном канале
Для телефонного канала обязательно указать свойство phoneNumber
или sipUri
.
Свойство | Тип | Описание |
---|---|---|
phoneNumber | Строка | Номер телефона, на который будет переведен звонок. Перевод на добавочный номер не поддерживается. |
sipUri | Строка | Номер SIP-телефона, на который нужно перевести звонок. Если вы передаете sipUri , то передавать phoneNumber не нужно. |
timeout | Строка | Время ожидания ответа от оператора в секундах. Если звонок не был переведен на оператора после истечения timeout , то бот перейдет в ближайший стейт, в котором отслеживается событие transfer . Значение по умолчанию — 60 секунд. |
method | Строка | Способ маршрутизации вызова: • invite — перевод вызова с сохранением соединения. Это значение по умолчанию. • refer — перевод вызова без сохранения соединения. Если вы используете refer , то свойства headers , transferChannel , continueCall и continueRecording будут проигнорированы. |
headers | Объект | SIP-заголовки, которые будут передаваться в сообщении SIP INVITE на указанный номер. Данная возможность, как правило, используется для передачи АОН-информации об абоненте. |
transferChannel | Строка | botId для маршрутизации вызова через SIP-транк, который подключен к данному каналу. При этом будут применены параметры подключенного SIP-транка. |
continueCall | Логический | Если true , абонент будет возвращен к диалогу с ботом после разговора с оператором. Если false , звонок будет завершен. Если оператор недоступен, перевод на него не произойдет. Значение по умолчанию — false . |
continueRecording | Логический | Если true , разговор продолжает записываться во время диалога с оператором и после возвращения абонента в диалог с ботом. Запись звонка будет доступна в логах диалогов. Значение по умолчанию — false . |
подсказка
При переводе звонка на оператора вы можете:
• Отслеживать статус перевода абонента.
• Прописать в сценарии, что делать, если оператор недоступен.
• Настроить отображение номера абонента.
• Отслеживать статус перевода абонента.
• Прописать в сценарии, что делать, если оператор недоступен.
• Настроить отображение номера абонента.
Синтаксис
В текстовых каналах
state: TransferToAgent
intent!: /TransferToAgent
random:
a: Перевожу наш разговор на оператора.
a: Соединяю вас с оператором.
script:
$response.replies = $response.replies || [];
$response.replies.push({
"type": "switch", // Тип ответа бота.
"firstMessage": $jsapi.chatHistory(), // Оператор получит историю переписки пользователя с ботом.
"closeChatPhrases": ["/closeChat", "Закрыть диалог"] // Команды, с помощью которых пользователь сможет закрыть чат с оператором.
});
В телефонном канале
state: TransferToAgent
intent!: /TransferToAgent
random:
a: Перевожу вас на оператора. Пожалуйста, оставайтесь на линии.
a: Соединяю вас с оператором. Ожидайте, пожалуйста, на линии.
script:
$response.replies = $response.replies || [];
$response.replies.push({
type: "switch", // Тип ответа бота.
phoneNumber: "79123456789", // Номер телефона, на который будет переведен звонок.
// Вместо телефона можно передать SIP URI — номер SIP-телефона:
// sipUri: "79123456789@sip.voximplant.com",
timeout: "30", // Время ожидания ответа от оператора.
headers: { // SIP-заголовки.
"callReason": "support",
"crmClientId": $client.id || "none"
},
transferChannel: "237-test-237-VDQ-28334674", // botId канала. Вызов будет переведен через SIP-транк, который подключен к каналу.
continueCall: true, // Возвращаем абонента к диалогу с ботом после разговора с оператором.
continueRecording: true // Продолжаем запись разговора.
});
Ограничения на каналы
switch
не поддерживается в следующих каналах:
- В голосовых ассистентах:
- Алиса
- Маруся
- Сбер Салют
- Google Ассистент
- Aimybox
- Zendesk
- Zendesk Chat (перевод на оператора можно реализовать другим способом)
Использование в сценарии
В текстовых каналах
- main.sc
- chatbot.yaml
theme: /
state: SwitchSuggestion
random:
a: Соединить вас со специалистом?
a: Хотите, чтобы я перевёл чат на оператора?
buttons:
"Да" -> /Switch
"Нет" -> /AnythingElse
intent: /Agree || toState = /Switch
intent: /Disagree || toState = /AnythingElse
state: Switch
intent!: /TransferToAgent
random:
a: Перевожу наш разговор на оператора.
a: Соединяю вас с оператором.
script:
$response.replies = $response.replies || [];
$response.replies.push({
type: "switch",
firstMessage: $jsapi.chatHistory(), // Оператор получит историю переписки пользователя с ботом.
destination: $injector.operatorGroup, // Группа операторов, на которую будет переведен диалог.
lastMessage: "Ждем вас снова!"
});
state: BackToBot
event: livechatFinished
a: Чат с оператором завершен. На связи снова бот-помощник.
go!: /AnythingElse
state: AnythingElse
a: Могу ли я еще чем-нибудь вам помочь?
injector:
operatorGroup: 101
В телефонном канале
- main.sc
- functions.js
require: functions.js
theme: /
state: TransferToAgent
intent!: /TransferToAgent
if: isOff() // Вызываем функцию, которая проверяет, звонит абонент в рабочие часы или нет.
go!: /TransferToAgent/WorkingHours
else:
go!: /TransferToAgent/NotWorkingHours
state: WorkingHours
random:
a: Перевожу вас на оператора. Пожалуйста, оставайтесь на линии.
a: Соединяю вас с оператором. Ожидайте, пожалуйста, на линии.
script:
$response.replies = $response.replies || [];
$response.replies.push({
type: "switch",
phoneNumber: "79123456789",
transferChannel: "237-test-237-VDQ-28334674",
continueCall: true,
continueRecording: true
});
state: TransferError
event: transfer
if: $dialer.getTransferStatus().status === "FAIL"
a: Прошу прощения! По техническим причинам перевести звонок на специалиста не удалось. Пожалуйста, перезвоните позже.
go!: /AnythingElse
state: NotWorkingHours
random:
a: К сожалению, сейчас перевод на оператора невозможен.
a: Простите, сейчас я не могу соединить вас со специалистом.
a: Пожалуйста, перезвоните в рабочее время, с девяти до восемнадцати ноль ноль по будням.
go!: /AnythingElse
state: AnythingElse
a: Могу ли я еще чем-нибудь вам помочь?
state: Goodbye
intent!: /Bye
random:
a: Спасибо за ваш звонок. Всего доброго!
a: Благодарю за звонок. Всего доброго и хорошего дня!
go!: /HangUp
state: HangUp
event!: hangUp
script:
$dialer.hangUp("(Бот повесил трубку)");
$jsapi.stopSession();
function isOff() {
var currentTime = new Date($jsapi.currentTime());
var day = currentTime.getDay();
var hours = currentTime.getHours();
return day === 6 || day === 0 || hours < 9 || hours >= 18;
}