Лямбда-функция, чтобы направить Лекса к новому намерению
Я пытаюсь использовать лямбда-функцию для отправки lex с новым намерением на основе значения входящего слота:
Как это
public override LexResponse Process(LexEvent lexEvent, ILambdaContext context)
{
var slots = lexEvent.CurrentIntent.Slots;
var sessionAttributes = lexEvent.SessionAttributes ?? new Dictionary<string, string>();
DesiredVehicleYesNo type;
if (slots.ContainsKey("DesiredVehicleYesNo"))
{
Enum.TryParse(slots["DesiredVehicleYesNo"], out type);
}
else
{
type = DesiredVehicleYesNo.Null;
}
switch (type)
{
case DesiredVehicleYesNo.YES:
Dictionary<string, string> s = new Dictionary<string, string>();
s.Add("DesiredVehicle", null);
//return ConfirmIntent(sessionAttributes, "DesiredVehicleYes", s, new LexResponse.LexMessage() { Content = "That's great! Let's get started.", ContentType = MESSAGE_CONTENT_TYPE });
//return ElicitSlot(sessionAttributes,"DesiredVehicleYes",null,"DesiredVehicle", new LexResponse.LexMessage() { Content = "That's great! Let's get started.", ContentType = MESSAGE_CONTENT_TYPE });
case DesiredVehicleYesNo.NO:
return ConfirmIntent(sessionAttributes, "DesiredVehicleNo", new Dictionary<string,string>(), new LexResponse.LexMessage() { Content = "Well, that's ok, I can help you choose", ContentType = MESSAGE_CONTENT_TYPE });
}
Я просто не уверен, какой тип возврата я должен использовать для этого? ConfirmIntent, ElicitSlot, ElicitIntent? Также мне нужно вернуть слоты обратно, я хочу, чтобы новое намерение использовало собственные подсказки для заполнения слотов, связанных с этим намерением.
Спасибо
2 ответа
Вы должны использовать ConfirmIntent
и поставлять intentName
а также slots
намерения вы хотите переключиться на.
Документы формата Lex Response
ConfirmIntent. Сообщает Amazon Lex о том, что пользователь должен дать ответ "да" или "нет" для подтверждения или отклонения текущего намерения.
Вы должны включить поля intentName и slots. Поле slots должно содержать запись для каждого из слотов, настроенных для указанного намерения. Если значение слота неизвестно, вы должны установить его на ноль. Вы должны включить поле сообщения, если поле expressionPrompt намерения имеет значение null. Если вы укажете и поле сообщения, и поле translationPrompt, в ответе будет содержаться содержимое поля translationPrompt. Поле responseCard является необязательным.
Таким образом, вы можете предоставить свое собственное сообщение, но убедитесь, что оно написано как вопрос Да / Нет. Так как ConfirmIntent
будет ожидать ответа Да / Нет от пользователя.
Этот подход всегда вызывает намерение, которое вы указали в intentName
, Таким образом, вам придется обрабатывать ответ пользователя там.
Если пользователь говорит "да", то confirmationStatus
будет держать значение Confirmed
,
Если пользователь говорит "нет", то confirmationStatus
будет держать значение Denied
,
Удостоверьтесь, что слоты, которые вы передаете, верны для этого нового намерения. Вы можете передать их предварительно заполненными, чтобы использовать то, что пользователь уже дал вам; или установить на null
чтобы позволить новому намерению попросить пользователя снова заполнить эти слоты.
Ты можешь использовать ConfirmIntent
как предположил Джей, однако, если вы не хотите ничего подсказывать пользователю, есть хакерский способ добиться этого:
- предоставить доступ для вызова лямбда-функций к вызывающей лямбда-функции, т.е. к лямбда-функции intent-A
- получить имя лямбда-функции бэкэнда из intent-B
- вызвать эту лямбда-функцию со всеми входами, используя boto3
- ответ будет в ключе "полезной нагрузки" объекта ответа
- получить ответ с помощью метода read()
- получить фактический результат в ['dialogAction']['message']['content']
- возврат с использованием метода close() по умолчанию
Вот пример кода для того же:
import boto3
client = boto3.client('lambda')
data = {'messageVersion': '1.0', 'invocationSource': 'FulfillmentCodeHook', 'userId': '###',
'sessionAttributes': {}, 'requestAttributes': None,
'bot': {'name': '###', 'alias': '$LATEST', 'version': '$LATEST'},
'outputDialogMode': 'Text',
'currentIntent': {'name': '###', 'slots': {'###': '###'},
'slotDetails': {'###': {'resolutions': [], 'originalValue': '###'}},
'confirmationStatus': 'None'},
'inputTranscript': '###'}
response = client.invoke(
FunctionName='{intent-B lambda function}',
InvocationType='RequestResponse',
Payload=json.dumps(data)
)
output = json.loads(response['Payload'].read())['dialogAction']['message']['content']
Надеюсь, поможет.