Сохранение данных сеанса для Google Actions с помощью Dialogflow и WebhookClient (v2 API) - PullRequest
0 голосов
/ 31 октября 2018

Я сохранял свои переменные сеанса как контексты , и в предыдущих выпусках он работал нормально.

На этот раз, когда я проверил, этот код перестал работать.

У моего package.json есть зависимости

"dependencies": {
    "actions-on-google": "^2.4.0",
    .
    .
    .
    "dialogflow-fulfillment": "^0.6.0"
  }

Тогда мой код выглядит как

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    const agent = new WebhookClient({ request, response });


    // Handle the Dialogflow intent named 'welcome'.
    function welcome(agent) {
          const sessionVars = {'userLang': 'en',  // possibilites handled - 'en', 'hi'
                          'words': [],
                          'questions': [],
                          'currentIndexPosition': 0,
                          'score': 0,
                        };

          const sessionContext = {'name': KEY_SESSION, 'lifespanCount': 10000, 'parameters': sessionVars};
          agent.setContext(sessionContext);
        .
        .
        .
        //Rest of the code
        }


        // Start a new round of learning by selecting words
        function startLearning(agent) {

        let sessionContext = agent.getContext(KEY_SESSION);
        let sessionParams = sessionContext.parameters;
        let conv = agent.conv();

        conv.ask('Awesome! Let\'s learn a new word. ');
        database_path = DATABASE_PATH_LEARNING_EN;

        return firebaseAdmin.database().ref(database_path)
          .once('value')
          .then( (data) => {

              // --- Code that reads data from database and stores in variable words ---

              // Update session data
              sessionParams.words = utils.getRandomItemList(words, QUESTIONS_PER_PRACTICE);
              let currentIndexPosition = 0;
              sessionParams.currentIndexPosition = currentIndexPosition;

              // --- printing sessionContext value shows correctly updated data here ---    

              // Update session data
              agent.setContext(sessionContext);
            } else {
              conv.close('No words to learn.');
            }
            agent.add(conv);
            return agent;
        });
       }

      // Repeat the word for learning
      function repeatWord(agent) {
        let sessionContext = agent.context.get(KEY_SESSION);
        let sessionParams = sessionContext.parameters;
        agent.add(JSON.stringify(sessionContext));
      }

Контекст устанавливается в welcome (). Я могу получить его в startLearning (), и печать сеансаContext в диалог после обновления также показывает, что данные были там. Затем я обновляю контекст агента как sessionContext.

В следующем намерении потока - repeatWord (в настоящее время имеется только код, необходимый для отладки), я не получаю обновленное значение контекста.

Я пробовал как agent.setContext (sessionContext), так и agent.context.set (sessionContext). Кажется, что оба работают одинаково и у меня не работают.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

попробуй

conv.data = sessionVars;

для установки переменных и доступа к ним с использованием conv.data в других целях. данные будут потеряны, когда разговор закончится. используйте conv.user.storage, если вам нужно сохранить данные в разговорах.

0 голосов
/ 01 ноября 2018

Хотя они используют термин lifespanCount в документации, библиотека просто вызывает это lifespan при использовании agent.context.set()

...