AWS Lex: произошла ошибка: неверный лямбда-ответ - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь сохранить значения, собранные с помощью Amazon Lex, в DynamoDB.Я сделал (или скопировал и изменил) функцию Lambda, которая, очевидно, не работает, но я действительно не понимаю, почему.Это ошибка, которую я получаю от Amazon Lex: «Произошла ошибка: неверный лямбда-ответ: получен ответ об ошибке от лямбды: обработано»

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

Когда я получаю эту ошибку, диалог находится в состоянии:

{
   "dialogState": "ElicitSlot",
   "intentName": "MCQ_A",
   "message": "What is a black and white horse",
   "messageFormat": "PlainText",
   "responseCard": null,
   "sessionAttributes": {},
   "slotToElicit": "QB",
   "slots": {
       "QA": "4",
       "QB": null,
       "Session": "444"
   }
}

// Вот моя лямбда-функция.Он написан на javascript, который я только что обнаружил, и который мне совершенно не нравится ^^ '

console.log('Loading event');
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
var tableName = "MCQ";

// Close dialog with the customer, reporting fulfillmentState of Failed or Fulfilled
function close(session_attributes, m) {
    let callback_obj = {
        sessionAttributes: session_attributes,
        dialogAction: {
            type: 'Close',
            fulfillmentState: "Fulfilled",
            message: m,
        }
    }
    return callback_obj;
}

function storeRegistration(intent, callback) {

    let userInfo = {};

    // store every slot we received as part of registration
    Object.keys(intent.slots).forEach((item) => {
        console.log(item)
        userInfo[item] = {"S": intent.slots[item]};
    });

    dynamodb.putItem({
        "TableName": tableName,
        "Item" : userInfo
    }, function(err, data) {
        if (err) {
            console.log('Failure storing user info');
            console.log(err);
            callback(close(intent.sessionAttributes, {contentType: 'PlainText', content: "I am sorry, but something went wrong. Please try again."}));
        } else {
            console.log("Successfully Stored UserInfo");
            callback(close(intent.sessionAttributes, {contentType: 'PlainText', content: "Thank you for attending the MCQ."}));
        }
    });
}

// --------------- Main handler -----------------------

// Route the incoming request based on intent.
// The JSON body of the request is provided in the event slot.
exports.handler = (event, context, callback) => {
    console.log(event);
    try {
        storeRegistration(event, (response) => {callback(null, response)});
    } catch (err) {
        callback(err);
    }
};

У вас есть идеи, что происходит?:) Заранее большое спасибо !!

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Большое спасибо за ваш ответ.QB действительно установлен как «обязательный».Поэтому я добавил несколько строк для обработки этого случая в главном разделе:

if (event.dialogState == "ElicitSlot")
        callback(null, {
            "dialogAction": {
                "type": "ElicitSlot",
                "intentName": event.intentName,
                "slots": event.slots,
                "slotToElicit" : event.slotToElicit
        }})

Но я получаю ту же ошибку.В отчаянии я также попытался ответить «Делегат», но тоже с ошибкой.У меня есть документ , поэтому я думаю, что мои ответы написаны правильно.Тем не менее, я не понимаю, почему мой чат-бот возвращает вывод с пустым слотом, так как я фактически заполняю слот в диалоговом окне ...

РЕДАКТИРОВАТЬ: после нескольких тестов с планом AWS "заказать цветы" исоответствующая лямбда-функция, все работает гладко, пока я не добавлю строку для хранения в Dynamodb.Так что моя ошибка должна быть там.

0 голосов
/ 01 февраля 2019

Я НАШЕЛ РЕШЕНИЕ:

Я отказался от своей функции и взял план AWS под названием lex-order-flowers-python.Это работает из коробки с проектом заказа цветов Lex.Мне просто нужно было адаптировать его к моей работе и добавить деталь DynamoDB.

Убедитесь, что ваш Предмет в хорошем формате, с указанным типом значения ('S' для строки)

put_item(
    TableName = 'myTableName',
    Item = {
        'key1': {'S': 'value1'}
        'key2': {'S': 'value2'}
    })

Итак, я сделал это:

userInfo = {}
for key, value in intent_request['currentIntent']["slots"].items() :
    userInfo[key] = {'S': value}

logger.debug(userInfo)

dynamodb = boto3.client('dynamodb')
dynamodb.put_item(TableName='MCQ', Item=userInfo)
0 голосов
/ 31 января 2019
  1. Слот QB может быть отмечен как обязательный в области определения слотов.Даже если вы закрываете диалог, выполняя намерение, лекс следит за своими приоритетами, чтобы он выявлял слот.
  2. Обрабатывать критерии elicitSLot с конца кода, а не с консоли lex.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...