

サポート終了通知: 2025 年 9 月 15 日、 AWS は Amazon Lex V1 のサポートを終了します。 V1 2025 年 9 月 15 日を過ぎると、Amazon Lex V1 コンソールまたは Amazon Lex V1 リソースにはアクセスできなくなります。Amazon Lex V2 を使用している場合は、代わりに [Amazon Lex V2 ガイド](https://docs.aws.amazon.com/lexv2/latest/dg/what-is.html)を参照してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 情報フローの詳細
<a name="ex1-sch-appt-info-flow-details"></a>

`ScheduleAppointment` ボットの設計図では、動的に生成されたレスポンスカードの使用を主に示しています。この演習の Lambda 関数は、Amazon Lex へのレスポンスにレスポンスカードを含めています。Amazon Lex はそのレスポンスカードをクライアントへの応答に含めています。このセクションでは以下の両方について説明します。
+ クライアントと Amazon Lex の間のデータフロー。

   

  このセクションでは、クライアントが `PostText` ランタイム API を使用して Amazon Lex にリクエストを送信することを前提としていて、それに応じたリクエスト/レスポンスの詳細を示しています。`PostText` ランタイム API の詳細については、「[PostText](API_runtime_PostText.md)」を参照してください。
**注記**  
クライアントが `PostContent` API を使用する場合の、クライアントと Amazon Lex の間の情報フローの例については、「[ステップ 2a (オプション): 音声による情報フローの詳細を確認する (コンソール)](gs-bp-details-postcontent-flow.md)」を参照してください。

   
+ Amazon Lex と Lambda 関数の間のデータフロー。詳細については、「[Lambda 関数の入力イベントとレスポンスの形式](lambda-input-response-format.md)」を参照してください。

**注記**  
この例では、Facebook Messenger クライアントを使用していることを前提としています。このクライアントは Amazon Lex へのリクエストでセッション属性を渡しません。したがって、このセクションで示しているリクエストの例では `sessionAttributes` は空です。Amazon Lex コンソールで提供されているクライアントを使用してボットをテストする場合、そのクライアントはセッション属性を含めます。

このセクションでは、各ユーザー入力の後に何が起こるかを説明します。

1. ユーザー: タイプ **Book an appointment**。

   1. クライアント (コンソール) は以下の [PostContent](API_runtime_PostContent.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/ScheduleAppointment/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
         "inputText":"book appointment",
         "sessionAttributes":{}
      }
      ```

      リクエストの URI と本文の両方で Amazon Lex に情報が提供されています。
      + リクエスト URI – ボット名 (ScheduleAppointment)、ボットのエイリアス (\$1LATEST)、およびユーザー名 ID。末尾の `text` は、このリクエストが `PostText` API リクエストである (`PostContent` API リクエストではない) ことを示しています。
      + リクエストボディ – ユーザー入力 (`inputText`) と空の `sessionAttributes` が含まれています。

   1. `inputText` から、Amazon Lex はインテント (`MakeAppointment`) を検出します。サービスによって、コードフックとして設定されている Lambda 関数が呼び出され、以下のイベントが渡されることで初期化および検証が実行されます。詳細については、「[入力イベントの形式](lambda-input-response-format.md#using-lambda-input-event-format)」を参照してください。

      ```
      {
          "currentIntent": {
              "slots": {
                  "AppointmentType": null,
                  "Date": null,
                  "Time": null
              },
              "name": "MakeAppointment",
              "confirmationStatus": "None"
          },
          "bot": {
              "alias": null,
              "version": "$LATEST",
              "name": "ScheduleAppointment"
          },
          "userId": "bijt6rovckwecnzesbthrr1d7lv3ja3n",
          "invocationSource": "DialogCodeHook",
          "outputDialogMode": "Text",
          "messageVersion": "1.0",
          "sessionAttributes": {}
      }
      ```

      クライアントによって送信された情報に加えて、Amazon Lex には、以下の追加データが含まれます。
      + `currentIntent` – 現在のインテントの情報を提供しています。
      + `invocationSource` – Lambda 関数呼び出しの目的を表しています。この場合、目的はユーザーデータの初期化および検証を実行することです。(Amazon Lex はインテントを達成するためのスロットデータの一部をユーザーがまだ指定していないことを知っています)。
      + `messageVersion` – 現在 Amazon Lex でサポートしているのは 1.0 バージョンだけです。

   1. この時点では、すべてのスロット値は null です (検証する対象はありません)。Lambda 関数は、以下のレスポンスを Amazon Lex に返して、`AppointmentType` スロットの情報を引き出すようにサービスに指示します。レスポンスの形式については、「[レスポンスの形式](lambda-input-response-format.md#using-lambda-response-format)」を参照してください。

      ```
      {
          "dialogAction": {
              "slotToElicit": "AppointmentType",
              "intentName": "MakeAppointment",
              "responseCard": {
                  "genericAttachments": [
                      {
                          "buttons": [
                              {
                                  "text": "cleaning (30 min)",
                                  "value": "cleaning"
                              },
                              {
                                  "text": "root canal (60 min)",
                                  "value": "root canal"
                              },
                              {
                                  "text": "whitening (30 min)",
                                  "value": "whitening"
                              }
                          ],
                          "subTitle": "What type of appointment would you like to schedule?",
                          "title": "Specify Appointment Type"
                      }
                  ],
                  "version": 1,
                  "contentType": "application/vnd.amazonaws.card.generic"
              },
              "slots": {
                  "AppointmentType": null,
                  "Date": null,
                  "Time": null
              },
              "type": "ElicitSlot",
              "message": {
                  "content": "What type of appointment would you like to schedule?",
                  "contentType": "PlainText"
              }
          },
          "sessionAttributes": {}
      }
      ```

      このレスポンスには、`dialogAction` フィールドと `sessionAttributes` フィールドが含まれています。特に、`dialogAction` フィールドでは以下のフィールドが返されています。
      + `type` – このフィールドを `ElicitSlot` に設定することで、Lambda 関数は、`slotToElicit` フィールドで指定しているスロットの値を引き出すように Amazon Lex に指示しています。Lambda 関数は、ユーザーに伝えるメッセージである `message` も提供しています。
      + `responseCard` – `AppointmentType` スロットで使用可能な値のリストを特定しています。レスポンスカードをサポートしているクライアント (例えば、Facebook Messenger) では、ユーザーが予約タイプを選択できるレスポンスカードが次の画像のように表示されます。  
![\[スケジュールの予約の種類と、クリーニング (30 分)、根管 (60 分)、ホワイトニング (30 分) の 3 つの選択肢を尋ねるレスポンスカード。\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/respcard-10.png)

   1. Lambda 関数からのレスポンス内の `dialogAction.type` で示されているように、Amazon Lex は以下のレスポンスをクライアントに返します。  
![\[予約を行うインテントと引き出す予約タイプスロットに関する情報を含む JSON レスポンス。\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/appt-10.png)

      クライアントはレスポンスを読み取り、「どのタイプを予約なさいますか?」のメッセージと レスポンスカード (クライアントでサポートされている場合) を表示します。

1. ユーザー: ユーザーにはクライアントに応じて 2 つの選択肢があります。
   + レスポンスカードが表示されている場合は、[**root canal (60 分)**] あるいはタイプ **root canal** を選択します。
   + クライアントでレスポンスカードがサポートされていない場合は、「**root canal**」と入力します。

   1. クライアントは以下の `PostText` リクエスト (読みやすいように改行が追加されています) を Amazon Lex に送信します。

      ```
      POST /bot/BookTrip/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
         "inputText": "root canal",
          "sessionAttributes": {}
      }
      ```

   1. Amazon Lex は以下のイベントをパラメータとして送信することで、ユーザーデータの検証のために Lambda 関数を呼び出します。

      ```
      {
          "currentIntent": {
              "slots": {
                  "AppointmentType": "root canal",
                  "Date": null,
                  "Time": null
              },
              "name": "MakeAppointment",
              "confirmationStatus": "None"
          },
          "bot": {
              "alias": null,
              "version": "$LATEST",
              "name": "ScheduleAppointment"
          },
          "userId": "bijt6rovckwecnzesbthrr1d7lv3ja3n",
          "invocationSource": "DialogCodeHook",
          "outputDialogMode": "Text",
          "messageVersion": "1.0",
          "sessionAttributes": {}
      }
      ```

      イベントデータで次の点に注意してください。
      + `invocationSource` は `DialogCodeHook` のままです。このステップではユーザーデータを検証しているだけです。
      + Amazon Lex は `AppointmentType` スロットの `currentIntent.slots` フィールドを `root canal` に設定します。
      + Amazon Lex はクライアントと Lambda 関数の間で `sessionAttributes` フィールドを渡すだけです。

   1. Lambda 関数はユーザー入力を検証し、予約日付の値を引き出すようにサービスに指示する、以下のレスポンスを Amazon Lex に返します。

      ```
      {
          "dialogAction": {
              "slotToElicit": "Date",
              "intentName": "MakeAppointment",
              "responseCard": {
                  "genericAttachments": [
                      {
                          "buttons": [
                              {
                                  "text": "2-15 (Wed)",
                                  "value": "Wednesday, February 15, 2017"
                              },
                              {
                                  "text": "2-16 (Thu)",
                                  "value": "Thursday, February 16, 2017"
                              },
                              {
                                  "text": "2-17 (Fri)",
                                  "value": "Friday, February 17, 2017"
                              },
                              {
                                  "text": "2-20 (Mon)",
                                  "value": "Monday, February 20, 2017"
                              },
                              {
                                  "text": "2-21 (Tue)",
                                  "value": "Tuesday, February 21, 2017"
                              }
                          ],
                          "subTitle": "When would you like to schedule your root canal?",
                          "title": "Specify Date"
                      }
                  ],
                  "version": 1,
                  "contentType": "application/vnd.amazonaws.card.generic"
              },
              "slots": {
                  "AppointmentType": "root canal",
                  "Date": null,
                  "Time": null
              },
              "type": "ElicitSlot",
              "message": {
                  "content": "When would you like to schedule your root canal?",
                  "contentType": "PlainText"
              }
          },
          "sessionAttributes": {}
      }
      ```

      ここでも、レスポンスに `dialogAction` フィールドと `sessionAttributes` フィールドが含まれています。特に、`dialogAction` フィールドでは以下のフィールドが返されています。
      + `type` – このフィールドを `ElicitSlot` に設定することで、Lambda 関数は、`slotToElicit` フィールドで指定しているスロットの値を引き出すように Amazon Lex に指示しています。Lambda 関数は、ユーザーに伝えるメッセージである `message` も提供しています。
      + `responseCard` – `Date` スロットで使用可能な値のリストを特定しています。レスポンスカードをサポートしているクライアント (例えば、Facebook Messenger) では、次の画像のように、ユーザーが予約日付を選択できるレスポンスカードが表示されます。  
![\[根管と 3 つの選択肢： 2-15、2-16、2-17 をスケジュールする日付を示すレスポンスカード。\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/respcard-20.png)

        Lambda 関数は 5 つの日付を返していますが、このクライアント (Facebook Messenger) ではレスポンスカードのボタンが 3 つまでに制限されています。そのため、スクリーンショットでは最初の 3 つの値だけが表示されています。

        これらの日付は Lambda 関数でハードコードされています。本稼働アプリケーションでは、カレンダーを使用して、予約可能な日付をリアルタイムで取得できます。日付は動的であるため、Lambda 関数でレスポンスカードを動的に生成する必要があります。

   1. Amazon Lex は `dialogAction.type` に気づき、Lambda 関数のレスポンスからの情報を含む次のレスポンスをクライアントに返します。  
![\[予約のインテント、入力された予定の種類、および予約日を示すメッセージを含む JSON レスポンス。\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/appt-20.png)

      クライアントには、「**When would you like to schedule your root canal?**」(root canal をいつ予約しますか ?) というメッセージ とレスポンスカード (クライアントでレスポンスカードがサポートされている場合) が表示されます。

1. ユーザー: タイプ **Thursday**。

   1. クライアントは以下の `PostText` リクエスト (読みやすいように改行が追加されています) を Amazon Lex に送信します。

      ```
      POST /bot/BookTrip/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
         "inputText": "Thursday",
          "sessionAttributes": {}
      }
      ```

   1. Amazon Lex は以下のイベントでパラメータとして送信して、ユーザーデータの検証のために Lambda 関数を呼び出します。

      ```
      {
          "currentIntent": {
              "slots": {
                  "AppointmentType": "root canal",
                  "Date": "2017-02-16",
                  "Time": null
              },
              "name": "MakeAppointment",
              "confirmationStatus": "None"
          },
          "bot": {
              "alias": null,
              "version": "$LATEST",
              "name": "ScheduleAppointment"
          },
          "userId": "u3fpr9gghj02zts7y5tpq5mm4din2xqy",
          "invocationSource": "DialogCodeHook",
          "outputDialogMode": "Text",
          "messageVersion": "1.0",
          "sessionAttributes": {}
      }
      ```

      イベントデータで次の点に注意してください。
      + `invocationSource` は `DialogCodeHook` のままです。このステップではユーザーデータを検証しているだけです。
      + Amazon Lex は `Date` スロットの `currentIntent.slots` フィールドを `2017-02-16` に設定します。
      + Amazon Lex はクライアントと Lambda 関数の間で `sessionAttributes` を渡すだけです。

   1. Lambda 関数はユーザー入力を検証します。今回は、Lambda 関数は指定された日付に予約可能な時間がないと判断します。この関数は、予約日付の値を再度引き出すようにサービスに指示する、以下のレスポンスを Amazon Lex に返します。

      ```
      {
          "dialogAction": {
              "slotToElicit": "Date",
              "intentName": "MakeAppointment",
              "responseCard": {
                  "genericAttachments": [
                      {
                          "buttons": [
                              {
                                  "text": "2-15 (Wed)",
                                  "value": "Wednesday, February 15, 2017"
                              },
                              {
                                  "text": "2-17 (Fri)",
                                  "value": "Friday, February 17, 2017"
                              },
                              {
                                  "text": "2-20 (Mon)",
                                  "value": "Monday, February 20, 2017"
                              },
                              {
                                  "text": "2-21 (Tue)",
                                  "value": "Tuesday, February 21, 2017"
                              }
                          ],
                          "subTitle": "When would you like to schedule your root canal?",
                          "title": "Specify Date"
                      }
                  ],
                  "version": 1,
                  "contentType": "application/vnd.amazonaws.card.generic"
              },
              "slots": {
                  "AppointmentType": "root canal",
                  "Date": null,
                  "Time": null
              },
              "type": "ElicitSlot",
              "message": {
                  "content": "We do not have any availability on that date, is there another day which works for you?",
                  "contentType": "PlainText"
              }
          },
          "sessionAttributes": {
           "bookingMap": "{\"2017-02-16\": []}"
         }
      }
      ```

      ここでも、レスポンスに `dialogAction` フィールドと `sessionAttributes` フィールドが含まれています。特に、`dialogAction` では以下のフィールドが返されています。
      + `dialogAction` field:
        + `type` – Lambda 関数はこの値を `ElicitSlot` に設定し、`slotToElicit` フィールドを `Date` にリセットします。Lambda 関数は、ユーザーに伝える適切なメッセージである `message` も提供しています。
        + `responseCard` – `Date` スロットの値のリストを返します。
      + `sessionAttributes` – 今回は、Lambda 関数は `bookingMap` セッション属性を含めています。その値は、要求された予約日付と予約可能な時間です (オブジェクトが空の場合は、予約可能な時間がないことを表します)。

   1. Amazon Lex は `dialogAction.type` に気づき、Lambda 関数のレスポンスからの情報を含む次のレスポンスをクライアントに返します。  
![\[予約をするインテントを示す JSON レスポンスと、カスタマーが希望した日に空きがないことを明確にするメッセージ。\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/appt-30.png)

      クライアントは**「We do not have any availability on that date, is there another day which works for you?」**(その日付では空きがありません。ご都合がよい別の日はありますか ?)のメッセージとレスポンスカード (クライアントでレスポンスカードがサポートされている場合) が表示されます。

1. ユーザー: ユーザーにはクライアントに応じて 2 つの選択肢があります。
   + レスポンスカードが表示されている場合は、[**2-15 (Wed)**] を選択するか、「**Wednesday**」と入力します。
   + クライアントでレスポンスカードがサポートされていない場合は、「**Wednesday**」と入力します。

   1. クライアント は以下の `PostText` リクエストを Amazon Lex に送信します。

      ```
      POST /bot/BookTrip/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
         "inputText": "Wednesday",
          "sessionAttributes": {
         }
      }
      ```

      
**注記**  
Facebook Messenger クライアントではセッション属性は設定されません。リクエスト間のセッションステータスを保持する場合は、Lambda 関数内でこれを実行する必要があります。実際のアプリケーションでは、これらのセッション属性をバックエンドデータベースで保持する必要があります。

   1. Amazon Lex は以下のイベントをパラメータとして送信することで、ユーザーデータの検証のために Lambda 関数を呼び出します。

      ```
      {
          "currentIntent": {
              "slots": {
                  "AppointmentType": "root canal",
                  "Date": "2017-02-15",
                  "Time": null
              },
              "name": "MakeAppointment",
              "confirmationStatus": "None"
          },
          "bot": {
              "alias": null,
              "version": "$LATEST",
              "name": "ScheduleAppointment"
          },
          "userId": "u3fpr9gghj02zts7y5tpq5mm4din2xqy",
          "invocationSource": "DialogCodeHook",
          "outputDialogMode": "Text",
          "messageVersion": "1.0",
          "sessionAttributes": {
          }
      }
      ```

      Amazon Lex は `currentIntent.slots` スロットを `Date` に設定することで `2017-02-15` を更新します。

   1. Lambda 関数はユーザー入力を検証し、予約時刻の値を引き出すように指示する、以下のレスポンスを Amazon Lex に返します。

      ```
      {
          "dialogAction": {
              "slots": {
                  "AppointmentType": "root canal",
                  "Date": "2017-02-15",
                  "Time": "16:00"
              },
              "message": {
                  "content": "What time on 2017-02-15 works for you? 4:00 p.m. is our only availability, does that work for you?",
                  "contentType": "PlainText"
              },
              "type": "ConfirmIntent",
              "intentName": "MakeAppointment",
              "responseCard": {
                  "genericAttachments": [
                      {
                          "buttons": [
                              {
                                  "text": "yes",
                                  "value": "yes"
                              },
                              {
                                  "text": "no",
                                  "value": "no"
                              }
                          ],
                          "subTitle": "Is 4:00 p.m. on 2017-02-15 okay?",
                          "title": "Confirm Appointment"
                      }
                  ],
                  "version": 1,
                  "contentType": "application/vnd.amazonaws.card.generic"
              }
          },
          "sessionAttributes": {
              "bookingMap": "{\"2017-02-15\": [\"10:00\", \"16:00\", \"16:30\"]}"
          }
      }
      ```

      ここでも、レスポンスに `dialogAction` フィールドと `sessionAttributes` フィールドが含まれています。特に、`dialogAction` では以下のフィールドが返されています。
      + `dialogAction` field:
        + `type` – `Lambda` 関数はこの値を `ConfirmIntent` に設定して、`message` で提示している予約時刻をユーザーに確認するように Amazon Lex に指示します。
        + `responseCard` – ユーザーが選択できる「はい/いいえ」の値のリストを返します。クライアントでレスポンスカードがサポートされている場合、クライアントはそのレスポンスカードを以下の例のように表示します。  
![\[予約の確認と 2 つのオプション (「はい」と「いいえ」) が記載されたレスポンスカード。\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/respcard-30.png)
      + `sessionAttributes` - Lambda 関数は `bookingMap` セッション属性を設定し、その値を予約日付とその日の予約可能な時間に設定します。この例では、予約時間は 30 分間です。1 時間かかる root canal の場合、予約できるのは 午後 4 時だけです。

        

   1. Lambda 関数のレスポンス内の `dialogAction.type` で示されているように、Amazon Lex は以下のレスポンスをクライアントに返します。  
![\[予約のインテントが示され、すべての枠が埋まっていることを示す JSON レスポンス。\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/appt-40.png)

      クライアントは次のメッセージを表示します。**2017 年 2 月 15 日は何時が都合がよろしいでしょうか？午後 4 時しか空いていませんがよろしいですか？**

   

1. ユーザー : [**yes**] を選択し ます。

   Amazon Lex は以下のイベントデータを使用して Lambda 関数を呼び出します。ユーザーが「**yes**」と応答しているため、`confirmationStatus` は `Confirmed` を `Time` に設定し、Amazon Lex の `currentIntent.slots ` フィールドを `4 p.m` に設定します。

   ```
   {
       "currentIntent": {
           "slots": {
               "AppointmentType": "root canal",
               "Date": "2017-02-15",
               "Time": "16:00"
           },
           "name": "MakeAppointment",
           "confirmationStatus": "Confirmed"
       },
       "bot": {
           "alias": null,
           "version": "$LATEST",
           "name": "ScheduleAppointment"
       },
       "userId": "u3fpr9gghj02zts7y5tpq5mm4din2xqy",
       "invocationSource": "FulfillmentCodeHook",
       "outputDialogMode": "Text",
       "messageVersion": "1.0",
       "sessionAttributes": {
      }
   }
   ```

   `confirmationStatus` が確認済みであるため、Lambda 関数はインテント (歯科予約) を処理し、以下のレスポンスを Amazon Lex に返します。

   ```
   {
       "dialogAction": {
           "message": {
               "content": "Okay, I have booked your appointment.  We will see you at 4:00 p.m. on 2017-02-15",
               "contentType": "PlainText"
           },
           "type": "Close",
           "fulfillmentState": "Fulfilled"
       },
       "sessionAttributes": {
           "formattedTime": "4:00 p.m.",
           "bookingMap": "{\"2017-02-15\": [\"10:00\"]}"
       }
   }
   ```

   次の点に注意してください。
   + Lambda 関数が `sessionAttributes` を更新しています。
   + `dialogAction.type` が `Close` に設定されていて、ユーザーの応答を想定しないことを Amazon Lex に指示しています。
   + `dialogAction.fulfillmentState` が `Fulfilled` に設定されていて、インテントの達成が完了したことを示しています。

   クライアントに次のメッセージを表示します。**あなたの予約が完了しました。2017 年 2 月 15 日の午後 4 時にお待ちしています。**





