Ошибка бота в чате лекса: достигнуто второе исполнение лямбды на том же высказывании
Я прочитал Lex Docs на Ответы.
Я искал и нашел:
- оставшийся без ответа вопрос по той же ошибке.
- Безответный аналогичный вопрос, но в Python.
- Оставшийся без ответа подобный вопрос в Amazon Dev Forum.
Так что мой вопрос остается. Что вызывает / Как исправить эту ошибку в Lex Chat Bot:
Произошла ошибка: неверный лямбда-ответ:
Достигнуто второе исполнение исполнения лямбда по тому же высказыванию
Ошибка возникает только при попытке ответить делегатом. Вот мой лямбда-код AWS (node.js 6.10) для ответа делегата:
exports.handler = (event, context, callback) => {
try {
intentProcessor(event,
(response) => {
callback(null, response);
});
} catch (err) {
callback(err);
}
};
function intentProcessor(intentRequest, callback) {
respond = delegate(sessionAttributes,intentRequest['currentIntent']['slots']);
callback(respond);
}
function delegate(sessionAttributes, slots){
return {
sessionAttributes,
dialogAction: {
type: "Delegate",
slots
}
};
}
Я подтвердил, что ответ возвращается, как и ожидалось, с минимальными требованиями для Делегата на Документы, которые являются sessionAttributes и DialogAction: тип и слоты. Слоты возвращаются нулевые, как и ожидалось.
Дополнительная, возможно, актуальная информация:
- У намерения есть несколько высказываний.
- У цели есть несколько слотов.
- Ни один из слотов не требуется.
Любые предложения или информация о том, что может вызвать эту ошибку, высоко ценится!
1 ответ
Я думаю, ты звонишь delegate()
в FulfillmentCodeHook
, Когда делегат вызывается, это означает, что
Лямбда-функция предписывает Amazon Lex выбрать следующий курс действий
Теперь в лямбда-функции есть два действия: DialogCodeHook
а также FulfillmentCodeHook
, Если вы находитесь в DialogCodeHook, то delegate
вызовет FulfillmentCodeHook. Но если вы находитесь в FulfillmentCodeHook, он выдаст ошибку.
Однако, если вы находитесь в FulfillmentCodeHook, и по какой-то причине вы хотите изменить значение любого slot
тогда вы можете установить значение этого slot
обнулить, а затем вызвать делегата, передавшего новый набор слотов. Таким образом, делегат снова вызовет DialogCodeHook.
Из документов AWS:
Если значение поля неизвестно, вы должны установить его на ноль. Вы получите исключение DependencyFailedException, если ваша функция fufillment возвращает диалоговое действие Delegate без удаления каких-либо слотов.
Надеюсь, поможет.