Параметр списка в диалоговом окне для помощника Google не дает правильных результатов - PullRequest
0 голосов
/ 17 января 2019

Я изучал Dialogflow за последние 6-7 дней и создал бота, у которого есть меню в виде списка.

После прочтения множества статей мы узнали, что нам нужно иметь событие actions_intent_OPTION в одном из намерений, чтобы List работал правильно. Также узнал, что помимо этого нам нужен обработчик / намерение для actions_intent_OPTION. Это намерение будет инициировано, когда пользователь нажмет одну из опций списка.

Сейчас я пытаюсь определить обработчик для события actions_intent_OPTION. Я определил намерение с именем "actions_intent_OPTION-handler", но я не могу найти код, в котором я могу кодировать для раздела выполнения Dialogflow, который идентифицирует выбранную пользователем опцию и вызывает намерение, связанное с этой опцией.

Я не из фонового кода, и я пробовал один код (index.js), но при развертывании не выдает никакой ошибки, однако при выполнении на симуляторе выдает ошибку "Не удалось проанализировать ответ Dialogflow в AppResponse из-за пустого речевой ответ. "

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

Подробная информация о боте, списке и намерениях прилагается.

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

Код в разделе исполнения

Определено содержание

Примечание. Назначение, которое необходимо вызвать, - «1.1 - ElectricityDetails - DueDate»

Вот код -> Пожалуйста, не спрашивайте меня, почему я использовал определенный кусок кода, как я новичок :).

'use strict';
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {dialogflow} = require('actions-on-google');
const app = dialogflow({debug: true});
//const agent = new WebhookClient({ request, response });
let intentMap = new Map();
app.intent('actions_intent_OPTION-handler', (conv, params, option) => {
  if (!option) {
    conv.ask('You did not select any item from the list or carousel');
  } else if (option === 'Payment Due Date Electricity') {
    //conv.ask('You are great');
    //intentMap.set('Default Welcome Intent', welcome);
    intentMap.set('1.1 - ElectricityDetails - DueDate',option);
  } else {
    conv.ask('You selected ' + option);
  }
});
//agent.handleRequest(intentMap);
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

1 Ответ

0 голосов
/ 22 января 2019

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

Пожалуйста, не спрашивайте меня, почему я использовал определенный кусок кода

Мы понимаем, что вы новичок - мы все были там! Но копирование кода без понимания того, что он должен делать, - рискованный путь.

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

Микширование библиотек

Похоже, вы загружаете как библиотеку actions-on-google, так и библиотеку диалогового потока. Хотя большая часть того, что вы делаете, связана с библиотекой actions-on-google, intentMap - это то, что используется библиотекой d-f.

Вы не можете смешать два. Выберите один и поймите, как регистрировать обработчики и как эти обработчики выбираются.

Регистрация обработчиков с помощью Actions-on-Google

Если вы используете библиотеку a-o-g, вы обычно создаете объект app с чем-то вроде

const app = dialogflow();

, а затем зарегистрировать каждый обработчик с чем-то вроде

app.intent( 'intent name', conv => {
  // handler code here
});

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

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

Зарегистрировать обработчик с диалоговым потоком выполнения

Подход с использованием диалогового потока аналогичен, но он предлагает создать Map, который сопоставляет Intent Name с функцией-обработчиком. Примерно так:

let intentMap = new Map();
intentMap.set( 'intent name', handlerFunction );

Где handlerFunction - это также имя функции, которую вы хотите использовать в качестве обработчика. Это может выглядеть примерно так:

function handlerFunction( agent ){
  // Handler stuff here
}

Затем вы можете создать агента, установить объекты запроса и ответа, которые он должен использовать, и указать ему использовать карту, чтобы выяснить, какой Intent Handler вызывать с чем-то вроде

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

Содержимое представляет то, что пользователь 1053 * делает, а не то, что вы делаете с ним

Помните, что Intents представляют действие пользователя.

То, что вы делаете на основе этого действия, зависит от многих вещей. В вашем случае, после того, как они выбрали опцию, вы хотите ответить так же, как если бы они вызвали ее с определенным намерением. Правильно?

Вы не делаете это, пытаясь вызвать это намерение.

Что вы делаете, так это то, что оба обработчика вызывают функцию, которая делает то, что вы хотите. В этом нет ничего особенного - оба просто вызывают одну и ту же функцию, как и многие другие коды, которые могут вызывать общие функции.

Не пытайтесь динамически регистрировать обработчики

В связи с предыдущей проблемой, попытка зарегистрировать новый обработчик в существующем обработчике не будет делать то, что вы хотите. К тому времени уже слишком поздно, и обработчики уже вызваны.

Могут быть ситуации, когда это имеет смысл - но их очень мало, далеко друг от друга, и очень очень продвинутая концепция. В общем, зарегистрируйте все ваши обработчики в центральном месте, как я обрисовал выше.

...