はじめに
本記事では、Amazon ConnectとAmazon Lex v2を連携させる際に、Lexのセッション属性に改行コード(\n
)が含まれているパラメータを指定し、それをConnectのListPickerで使用すると、Connectのテストチャット時にインターフェースで表示に想定外(真っ白になる)事象とその対処方法について記載します。
やりたいこと
LambdaでLexのセッション属性に設定した値をConnectのListPickerで使用したい。
書かない事
- Lambdaの権限周りについて
- Connectのインスタンス作成について
環境
- Lex v2
事象
Connectのテストチャットから動作を確認すると、フロー上のGet Customer inputブロックに到達した際に文言が表示されず、画面が真っ白になります。
下記のようなイメージです。
原因 & 対処法
Lambdaのレスポンスに含まれていた改行コード(\n)が原因でした。
こちらを取り除くと想定通りの文言が表示されました。
Connectのフロー
本記事で使用してるConnectのフローは次の通りです。
図のブロックの用途はそれぞれ次の通りです。
① Get Customer inputブロック:ListPickerを指定したブロック
② Play Promptブロック:LexのsessionAttributesに設定されたテキスト(=★)を表示するブロック
③ Get Customer inputブロック:ListPickerを指定したブロック(element > title には★を設定)
① Get Customer Inputブロック
{
"templateType": "ListPicker",
"version": "1.0",
"data": {
"content": {
"title": "サンプルテキスト",
"subtitle": "",
"elements": [
{ "title": "サンプル選択肢" }
]
}
}
}
② Play Promptブロック
$.Lex.SessionAttributes.response
③ Get Customer Inputブロック
{
"templateType": "ListPicker",
"version": "1.0",
"data": {
"content": {
"title": "$.Lex.SessionAttributes.response",
"subtitle": "",
"elements": [
{ "title": "サンプル選択肢" }
]
}
}
}
Lex
インテントの設定
次のようにインテントの設定をいたします。
- インテント名:sample_intent
- サンプル発話:サンプル選択肢
- Code hooks:☑をいれた状態
Lexから呼ぶLambdaの設定
エイリアスから設定しておきます。
Lambda
次の通りLexから呼ばれる用のLambdaを作成します。
def lambda_handler(event, context):
intent_name = event['sessionState']['intent']['name']
slots = event['sessionState']['intent']['slots']
return {
'sessionState': {
'sessionAttributes': {
'response': 'ああああ\nあああ'
},
'dialogAction': {
'type': 'Close',
},
'intent': {
'name': intent_name,
'slots': slots,
'state': 'Fulfilled'
}
}
}
Connectのテストチャットから動作確認
②Play Promptブロックでは改行コードが含まれていても問題なく表示できていました。
Play Promptブロックの後のブロック(③ Get Customer inputブロック)に到達すると、テストチャットの画面が真っ白になってしまいます。
CloudWatchからフローログを確認すると次のようになっており、LambdaでLexのセッション属性に設定していた"ああああ\nあああ\"
も値が入っています。
{
"ContactId": "~~~",
"ContactFlowId": "~~~",
"ContactFlowName": "~~~",
"ContactFlowModuleType": "GetUserInput",
"Identifier": "ListPicker指定ブロック2",
"Timestamp": "~~~",
"Parameters": {
"NoInputTimeout": "~~~",
"TextToSpeechType": "text",
"LexVersion": "V2",
"BotAliasArn": "~~~",
"Parameter": "~~~",
"Text": "{\n \"templateType\": \"ListPicker\",\n \"version\": \"1.0\",\n \"data\": {\n \"content\": {\n \"title\": \"ああああ\nあああ\",\n \"subtitle\": \"\",\n \"elements\": [\n { \"title\": \"サンプル選択肢\" }\n ]\n }\n }\n}",
"Voice": "~~~",
"MaxSpeechDuration": "~~~"
}
}
見た感じブロックでエラーは起きてないように見えますが、原因を追っていくとLambdaで設定した次の部分の改行コード \n
でした。
"response": "ああああ\nあああ"
以下は修正後のLambdaのソースです。
改行コードを含まない文字列("あああああああ")を設定することで、ConnectのListPickerでの表示問題を回避できました。
def lambda_handler(event, context):
intent_name = event['sessionState']['intent']['name']
slots = event['sessionState']['intent']['slots']
return {
"sessionState": {
"sessionAttributes": {
"response": "あああああああ"
},
"dialogAction": {
"type": "Close",
},
"intent": {
"name": intent_name,
"slots": slots,
"state": "Fulfilled"
}
}
}
試しに \n
を取り除いて動かしてみると、今回起きていた事象は改善されました。
何か参考になれば幸いです。
参考