Как сделать вызовы REST API для Amazon Alexa - PullRequest
0 голосов
/ 07 июня 2018

Я создаю собственный навык Alexa и хочу делать вызовы REST API.В настоящее время я могу сделать запрос GET для получения данных из моего веб-сервиса, который затем используется Alexa.Тем не менее, у меня есть следующие требования, и я не уверен, как приступить к разработке этого.

  1. Вызов навыка (Выполнено)
  2. Пользователь вызовет намерение «Получить список тем»Alexa выполняет вызов GET REST API и предоставляет «список тем» (Завершено)
  3. Сделать так, чтобы Alexa предлагал пользователю выбрать тему из списка (Ожидание)
  4. Получать ответпользователем в функции лямбда и использовать ответ, чтобы сделать вызов POST / PUT.(Ожидание)
  5. Повторная проверка пользователя, если выбранная тема недействительна (Ожидание).

Как реализовать 3, 4 и 5?В настоящее время я использую Python 3.6 для написания лямбда-функции на консоли разработчика AWS.Есть ли какое-либо руководство по API Amazon Alexa для Python 3.6.

Как мне сделать это на Java, как мне больше нравится?

Я следовал приведенным здесь инструкциям, чтобы разработать то, что у меня есть: https://github.com/simonprickett/alexabart

Имеется ли подробная документация о том, как написать специфическую лямбда-функцию Alexa и соответствующее руководство по API для Python3 или Java.

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

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

Вы можете сохранить что-то подобное в переменной сеанса.

sessionAttributes: {
    "AllQuestions" : ["string", "string"],
    "LastQuestionIndex" : integer
}

Я предполагаю, что вы можете получить список вопросов (используя запрос GET).

Шаг 1: Сделайте слот

Answer будет слоткоторый будет хранить ваш ответ.

Шаг 2: Подготовьте свои вопросы

Когда ваше намерение только началось и у вас ничего нет в вашем sessionAttributes (используйте простое if-else), вам придетсясделайте запрос GET и соберите все свои вопросы (может быть, в списке или что-то).Вы делаете свой запрос GET и сохраняете все вопросы в своем sessionAttributes['AllQuestions'].И установите LastQuestionIndex = -1.

Теперь начинается сложная часть. (я также предполагаю, что вы можете использовать Dialog.ElicitSlot Директиву).

Шаг3: Задайте вопросы один за другим.

Теперь у вас есть список всех вопросов, а также индекс последнего заданного вопроса.А теперь вам просто нужно увеличить индекс, получить следующий вопрос и использовать директиву Dialog.ElicitSlot, чтобы задать этот новый вопрос.И обновите LastQuestionIndex в ваших атрибутах сеанса.

Шаг 4: Получение ответа

Прежде чем перейти к следующему вопросу, вам также придется проверить, установлен ли слот Answerимеет какое-либо значение или нет? Если у него есть значение (это не «Нет»), то вы можете использовать переменную LastQuestionIndex и сохранить ответ на этот конкретный вопрос.

Если выИщите код, вот и вы:

# Line 1 - 22 should be in your intent function
sessionAttributes =  dict()
if 'sessionAttributes' in event['session']: 
    sessionAttributes = event['session']['sessionAttributes']

if not sessionAttributes.has_key('AllQuestions') : 
    # Make the GET REQUEST
    Questions = ["all", "of", "your", "Questions", "stored", "in", "a", "list"]
    sessionAttributes['AllQuestions'] = Questions
    sessionAttributes['LastQuestionIndex'] = -1


Answer = getSlotValue('Answer')
if Answer != None:
    # AllAnswers is a dictionary which has key as the question number and value is the answer
    # AllAnswers = {
    #   0 : "Answer to your first question",
    #   1 : "Answer to your second question"
    # }
    AllAnswers[sessionAttributes['LastQuestionIndex']] = Answer

return ansNextQuestion(sessionAttributes)


def askNextQuestion(sessionAttributes) :
    Last = sessionAttributes['LastQuestionIndex']
    sessionAttributes['LastQuestionIndex'] = Last + 1

    if Last < len(sessionAttributes['AllQuestions']): 
        outputSpeech = "Your next question is " + sessionAttributes['AllQuestions'][Last + 1]
        return {
            "version": "1.0",
            "sessionAttributes": sessionAttributes,
            "response": {
                "outputSpeech": {
                    "type": "PlainText",
                    "text": outputSpeech
                },
                "shouldEndSession": False,
                "directives": [
                    {
                        "type": "Dialog.ElicitSlot",
                        "slotToElicit": "Question",
                        "updatedIntent": {
                            "name": "GetMovieDetails",
                            "confirmationStatus": "NONE",
                            "slots": {
                                "Answer": {
                                    "name": "Answer",
                                    "value": "NONE" # You can change the value of Answer to get new answer, this is allowed.
                                }
                            }
                        }
                    }
                ]
            }
        }
    else : 
        # You are out of questions, now proceed to what you should do after getting all the answers.
0 голосов
/ 07 июня 2018

Вы можете использовать директивы slots и Dialog.ElicitSlot, чтобы получить информацию от пользователя.Точнее, вам понадобится слот, для которого вы будете возвращать ответ Dialog.ElicitSlot, а в ответе speechOutput вы предоставите список опций, и когда пользователь предоставит информацию, она будет собрана вслот.см. это: https://developer.amazon.com/docs/custom-skills/dialog-interface-reference.html#elicitslot

Если вы ищете код, это то, что я сделал в Python 2.7

def dialog_elicit_slot(output, slotToElicit, city_name, movie_name, attributes, multiplex = None, confirmationStatus = "CONFIRMED"):
    return {
        "version": "1.0",
        "sessionAttributes": attributes,
        "response": {
            "outputSpeech": {
                "type": "PlainText",
                "text": output
            },
            "shouldEndSession": False,
            "directives": [
                {
                    "type": "Dialog.ElicitSlot",
                    "slotToElicit": slotToElicit,
                    "updatedIntent": {
                        "name": "GetMovieDetails",
                        "confirmationStatus": confirmationStatus,
                        "slots": {
                            "CITY": {
                                "name": "CITY",
                                "confirmationStatus": "CONFIRMED" if city_name != None else "NONE",
                                "value": city_name
                            },
                            "NAME": {
                                "name": "NAME",
                                "confirmationStatus": "CONFIRMED" if movie_name != None else "NONE",
                                "value": movie_name
                            },
                            "MULTIPLEX": {
                                "name": "MULTIPLEX",
                                "confirmationStatus": "CONFIRMED" if multiplex != None else "NONE",
                                "value" : multiplex
                            }
                        }
                    }
                }
            ]
        }
    }

Здесь вы можете видеть, что я имел3 слота, из которых 2 (CITY и NAME) были сделаны необходимыми в мастере умений.

Это то, что делает мой навык.Сначала он запрашивает город и название фильма (вызов навыка), затем мой навык отправляет запрос GET на удаленный сайт, чтобы получить список мультиплексов.И когда у меня был список мультиплексов, которые показывают этот фильм (который пользователь сказал и собирается в слоте NAME) в своем конкретном городе, я предоставляю им список мультиплексов (который представляет собой просто строку, переменную output ввышеуказанный код).И директива Dialog.ElicitSlot собирает информацию о слоте для слота slotToElicit (который в данном случае MULTIPLEX).

Если это выглядит подавляющим, вы можете просто связаться со мной напрямую.

...