Сессия истекает в диалоге - PullRequest
0 голосов
/ 18 июня 2019

Я узнал, что контекст истекает через 15 минут, но есть ли способ решить его вручную, т.е. путем сохранения предыдущего диалога в дБ, чтобы мы могли обработать эту проблему с истечением срока сеанса или же весь разговор (выходной контекст) в рамках этого сеансаИдентификатор станет понятным и нужно начинать с первого.

exports.fulfillmenttext = functions.https.onRequest((req,res) =>{ 
    const answer1 = req.body.Text;
    console.log("Text said by the user",answer1);
    const uid = answer1.substring(0,28);
    console.log("uid1 is",uid);
    const answer = answer1.substring(28);
    console.log("answer is",answer);
    const sessionId = uid;
    var count,questvalue;
    runSample();
    async function runSample(projectId = 'xxxxxxx') {
      const languageCode = 'en-US';
      const credentials = {
        client_email: 'xxxxxxxxxx',
        private_key: 'xxxxxxxxx'
      };
      //Instantiate a DialogFlow client.
      const dialogflow = require('dialogflow');
      const sessionClient = new dialogflow.SessionsClient({
        projectId,
        credentials,
      });
    // Define session path
      const sessionPath = sessionClient.sessionPath(projectId, sessionId);
      // The text query request.
      const request = {
        session: sessionPath,
        queryInput: {
          text: {
            text: answer,
            languageCode,
          },
        },
      };
      const responses =  await sessionClient.detectIntent(request);
      console.log('Detected intent');
      const result = responses[0].queryResult;
      let action = result.action; 
      console.log("action is"+action);
      console.log(`  Query: ${result.queryText}`);
      console.log(`  Response: ${result.fulfillmentText}`);
      if (result.intent) {
        const question = result.fulfillmentText;
        console.log("question is",question);
        const actionHandlers = {
            'early': () => {
                console.log('earlyaction1', action);
                let name1 = JSON.stringify(result.parameters.fields.Name.stringValue);
                name1 = name1.toString().replace(/"/g,"");
                var data1 = {
                    Name: name1
                };
                var setDoc1 = admin.firestore().collection('User').doc(uid).collection("Popop").doc(uid).collection('Answers').doc('Earlyyears').update(data1);

            },
            'family': () => {
                console.log('familyaction1', action);
                let mname1 = JSON.stringify(result.parameters.fields.M_Name.stringValue);
                let mname_string = mname1.toString().replace(/"/g,"");
                var data20 = {
                    MName: mname_string
                };
                var setDoc20 = admin.firestore().collection('User').doc(uid).collection("Popop").doc(uid).collection('Answers').doc('Family').update(data20);

            }

        };
        if (action === 'early') {
             console.log('1');
             actionHandlers[action]();
        }
        else if (action === 'family') {
            console.log('2');
            actionHandlers[action]();
        }

        res.status(200).send({"question":result.fulfillmentText,"action":action});


      } else {
          console.log(`  No intent matched.`);
          res.status(400).send({"action":"empty"});
      }
    }    
});

1 Ответ

0 голосов
/ 18 июня 2019

Я тоже наткнулся на эту проблему.Мое решение состояло в том, чтобы сохранить идентификатор пользователя и сохранить контексты в Firestore.

ОБНОВЛЕНИЕ:

Вот так я и сохранил контексты Dialogflow в Firestore:

function saveContexts(userId, contexts) {
let UID = userId;

//get all contexts + parameters

if (contexts === undefined) {
    console.log("contexts are undefined! returning");
    return false;
}
db.collection("user-contexts-prod").doc(UID).set({
    dateCreated: new Date(),
    contexts: JSON.stringify(contexts)
})
    .then(function () {
        console.log("success!");
        return true;
    })
    .catch(function (error) {
        console.log("error writing document..", error);
        return false;
    });
}

Получение пользовательских контекстов:

async function getContexts(userId) {
    let UID = userId;
    let docRef = db.collection("user-contexts-prod").doc(UID);
    return docRef.get()
        .then(res => {
            if (res.exists) {
                let contexts = JSON.parse(res.data().contexts);
                console.log("<><> parsed contexts <><>: ");
                console.log(contexts);
                return contexts;
            } else {
                console.log(" UID DOES NOT EXIST!");
                return false;
            }
        })
}

Вы можете установитьснова контексты, зацикливая их и используя contextClient для создания новых контекстов.Или используйте этот метод, чтобы пройтись по контекстам и найти тот, который вам нужен:

contexts.forEach(function(context) {
                if (context.name === 'projects/{DIALOGFLOWPROJECTID}/agent/sessions/' + senderId + '/contexts/{CONTEXTNAME}') {
                    sessionData = context.parameters;
                    // all data that you saved in CONTEXTNAME is now available in the sessionData variable

                }
            });

Оригинальный ответ:

Всякий раз, когда пользователь начал говорить, у которого не было активных контекстовЯ проверяю, хранится ли у меня идентификатор пользователя в моей базе данных.Если этот пользователь существовал в моей БД, я извлекал информацию о пользователе со всеми его данными, например так:

knownUser = await db.isKnownUser(senderId);
                if (knownUser) {
                    //knownUser
                    console.log("Known user");
                    let userData = db.getUserDataById(senderId)

                    //initialize contexts with data you need

                    payload = returningUser_useSameData();
                    messenger.send(payload, senderId);

                    dashbot.logBotMessage(payload.toString, sessionId, intentName);
                    break;

                } else {
                    //newUser
                    console.log("new user");

                    createContext('await_fillInTogether', '', sessionPath, sessionId, 1);
                    createContext('session', '', sessionPath, sessionId, 500);

                    payload = fillInTogetherNewUser();
                    messenger.send(payload, senderId);

                    dashbot.logBotMessage(payload.toString, sessionId, intentName);
                    break;
                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...