Возникла проблема при генерации отклика на явный слот - PullRequest
3 голосов
/ 09 апреля 2019

Я хочу создать dialogHook для определенного слота, а лучше сказать, что это проверочный тип. Если слот вернет истину, тогда только я открою свой извлеченный слот, иначе он пойдет как обычно. Пожалуйста, помогите, каков будет мой подход.Я относительно новичок в lex.

Я пытался создать диалоговое окно для childExists, но оно не работает.

def lambda_handler(event,context):
    os.environ['TZ']='America/New_York'
    time.tzset();
    logger.debug('event.bot.name={}'.format(event['bot']['name']))
    return dispatch(event);

def dispatch(intent_request):
    intent_name=intent_request['currentIntent']['name']
    if intent_name=='HotelReservation':
        return book_hotel(intent_request)

def book_hotel(intent_request):
    slots=intent_request['currentIntent']['slots']
    welcome=intent_request['currentIntent']['slots']['welcome']
    location=intent_request['currentIntent']['slots']['Location']
    fromDate=intent_request['currentIntent']['slots']['FromDate']
    adultCount=intent_request['currentIntent']['slots']['adultCount']
    nights=intent_request['currentIntent']['slots']['nights']
    childExists=intent_request['currentIntent']['slots']['childExists']
    source=intent_request['invocationSource']
    session_attributes={}
    if source=='DialogCodeHook'and childExists.lower()=='yes':
        session_attributes={}
        return elicit_slot (
        session_attributes,
            'HotelReservation',
            'childCount',
             'AMAZON.NUMBER',            
            {
            'contentType':'PlainText',
            'content':'Please enter number of Children'
            }
        )
    elif source=='DialogCodeHook':
        output_session_attributes = intent_request['sessionAttributes'] if intent_request['sessionAttributes'] is not None else {}
        return delegate(output_session_attributes, intent_request['currentIntent']['slots'])
    else:

        return close (
            session_attributes,
                'Fulfilled',{
                'contentType':'PlainText',
                'content':'Here is the temparature in'
                }
            )


#for fullfillment function
def close(session_attributes,fulfillment_state,message):
    response={
        'sessionAttributes':session_attributes,
        'dialogAction':{
            'type':'Close',
            'fulfillmentState':fulfillment_state,
            'message':message
        }
    }
    return response
#for elicit slot return
def elicit_slot(session_attributes, intent_name,slots,slot_to_elicit,message):
                        response= {
                         'sessionAttributes': session_attributes,
                         'dialogAction': {
                         'type': 'ElicitSlot',
                         'intentName': intent_name,
                         'slots': slots,
                         'slotToElicit': slot_to_elicit,
                         'message': message
                         }
                       }
    return response;
def delegate(session_attributes, slots):
    return {
        'sessionAttributes': session_attributes,
        'dialogAction': {
            'type': 'Delegate',
            'slots': slots
        }
    }

На самом деле мои слоты должны работать как обычно, но после слота childExistsЯ хочу отправить ответ elicit Это изображение доступных слотов

1 Ответ

3 голосов
/ 10 апреля 2019

Насколько я понимаю, вы спрашиваете у пользователя Do you have any children и сохраняете ответ в childExists слоте, если ответ да , то вы хотите задать количество детей.

Итак, по моему мнению, вам нужно иметь дополнительный слот childCount для хранения количества детей. Так как этот слот не всегда требуется, не отмечайте это обязательное в консоли amazon lex.

Теперь вы проверите это в своем DialogCodeHook и спросите пользователя соответственно, только когда childExists == 'yes', а в childCount нет значения. Мы используем комбинацию этих условий, чтобы гарантировать, что они не будут работать бесконечно.

def book_hotel(intent_request):
    slots = intent_request['currentIntent']['slots']
    welcome = slots['welcome']
    location = slots['Location']
    fromDate = slots['FromDate']
    adultCount = slots['adultCount']
    nights = slots['nights']
    childExists = slots['childExists']
    childCount = slots['childCount']
    source = intent_request['invocationSource']
    if source == 'DialogCodeHook':
        output_session_attributes = intent_request['sessionAttributes'] if intent_request['sessionAttributes'] is not None else {}
        if childExists.lower() == 'yes':
            if not childCount:
                return elicit_slot (
                    output_session_attributes,
                    'HotelReservation',
                    slots,
                    'childCount',            
                        {
                            'contentType':'PlainText',
                            'content':'Please enter number of Children'
                        }
                    )
        return delegate(output_session_attributes, intent_request['currentIntent']['slots'])

    if source == 'FulfillmentCodeHook':
        return close (
            output_session_attributes,
                'Fulfilled',{
                'contentType':'PlainText',
                'content':'Here is the temparature in'
                }
            )

Надеюсь, это поможет.

...