Aws lambda 亚马逊Lex slot赢得';它不能保存价值。返回空

Aws lambda 亚马逊Lex slot赢得';它不能保存价值。返回空,aws-lambda,amazon-lex,amazon-connect,Aws Lambda,Amazon Lex,Amazon Connect,我正在尝试执行一个检查,该检查为用户提供一个选项,在用户在确认步骤拒绝后更新意图中特定插槽的值 我有一个新用户意向,该意向包含以下时段: updateNewUser是一种自定义插槽类型(扩展值),具有以下条目: 现在,当用户在确认步骤中拒绝时,我会询问用户要更新/更改的插槽,并使用Lambda函数将用户输入值存储在updateNewUser插槽中。但问题来了 Bot对所有捕获的值播放确认提示 用户在确认时说“不” Bot通过询问“你有什么价值”来引出updateNewUser槽 要更新吗?

我正在尝试执行一个检查,该检查为用户提供一个选项,在用户在确认步骤拒绝后更新意图中特定插槽的值

我有一个新用户意向,该意向包含以下时段:

updateNewUser是一种自定义插槽类型(扩展值),具有以下条目:

现在,当用户在确认步骤中拒绝时,我会询问用户要更新/更改的插槽,并使用Lambda函数将用户输入值存储在updateNewUser插槽中。但问题来了

  • Bot对所有捕获的值播放确认提示
  • 用户在确认时说“不”
  • Bot通过询问“你有什么价值”来引出updateNewUser槽 要更新吗?”
  • 如果用户所说的单词与 updateNewUser自定义插槽类型,则其工作正常
  • 如果用户说了一个类似(不完全匹配)的词,如“姓名”或“电子邮件” 或“number”,则在updateNewUser和bot中不存储任何值 继续进行确认提示
以下是我的Lambda代码:

def newUser(intent_request):

slot_details = intent_request['currentIntent']['slotDetails']
slots = intent_request['currentIntent']['slots']
f_name = slots['f_name']
l_name = slots['l_name']
cellNum = slots['cellNum']
emailAdd = slots['emailAdd']
updateSlot = slots['updateNewUser']
session_attributes = intent_request['sessionAttributes'] if intent_request['sessionAttributes'] is not None else {}
confirmation_status = intent_request['currentIntent']['confirmationStatus']


if intent_request['invocationSource'] == 'DialogCodeHook':
    validation_result = validate_newusr(intent_request['currentIntent']['slots'], intent_request['currentIntent']['slotDetails'])
    if not validation_result['isValid']:
        slots = intent_request['currentIntent']['slots']
        slots[validation_result['violatedSlot']] = None
        slots['updateNewUser'] = None
        return elicit_slot(
            session_attributes,
            intent_request['currentIntent']['name'],
            slots,
            validation_result['violatedSlot'],
            validation_result['message']
        )
    
    if confirmation_status == 'Denied':
        slots = intent_request['currentIntent']['slots']
        
        return elicit_slot(
            session_attributes,
            intent_request['currentIntent']['name'],
            slots,
            'updateNewUser',
            {
                'contentType': 'SSML',
                'content': '<speak>Which value do you want to change?</speak>'
            }
        )
    
    
    return delegate(
        session_attributes,
        intent_request['currentIntent']['slots']
    )
    
return close(
        session_attributes,
        'Fulfilled',
        {
            'contentType': 'SSML',
            'content': '<speak>Your account has been created, and you will shortly receive an email to set up your password. Now, would you like to make a reservation for yourself, or for somone else?</speak>'
        }
    )
def新用户(意图请求):
slot\u details=intent\u请求['currentIntent']['slotDetails']
slots=intent\u请求['currentIntent']['slots']
f_name=插槽['f_name']
l_name=插槽['l_name']
cellNum=插槽['cellNum']
emailAdd=slots['emailAdd']
updateSlot=slots['updateNewUser']
session_attributes=intent_请求['sessionAttributes'],如果intent_请求['sessionAttributes']不是其他{}
确认状态=意向请求['currentIntent']['confirmationStatus']
如果意图_请求['invocationSource']=='DialogCodeHook':
验证结果=验证新USR(意图请求['currentIntent']['slots'],意图请求['currentIntent']['slotDetails']))
如果不是验证结果['isValid']:
slots=intent\u请求['currentIntent']['slots']
插槽[验证结果['violatedSlot']]=无
插槽['updateNewUser']=无
返回引出槽(
会话属性,
意向请求['currentIntent']['name'],
插槽,
验证结果['violatedSlot'],
验证结果['message']
)
如果确认\u状态==“拒绝”:
slots=intent\u请求['currentIntent']['slots']
返回引出槽(
会话属性,
意向请求['currentIntent']['name'],
插槽,
“updateNewUser”,
{
“contentType”:“SSML”,
“内容”:“要更改哪个值?”
}
)
返回代表(
会话属性,
意向请求['currentIntent']['slots']
)
回程结束(
会话属性,
"圆满",,
{
“contentType”:“SSML”,
“内容”:“您的帐户已创建,您将很快收到设置密码的电子邮件。现在,您想为自己或其他人预订吗?”
}
)
以下是验证代码:

def validate_newusr(slots, slot_details):

f_name = slots['f_name']
l_name = slots['l_name']
cellNum = slots['cellNum']
emailAdd = slots['emailAdd']
updateSlot = slots['updateNewUser']


if f_name:
    if ' ' in f_name:
        f_name = f_name.replace(' ', '')
        slots['f_name'] = f_name
            
if l_name:
    if ' ' in l_name:
        l_name = l_name.replace(' ', '')
        slots['l_name'] = l_name

if cellNum and (len(cellNum) != 10):
    return build_validation_result(
        False,
        'cellNum',
        '<speak>Please provide a valid, 10 digit phone number.</speak>'
    )
    
    
return build_validation_result(     #I use this to check whether updateNewUser stores something or not. But of course I only paste this code here at confirmIntent step; not before.
            False,
            'updateNewUser',
            str(updateSlot)
        )


    
if updateSlot:                      # this code won't run because updateSlot is empty
    
    return build_validation_result(     
            False,
            'updateNewUser',
            str(updateSlot)
        )
    
    if len(slot_details['updateNewUser']['resolutions']) == 1 and str(list(slot_details['updateNewUser']['resolutions'][0].values())[0]).lower() in ['last name','first name', 'cell phone number', 'email address']:
        slots['updateNewUser'] = list(slot_details['updateNewUser']['resolutions'][0].values())[0]
    
    if len(slot_details['updateNewUser']['resolutions']) == 0 or str(list(slot_details['updateNewUser']['resolutions'][0].values())[0]).lower() not in ['last name','first name', 'cell phone number', 'email address']:
        return build_validation_result(
            False,
            'updateNewUser',
            '<speak>Sorry, I could not understand. Please say first name, last name, phone number, or email address.</speak>'
        )
        
    if slots['updateNewUser'] == 'first name':
        return build_validation_result(
            False,
            'f_name',
            '<speak>Please say your updated first name.</speak>'
        )
        
    if slots['updateNewUser'] == 'last name':
        return build_validation_result(
            False,
            'l_name',
            '<speak>Please say your updated last name.</speak>'
        )
        
    if slots['updateNewUser'] == 'cell phone number':
        return build_validation_result(
            False,
            'cellNum',
            '<speak>Please say, or type your updated phone number.</speak>'
        )
        
    if slots['updateNewUser'] == 'email address':
        return build_validation_result(
            False,
            'emailAdd',
            '<speak>Please say your updated email address.</speak>'
        )
        
return {'isValid': True}
def validate_newusr(插槽、插槽详细信息):
f_name=插槽['f_name']
l_name=插槽['l_name']
cellNum=插槽['cellNum']
emailAdd=slots['emailAdd']
updateSlot=slots['updateNewUser']
如果f_名称:
如果f_名称中有“”:
f_name=f_name.replace(“”,“”)
插槽['f_name']=f_name
如果l_名称:
如果l_名称中有“”:
l_name=l_name.replace(“”,“”)
插槽['l_name']=l_name
如果cellNum和(len(cellNum)!=10):
返回生成\验证\结果(
假,,
“cellNum”,
'请提供有效的10位电话号码。'
)
返回build_validation_result(#我用它来检查updateNewUser是否存储了一些东西。但是我当然只在确认步骤将代码粘贴到这里,而不是之前。
假,,
“updateNewUser”,
str(updateSlot)
)
if updateSlot:#由于updateSlot为空,因此此代码不会运行
返回生成验证结果(
假,,
“updateNewUser”,
str(updateSlot)
)
如果len(slot_details['updateNewUser']['resolutions'])=1和str(list(slot_details['updateNewUser']['resolutions'][0].values())[0]).lower()位于['last name'、'first name'、'cell phone number'、'email address']:
插槽['UpdatenWuser']=列表(插槽_详细信息['UpdatenWuser']['resolutions'][0]。值())[0]
如果len(slot_details['updateNewUser']['resolutions'])=0或str(list(slot_details['updateNewUser']['resolutions'][0]。values())[0])。lower()不在['last name'、'first name'、'cell phone number'、'email address'中:
返回生成\验证\结果(
假,,
“updateNewUser”,
“对不起,我听不懂。请说出名字、姓氏、电话号码或电子邮件地址。”
)
如果插槽['updateNewUser']=='first name':
返回生成\验证\结果(
假,,
“f_name”,
“请说出您最新的名字。”
)
如果插槽['updateNewUser']=='last name':
返回生成\验证\结果(
假,,
“l_name”,
'请说出您最新的姓氏。'
)
如果插槽['updateNewUser']=='cell phone number':
返回生成\验证\结果(
假,,
“cellNum”,
'请说出或键入您更新的电话号码。'
)
如果插槽['updateNewUser']=='email address':
返回生成\验证\结果(
假,,
“emailAdd”,
'请说出您的最新电子邮件地址。'
)
返回{'isValid':True}
这里有一些