How can I make Dialogflow agent greet user if they have used the action before?





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I'm using Actions On Google / Dialogflow, and I'm trying to make a function that will greet a user by their name if they've used the action before, and if not, will ask for their name. I have tried to map this to the "Welcome intent" through fulfillment, but whenever I try to run the action on the simulator, I get this error:



Error 206: Webhook Error


Which Initially would make sense if this was mapped to another intent, but I'm wondering if I'm getting this error because you can't have a fulfillment with the welcome intent?



Here's the code I'm using in the inline editor which may be the problem:



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


function welcome(conv) {
if (conv.user.last.seen) {
conv.ask(`Welcome back ${name}!`);
} else {
conv.ask('Welcome to The app! My name is Atlas, could I get your name?');
}}

let intentMap = new Map();
intentMap.set('Welcome Intent', welcome);
agent.handleRequest(intentMap);


How come this isn't working? Do I need to implement user login? Do I need to use a function that would write to a firestore databbase?



Thanks for the help or suggestions!










share|improve this question

























  • are you suer your code runs properly? maybe conv.user.last.seen is not always set? in that case the script would throw something like cannot get seen of undefined

    – Luke
    Nov 23 '18 at 17:38






  • 1





    It looks like OP is using the Actions on Google library syntax but the dialogflow fulfillment library. I'd switch to use AoG for everything.

    – Nick Felker
    Nov 23 '18 at 23:21


















0















I'm using Actions On Google / Dialogflow, and I'm trying to make a function that will greet a user by their name if they've used the action before, and if not, will ask for their name. I have tried to map this to the "Welcome intent" through fulfillment, but whenever I try to run the action on the simulator, I get this error:



Error 206: Webhook Error


Which Initially would make sense if this was mapped to another intent, but I'm wondering if I'm getting this error because you can't have a fulfillment with the welcome intent?



Here's the code I'm using in the inline editor which may be the problem:



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


function welcome(conv) {
if (conv.user.last.seen) {
conv.ask(`Welcome back ${name}!`);
} else {
conv.ask('Welcome to The app! My name is Atlas, could I get your name?');
}}

let intentMap = new Map();
intentMap.set('Welcome Intent', welcome);
agent.handleRequest(intentMap);


How come this isn't working? Do I need to implement user login? Do I need to use a function that would write to a firestore databbase?



Thanks for the help or suggestions!










share|improve this question

























  • are you suer your code runs properly? maybe conv.user.last.seen is not always set? in that case the script would throw something like cannot get seen of undefined

    – Luke
    Nov 23 '18 at 17:38






  • 1





    It looks like OP is using the Actions on Google library syntax but the dialogflow fulfillment library. I'd switch to use AoG for everything.

    – Nick Felker
    Nov 23 '18 at 23:21














0












0








0








I'm using Actions On Google / Dialogflow, and I'm trying to make a function that will greet a user by their name if they've used the action before, and if not, will ask for their name. I have tried to map this to the "Welcome intent" through fulfillment, but whenever I try to run the action on the simulator, I get this error:



Error 206: Webhook Error


Which Initially would make sense if this was mapped to another intent, but I'm wondering if I'm getting this error because you can't have a fulfillment with the welcome intent?



Here's the code I'm using in the inline editor which may be the problem:



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


function welcome(conv) {
if (conv.user.last.seen) {
conv.ask(`Welcome back ${name}!`);
} else {
conv.ask('Welcome to The app! My name is Atlas, could I get your name?');
}}

let intentMap = new Map();
intentMap.set('Welcome Intent', welcome);
agent.handleRequest(intentMap);


How come this isn't working? Do I need to implement user login? Do I need to use a function that would write to a firestore databbase?



Thanks for the help or suggestions!










share|improve this question
















I'm using Actions On Google / Dialogflow, and I'm trying to make a function that will greet a user by their name if they've used the action before, and if not, will ask for their name. I have tried to map this to the "Welcome intent" through fulfillment, but whenever I try to run the action on the simulator, I get this error:



Error 206: Webhook Error


Which Initially would make sense if this was mapped to another intent, but I'm wondering if I'm getting this error because you can't have a fulfillment with the welcome intent?



Here's the code I'm using in the inline editor which may be the problem:



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


function welcome(conv) {
if (conv.user.last.seen) {
conv.ask(`Welcome back ${name}!`);
} else {
conv.ask('Welcome to The app! My name is Atlas, could I get your name?');
}}

let intentMap = new Map();
intentMap.set('Welcome Intent', welcome);
agent.handleRequest(intentMap);


How come this isn't working? Do I need to implement user login? Do I need to use a function that would write to a firestore databbase?



Thanks for the help or suggestions!







javascript node.js firebase dialogflow actions-on-google






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 23 '18 at 17:30







Landon G

















asked Nov 23 '18 at 17:15









Landon GLandon G

14213




14213













  • are you suer your code runs properly? maybe conv.user.last.seen is not always set? in that case the script would throw something like cannot get seen of undefined

    – Luke
    Nov 23 '18 at 17:38






  • 1





    It looks like OP is using the Actions on Google library syntax but the dialogflow fulfillment library. I'd switch to use AoG for everything.

    – Nick Felker
    Nov 23 '18 at 23:21



















  • are you suer your code runs properly? maybe conv.user.last.seen is not always set? in that case the script would throw something like cannot get seen of undefined

    – Luke
    Nov 23 '18 at 17:38






  • 1





    It looks like OP is using the Actions on Google library syntax but the dialogflow fulfillment library. I'd switch to use AoG for everything.

    – Nick Felker
    Nov 23 '18 at 23:21

















are you suer your code runs properly? maybe conv.user.last.seen is not always set? in that case the script would throw something like cannot get seen of undefined

– Luke
Nov 23 '18 at 17:38





are you suer your code runs properly? maybe conv.user.last.seen is not always set? in that case the script would throw something like cannot get seen of undefined

– Luke
Nov 23 '18 at 17:38




1




1





It looks like OP is using the Actions on Google library syntax but the dialogflow fulfillment library. I'd switch to use AoG for everything.

– Nick Felker
Nov 23 '18 at 23:21





It looks like OP is using the Actions on Google library syntax but the dialogflow fulfillment library. I'd switch to use AoG for everything.

– Nick Felker
Nov 23 '18 at 23:21












2 Answers
2






active

oldest

votes


















1














Let's clear a few things up to start:




  • You can have fulfillment with your welcome intent.

  • You do not need user login. Although using Google Sign In for Assistant can certainly be used, it doesn't fundamentally change your problem here.

  • You do not need to use a function that writes to the firestore database. Again, you could use it, but this doesn't change your problems.


The specific reason this isn't working is because the conv parameter in this case contains a Dialogflow WebhookClient rather than an actions-on-google Conversation object.



To get the Conversation object with the parameter you have, you can call conv.getConv(), which will give you an object that has a user parameter. So this may look something like



function welcome(conv) {
let aog = conv.getConv();
if (aog.user.last.seen) {
conv.ask(`Welcome back ${name}!`);
} else {
conv.ask('Welcome to The app! My name is Atlas, could I get your name?');
}}


There are, however, still some issues with this. Most notably, it isn't clear where name will come from. I assume you will get it out of the user store object, but you don't seem to have done this.






share|improve this answer































    0














    For anyone who comes across this question in the future and just wants a straight forward answer without having to search through ambiguous answers / documentation, here is what to do step by step:



    note: I ended up using the Google Sign in method, but even if this isn't your goal, i'll post the link to the alternative method.



    1) Import the actions on google module. What people / tutorials don't to show is you have to import the library like this (for user login):



    const {
    dialogflow,
    Permission,
    SignIn
    } = require('actions-on-google')


    instead of



    const dialogflow = require('actions-on-google')


    2) Use this code:



    const app = dialogflow({
    clientId: '<YOUR CLIENT ID from Actions on Google>',
    });

    app.intent('Start Signin', conv => {
    conv.ask(new SignIn('To get your account details'));
    });


    app.intent('Get Signin', (conv, params, signin) => {
    if (signin.status === 'OK') {
    const payload = conv.user.profile.payload;
    conv.ask(`Welcome back ${payload.name}. What do you want to do next?`);
    } else {
    conv.ask(`I won't be able to save your data, but what do you want to do next?`);
    }
    });


    This function will ask the user for a login, and next time you invoke the intent, it will say "Welcome back name", because google automatically saves it.



    Here's the link to the alternative method:






    share|improve this answer
























      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53450716%2fhow-can-i-make-dialogflow-agent-greet-user-if-they-have-used-the-action-before%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      1














      Let's clear a few things up to start:




      • You can have fulfillment with your welcome intent.

      • You do not need user login. Although using Google Sign In for Assistant can certainly be used, it doesn't fundamentally change your problem here.

      • You do not need to use a function that writes to the firestore database. Again, you could use it, but this doesn't change your problems.


      The specific reason this isn't working is because the conv parameter in this case contains a Dialogflow WebhookClient rather than an actions-on-google Conversation object.



      To get the Conversation object with the parameter you have, you can call conv.getConv(), which will give you an object that has a user parameter. So this may look something like



      function welcome(conv) {
      let aog = conv.getConv();
      if (aog.user.last.seen) {
      conv.ask(`Welcome back ${name}!`);
      } else {
      conv.ask('Welcome to The app! My name is Atlas, could I get your name?');
      }}


      There are, however, still some issues with this. Most notably, it isn't clear where name will come from. I assume you will get it out of the user store object, but you don't seem to have done this.






      share|improve this answer




























        1














        Let's clear a few things up to start:




        • You can have fulfillment with your welcome intent.

        • You do not need user login. Although using Google Sign In for Assistant can certainly be used, it doesn't fundamentally change your problem here.

        • You do not need to use a function that writes to the firestore database. Again, you could use it, but this doesn't change your problems.


        The specific reason this isn't working is because the conv parameter in this case contains a Dialogflow WebhookClient rather than an actions-on-google Conversation object.



        To get the Conversation object with the parameter you have, you can call conv.getConv(), which will give you an object that has a user parameter. So this may look something like



        function welcome(conv) {
        let aog = conv.getConv();
        if (aog.user.last.seen) {
        conv.ask(`Welcome back ${name}!`);
        } else {
        conv.ask('Welcome to The app! My name is Atlas, could I get your name?');
        }}


        There are, however, still some issues with this. Most notably, it isn't clear where name will come from. I assume you will get it out of the user store object, but you don't seem to have done this.






        share|improve this answer


























          1












          1








          1







          Let's clear a few things up to start:




          • You can have fulfillment with your welcome intent.

          • You do not need user login. Although using Google Sign In for Assistant can certainly be used, it doesn't fundamentally change your problem here.

          • You do not need to use a function that writes to the firestore database. Again, you could use it, but this doesn't change your problems.


          The specific reason this isn't working is because the conv parameter in this case contains a Dialogflow WebhookClient rather than an actions-on-google Conversation object.



          To get the Conversation object with the parameter you have, you can call conv.getConv(), which will give you an object that has a user parameter. So this may look something like



          function welcome(conv) {
          let aog = conv.getConv();
          if (aog.user.last.seen) {
          conv.ask(`Welcome back ${name}!`);
          } else {
          conv.ask('Welcome to The app! My name is Atlas, could I get your name?');
          }}


          There are, however, still some issues with this. Most notably, it isn't clear where name will come from. I assume you will get it out of the user store object, but you don't seem to have done this.






          share|improve this answer













          Let's clear a few things up to start:




          • You can have fulfillment with your welcome intent.

          • You do not need user login. Although using Google Sign In for Assistant can certainly be used, it doesn't fundamentally change your problem here.

          • You do not need to use a function that writes to the firestore database. Again, you could use it, but this doesn't change your problems.


          The specific reason this isn't working is because the conv parameter in this case contains a Dialogflow WebhookClient rather than an actions-on-google Conversation object.



          To get the Conversation object with the parameter you have, you can call conv.getConv(), which will give you an object that has a user parameter. So this may look something like



          function welcome(conv) {
          let aog = conv.getConv();
          if (aog.user.last.seen) {
          conv.ask(`Welcome back ${name}!`);
          } else {
          conv.ask('Welcome to The app! My name is Atlas, could I get your name?');
          }}


          There are, however, still some issues with this. Most notably, it isn't clear where name will come from. I assume you will get it out of the user store object, but you don't seem to have done this.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 23 '18 at 23:55









          PrisonerPrisoner

          36.2k33562




          36.2k33562

























              0














              For anyone who comes across this question in the future and just wants a straight forward answer without having to search through ambiguous answers / documentation, here is what to do step by step:



              note: I ended up using the Google Sign in method, but even if this isn't your goal, i'll post the link to the alternative method.



              1) Import the actions on google module. What people / tutorials don't to show is you have to import the library like this (for user login):



              const {
              dialogflow,
              Permission,
              SignIn
              } = require('actions-on-google')


              instead of



              const dialogflow = require('actions-on-google')


              2) Use this code:



              const app = dialogflow({
              clientId: '<YOUR CLIENT ID from Actions on Google>',
              });

              app.intent('Start Signin', conv => {
              conv.ask(new SignIn('To get your account details'));
              });


              app.intent('Get Signin', (conv, params, signin) => {
              if (signin.status === 'OK') {
              const payload = conv.user.profile.payload;
              conv.ask(`Welcome back ${payload.name}. What do you want to do next?`);
              } else {
              conv.ask(`I won't be able to save your data, but what do you want to do next?`);
              }
              });


              This function will ask the user for a login, and next time you invoke the intent, it will say "Welcome back name", because google automatically saves it.



              Here's the link to the alternative method:






              share|improve this answer




























                0














                For anyone who comes across this question in the future and just wants a straight forward answer without having to search through ambiguous answers / documentation, here is what to do step by step:



                note: I ended up using the Google Sign in method, but even if this isn't your goal, i'll post the link to the alternative method.



                1) Import the actions on google module. What people / tutorials don't to show is you have to import the library like this (for user login):



                const {
                dialogflow,
                Permission,
                SignIn
                } = require('actions-on-google')


                instead of



                const dialogflow = require('actions-on-google')


                2) Use this code:



                const app = dialogflow({
                clientId: '<YOUR CLIENT ID from Actions on Google>',
                });

                app.intent('Start Signin', conv => {
                conv.ask(new SignIn('To get your account details'));
                });


                app.intent('Get Signin', (conv, params, signin) => {
                if (signin.status === 'OK') {
                const payload = conv.user.profile.payload;
                conv.ask(`Welcome back ${payload.name}. What do you want to do next?`);
                } else {
                conv.ask(`I won't be able to save your data, but what do you want to do next?`);
                }
                });


                This function will ask the user for a login, and next time you invoke the intent, it will say "Welcome back name", because google automatically saves it.



                Here's the link to the alternative method:






                share|improve this answer


























                  0












                  0








                  0







                  For anyone who comes across this question in the future and just wants a straight forward answer without having to search through ambiguous answers / documentation, here is what to do step by step:



                  note: I ended up using the Google Sign in method, but even if this isn't your goal, i'll post the link to the alternative method.



                  1) Import the actions on google module. What people / tutorials don't to show is you have to import the library like this (for user login):



                  const {
                  dialogflow,
                  Permission,
                  SignIn
                  } = require('actions-on-google')


                  instead of



                  const dialogflow = require('actions-on-google')


                  2) Use this code:



                  const app = dialogflow({
                  clientId: '<YOUR CLIENT ID from Actions on Google>',
                  });

                  app.intent('Start Signin', conv => {
                  conv.ask(new SignIn('To get your account details'));
                  });


                  app.intent('Get Signin', (conv, params, signin) => {
                  if (signin.status === 'OK') {
                  const payload = conv.user.profile.payload;
                  conv.ask(`Welcome back ${payload.name}. What do you want to do next?`);
                  } else {
                  conv.ask(`I won't be able to save your data, but what do you want to do next?`);
                  }
                  });


                  This function will ask the user for a login, and next time you invoke the intent, it will say "Welcome back name", because google automatically saves it.



                  Here's the link to the alternative method:






                  share|improve this answer













                  For anyone who comes across this question in the future and just wants a straight forward answer without having to search through ambiguous answers / documentation, here is what to do step by step:



                  note: I ended up using the Google Sign in method, but even if this isn't your goal, i'll post the link to the alternative method.



                  1) Import the actions on google module. What people / tutorials don't to show is you have to import the library like this (for user login):



                  const {
                  dialogflow,
                  Permission,
                  SignIn
                  } = require('actions-on-google')


                  instead of



                  const dialogflow = require('actions-on-google')


                  2) Use this code:



                  const app = dialogflow({
                  clientId: '<YOUR CLIENT ID from Actions on Google>',
                  });

                  app.intent('Start Signin', conv => {
                  conv.ask(new SignIn('To get your account details'));
                  });


                  app.intent('Get Signin', (conv, params, signin) => {
                  if (signin.status === 'OK') {
                  const payload = conv.user.profile.payload;
                  conv.ask(`Welcome back ${payload.name}. What do you want to do next?`);
                  } else {
                  conv.ask(`I won't be able to save your data, but what do you want to do next?`);
                  }
                  });


                  This function will ask the user for a login, and next time you invoke the intent, it will say "Welcome back name", because google automatically saves it.



                  Here's the link to the alternative method:







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 27 '18 at 1:17









                  Landon GLandon G

                  14213




                  14213






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53450716%2fhow-can-i-make-dialogflow-agent-greet-user-if-they-have-used-the-action-before%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      這個網誌中的熱門文章

                      Xamarin.form Move up view when keyboard appear

                      Post-Redirect-Get with Spring WebFlux and Thymeleaf

                      Anylogic : not able to use stopDelay()