Отправка групповых (множественных) сообщений из Lambda в Lex - PullRequest
0 голосов
/ 10 октября 2018

В настоящее время я пытаюсь отправить несколько сообщений из AWS Lambda в Lex в Python 3.6, но Лекс считает мои ответы неверными.

Я получил несколько ошибок, таких как:

  • Получен неверный ответ от Lambda: невозможно создать экземпляр сообщения, проблема: contentType не должен быть нулевым
  • «content» не может быть пустым
  • Синтаксическая ошибка в модуле «lambda_function»: неожиданный символ послесимвол продолжения строки [после попытки избежать моего JSON]
  • Получен неверный ответ от Lambda: Невозможно десериализовать экземпляр java.lang.String из токена START_OBJECT в ...

В общем, я делаю это так:

    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 ?'}]

Я попытался преобразовать массив 'messages' в строку, отправить его в виде JSON и т. д.Но, похоже, ничего не работает.

Я прочитал всю документацию, перечисленную в этом выпуске ...

Кто-нибудь уже нашел решение, пожалуйста?

Спасибо,

1 Ответ

0 голосов
/ 15 октября 2018

Насколько я знаю, это невозможно из Лямбды. Лекс допускает только одно ответное сообщение .Существует нечто, называемое Группа сообщений , которое можно создать при сборке бота Lex с JSON из утилиты управления 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"
    }
}

Я думаю, что вашЛучший вариант использования лямбда-функции - объединить строки в 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.

...