If you are using Amazon Lex V2, refer to the Amazon Lex V2 guide instead.
If you are using Amazon Lex V1, we recommend upgrading your bots to Amazon Lex V2. We are no longer adding new features to V1 and strongly recommend using V2 for all new bots.
Migrating a Lambda function from Amazon Lex V1 to Amazon Lex V2
Amazon Lex V2 allows only one Lambda function for each language in a bot. The Lambda function and its settings are configured for the bot alias that you use at runtime.
The Lambda function is invoked for all intents in that language if dialog and fulfillment code hooks are enabled for the intent.
Amazon Lex V2 Lambda functions have a different input and output message format from Amazon Lex V1. These are the differences in the Lambda function input format.
-
Amazon Lex V2 replaces the
currentIntent
andalternativeIntents
structures with theinterpretations
structure. Each interpretation contains an intent, the NLU confidence score for the intent, and an optional sentiment analysis. -
Amazon Lex V2 moves the
activeContexts
,sessionAttributes
in Amazon Lex V1 to the unifiedsessionState
structure. This structure provides information about the current state of the conversation, including the originating request ID. -
Amazon Lex V2 doesn't return the
recentIntentSummaryView
. Use the information in thesessionState
structure instead. -
The Amazon Lex V2 input provides the
botId
andlocaleId
in thebot
attribute. -
The input structure contains an
inputMode
attribute that provides information on the type of input: text, speech, or DTMF.
These are the differences in the Lambda function output format:
-
The
activeContexts
andsessionAttributes
structures in Amazon Lex V1 are replaced by thesessionState
structure in Amazon Lex V2. -
The
recentIntentSummaryView
isn't included in the output. -
The Amazon Lex V1
dialogAction
structure is split into two structures,dialogAction
that is part of thesessionState
structure, andmessages
that is required when thedialogAction.type
isElicitIntent
. Amazon Lex chooses messages from this structure to show to the user.
When you build a bot with the Amazon Lex V2 APIs, there is only one Lambda function per bot alias per language instead of a Lambda function for each intent. If you want to continue to use separate functions, you can create a router function that activates a separate function for each intent. The following is a router function that you can use or modify for your application.
import os import json import boto3 # reuse client connection as global client = boto3.client('lambda') def router(event): intent_name = event['sessionState']['intent']['name'] fn_name = os.environ.get(intent_name) print(f"Intent: {intent_name} -> Lambda: {fn_name}") if (fn_name): # invoke lambda and return result invoke_response = client.invoke(FunctionName=fn_name, Payload = json.dumps(event)) print(invoke_response) payload = json.load(invoke_response['Payload']) return payload raise Exception('No environment variable for intent: ' + intent_name) def lambda_handler(event, context): print(event) response = router(event) return response
List of updated fields
The following tables provide detailed information about the updated fields in the Amazon Lex V2 Lambda request and response. You can use these tables to map fields between the versions.
Request
The following fields have been updated in the Lambda function request format.
Active contexts
The activeContexts
structure is now part
of the sessionState
structure.
V1 structure | V2 structure |
---|---|
activeContexts |
sessionState.activeContexts |
activeContexts[*].timeToLive |
sessionState.activeContexts[*].timeToLive |
activeContexts[*].timeToLive.timeToLiveInSeconds |
sessionState.activeContexts[*].timeToLive.timeToLiveInSeconds |
activeContexts[*].timeToLive.turnsToLive |
sessionState.activeContexts[*].timeToLive.turnsToLive |
activeContexts[*].name |
sessionState.activeContexts[*].name |
activeContexts[*].parameters |
sessionState.activeContexts[*].contextAttributes |
Alternative intents
The interpretations list from index 1 to N contains
the list of alternative intents predicted by Amazon Lex V2,
along with their confidence scores. The
recentIntentSummaryView
is removed from
the request structure in Amazon Lex V2. To see the details from
the recentIntentSummaryView
, use the GetSession
operation.
V1 structure | V2 structure |
---|---|
alternativeIntents |
interpretations[1:*] |
recentIntentSummaryView |
N/A |
Bot
In Amazon Lex V2, bots and aliases have identifiers. The bot ID is part of the codehook input. The alias ID is included, but not the alias name. Amazon Lex V2 supports multiple locales for the same bot so the locale ID is included.
V1 structure | V2 structure |
---|---|
bot |
bot |
bot.name |
bot.name |
N/A |
bot.id |
bot.alias |
N/A |
N/A |
bot.aliasId |
bot.version |
bot.version |
N/A |
bot.localeId |
Current intent
The sessionState.intent
structure
contains the details of the active intent. Amazon Lex V2 also
returns a list of all of the intents, including
alternative intents, in the interpretations
structure. The first element in the interpretations list
is always the same as
sessionState.intent
.
V1 structure | V2 structure |
---|---|
currentIntent |
sessionState.intent OR interpretations[0].intent |
currentIntent.name |
sessionState.intent.name OR interpretations[0].intent.name |
currentIntent.nluConfidenceScore |
interpretations[0].nluConfidence.score |
Dialog action
The confirmationStatus
field is now part
of the sessionState
structure.
V1 structure | V2 structure |
---|---|
currentIntent.confirmationStatus |
sessionState.intent.confirmationState OR interpretations[0].intent.confirmationState |
N/A |
sessionState.intent.state OR interpretations[*].intent.state |
Amazon Kendra
The kendraResponse
field is now part of
the sessionState
and
interpretations
structures.
V1 structure | V2 structure |
---|---|
kendraResponse |
sessionState.intent.kendraResponse OR interpretations[0].intent.kendraResponse |
Sentiment
The sentimentResponse
structure is moved
to the new interpretations
structure.
V1 structure | V2 structure |
---|---|
sentimentResponse |
interpretations[0].sentimentResponse |
sentimentResponse.sentimentLabel |
interpretations[0].sentimentResponse.sentiment |
sentimentResponse.sentimentScore |
interpretations[0].sentimentResponse.sentimentScore |
Slots
Amazon Lex V2 provides a single slots
object
inside the sessionState.intent
structure
that contains the resolved values, interpreted value,
and the original value of what the user said. Amazon Lex V2
also supports multi-valued slots by setting the
slotShape
as List
and
setting the values
list. Single-value slots
are supported by the value
field, their
shape is assumed to be Scalar
.
V1 structure | V2 structure |
---|---|
currentIntent.slots |
sessionState.intent.slots OR interpretations[0].intent.slots |
currentIntent.slots[*].value |
sessionState.intent.slots[*].value.interpretedValue OR interpretations[0].intent.slots[*].value.interpretedValue |
N/A |
sessionState.intent.slots[*].value.shape OR interpretations[0].intent.slots[*].shape |
N/A |
sessionState.intent.slots[*].values OR interpretations[0].intent.slots[*].values |
currentIntent.slotDetails |
sessionState.intent.slots OR interpretations[0].intent.slots |
currentIntent.slotDetails[*].resolutions |
sessionState.intent.slots[*].resolvedValues OR interpretations[0].intent.slots[*].resolvedValues |
currentIntent.slotDetails[*].originalValue |
sessionState.intent.slots[*].originalValue OR interpretations[0].intent.slots[*].originalValue |
Others
The Amazon Lex V2 sessionId
field is the same as
the userId
field in Amazon Lex V1. Amazon Lex V2 also
sends the inputMode
of the caller: text,
DTMF, or speech.
V1 structure | V2 structure |
---|---|
userId |
sessionId |
inputTranscript |
inputTranscript |
invocationSource |
invocationSource |
outputDialogMode |
responseContentType |
messageVersion |
messageVersion |
sessionAttributes |
sessionState.sessionAttributes |
requestAttributes |
requestAttributes |
N/A |
inputMode |
N/A |
originatingRequestId |
Response
The following fields have been changed in the Lambda function response message format.
Active contexts
The activeContexts
structure moved to the
sessionState
structure.
V1 structure | V2 structure |
---|---|
activeContexts |
sessionState.activeContexts |
activeContexts[*].timeToLive |
sessionState.activeContexts[*].timeToLive |
activeContexts[*].timeToLive.timeToLiveInSeconds |
sessionState.activeContexts[*].timeToLive.timeToLiveInSeconds |
activeContexts[*].timeToLive.turnsToLive |
sessionState.activeContexts[*].timeToLive.turnsToLive |
activeContexts[*].name |
sessionState.activeContexts[*].name |
activeContexts[*].parameters |
sessionState.activeContexts[*].contextAttributes |
Dialog action
The dialogAction
structure moved to the
sessionState
structure. You can now
specify multiple messages in a dialog action, and the
genericAttachments
structure is now the
imageResponseCard
structure.
V1 structure | V2 structure |
---|---|
dialogAction |
sessionState.dialogAction |
dialogAction.type |
sessionState.dialogAction.type |
dialogAction.slotToElicit |
sessionState.intent.dialogAction.slotToElicit |
dialogAction.type.fulfillmentState |
sessionState.intent.state |
dialogAction.message |
messages |
dialogAction.message.contentType |
messages[*].contentType |
dialogAction.message.content |
messages[*].content |
dialogAction.responseCard |
messages[*].imageResponseCard |
dialogAction.responseCard.version |
N/A |
dialogAction.responseCard.contentType |
messages[*].contentType |
dialogAction.responseCard.genericAttachments |
N/A |
dialogAction.responseCard.genericAttachments[*].title |
messages[*].imageResponseCard.title |
dialogAction.responseCard.genericAttachments[*].subTitle |
messages[*].imageResponseCard.subtitle |
dialogAction.responseCard.genericAttachments[*].imageUrl |
messages[*].imageResponseCard.imageUrl |
dialogAction.responseCard.genericAttachments[*].buttons |
messages[*].imageResponseCard.buttons |
dialogAction.responseCard.genericAttachments[*].buttons[*].value |
messages[*].imageResponseCard.buttons[*].value |
dialogAction.responseCard.genericAttachments[*].buttons[*].text |
messages[*].imageResponseCard.buttons[*].text |
dialogAction.kendraQueryRequestPayload |
dialogAction.kendraQueryRequestPayload |
dialogAction.kendraQueryFilterString |
dialogAction.kendraQueryFilterString |
Intents and slots
Intent and slot fields that were part of the
dialogAction
structure are now part of
the sessionState
structure.
V1 structure | V2 structure |
---|---|
dialogAction.intentName |
sessionState.intent.name |
dialogAction.slots |
sessionState.intent.slots |
dialogAction.slots[*].key |
sessionState.intent.slots[*].key |
dialogAction.slots[*].value |
sessionState.intent.slots[*].value.interpretedValue |
N/A |
sessionState.intent.slots[*].value.shape |
N/A |
sessionState.intent.slots[*].values |
Others
The sessionAttributes
structure is now
part of the sessionState
structure. The
recentIntentSummaryReview
structure has
been removed.
V1 structure | V2 structure |
---|---|
sessionAttributes |
sessionState.sessionAttributes |
recentIntentSummaryView |
N/A |