Amazon Lex接受任何回复的ConfirmIntent

时间:2017-12-14 10:36:18

标签: aws-lambda amazon-lex

我有intent-A由某些用户输入触发。当响应给用户时,我使用了ConfirmIntent而不是Close,这样我就可以切换/链接另一个意图(假设为intent-B)。

理想情况下,如果用户键入"yes",则应触发intent,如果用户键入"no",则不应该。问题是无论我输入什么,intent-B都会被触发。

我已阅读hereherehere中的ConfirmIntent

致电代码:

session_attributes = {"confirmationContext": "AutoPopulate"}
return confirm_intent(session_attributes , 'intent-B', slots, 'Do you want to invoke intent-B')

确认内容代码:

def confirm_intent(session_attributes, intent_name, slots, message):
    return {
        'sessionAttributes': session_attributes,
        'dialogAction': {
            'type': 'ConfirmIntent',
            'intentName': intent_name,
            'slots': slots,
            'message': {
                'contentType': 'PlainText',
                'content': message
            }
        }
    }

在日志中,当我输入confirmationStatus': 'Denied'时,我会看到"no,但即便如此,intent-B也会被调用。

我错过了什么或是这样设计的吗?

注意:要解决此问题,我将在intent-B

的DialogCodeHook中添加以下代码
if 'confirmationStatus' in intent_request['currentIntent'] and intent_request['currentIntent']['confirmationStatus'] == 'Denied':
    return close("Ok, let me know if you need anything else.", session_attributes)

1 个答案:

答案 0 :(得分:3)

您正在正确处理此问题。

当您将intent-B传递到confirm_intent请求时。您告诉Lex将用户响应传递给intent-B。当用户使用"no"回复时,Denied值会正确传递。

或者,您可以在intent-A请求中添加confirm_intent。然后,当回复点击intent-A时,您可以使用Close拒绝,Delegate confirmation将流量传递给intent-B。这是“更正确”但会导致额外的计算,所以这是一个权衡。

如果您有多个跟进请求,可以考虑使用ElicitIntent来询问用户"What can I help you with?"。拥有像"nothing""goodbye"这样的话语意图会得到负面回应。这是一个稍微不同的用例,可能不适合您。