Я пытаюсь правильно понять, как слоты работают программно.Прежде чем что-то кодировать, я пытаюсь понять это, взглянув на примеры для alexa sdk для python.
В частности, я пытался понять основы слотов в Пример ColorPicker (я правильно понял hello_world и сам немного кодировал, добавляя что-то. Работало нормально).
Мне трудно понять, как для доступа к этим значениям слотов (потому что я вижу, что это делается двумя разными способами).
def whats_my_color_handler(handler_input):
"""Check if a favorite color has already been recorded in
session attributes. If yes, provide the color to the user.
If not, ask for favorite color.
"""
# type: (HandlerInput) -> Response
if color_slot_key in handler_input.attributes_manager.session_attributes:
fav_color = handler_input.attributes_manager.session_attributes[
color_slot_key]
speech = "Your favorite color is {}. Goodbye!!".format(fav_color)
handler_input.response_builder.set_should_end_session(True)
else:
speech = "I don't think I know your favorite color. " + help_text
handler_input.response_builder.ask(help_text)
handler_input.response_builder.speak(speech)
return handler_input.response_builder.response
Что я понимаю в этой функции, так это то, что color_slot_key
- это имя переменной в слотев Alexa (de frontend, Alexa Developer).Но тогда handler_input.attributes_manager.session_attributes
, насколько я понимаю, это слоты в целом, и доступ по его ключу handler_input.attributes_manager.session_attributes['color_slot_key']
получит значение слота с этим ключом.
Если я правильно понял это, для меня это имеет смысл.Если есть цвет, Алекса произносит его.Если нет, то это не так.
Сейчас:
@sb.request_handler(can_handle_func=is_intent_name("MyColorIsIntent"))
def my_color_handler(handler_input):
"""Check if color is provided in slot values. If provided, then
set your favorite color from slot value into session attributes.
If not, then it asks user to provide the color.
"""
# type: (HandlerInput) -> Response
slots = handler_input.request_envelope.request.intent.slots
if color_slot in slots:
fav_color = slots[color_slot].value
handler_input.attributes_manager.session_attributes[
color_slot_key] = fav_color
speech = ("Now I know that your favorite color is {}. "
"You can ask me your favorite color by saying, "
"what's my favorite color ?".format(fav_color))
reprompt = ("You can ask me your favorite color by saying, "
"what's my favorite color ?")
else:
speech = "I'm not sure what your favorite color is, please try again"
reprompt = ("I'm not sure what your favorite color is. "
"You can tell me your favorite color by saying, "
"my favorite color is red")
handler_input.response_builder.speak(speech).ask(reprompt)
return handler_input.response_builder.response
Я не понимаю, почему в этой функции к значению цвета обращаются:
handler_input.request_envelope.request.intent.slots[color].value
И не так, как в первой функции (что-то вроде этого):
handler_input.attributes_manager.session_attributes[color_slot_key]
Я предполагаю, что первая просто проверяет, есть ли она в атрибутах сеанса или нет(Который я не очень понимаю, что это такое), а другой имеет отношение к запросам Alexa .Но почему формат отличается?