Навыки
Навык это готовый блок сценария с собственной формой настройки. Он добавляется на холст из панели инструментов слева (значки под кнопками типов звеньев), получает имя вида «Выбор 1», «API 2», а внутри создаёт служебный подпроцесс в папке skills/, который не нужно редактировать вручную. У каждого навыка есть переходы-исходы: «Успех» и «Ошибка» (у «Выбора» по одному переходу на каждый вариант и «Ошибка»). Настройки открываются двойным щелчком по звену.
Одиночный выбор
Задаёт вопрос с вариантами ответа и ведёт по разным переходам в зависимости от выбора.
| Вкладка | Что настроить |
|---|---|
| Основные | Вопрос и варианты: для каждого варианта название кнопки и значение. Через запятую можно перечислить альтернативы, которые клиент может набрать текстом вместо нажатия («да, конечно, ага») |
| Расширенные | Максимальное число попыток (по умолчанию 3), повторять ли вопрос при неверном ответе и что сказать перед повтором, имя переменной, куда записать выбранное значение, тип элемента содержимого для вопроса |
Переходы: «Если [вариант]» для каждого варианта и «Ошибка». Любой переход открывается двойным щелчком по нему на звене и показывается как «Если нажата кнопка» с вашим меню и выбранным вариантом; «Ошибка» срабатывает, если клиент так и не выбрал ни один вариант за отведённые попытки. Совпадение по тексту работает и через NLU: если вариант назван так же, как намерение, распознанное намерение тоже засчитывается.
Вызов API
Обращение к внешней системе по HTTP: CRM, ДБО, учётной системе, Helpdesk. В демонстрационном боте остатки по картам имитируются действиями, в реальном проекте на их месте стоит этот навык.
| Вкладка | Что настроить |
|---|---|
| Запрос | Метод (GET, POST, PUT, PATCH, DELETE), адрес и тело запроса. Адрес и тело принимают переменные: https://api.bank.local/cards/{{temp.card}}/balance, {"clientId": "{{user.id}}"} |
| Параметры | Заголовки запроса в JSON, например {"Authorization": "Bearer {{temp.token}}", "Content-Type": "application/json"} |
| Ответ | Хранилище и имя переменной, куда записать ответ (по умолчанию temp.response) |
В переменную попадает объект { body, status }: temp.response.body.balance, temp.response.status. При сетевой ошибке или ответе с кодом ошибки записывается только status, а переход идёт по «Ошибке». Переходы «Успех» и «Ошибка» проверяют temp.valid и !temp.valid.
Ключи и пароли внешних систем не вписывайте в заголовки открытым текстом: попросите администратора задать их переменными окружения сервера с префиксом EXPOSED_ и используйте в собственном действии (process.env.EXPOSED_CRM_TOKEN), см. «Действия и хуки». Ответ приходит в пределах тайм-аута диалога (converse.timeout, по умолчанию 5 секунд): медленные системы лучше вызывать асинхронно.
Заполнение слота
Получает от клиента конкретное значение (сумму, дату, город, адрес почты) и переспрашивает, пока не получит.
| Поле | Что настроить |
|---|---|
| Намерение и Слот для заполнения | Намерение, в котором описан слот, и сам слот (см. «Сущности, слоты и контексты») |
| Вопрос для уточнения | Элемент содержимого, которым бот спрашивает значение («Укажите сумму перевода») |
| Сообщение при ошибке ввода | Что сказать, если во фразе клиента нужного значения не нашлось |
| Количество попыток | После стольких неудач срабатывает переход «Ошибка» |
| Очистка после X переходов | Через сколько ходов диалога слот забывается (-1: не забывать) |
| Дополнительная валидация | Скрипт, который проверяет значение и записывает temp.valid = true или false (например, сумма не больше лимита) |
Значение слота доступно как session.slots.<имя слота>.value (платформа хранит заполненные слоты в сессии) и в event.nlu.slots на том ходу, когда клиент его назвал.
Отправка Email
Отправляет письмо через почтовый сервер, заданный администратором (параметр transportConnectionString модуля базовых навыков). Поля: отправитель, получатель, копия, скрытая копия, тема и текст письма; тема и текст выбираются из элементов содержимого и могут содержать переменные (Заявка от {{user.name}}). Переходы «Успех» и «Ошибка».
Переадресация диалога
Передаёт обращение в iQChannels оператору, группе операторов или обратно в очередь; бот после этого выходит из диалога.
| Поле | Что настроить |
|---|---|
| Куда передать диалог | На оператора (идентификатор оператора), на группу операторов (идентификатор группы) или вернуть в очередь. Идентификаторы берутся из iQChannels; можно подставить переменную, например {{temp.groupId}}, чтобы выбирать группу по теме вопроса |
| Тема обращения | Не менять, сбросить или установить тему (идентификатор темы в iQChannels): так обращение попадает в нужную очередь с правильной категорией |
| Сообщение клиенту | Текст, который клиент увидит перед передачей: «Переключаю вас на оператора» |
В демонстрационном боте так устроен процесс «Связь_с_оператором». Технически навык отправляет текстовый ответ с полями маршрутизации (operatorid, groupid, toqueue, categoryid), которые понимает iQChannels; в эмуляторе Studio передача не происходит, виден только текст.
Закрытие диалога
Отправляет в iQChannels команду закрыть обращение; клиент получает последнее сообщение («Обращение будет закрыто»). Используйте в конце сценариев, где вопрос решён полностью и оператор не нужен.
ИИ-агент
Передаёт вопрос клиента генеративной модели через шлюз iQGPT и возвращает ответ в переменную. Описан отдельно в разделе «ИИ-агент на основе GPT».
Общие правила
- После навыка всегда обрабатывайте оба исхода: оставленный без перехода исход «Ошибка» означает, что клиент зависнет без ответа.
- Навыки можно редактировать после создания (двойной щелчок), копировать вместе со звеном и переименовывать.
- Если в сценарии одна и та же операция повторяется (например, запрос номера карты с проверкой), вынесите её в отдельный процесс и вызывайте переходом к подпроцессу, а не копируйте навык.