Amazon Lex 接受任何响应的 ConfirmIntent

sid*_*491 4 aws-lambda amazon-lex

我有一个intent-A由一些用户输入触发的。当向用户提供响应时,我使用了ConfirmIntent而不是Close这样我可以切换/链接另一个意图(可以说intent-B)。

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

ConfirmIntent这里这里这里阅读了有关内容。

调用代码:

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

确认意图代码:

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
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

在日志中,我可以看到,confirmationStatus': 'Denied'当我输入"no" 时,但即使那样intent-B也会被调用。

我错过了什么还是它是这样设计的?

注意:对于解决方法,我在 DialogCodeHook 的 DialogCodeHook 中添加以下代码intent-B

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)
Run Code Online (Sandbox Code Playgroud)

Mil*_*ilk 5

您正在正确处理此问题。

当您传入intent-B您的confirm_intent请求时。您告诉 Lex 将用户响应传递给intent-B. 当用户以 响应时"no",该Denied值将正确传递。

或者,您可以intent-A在您的confirm_intent请求中使用。然后,当响应命中时,intent-A您可以使用Closeon denial 和Delegateonconfirmation将流传递到intent-B. 这是“更正确的”,但会导致额外的计算,因此这是一种权衡。

如果您有多个跟进请求,您可以考虑使用ElicitIntentto 代替询问 user "What can I help you with?"。有一个包含诸如"nothing", 之类的话语的意图"goodbye"将捕获负面响应。这是一个略有不同的用例,可能不适合您。