Я пытаюсь реализовать AMAZON.HelpIntent для своего навыка Alexa.
Это предполагаемое поведение:
Пользователь: Алекса, скажите Калькулятору объема рассчитать объем коробки.
Alexa: Какова длина коробки?
Пользователь: Справка
Alexa: длина блока определяется его длиной. Попробуйте сказать, что длина равна двум или что длина равна двум метрам.
Быстрый ответ пользователя
Пользователь: длина — два метра.
Alexa: Какова ширина поля?
Разговор продолжается до тех пор, пока не будут заполнены ячейки намерения.
Чтобы добиться такого поведения, мне нужно знать, какое намерение у моего пользователя. Эта строка кода позволяет мне это сделать.
session.attributes['last_intent'] = 'BoxVolumeIntent'
Я могу проверить внутри своего AMAZON.HelpIntent, если 'last_intent' == 'BoxVolumeIntent'
if session.attributes.get('last_intent') == 'BoxVolumeIntent':
# Determine which part of the multi-turn dialog I am in and return
# relevant help to the user here. Then pass the value back to the
# correct intent to be processed. This is what I don't know how to
# do.
Атрибуты session.attributes определены в flask-ask Джоном Уилером.
Доступ к нему можно получить в Python с помощью следующей строки:
from flask_ask import session
Сегодня утром я спросил Джона в электронном письме, знает ли он, как решить мою проблему, и он ответил, что некоторое время не работал над flask-ask и не знает, что такое многооборотный диалог.
Как я могу правильно реализовать AMAZON.HelpIntent для своего навыка?
BoxVolumeIntent
@ask.intent("BoxVolumeIntent", convert={'length': int, 'width': int, 'height': int, 'unit': str},
default={'unit': 'meters'})
def calculate_box_volume(length, width, height, unit):
"""
Description:
A function to calculate the volume of a box.
Args:
:param1 (int) length: The length of the box.
:param2 (int) width: The width of the box.
:param3 (int) height: The height of the box.
:param4 (str) unit: The unit of measurement. If unit is undefined its value defaults to 'meters'.
:return: A statement to be spoken by the Alexa device and a card sent to the Amazon Alexa phone app.
"""
# Determine which intent was the last one called.
session.attributes['last_intent'] = 'BoxVolumeIntent'
# Taken from Issue 72. Solves the problem of returning a Dialog.Directive
dialog_state = get_dialog_state()
if dialog_state != "COMPLETED":
return delegate(speech=None)
box_volume = length * width * height
msg = "The volume of the box is {} cubic {}".format(box_volume, unit)
return statement(msg).simple_card("Volume Calculator", msg)
Я включил BoxVolumeIntent из моего бэкенда Python 3. Обратите внимание, что у меня нет строк, чтобы Alexa спрашивала пользователя о длине, ширине и высоте. Все это обрабатывается в БЕТА-версии Skill Builder, которую можно найти в консоли разработчика Amazon. Я не могу сказать, на каком этапе намерения находится мой пользователь.
Потому что, как я уже упоминал в комментарии ниже, пользователь может начать с любого из шагов. Например: Ширина коробки равна пяти. Обычно это шаг 2, а не шаг 1 многоэтапного намерения.
session.attributes
для сохранения состояния. Вы можете сохранить столько состояний (используя разные клавиши), сколько захотите. - person ck3g   schedule 09.01.2018