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

Я пытался получить вопросы, которые задает бот lex, в лямбда-функции и сохранить в DynamoDB. Я хочу, чтобы синтаксис получал вопросы от amazon lex. Я пробовал это

"const question1=intentRequest.currentIntent.prompts.FlowerType"

но это дает мне ошибку, поэтому парни пытаются помочь мне

2 ответа

Если вы ищете вопрос, который задал бот, вы не получите его в формате JSON. Единственное, что вы получите, это слот и значение слота. Пожалуйста, смотрите вход json со слотами, где вы получите только значение слота, а не вопрос, заданный ботом Lex

{
  "messageVersion": "1.0",
  "invocationSource": "FulfillmentCodeHook",
  "userId": "897877979",
  "sessionAttributes": {},
  "requestAttributes": null,
  "bot": {
    "name": "Reasturant",
    "alias": "$LATEST",
    "version": "$LATEST"
  },
  "outputDialogMode": "Text",
  "currentIntent": {
    "name": "Intent",
    "slots": {
      "SlotType": "SlotValue"
    },
    "slotDetails": {
      "Location": {
        "resolutions": [],
        "originalValue": "SlotValue"
      }
    },
    "confirmationStatus": "None"
  },
  "inputTranscript": "Your question goes here"
}

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

{
  "messageVersion": "1.0",
  "invocationSource": "FulfillmentCodeHook",
  "userId": "876669698689967676",
  "sessionAttributes": {},
  "requestAttributes": null,
  "bot": {
    "name": "LexBotName",
    "alias": "$LATEST",
    "version": "$LATEST"
  },
  "outputDialogMode": "Text",
  "currentIntent": {
    "name": "WorkingHours",
    "slots": {},
    "slotDetails": {},
    "confirmationStatus": "None"
  },
  "inputTranscript": "The question you have asked"
}

Ключ " inputTranscript " - это место, где вы получите вопрос. так что вы получите вопрос,

var question = event.inputTranscript

где 'событие' - это первый параметр функции-обработчика лямбды.

Ответ, который вы предоставляете из своего лямбда-кода через Fulfillment (ElicitSlot, ElicitIntent, Close и т.д.) - это вопросы, задаваемые ботом.

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

Псевдокод:

def dynamo_put_convo(user_message, bot_response):
    #your code to put items into dynamodb


def perform_action(intent_request):
    user_message = intent_request['inputTranscript']
    if source == 'DialogCodeHook':
        # your code
        validation_result = some validation code
        if validation_result == False:
            bot_response = elicit_slot_message
            dynamo_put_convo(user_message, bot_response)
            return elicit_slot()
        return delegate()

    if source == 'FulfillmentCodeHook':
        # your code
        bot_response = output_from_your_code_which_you_want_to_display_to_user
        dynamo_put_convo(user_message, bot_response)
        return close(bot_response)

def lambda_handler(event, context):
    intent_name = intent_request['currentIntent']['name']
    if intent_name == 'ABC':
        return perform_action(intent_request)
    raise Exception('Intent with name ' + intent_name + ' not supported')

Идея состоит в том, чтобы создать функцию для помещения записей в таблицу DynamoDB и вызывать этот метод непосредственно перед тем, как ваш бот отправит какое-либо сообщение пользователю.

Надеюсь, поможет.

Другие вопросы по тегам