Намерение Dialogflow - PullRequest
       10

Намерение Dialogflow

0 голосов
/ 05 июля 2019

У меня возникает проблема при вызове API в диалоговом потоке Google.Я хочу вызвать API в первом намерении (getAPIData), а затем одновременно вызвать второе намерение (followOne) и затем третье намерение (followTwo).(Не хочу ждать завершения вызова API).В третьем намерении я хочу получить результат вызова API, который мы вызываем в первом намерении, и добавить ответ API агенту диалогового потока.Пожалуйста, просмотрите код для более подробной информации и дайте мне знать проблему.Для ответа API требуется более 11 секунд.

const {WebhookClient} = require('dialogflow-fulfillment');
const axios = require('axios');
const {Card, Suggestion, List, BrowseCarousel, BrowseCarouselItem} = require('dialogflow-fulfillment');

process.env.DEBUG = 'dialogflow:debug';

exports.GetAPIDataHandle = functions.https.onRequest((request, response) => {
let dialogflowResponse = '';

    const agent = new WebhookClient({ request, response });

        async function getAPIData(){
            axios.get('https://apiurl.com')
            .then((resp) => {
                dialogflowResponse = resp.data.data;
            })
            doTimeOut(3.5);
            agent.setFollowupEvent('followUpOne');
        }
        function followOne(agent){  
            doTimeOut(4);
            agent.setFollowupEvent('followUpTwo');
        }
        function followTwo(agent){  
                doTimeOut(4);

        if(dialogflowResponse != ''){
                    agent.add('Here is the search result.');
                    dialogflowResponse.map(result => {
                    agent.add(result.word);
                })

            }else{
                agent.add(`Please try again later`);  
            } 
        }

  let intentMap = new Map();
    intentMap.set('getFunnyWords', getAPIData);
    intentMap.set('followupeventone', followOne);
    intentMap.set('followupeventtwo', followTwo);
    agent.handleRequest(intentMap);  
});

function doTimeOut(numsec){
    var dt1 = new Date();
    dt1.setSeconds( dt1.getSeconds() + numsec);
    do{
    }while((new Date()).getSeconds() < dt1.getSeconds());
    }

Согласно текущему коду, мы получаем, что глобальная переменная dialogflowResponse не определена в третьем намерении.

1 Ответ

0 голосов
/ 08 июля 2019

Есть несколько способов добиться этого.

  1. Итак, вот пример , как вы можете объявить глобальную переменную в узле JS .
  2. Если вы не используете встроенный редактор Dialogflow, то лучше использовать базу данных Redis, это действительно быстро. Вы можете управлять сессией за сеансом по вашему запросу. Когда срабатывает followTwo intent webhook, вы можете получить данные из Redis, сохранить их в контексте и очистить Redis для других запросов. Coz Redis - это база данных в памяти, и существуют ограничения памяти.
  3. Используйте любую другую базу данных для хранения данных запроса.

Старайтесь не использовать глобальную переменную. Вместо этого используйте любую базу данных.

...