Действия в Google - обработка ответов карусели из диалогового потока - PullRequest
0 голосов
/ 26 ноября 2018

Я создал простой интерфейс Google Assistant с использованием DialogFlow с несколькими каруселями, которые я хочу объединить.Тем не менее, всякий раз, когда я касаюсь параметра карусели, он всегда переходит к первому намерению, для которого задано событие actions_intent_OPTION.Я могу добраться до всех своих экранов с помощью голосовых команд, но я не уверен, как обрабатывать сенсорные команды для отправки пользователю правильного намерения.

Текущий код в webhook:

const party = 'party';
const cocktail = 'cocktail';
const SELECTED_ITEM_RESPONSES = {
  [party]: 'You selected party',
  [cocktail]: 'You selected cocktail',
};

function carousel(agent) {
    //agent.add(`Item selected`);
    app.intent('actions.intent.OPTION', (conv, params, option) => {
      let response = 'You did not select any item from the list or carousel';
      if (option && SELECTED_ITEM_RESPONSES.hasOwnProperty(option)) {
        response = SELECTED_ITEM_RESPONSES[option];
      } else {
        response = 'You selected an unknown item from the list or carousel';
      }
      conv.ask(response);
    });
}

Если я оставляю строку agent.add (), я получаю «Элемент выбран» ... но если я пытаюсь использовать код app.intent, он говорит, что я просто получаю пустой речевой ответ.

Я пытался создать 1 намерение под названием CarouselHandler для обработки всех пунктов меню.Я использовал пример кода для вызова функции carousel (), когда это намерение было затронуто событием.

  let intentMap = new Map();
  intentMap.set('Default Welcome Intent', welcome);
  intentMap.set('Default Fallback Intent', fallback);
  intentMap.set('CarouselHandler', carousel);
  agent.handleRequest(intentMap);

1 Ответ

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

У вас есть несколько вопросов по поводу использования опций.Давайте попытаемся прояснить некоторые вещи.

Могу ли я получить разные намерения, запускаемые для каждого параметра?

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

Как вы заметили, вам нужно создать намерение с событием actions_intent_OPTION.

enter image description here

Ваш код для обработки этого может выглядеть примерно так, хотя есть и другие способы обработки:

app.intent('list.reply.click', (conv, params, option) => {
  // Get the user's selection
  // Compare the user's selections to each of the item's keys
  if (!option) {
    conv.ask('You did not select any item from the list or carousel');
  } else if (option === 'OPTION_1') {
    handleOption1( conv );
  } else if (option === 'OPTION_2') {
    handleOption2Or3( conv );
  } else if (option === 'OPTION_3') {
    handleOption2Or3( conv );
  } else {
    conv.ask('You selected an unknown item from the list, or carousel');
  }
});

Могу ли я получитьразличные намерения, запущенные для каждой карусели?

Да.Для этого при отправке карусели вы установите OutgoingContext и удалите любые другие OutgoingContexts, которые вы создали для карусели (установите для их продолжительности жизни значение 0).Затем вы создадите Intent, который имеет этот контекст как IncomingContext.

Код для отправки карусели может выглядеть примерно так, если вы используете библиотеку actions-on-google

conv.ask("Here is menu 2");
conv.ask(new List({
  title: "Menu 2",
  items: {
    "OPTION_1": {
      title: "Option 1",
      description: "Description 1"
    },
    "OPTION_2": {
      title: "Option 2",
      description: "Description 2"
    },
    "OPTION_3": {
      title: "Option 3",
      description: "Description 3"
    },
  }
});
conv.contexts.set("menu_2",99);
conv.contexts.delete("menu_1");
conv.contexts.delete("menu_3");
// Don't forget to add suggestions, too

Если вы используете библиотеку исполнения диалогового потока, она будет аналогичной, хотя есть несколько отличий:

let conv = agent.conv();
conv.ask("Here is menu 2");
conv.ask(new List({
  title: "Menu 2",
  items: {
    "OPTION_1": {
      title: "Option 1",
      description: "Description 1"
    },
    "OPTION_2": {
      title: "Option 2",
      description: "Description 2"
    },
    "OPTION_3": {
      title: "Option 3",
      description: "Description 3"
    },
  }
});

agent.add(conv);
agent.setContext({name:"menu_1", lifespan:0});
agent.setContext({name:"menu_2", lifespan:99});
agent.setContext({name:"menu_3", lifespan:0});

Если вы используете multivocal , конфигурация ответа можетвыглядело примерно так:

{
  Template: {
    Text: "Here is menu 2",
    Option: {
      Type: "carousel",
      Title: "Menu 2",
      Items: [
        {
          Title: "Option 1",
          Body: "Description 1"
        },
        {
          Title: "Option 2",
          Body: "Description 2"
        },
        {
          Title: "Option 3",
          Body: "Description 3"
        }
      ]
    }
  },
  Context: [
    {
      name: "menu_1",
      lifetime: 0
    },
    {
      name: "menu_2",
      lifetime: 99
    },
    {
      name: "menu_3",
      lifetime: 0
    }
  ]
}

Намерение, которое захватит это предложение, может выглядеть примерно так:

enter image description here

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

Если между обработчиками есть перекрывающиеся параметры, они могут вызывать ту же функцию, которая фактически выполняет работу (снова, как показано выше).

Как я могу обрабатывать голосовые и опциональные ответы одинаково?

AoG, в некоторых случаях, будет использовать голосовой ответ для запуска option.Это то, что псевдонимы для.Но даже помимо этого, если у вас есть Интенты, которые ловят фразы от пользователя, и Интент, который работает с Опциями, все, что вам нужно сделать, это заставить код выполнения вызывать ту же функцию.

Почему нетНе работает ли код?

Строка

app.intent('actions.intent.OPTION', (conv, params, option) => {

Возможно, не то, что вы думаете.Если это не имя для Intent в Dialogflow , строка actions.intent.OPTION не будет отображаться в вашем обработчике.Это также, как вы регистрируете обработчик Intent в библиотеке actions-on-google.

Выглядит так, как будто вы смешиваете способ выполнения обработчика диалога для регистрации обработчиков Intent с библиотекой actions-on-google.способ регистрации обработчиков намерений с помощью функции carousel().Не делай этого.(Это также может быть причиной того, что ответы не возвращаются правильно.)

...