

サポート終了通知: 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"></a>

この演習のボット例では、歯科医院の予約を行います。この例では、レスポンスカードを使用してボタンでユーザー入力を取得する方法も示しています。具体的には、この例では、実行時に動的にレスポンスカードを生成しています。

ビルド時にレスポンスカード (静的レスポンスカードとも呼ばれます) を設定することも、 AWS Lambda 関数で動的に生成することもできます。この例のボットでは、以下のレスポンスカードを使用します。
+ 予約タイプのボタンをリストするレスポンスカード。例については、次の画像を参照してください。  
![\[スケジュールの予約の種類と、クリーニング (30 分)、根管 (60 分)、ホワイトニング (90 分) の 3 つの選択肢を尋ねるレスポンスカード。\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/respcard-10.png)
+ 予約日付のボタンをリストするレスポンスカード。例については、次の画像を参照してください。  
![\[予約のスケジュールを設定する日付と、2-15、2-16、2-17 の 3 つの選択肢を記載したレスポンスカード。\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/respcard-20.png)
+ 提示された予約時刻を確認するボタンをリストするレスポンスカード。例については、次の画像を参照してください。  
![\[「はい」と「いいえ」の 2 つの選択肢がある、予約の日時の確認を求めるレスポンスカード。\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/respcard-30.png)

  

予約できる日付と時刻は変わるため、実行時にレスポンスカードを作成する必要があります。 AWS Lambda 関数を使用して、これらのレスポンスカードを動的に生成します。Lambda 関数は、Amazon Lex へのレスポンス内でレスポンスカードを返します。Amazon Lex は、クライアントへのレスポンス内にレスポンスカードを含めます。

クライアント (例えば、Facebook Messenger) でレスポンスカードがサポートされている場合、ユーザーはボタンのリストから選択するか、またはレスポンスを入力します。サポートされていない場合、ユーザーはレスポンスを入力します。

前の例で示されているボタンに加えて、イメージ、添付ファイル、およびその他の役立つ情報をレスポンスカードに表示することもできます。レスポンスカードに関する情報については、「[レスポンスカード](howitworks-manage-prompts.md#msg-prompts-resp-card)」を参照してください。

この演習では、以下のことを行います。
+ ボット (ScheduleAppointment 設計図を使用) を作成してテストします。この演習では、ボットの設計図を使用して、迅速にボットをセットアップし、テストします。使用可能な設計図の一覧については、「[Amazon Lex と AWS Lambda ブループリント](lex-lambda-blueprints.md)」を参照してください。このボットには 1 つのインテント (`MakeAppointment`) が事前設定されています。

   
+ Lambda 関数を作成してテストします (Lambda で提供されている lex-make-appointment-python 設計図を使用)。その Lambda 関数をコードフックとして使用して初期化、検証、およびフルフィルメント (達成) タスクを実行するように、`MakeAppointment` インテントを設定します。
**注記**  
提供されている Lambda 関数の例では、歯科医予約のモックアップの予約可能日時に基づいて動的な会話を示しています。実際のアプリケーションでは、実際のカレンダーを使用して予定を設定できます。
+ その Lambda 関数をコードフックとして使用するように、`MakeAppointment` インテント設定を更新します。次に、エンドツーエンドエクスペリエンスをテストします。
+ 作動中のレスポンスカードを確認できるように、そのスケジュール予約ボットを Facebook Messenger に公開します (Amazon Lex コンソール内のクライアントではレスポンスカードは現在サポートされていません)。

以下のセクションでは、この演習で使用する設計図に関する概要情報を示しています。

**Topics**
+ [ボット設計図 (ScheduleAppointment) の概要](#ex1-sch-appt-bp-summary-bot)
+ [Lambda 関数の設計図 (lex-make-appointment-python) の概要](#ex1-sch-appt-summary-lambda)
+ [ステップ 1: Amazon Lex ボットを作成する](ex1-sch-appt-create-bot.md)
+ [ステップ 2: Lambda 関数を作成する](ex1-sch-appt-create-lambda-function.md)
+ [ステップ 3: インテントの更新: コードフックを設定する](ex1-sch-appt-create-integrate.md)
+ [ステップ 4: ボットを Facebook Messenger プラットフォームにデプロイする](ex-sch-appt-fb-integration.md)
+ [情報フローの詳細](ex1-sch-appt-info-flow-details.md)

## ボット設計図 (ScheduleAppointment) の概要
<a name="ex1-sch-appt-bp-summary-bot"></a>

この演習でボットの作成に使用する ScheduleAppointment 設計図は以下のように事前設定されています。
+ **スロットタイプ** – 1 つのカスタムスロットタイプ (`AppointmentTypeValue`) と列挙値 (`root canal`、`cleaning`、`whitening`)。
+ **インテント** – 1 つのインテント (`MakeAppointment`)。次のように事前設定されています。
  + **スロット** – このインテントでは以下のスロットが設定されています。
    + スロット `AppointmentType`: `AppointmentTypes` カスタムタイプ
    + スロット `Date`: `AMAZON.DATE` 組み込みタイプ
    + スロット `Time`: `AMAZON.TIME` 組み込みタイプ
  + **発話** – このインテントでは以下の発話が事前設定されています。
    + 「予約をお願いします」
    + 「予約します」 
    + 「\$1AppointmentType\$1 を予約」

    ユーザーがこのいずれかを発声すると、Amazon Lex は `MakeAppointment` がインテントであると判断し、プロンプトを使用してスロットデータを引き出します。
  + **プロンプト** – このインテントでは以下のプロンプトが事前設定されています。
    + `AppointmentType` スロットのプロンプト –「どのタイプを予約なさいますか?」
    + `Date` スロットのプロンプト –「何日に \$1AppointmentType\$1 を予約なさいますか?」
    + `Time` スロットのプロンプト –「何時に \$1AppointmentType\$1 を予約なさいますか?」 と 

      「\$1Date\$1 の何時になさいますか?」
    + 確認プロンプト –「\$1Time\$1 は予約できますが、この時刻で予約してよろしいでしょうか?」 
    + キャンセルメッセージ –「かしこまりました、予約は行いません。」

## Lambda 関数の設計図 (lex-make-appointment-python) の概要
<a name="ex1-sch-appt-summary-lambda"></a>

Lambda 関数の設計図 (lex-make-appointment-python) は、ScheduleAppointment ボットの設計図を使用して作成したボット用のコードフックです。

この Lambda 関数の設計図のコードは、初期化/検証とフルフィルメントタスクの両方を実行できます。
+ この Lambda 関数のコードは、歯科医予約のサンプル予約可能日時に基づいた動的会話を示しています (実際のアプリケーションではカレンダーを使用できます)。ユーザーが指定した曜日または日付について、このコードは次のように設定されています。
  +  予約可能な時間がない場合、Lambda 関数は、ユーザーに別の曜日または日付の入力を求めるように Amazon Lex に指示するレスポンスを返します (`dialogAction` タイプを `ElicitSlot)` に設定)。詳細については、「[レスポンスの形式](lambda-input-response-format.md#using-lambda-response-format)」を参照してください。
  + 指定された曜日または日付で予約可能な時間が 1 つだけの場合、Lambda 関数はその予約可能な時間をレスポンスで提示し、レスポンス内の `dialogAction` を `ConfirmIntent` に設定することで、ユーザーに確認するように Amazon Lex に指示します。これは、予約可能な時間を積極的に提示することでユーザーエクスペリエンスを改善する方法を示しています。
  + 予約可能な時間が複数ある場合、Lambda 関数は予約可能な時間のリストを Amazon Lex へのレスポンスで返します。Amazon Lex は、Lambda 関数からのメッセージを付けたレスポンスをクライアントに返します。
+ フルフィルメントコードフックとして、Lambda 関数は予約が行われた (つまり、インテントが達成された) ことを示す概要メッセージを返します。

**注記**  
この例ではレスポンスカードの使用方法を示しています。Lambda 関数はレスポンスカードを構築して Amazon Lex に返します。レスポンスカードには、予約可能な日付と時刻がボタンとしてリストされていて、そのリストから選択できます。Amazon Lex コンソールで提供されているクライアントを使用してボットをテストする場合は、レスポンスカードを確認できません。レスポンスカードを確認するには、ボットを Facebook Messenger などのメッセージングプラットフォームと連携する必要があります。手順については、「[Amazon Lex ボットと Facebook Messenger の統合](fb-bot-association.md)」を参照してください。レスポンスカードの詳細情報については、「[メッセージの管理](howitworks-manage-prompts.md)」を参照してください。

Amazon Lex は Lambda 関数を呼び出す際にイベントデータを入力として渡します。イベントフィールドの 1 つは `invocationSource` であり、Lambda 関数はこのイベントフィールドを使用して入力検証とフルフィルメントのいずれかのアクティビティを選択します。詳細については、「[入力イベントの形式](lambda-input-response-format.md#using-lambda-input-event-format)」を参照してください。

**次のステップ**  
[ステップ 1: Amazon Lex ボットを作成する](ex1-sch-appt-create-bot.md)

# ステップ 1: Amazon Lex ボットを作成する
<a name="ex1-sch-appt-create-bot"></a>

このセクションでは、Amazon Lex コンソールで提供されている ScheduleAppointment 設計図を使用して Amazon Lex ボットを作成します。

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/) で Amazon Lex コンソールを開きます。

1. [**Bots**] ページで、[**Create**] を選択します。

1. [**Create your Lex bot**] ページで、次の操作を行います。
   + [**ScheduleAppointment**] 設計図を選択します。
   + ボット名 (ScheduleAppointment) はデフォルトのままにしておきます。

1. **[作成]** を選択します。

   このステップにより、ボットが保存および構築されます。構築プロセス中に、コンソールによって以下のリクエストが Amazon Lex に送信されます。
   + スロットタイプの新しいバージョンを (\$1LATEST バージョンから) 作成する。このボットの設計図で定義されているスロットタイプの詳細については、「[ボット設計図 (ScheduleAppointment) の概要](ex1-sch-appt.md#ex1-sch-appt-bp-summary-bot)」を参照してください。
   + `MakeAppointment` インテントのバージョンを (\$1LATEST バージョンから) 作成する。場合によっては、新しいバージョンを作成する前に、`update` API オペレーションのリクエストがコンソールによって送信されます。
   + ボットの \$1LATEST バージョンを更新する。

     現時点では、Amazon Lex はボットの機械学習モデルを構築します。コンソールでボットをテストする場合、コンソールではランタイム API を使用してユーザー入力が Amazon Lex に返されます。Amazon Lex は機械学習モデルを使用してそのユーザー入力を解釈します。

1. コンソールで ScheduleAppointment ボットが表示されます。[**Editor**] タブで、事前設定されているインテント (`MakeAppointment`) の詳細を確認します。

1. テストウィンドウでボットをテストします。以下のスクリーンショットを使用して、ボットとのテスト会話を開始します。  
![\[エージェントとの会話。エージェントは予約の種類、日付、時間を尋ね、予約を確認します。\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/appt-test-no-lambda.png)

   次の点に注意してください。
   + 最初のユーザー入力 (「予約します」) から、ボットはこのインテント (`MakeAppointment`) を推測します。
   + ボットは、設定されているプロンプトを使用してユーザーからスロットデータを取得します。
   + ボットの設計図では、`MakeAppointment` インテントに次の確認プロンプトが設定されています。

     ```
     {Time} is available, should I go ahead and book your appointment?
     ```

     ユーザーがすべてのスロットデータを提供すると、Amazon Lex は確認プロンプトをメッセージとして付けたレスポンスをクライアントに返します。クライアントはそのメッセージをユーザーに表示します。

     ```
     16:00 is available, should I go ahead and book your appointment? 
     ```

   ユーザーデータを初期化または検証するためのコードがないため、ボットは任意の日付と時刻の予約を受け付けていることがわかります。次のセクションでは、その処理を行う Lambda 関数を追加します。

**次のステップ**  
[ステップ 2: Lambda 関数を作成する](ex1-sch-appt-create-lambda-function.md)

# ステップ 2: Lambda 関数を作成する
<a name="ex1-sch-appt-create-lambda-function"></a>

このセクションでは、Lambda コンソールで提供されている設計図 (lex-make-appointment-python) を使用して Lambda 関数を作成します。また、コンソールで提供されている Amazon Lex のサンプルイベントデータを使用して Lambda 関数を呼び出すことで、この関数をテストします。

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) で AWS Lambda コンソールを開きます。

1. **[Create a Lambda function]** (Lambda 関数の作成) を選択します。

1. [**設計図の選択**] に「**lex**」と入力して設計図を見つけます。次に、[**lex-make-appointment-python**] 設計図を選択します。

1. Lambda 関数を次のように設定します。
   + Lambda 関数の名前 (`MakeAppointmentCodeHook`) を入力します。
   + ロールとして [**Create a new role from template(s)**] を選択し、ロール名を入力します。
   + 他はデフォルト値のままにしておきます。

1. **[Create Function]** (関数の作成) を選択します。

1. 英語 (US) (en-US) 以外のロケールを使用している場合は、[特定のロケールの設計図の更新](lex-lambda-blueprints.md#blueprint-update-locale) の説明に従ってインテント名を更新します。

1. Lambda 関数をテストします。

   1. [**Actions**]、[**Configure test event**] の順に選択します。

   1. [**Sample event template**] リストで、[**Lex-Make Appointment (preview)**] を選択します。このサンプルイベントでは、Amazon Lex のリクエスト/レスポンスモデルが使用されていて、この Amazon Lex ボットからのリクエストと一致するように値が設定されています。Amazon Lex のリクエスト/レスポンスモデルについては、「[Lambda 関数を使用する](using-lambda.md)」を参照してください。

   1. **[保存してテスト]** を選択します。

   1. Lambda 関数が正常に実行されたことを確認します。この例のレスポンスは、Amazon Lex レスポンスモデルと一致します。





**次のステップ**  
[ステップ 3: インテントの更新: コードフックを設定する](ex1-sch-appt-create-integrate.md)

# ステップ 3: インテントの更新: コードフックを設定する
<a name="ex1-sch-appt-create-integrate"></a>

このセクションでは、検証とフルフィルメントアクティビティのためのコードフックとして Lambda 関数を使用するように、`MakeAppointment` インテントの設定を更新します。



1. Amazon Lex コンソールで、[ScheduleAppointment] ボットを選択します。コンソールに [**MakeAppointment**] インテントが表示されます。インテント設定を次のように変更します。
**注記**  
更新できるのは Amazon Lex リソース (インテントを含む) の \$1LATEST バージョンのみです。インテントのバージョンが \$1LATEST に設定されていることを確認します。このボットのバージョンはまだ発行していないため、コンソール内のボットは \$1LATEST バージョンのままです。

   1. **[オプション]** セクションでは、**[初期化と検証コードのフック]** を選択し、リストから Lambda 関数を選びます。

   1. **[フルフィルメント]** セクションで、**[AWS Lambda 関数]** を選択し、次にリストから Lambda 関数を選択します。

   1. [**Goodbye message**] を選択し、メッセージを入力します。

1. [**Save**] を選択し、次に [**Build**] を選択します。

1. 以下の画像のように、ボットをテストします。  
![\[エージェントとの会話。エージェントは予約の種類、日付、時間を尋ね、予約を確認します。\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/appt-test-with-lambda.png)

**次のステップ**  
[ステップ 4: ボットを Facebook Messenger プラットフォームにデプロイする](ex-sch-appt-fb-integration.md)

# ステップ 4: ボットを Facebook Messenger プラットフォームにデプロイする
<a name="ex-sch-appt-fb-integration"></a>

前のセクションでは、Amazon Lex コンソール内のクライアントを使用して ScheduleAppointment ボットをテストしました。現時点では、Amazon Lex コンソールはレスポンスカードをサポートしていません。ボットでサポートされている動的に生成されたレスポンスカードをテストするには、ボットを Facebook Messenger プラットフォームにデプロイしてテストします。

手順については、「[Amazon Lex ボットと Facebook Messenger の統合](fb-bot-association.md)」を参照してください。

**次のステップ**  
[情報フローの詳細](ex1-sch-appt-info-flow-details.md)

# 情報フローの詳細
<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 時にお待ちしています。**





