根据传入请求的contentType在Amazon Lambda函数输出中指定contentType?

时间:2017-06-06 16:22:43

标签: python aws-lambda amazon-lex

我正在Amazon Lex bot工作,在我的python Lambda函数中,我有以下作为输出回复:

    def close(session_attributes, fulfillment_state, message):
    response = {
        'sessionAttributes': session_attributes,
        'dialogAction': {
            'type': 'Close',
            'fulfillmentState': fulfillment_state,
            'message': message
        }
    }

    return response

def Test_Bot(intent_request):
    # bunch of other code processing

    # call to close() in final output return
    return close(
        session_attributes,
        'Fulfilled',
        {
            'contentType': 'PlainText',
            'content': 'Thanks for asking!'
        }
    )

以下是我对Lambda函数的输入结果:

def dispatch(intent_request):

    intent_name = intent_request['currentIntent']['name']

    # Dispatch to your bot's intent handlers
    if intent_name == 'TestBot':
        return Test_Bot(intent_request)


    raise Exception('Intent with name ' + intent_name + ' not supported')


# --- Main handler ---


def lambda_handler(event, context):

    return dispatch(event)

注意这不是完整的代码,而是输入和输出代码的一部分。

现在我面临的问题是,如果我通过type-in测试机器人控制台Lex我的问题,我的代码从开始到结束都非常好。但是,如果我speak-in我的问题,那么代码会在终点处中断。现在,如果我是正确的,因为contentType设置为PlainText,所以当我type-in问题时它可以正常工作,但当我speak-in问题时,它会期待{ {1}} audio中的{1}}不存在,因此会中断。

所以我的问题是如何访问传入请求的contentType?表示如果用户正在键入,则上述响应格式中的contentType设置为contentType,当用户在说话时,PlainText设置为contentType

1 个答案:

答案 0 :(得分:0)

通过让机器人直接从Lex与Lambda通信,你不能改变'outputDialogMode'的值,它必须通过调用带有文本或音频接受头的Lex来完成。实际上,这意味着您无法使用PostContent响应。

我也遇到过这种情况,我发现的解决方法是动态创建一个带有Polly的音频文件,然后将其存储在S3中,然后在响应卡的attachmentLinkUrl字段中引用保存的文件。

请参阅sing_a_song方法in this example.