Вам придется учесть разницу между Lex и Alexa. Наиболее заметными различиями являются форматы запросов и ответов.
Существенные различия, о которых следует знать:
- Основные различия между форматами и передачей
sessionAttribtues
и slots
.
- Lex имеет 4 встроенных
slotTypes
, которые Alexa не использует (пока?): AMAZON.EmailAddress,
, AMAZON.Percentage
, AMAZON.PhoneNumber
, AMAZON.SpeedUnit
и AMAZON.WeightUnit
. ( Reference. )
- Lex всегда передает полный пользовательский ввод через
inputTranscript
. Алекса нет.
- Alexa предоставляет
resolutions
для значений слотов, но заполняет фактическое значение слотов необработанными данными, извлеченными из ввода.
- Lex автоматически разрешит значение слота, если для него установлены синонимы
slotType
.
Поработав с ними обоими довольно часто, и часто сталкиваясь с этим, я предпочитаю Лекса, а не Алекса. Я обнаружил, что Lex проще и обеспечивает больше свободы для разработчика и контроля, даже если вы должны соответствовать ограничениям каждого из выходных каналов Lex.
Сравнить форматы запросов / ответов:
Alexa JSON формат
Формат Lex JSON
Пример запроса Alexa:
{
"version": "1.0",
"session": {
"new": true,
"sessionId": "amzn1.echo-api.session.[unique-value-here]",
"application": {
"applicationId": "amzn1.ask.skill.[unique-value-here]"
},
"attributes": {
"key": "string value"
},
"user": {
"userId": "amzn1.ask.account.[unique-value-here]",
"accessToken": "Atza|AAAAAAAA...",
"permissions": {
"consentToken": "ZZZZZZZ..."
}
}
},
"context": {
"System": {
"device": {
"deviceId": "string",
"supportedInterfaces": {
"AudioPlayer": {}
}
},
"application": {
"applicationId": "amzn1.ask.skill.[unique-value-here]"
},
"user": {
"userId": "amzn1.ask.account.[unique-value-here]",
"accessToken": "Atza|AAAAAAAA...",
"permissions": {
"consentToken": "ZZZZZZZ..."
}
},
"apiEndpoint": "https://api.amazonalexa.com",
"apiAccessToken": "AxThk..."
},
"AudioPlayer": {
"playerActivity": "PLAYING",
"token": "audioplayer-token",
"offsetInMilliseconds": 0
}
},
"request": {}
}
Пример запроса Lex:
{
"currentIntent": {
"name": "intent-name",
"slots": {
"slot name": "value",
"slot name": "value"
},
"slotDetails": {
"slot name": {
"resolutions" : [
{ "value": "resolved value" },
{ "value": "resolved value" }
],
"originalValue": "original text"
},
"slot name": {
"resolutions" : [
{ "value": "resolved value" },
{ "value": "resolved value" }
],
"originalValue": "original text"
}
},
"confirmationStatus": "None, Confirmed, or Denied (intent confirmation, if configured)"
},
"bot": {
"name": "bot name",
"alias": "bot alias",
"version": "bot version"
},
"userId": "User ID specified in the POST request to Amazon Lex.",
"inputTranscript": "Text used to process the request",
"invocationSource": "FulfillmentCodeHook or DialogCodeHook",
"outputDialogMode": "Text or Voice, based on ContentType request header in runtime API request",
"messageVersion": "1.0",
"sessionAttributes": {
"key": "value",
"key": "value"
},
"requestAttributes": {
"key": "value",
"key": "value"
}
}