会话在Dialogflow中到期

时间:2019-06-18 04:06:28

标签: dialogflow

我知道上下文会在15分钟后过期,但是有什么方法可以手动解决,即通过将先前的会话存储为dB,以便我们可以处理该会话即将到期的问题,或者处理该会话下的整个会话(输出上下文) ID将变得清晰,需要从第一个开始。

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 :(得分:0)

我也偶然发现了这个问题。我的解决方案是保存userID并将上下文保存到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

                }
            });

原始答案:

每当有没有任何活动上下文的用户开始交谈时,我都会检查我的userID是否存储在数据库中。如果该用户存在于我的数据库中,我将使用其所有数据检索用户信息,如下所示:

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;
                }