Как я могу заставить агента Dialogflow приветствовать пользователя, если он уже использовал это действие? - PullRequest
0 голосов
/ 23 ноября 2018

Я использую Действия в Google / Dialogflow и пытаюсь создать функцию, которая будет приветствовать пользователя по его имени, если он уже использовал это действие, и, если нет, запросит его имя.Я пытался сопоставить это с «Приветственным намерением» посредством выполнения, но всякий раз, когда я пытаюсь запустить действие на симуляторе, я получаю эту ошибку:

Error 206: Webhook Error

Что изначально имело бы смысл, если бы это было сопоставленос другим намерением, но мне интересно, получаю ли я эту ошибку, потому что у вас не может быть выполнения с приветственным намерением?

Вот код, который я использую во встроенном редакторе, который может бытьпроблема:

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

Почему это не работает?Нужно ли вводить логин пользователя?Нужно ли мне использовать функцию, которая записывает данные в базу данных пожарного магазина?

Спасибо за помощь или предложения!

Ответы [ 2 ]

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

Для тех, кто сталкивается с этим вопросом в будущем и просто хочет получить прямой ответ без необходимости искать неоднозначные ответы / документацию, вот что нужно сделать шаг за шагом:

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

1) Импортируйте действия в модуль Google.Люди и учебники не должны показывать, что вы должны импортировать библиотеку следующим образом (для входа пользователя):

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

вместо

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

2) Используйте этот код:

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?`);
   }
        });

Эта функция запросит у пользователя логин, и в следующий раз, когда вы вызовете намерение, появится «Добро пожаловать, имя», потому что Google автоматически его сохранит.

Вотссылка на альтернативный метод :

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

Давайте проясним несколько вещей для начала:

  • Вы можете иметь выполнение с вашим желанным намерением.
  • Вы делаете не нужен логин пользователя.Хотя использование Google Sign In for Assistant, безусловно, может быть использовано, это не меняет принципиально вашу проблему здесь.
  • Вы не должны использовать функцию, которая записывает данные в базу данных firestore.Опять же, вы можете использовать его, но это не меняет ваших проблем.

Конкретная причина, по которой это не работает, заключается в том, что параметр conv в этом случае содержит Dialogflow WebhookClient, а не action-on-google Объект беседы .

Чтобы получить объект беседы с имеющимся у вас параметром, вы можете вызвать conv.getConv(), который даст вам объекткоторый имеет user параметр.Так что это может выглядеть примерно так:

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?');
}}

Однако с этим все еще есть некоторые проблемы.В частности, неясно, откуда будет name.Я предполагаю, что вы получите его из объекта хранилища пользователя, но, похоже, вы этого не сделали.

...