Диалоговое окно: вызов стороннего API из webhook и ожидание ответа - PullRequest
0 голосов
/ 22 апреля 2020

Я создаю чат-бота, у которого есть намерение со ссылкой для оплаты. Таким образом, при срабатывании этого намерения я сделал вызов от выполнения webhook к стороннему API, для ответа на который требуется около 20 секунд. Но в этот период мой ответ истекает, так как он ограничен 5 se c от Google.

Можете ли вы предложить, какой подход я должен следовать. Я просто хочу подождать около 20 секунд c, чтобы ответить.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Короткий ответ: вы не можете.

Более длинный ответ заключается в том, что вам нужно думать об этом как о разговоре. Если вы задали кому-то вопрос и не получили от него ответа в течение 20 секунд - это было бы довольно неудобно, не так ли?

Вместо этого мы придумали способы компенсировать это молчание , В физической беседе люди могут взаимодействовать с вами и задавать вам вопросы, чтобы заполнить время. Если вы разговариваете по телефону, они могут играть в Hold Musi c. Или мы можем на данный момент прекратить разговор и сообщить им позже, когда будет результат.

При построении Действия у нас есть аналогичные параллели, которые могут работать лучше или хуже в зависимости от наших точных потребностей.

Вступление в разговор

Один из подходов состоит в том, что когда мы получаем запрос от пользователя, мы делаем две вещи:

  1. Запускаем задачу, которая выполнит запросите и сохраните результаты в отдельной «базе данных ответов», индексированной по отношению к пользователю, идентификатору сеанса или некоторому другому временному идентификатору, который мы можем сгенерировать и использовать позже.
  2. Во время выполнения запроса мы отвечаем на Пользователь говорит, что мы работаем над этим, и задает ему еще один вопрос.

Затем, когда они отвечают своим ответом на этот другой вопрос, мы можем проверить, есть ли у нас ответ для них в базе данных. , Если мы сделаем, мы ответим с этим. Если нет, мы повторим шаг 2 до тех пор, пока мы не сделаем это.

Этот подход хорошо работает, если у нас есть другие вопросы, или если у нас хорошее место, чтобы «поболтать». Изображение при бронировании авиабилетов - когда мы ищем рейсы, мы можем спросить, предпочитают ли они места у окна или у прохода (о чем нам нужно будет спросить позже), или поговорить, поговорив, путешествуют ли они по делам или на отдыхе.

Использование «Hold Musi c»

Вариант этого позволяет нам сыграть немного Hold Musi c, пока мы обрабатываем ответ.

Вместо того, чтобы задавать вопрос на шаге 2 выше, мы отвечаем Media Response , который воспроизводит примерно 20 секунд музыки c. Когда musi c завершится, нашему веб-крюку выполнения будет отправлено событие MEDIA_STATUS, и мы можем либо вернуть информацию из базы данных ответов, либо сказать, что мы все еще работаем над этим и сыграть больше musi c.

Это менее разговорный, но может сработать лучше, если нам на самом деле пока нечего сказать.

Отправка уведомления

Если ответ может занять очень много времени, тогда лучше просто позволить им делать другие вещи и отправлять уведомление или текст или электронное письмо, когда у вас есть результат. В этих случаях, однако, требуется, чтобы пользователь каким-либо образом зарегистрировался у вас, и, вероятно, он более уместен, если у вас есть давние отношения с пользователем.

Резюме

Вы должны возвращать результаты так быстро, как только можете, чтобы они были похожи на разговор Когда вы не можете, подумайте о других средствах, например, о том, как мы будем считать, что было бы, если бы мы разговаривали с другим человеком.

0 голосов
/ 22 апреля 2020

Один из вариантов - поддерживать разговор, используя события (генерируемые webhook), которые запускают выделенные намерения.

Когда платеж должен быть выполнен, веб-крючок запускает фоновый процесс для обработки стороннего платежного API и ожидает 4-5 секунд c, после чего генерируется событие (setFollowupEvent PAYMENT_IN_PROGRESS). Это событие связано с намерением DialogFlow, которое срабатывает, как только событие отправляется обратно на платформу.
В этот момент у вас есть еще один входящий вызов webhook: проверьте состояние платежа, если он все еще выполняется (вероятно, после 5 se c) затем спите 4-5 se c и отправьте другое событие (setFollowupEvent PAYMENT_IN_PROGRESS_2), которое создает тот же рабочий процесс.

Вы можете сделать это очень много раз (я думаю, максимум 3), поэтому необходимо учитывать тот факт, что платеж не прекращается во времени (сценарий отката). Разумным вариантом может быть продолжение вовлечения пользователя в разговор, что не всегда легко, в зависимости от того, о чем говорит ваш чат-бот.

Надеюсь, это поможет.

...