1

我目前正在尝试在 Python 3.6 中从 AWS Lambda 向 Lex 发送多条消息,但 Lex 认为我的答案不正确。

我遇到了多个错误,例如:

  • 收到来自 Lambda 的无效响应:无法构造消息实例,问题:contentType 不能为空
  • “内容”不能为空
  • 模块“lambda_function”中的语法错误:行继续符后出现意外字符[在尝试转义我的 JSON 之后]
  • 收到来自 Lambda 的无效响应:无法从 START_OBJECT 令牌中反序列化 java.lang.String 实例...

所以基本上,我这样做是这样的:

    messages = [
        {
            'contentType': 'PlainText',
            'group': 0,
            'value': 'Applying this criteria, you have %d result(s) left.' % len(json.loads(session_attributes['results']))
        },
        {
            'contentType': 'PlainText',
            'group': 1,
            'value': 'What do you want to do next ?'
        }
    ]

format_message('PlainText', messages)

使用 format_message 暂时看起来像这样(因为我已经尝试了很多事情来使它工作......但没有任何成功) - 但这个也不起作用:

def format_message(message_type, content):
return {'messages': content}

最后,它给出了这种响应格式(带有其他 lex 先决条件,例如插槽等,但我不会在此处显示它们,因为我认为它不相关):

{'message': {'messages': [{'group': 0, 'contentType': 'PlainText', 'value': 'Applying this criteria, you have 1 result(s) left.'}, {'group': 1, 'contentType': 'PlainText', 'value': 'What do you want to do next ?'}]

我试图将“消息”数组转换为字符串,将其作为 JSON 等发送,但似乎没有任何效果。

我阅读了此问题中列出的所有文档...

请问有人已经找到解决方案了吗?

谢谢,

4

1 回答 1

2

据我所知,Lambda 无法做到这一点。Lex 只允许一条返回消息。当您从命令行管理实用程序使用 JSON 构建 Lex 机器人时,可以创建一个称为消息组aws的东西,例如:

{
    "metadata": {
        "importFormat": "JSON",
        "importType": "LEX",
        "schemaVersion": "1.0"
    },
    "resource": {
        "abortStatement": {
            "messages": [
                {
                    "content": "Sorry, I could not understand. Goodbye.",
                    "contentType": "PlainText"
                }
            ]
        },
        "childDirected": false,
        "clarificationPrompt": {
            "maxAttempts": 5,
            "messages": [
                {
                    "content": "Sorry, can you please repeat that?",
                    "contentType": "PlainText"
                }
            ]
        },
        "idleSessionTTLInSeconds": 300,
        "intents": [
            {
                "conclusionStatement": {
                    "messages": [
                        {
                            "content": "Hello",
                            "contentType": "PlainText"
                        },
                        {
                            "content": "World",
                            "contentType": "PlainText"
                        }
                    ]
                },
                "fulfillmentActivity": {
                    "type": "ReturnIntent"
                },
                "name": "test",
                "sampleUtterances": [
                    "hello"
                ],
                "slots": [],
                "version": "1"
            }
        ],
        "locale": "en-US",
        "name": "Test",
        "version": "1",
        "voiceId": "Matthew"
    }
}

我认为 Lambda 函数的最佳选择是在 Python 中将字符串连接在一起,如下所示:

'message': {
    'contentType': 'PlainText',
    'value': ('Applying this criteria, you have %d result(s) left.' % len(json.loads(session_attributes['results']))) + 'What do you want to do next ?'
}

请原谅格式。我通常不在 Python 中工作。

于 2018-10-15T17:19:52.503 回答