Alexa Skill Connectionsの実装



Alexa Skill Connectionsの実装

Skill Connections機能を使い、Alexaスキルから別のスキルにリクエストを転送することで、転送元のスキルだけでは処理できないユーザーリクエストにも対応できるようになります。Skill Connectionsでは、Alexaにリクエストの実行を依頼する側のスキルのことを「リクエスター」と呼び、リクエストを実行する側のスキルのことを「プロバイダー」と呼びます。

Skill Connectionsを使えば、ユーザーはスキルが変わるたびに同じ情報を繰り返す必要がなくなり、自由にスキル間を移動できるようになるので、Alexaのユーザーエクスペリエンスが向上します。たとえば、レシピスキルを使っているユーザーが「このレシピを印刷して」と言うと、ウェブ印刷スキルがレシピを印刷してくれます。ユーザーがプリンターを持っていないなどの理由でスキルを接続できない場合、Skill Connectionsは終了し、ユーザーは元のリクエスタースキルセッションに戻ります。

一貫したユーザーエクスペリエンスを提供するため、各Skill Connectionsタスクには、各タスクの説明と共に、独自の音声デザインガイドラインがあります。これらのガイドラインでは、リクエスタースキル、プロバイダースキル、AlexaがSkill Connectionsリクエストの実行中に使うプロンプトが指定されています。

スキルをSkill Connectionsのリクエスターにする

「リクエスター」スキルは、「プロバイダー」スキルとの接続をリクエストします。接続が可能であれば、プロバイダースキルはリクエスタースキルのリクエストを実行します。既存のスキルもリクエスタースキル、つまりプロバイダースキルにスキル接続をリクエストするスキルに変更できます。

スキルサービスをSkill Connectionsタスクのリクエスターにするには、次のように変更します。

  1. Connections.StartConnectionディレクティブを返すハンドラーを実装します。
  2. Skill Connectionsリクエストからの応答をSessionResumedRequestオブジェクトの形式で受け取るハンドラーを実装します。これにより、ユーザーは元のリクエスタースキルの同じ場所に戻ることができます。

Skill Connectionsでサポートされるタスクのリストを参照してください。

Connections.StartConnectionディレクティブを返すハンドラーを実装する

応答オブジェクトのConnections.StartConnectionディレクティブをセットした場合は、Skill Connectionsリクエストを送信できます。以下のサンプルコードを参照してください。Connections.StartConnectionディレクティブを返す際は、shouldEndSessionフラグを未定義のままにする必要があります。

Alexa Skills Kit SDK for Node.jsを使用したサンプルコード

return handlerInput.responseBuilder
        .addDirective({
            'type': 'Connections.StartConnection',
            'uri': 'connection://{task_name}{/version_number}',
            'input': {
                   ...
                }
            },
            'token': '...',
        })
        .getResponse();

応答のアトリビュート

typeディレクティブの種類を指定します。この場合はConnections.StartConnectionです。
uriタスクとタスクのバージョンを定義するリソースです。
input送信するSkill Connectionsリクエストのリクエストオブジェクトを含みます。
tokenSessionResumedRequestの元の場所に戻るためのトークンです。Skill Connectionsリクエストが完了した後、リクエスタースキルを再開するために使用できます。

Skill Connectionsリクエストから応答を受け取るハンドラーを実装する

リクエスタースキルは、元のSkill Connectionsリクエストに対するSkill Connections応答を受け取るためのハンドラーも実装する必要があります。そのためには、スキルにSessionResumedRequestハンドラーを追加します。リクエスタースキルがSessionResumedRequestを受け取ると、Connections.StartConnectionディレクティブが返されたときに、スキルの以前のセッションに戻ります。応答ハンドラーを実装していない場合、スキルで処理できない例外が発生し、ユーザーエクスペリエンスが中断します。

Alexa Skills Kit SDK for Node.jsを使用したサンプルコード

このコードでは、Alexa Skills Kit Node.js SDKを使用しています。

const ConnectionsResponseHandler = {
  canHandle(handlerInput) {
    const request = handlerInput.requestEnvelope.request;
    return request.type === 'SessionResumedRequest';
  },
  handle(handlerInput) {
    const statusCode = event.requestEnvelope.request.cause.status.code;
    const statusMessage = event.requestEnvelope.request.cause.status.message;
    console.log('SessionResumedRequestを受け取りました:ステータスコード: [' + statusCode + '], メッセージ: [' + message + ']');

   // セッションアトリビュートとIDは、前回のIntentRequestと同じです
   const sessionAttributes = handlerInput.attributesManager.getSessionAttributes();


    // リクエスタースキルのエクスペリエンスが継続します

    return handlerInput.responseBuilder
        .speak("リクエスタースキルがSessionResumedRequestを受け取りました")
        .getResponse();
  },
};

Skill Connectionsリクエスターの例

この例は、スキルがどのようにAmazon.PrintPDFタスクの実行をリクエストするかを示しています。

まず、リクエスタースキルがConnections.StartConnectionディレクティブを返します。

PrintPDFSkillConnectionsRequestDispatcher = {
    speechText: 'リクエスターがPDFを印刷するSkill Connectionsリクエストを送信しています',
    directive: {
        'type': 'Connections.StartConnection',
        'uri': 'connection://AMAZON.PrintPDF/1',
        'input': {
         '@type': 'PrintPDFRequest',
         '@version': '1',
         'title': 'タイトル',
         'description': '説明',
         'url': 'http://www.example.com/flywheel.pdf'
        },
        'token': 'none'
    }

Skill Connectionsリクエストがプロバイダースキルによって実行されたら、リクエスターはSessionResumedRequestオブジェクトを受け取ります。

以下は、リクエストのJSONスキーマのサンプルです。

{
    "type": "SessionResumedRequest",
    "requestId": "string",
    "timestamp": "string",
    "locale": "string",
    "originIpAddress": "string",
    "cause": {
        "type": "ConnectionCompleted",
        "token": "1234",
        "status": {
            "code": "200",
            "message": "OK"
        },
        "result": null
    }
}

SessionResumedRequestのハンドラーは次のようになります。

const SessionResumedRequestHandler = {
    canHandle(handlerInput) {
        const request = handlerInput.requestEnvelope.request;
        return request.type === 'SessionResumedRequest';
    },
    handle(handlerInput) {
        console.log("リクエスタースキルがSessionResumedRequestを受け取りました");
        const sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
        const status = handlerInput.requestEnvelope.request.cause.status;
        const code = status.code;
        const message = status.message;

        const speechText = `ステータスコードは${code}、メッセージは ${message}です`;

        return handlerInput.responseBuilder
            .speak(speechText)
            .getResponse();
    },
};

アトリビュート

呼び出したSkill Connectionsリクエストに対しては、任意の有効なHTTPステータスコードを返すことができます。Alexaは、以下のステータスコードを返します。ただし、Skill Connectionsリクエストを実行しているプロバイダースキルも、任意の有効なHTTPコードを返すことができます。

  • status: リクエストのステータスです。
    • code:ステータスコードです。
      • 200: リクエストは正常に実行されました。
      • 204: ユーザーがSkill Connectionsの使用を拒否しました。
      • 227: プロバイダーがアカウントリンクされていません。
      • 404: 現在利用可能なプロバイダーがありません。
      • 400: 不正なリクエスト - リクエストは無効です。
      • 500: サーバーエラーです。
    • message: リクエストの結果を表すテキスト文字列のメッセージです。たとえば、「乗車予約が正常に完了しました」などのようになります。

詳細については、Alexaから送信されたリクエストを処理するを参照してください。

リクエスタースキルをテストする

Skill Connectionsリクエスターになるために必要な機能をスキルに実装したら、ほかの呼び出しのテストと同様にスキルをテストできます。Skill Connectionsリクエストを開始すると、Alexaはリクエストに適したプロバイダーを解決し、リクエストを公開中のプロバイダースキルにルーティングします。

また、リクエスタースキルがSkill Connectionsリクエストを処理中に受け取るさまざまなステータスコードをどのように処理するかをテストする必要もあります。Skill Connections応答で特定のステータスコードを受け取ったときにスキルがどう応答するかをテストするには、AMAZON.TestStatusCodeタスクを定義したConnections.StartConnectionディレクティブを返すようリクエスタースキルを変更します。このディレクティブが返される応答の本文で、inputに目的のステータスコードが含まれます。たとえば、SessionResumedRequestハンドラーが502のステータスコードを受け取った場合にどう処理するかをテストするには、スキルが以下のディレクティブを返す必要があります。

return handlerInput.responseBuilder
        .addDirective({
            'type': 'Connections.StartConnection',
            'uri': 'connection://AMAZON.TestStatusCode/1',
            'input': {
                'code': '502'
            }
        })
        .getResponse();

その後、リクエスタースキルは、inputで定義されたステータスコードを含むSessionResumedRequestオブジェクトを受け取ります。

リクエスタースキルを公開する

テストを完了し、スキルの申請要件を満たすことが確認できたら、スキルを公開して、本番環境でSkill Connectionsタスクを受信するための認定を申請できます。認定済みのスキルの場合、変更は公開と同時に有効になります。

スキルをSkill Connectionsのプロバイダーにする

以下の手順でスキルを更新すると、スキルをSkill Connectionsのプロバイダーにすることができます。

  1. スキルマニフェストを更新して、Skill Connectionsタスクのプロバイダーとしてスキルを登録します。
  2. Skill Connectionsタスクを実行するハンドラーを実装します。

あわせて、認定プロセスに従ってスキルがプロバイダーとして承認される必要もあります。

スキルマニフェストを更新して、Skill Connectionsタスクのプロバイダーとしてスキルを登録する

Skill Connectionsサポートをスキルに追加するには、スキルマニフェストtasksフィールドを追加します。以下の例を参照してください。フィールドのnameにはスキルが実行できるタスクの名前を指定し、フィールドのversionにはそのタスクのバージョンを指定します。下の例のマニフェストでは、このスキルはAMAZON.PrintPDFタスクのバージョン1のプロバイダーとして登録されています。

{
   "manifest": {
       "publishingInformation": {
           "locales": { ... }
        },
       "apis": {
           "custom": {
               "endpoint": {
                   "uri": "..."
                },
               "interfaces": [],
               "tasks" : [
                    {
                     "name": "AMAZON.PrintPDF",
                     "version": "1"
                    }
                ]
            }
        },
       "manifestVersion": "..."
    }
}

Skill Connectionsタスクを実行するハンドラーを実装する

プロバイダースキルは、Skill Connectionsリクエストを受け取るハンドラーを実装する必要があります。リクエストハンドラーを実装しないと、処理されない例外が発生し、ユーザーエクスペリエンスが中断します。

プロバイダースキルは、リクエスタースキルから送信されたリクエストのLaunchRequestオブジェクトを受け取ります。

タスクを処理したら、プロバイダーはリクエスターに制御を戻す応答で、Tasks.CompleteTaskディレクティブを送信する必要があります。プロバイダースキルがTasks.CompleteTaskディレクティブを返す際は、shouldSessionEndアトリビュートをtrueに定義する必要があります。

Alexa Skills Kit SDK for Node.jsを使用したサンプルコード

このコードでは、Alexa Skills Kit Node.js SDKを使用しています。

const ConnectionsRequestHandler = {
    canHandle(handlerInput) {
        const request = handlerInput.requestEnvelope.request;
        return request.type === 'LaunchRequest'
            && request.task.name == "AMAZON.RequestType";
    },
    handle(handlerInput) {
        console.log("AMAZON.RequestTypeタスクを処理しています。");

        // ビジネスロジック

        let speechText = "リクエストを受信しました。";

        return handlerInput.responseBuilder
            .speak(speechText)
            .addDirective({
                "type": "Tasks.CompleteTask",
                "status": {
                    "code": "200",
                    "message": "目的に応じて返します",
                }
            })
            .withShouldEndSession(true)
            .getResponse();
    },
};

応答のアトリビュート

typeディレクティブの種類です。この場合、Skill Connectionsリクエストを実行する「Tasks.CompleteTask」が使われます。
statusコードとメッセージが含まれます。コードには任意の有効なHTTPコードが入ります。

プロバイダースキルのサンプルコード

以下のサンプルコードでは、プロバイダースキルが受け取ったAmazon.PrintPDFタスクのSkill Connectionsリクエストをどのように処理するかを示しています。また、Skill Connectionsリクエストハンドラーが受け取るLaunchRequestオブジェクトの例も示します。

{
    "type": "LaunchRequest",
    "requestId": "string",
    "timestamp": "string",
    "locale": "string",
    "originIpAddress": "string",
    "task": {
        "name": "AMAZON.PrintPDF",
        "version": "1",
        "input": {
            "@type": "PrintPDFRequest",
            "@version": "1",
            "title": "フライホイール",
            "description": "フライホイール",
            "url": "http://www.example.com/flywheel.pdf"
        }
    }
}

Alexa Skills Kit SDK for Node.jsを使用したサンプルコード

このコードでは、Alexa Skills Kit Node.js SDKを使用しています。

const PrintPDFTaskHandler = {
    canHandle(handlerInput) {
        const request = handlerInput.requestEnvelope.request;
        return request.type === 'LaunchRequest'
            && request.task.name == "AMAZON.PrintPDF";
    },
    handle(handlerInput) {
        console.log("AMAZON.PrintPDFタスクを処理しています。");

        // PDFの印刷ロジック

        let speechText = "印刷リクエストを確認しました。";

        return handlerInput.responseBuilder
            .speak(speechText)
            .addDirective({
                "type": "Tasks.CompleteTask",
                "status": {
                    "code": "200",
                    "message": "目的に応じて返します",
                }
            })
            .withShouldEndSession(true)
            .getResponse();
    },
};

プロバイダースキルをテストする

Alexa Skills Kit開発チームでは、有効なSkill Connectionsリクエストをスキルに送信できるテスト用スキルを提供しています。このスキルの操作方法は次のとおりです。

  1. プロバイダースキルでテストを有効にしておきます。詳細については、スキルのテストを参照してください。
  2. 開発者コンソールでスキルを開き、テストタブをクリックします。
  3. 有効なSkill Connectionsリクエストを使ってテストするには、「open connection tester tool」と入力し、<スキルID>–<タスク名>パラメーターを指定して有効なSkill Connectionsリクエストを送信します。<スキルID>と<タスク名>は、skillIdと目的のタスクリクエスト名に置き換えます。これにより、開発中ステージのテストプロバイダースキルにリクエストが送信されます。たとえば、連結した<スキルID>–<タスク名>パラメーターは、amzn1.ask.skill.3f4a2fa7-0dff-4a56-a83c-9783ea111a11--PrintPDFRequestのようになります。

inputアトリビュートの値を変えてテストする場合は、Skill Connectionsリクエストをプロバイダースキルに送信するリクエスタースキルを作成できます。リクエスタースキルからSkill Connectionsリクエストを送信する場合は、プロバイダーのskillIdのオーバーライドも追加する必要があります。これは、Alexaがプロバイダースキル宛てにリクエストを送信できるようにするためです。

return handlerInput.responseBuilder
        .addDirective({
            'type': 'Connections.StartConnection',
            'uri': 'connection://{task_name}{/version_number}',
            'input' : { 
                '@type' : '...', 
                '@version' : '...',
                'context' : { 
                    'providerId' : 'your-provider-skill-id'
                }
            },
            'token': '...',
        })
        .getResponse();

プロバイダースキルの認定を申請する

プロバイダースキルのテストが完了したら、スキルの認定を申請できます。認定後、スキルは公開されます。リクエスターがこのスキルで提供するタスクに対してSkill Connectionsリクエストを送信すると、Alexaはスキルをリクエストの実行候補として検討します。

プロバイダースキルとして認定されるには、以下の動作要件を満たす必要があります。これらはすべて、優れたユーザーエクスペリエンスにつながるものです。

  • プロバイダースキルが、リクエスタースキルが呼び出すSkill Connectionsタスクに関連する機能を実行できること。つまり、ウェブページの印刷スキルであれば、リクエスタースキルからリクエストされたときにそのタスクを実行できる必要があります。
  • プロバイダースキルは、リクエスタースキルから受け取ったペイロードが無効または空の場合も適切に処理する必要があります。たとえば、画像を印刷するプロバイダースキルの場合、指定された画像のURLが無効であれば、プロバイダースキルがユーザーにURLが無効であることを知らせる必要があります。ペイロードが無効または空の場合、ユーザーにわかりやすい音声プロンプトでこうしたエラーを適切に処理する必要があります。
  • プロバイダースキルがリクエスタースキルに代わって実行するすべてのアクションは、プロバイダースキルのサンプルフレーズや呼び出し名でプロバイダースキルを呼び出すことでキャンセルできます。ユーザーがこのスキルと直接対話した場合とまったく同じです。たとえば、ライドシェアのプロバイダースキルで、ユーザーが「アレクサ、ライドシェアをキャンセル」と言ったとします。この場合、ユーザーがこのスキルから直接ライドシェアの手配をしたときと同じキャンセルダイアログが出される必要があります。

Skill Connectionsでサポートされるタスク

Skill Connectionsでは、次のタスクがサポートされます。それぞれのタスクのペイロードに固有のスキーマがあります。

AMAZON.PrintImage

AMAZON.PrintImageタスクを使うと、スキルから印刷スキルに画像を送信できます。写真、塗り絵、パズル、折り紙テンプレートなどの印刷に利用できます。

パラメーター

名前 必須 説明
title 文字列 印刷するファイルのタイトルです。
description × 文字列 ファイルの説明です。
url 文字列 画像のURLです。
imageType 文字列{JPG, JPEG} 画像の種類です。

inputを使った応答のサンプル

{
  "type": "Connections.StartConnection",
  "uri": "connection://AMAZON.PrintImage/1",
  "input": {
         "@type": "PrintImageRequest",
         "@version": "1",
         "title": "フライホイールドキュメント",
         "description": "フライホイール",
         "imageType": "JPEG",
         "url": "http://www.example.com/flywheel.jpeg"
  }
}

音声デザインのガイドライン

この例は、AMAZON.PrintImageタスクで想定されるユーザーエクスペリエンスを表しています。

  1. Alexa(リクエスタースキルの開発者が決定): 今日のクロスワードパズルを利用できます。
  2. Alexa(Alexaが決定): {provider_skill_name}を試してみますか?
  3. ユーザー: ぜひ。
  4. Alexa(プロバイダースキルの開発者が決定): 今日のクロスワードパズルを印刷しています。
  5. Alexa(Alexaが決定): {requester_skill_name}に戻ります。

リクエスタースキルからプロバイダースキルへの遷移中、Alexaは常にここに示したようなプロンプトを出します。つまり、スキル側でこうしたプロンプトを出す必要はありません。

ユーザーがプロバイダーを使ったことがない場合 Alexa(Alexaが決定): {provider_skill_name}を試してみますか?
ユーザーがプロバイダーを使ったことがある場合 Alexa(Alexaが決定): {provider_skill_name}を試してみますか?

プロバイダースキルからリクエスタースキルに戻るにあたって、次のようなプロンプトが出されます。

  • Alexa(Alexaが決定): {requester_skill_name}に戻ります。

ユーザーが印刷する可能性のあるコンテンツを表示している場合、スキルは以下を含む応答を返す必要があります。

  • ユーザーに、コンテンツが印刷できることを伝えるプロンプト
  • 関連するペイロードのパラメーターを指定したConnections.StartConnectionディレクティブ

AMAZON.PrintPDF

AMAZON.PrintPDFタスクを使うと、スキルから印刷スキルにPDFドキュメントを送信できます。このタスクは、ドキュメント、塗り絵、パズル、折り紙テンプレートの印刷をはじめ、幅広い用途に利用できます。

パラメーター

名前 必須 説明
title 文字列 印刷するファイルのタイトルです。
description × 文字列 PDFファイルの説明です。
url 文字列 PDFファイルの場所です。

inputを使った応答のサンプル

{
 "type": "Connections.StartConnection",
 "uri": "connection://AMAZON.PrintPDF/1",
 "input": {
         "@type": "PrintPDFRequest",
         "@version": "1",
         "title": "タイトル",
         "description": "説明",
         "url": "http://www.example.com/flywheel.pdf"
  }
}

音声デザインのガイドライン

この例は、Amazon.PrintPDFタスクで想定されるユーザーエクスペリエンスを表しています。

  1. Alexa(リクエスタースキルの開発者が決定): 今日のクロスワードパズルを利用できます。
  2. Alexa(Alexaが決定): {provider_skill_name}を試してみますか?
  3. ユーザー: ぜひ。
  4. Alexa(プロバイダースキルの開発者が決定): 今日のクロスワードパズルを印刷しています。
  5. Alexa(Alexaが決定): {requester_skill_name}に戻ります。

リクエスタースキルからプロバイダースキルへの遷移中、Alexaは常にここに示したようなプロンプトを出します。つまり、スキル側でこうしたプロンプトを出す必要はありません。

ユーザーがプロバイダーを使ったことがない場合 Alexa(Alexaが決定): {provider_skill_name}を試してみますか?
ユーザーがプロバイダーを使ったことがある場合 Alexa(Alexaが決定): {provider_skill_name}を試してみますか?

プロバイダースキルからリクエスタースキルに戻るにあたって、次のようなプロンプトが出されます。

  • Alexa(Alexaが決定): {requester_skill_name}に戻ります。

ユーザーが印刷する可能性のあるコンテンツを表示している場合、スキルは以下を含む応答を返す必要があります。

  • ユーザーに、コンテンツが印刷できることを伝えるプロンプト
  • 関連するペイロードのパラメーターを指定したConnections.StartConnectionディレクティブ

AMAZON.PrintWebPage

AMAZON.PrintWebPageタスクを使うと、スキルから印刷スキルにウェブページを送信できます。このタスクは、ドキュメント、塗り絵、パズル、折り紙テンプレートの印刷をはじめ、幅広い用途に利用できます。

名前 必須 説明
title 文字列 印刷するファイルのタイトルです。
description × 文字列 ウェブページの説明です。
url 文字列 ウェブページの場所です。

inputを使った応答のサンプル

{
 "type": "Connections.StartConnection",
 "uri": "connection://AMAZON.PrintWebPage/1",
 "input": {
       "@type": "PrintWebPageRequest",
       "@version": "1",
       "title": "タイトル",
       "description": "説明",
       "url": "http://www.example.com/flywheel.html"
    }
}

音声デザインのガイドライン

この例は、AMAZON.PrintWebPageタスクで想定されるユーザーエクスペリエンスを表しています。

  1. Alexa(リクエスタースキルの開発者が決定): 今日のクロスワードパズルを利用できます。
  2. Alexa(Alexaが決定): {provider_skill_name}を試してみますか?
  3. ユーザー: ぜひ。
  4. Alexa(プロバイダースキルの開発者が決定): 今日のクロスワードパズルを印刷しています。
  5. Alexa(Alexaが決定): {requester_skill_name}に戻ります。

リクエスタースキルからプロバイダースキルへの遷移中、Alexaは常にここに示したようなプロンプトを出します。つまり、スキル側でこうしたプロンプトを出す必要はありません。

ユーザーがプロバイダーを使ったことがない場合 Alexa(Alexaが決定): {provider_skill_name}を試してみますか?
ユーザーがプロバイダーを使ったことがある場合 Alexa(Alexaが決定): {provider_skill_name}を試してみますか?

プロバイダースキルからリクエスタースキルに戻るにあたって、次のようなプロンプトが出されます。

  • Alexa(Alexaが決定): {requester_skill_name}に戻ります。

ユーザーが印刷する可能性のあるコンテンツを表示している場合、スキルは以下を含む応答を返す必要があります。

  • ユーザーに、コンテンツが印刷できることを伝えるプロンプト
  • 関連するペイロードのパラメーターを指定したConnections.StartConnectionディレクティブ

AMAZON.ScheduleTaxiReservation

AMAZON.ScheduleTaxiReservationタスクは、スキルでユーザーが乗り物を予約する際に使用します。このタスクを使うと、スキルはユーザーが選んだ方法で乗り物を予約します。これにより、リクエスタースキルはより便利になり、プロバイダースキルはビジネスを広げることができます。

名前 必須 説明
partySize × 整数 予約する人数です。
pickupLocation 〇/× PostalAddress dropoffLocationを指定する場合は任意です。ユーザーが乗車したい場所を指定します。
pickupTime × dateTime ユーザーが乗車したい時刻を指定します。
dropoffLocation 〇/× PostalAddress pickupLocationを指定する場合は任意です。ユーザーが降車したい場所を指定します。

PostalAddressのパラメーター

名前 必須 説明
streetAddress 文字列 町名および番地を指定します。
locality 文字列 日本の場合は市区町村を指定します。
region 文字列 日本の場合は都道府県を指定します。
postalCode 文字列 郵便番号を指定します。
country × 文字列 国を指定します。

inputを使った応答のサンプル

{
 "type": "Connections.StartConnection",
 "uri": "connection://AMAZON.ScheduleTaxiReservation/1",
 "input": {
       "@type": "ScheduleTaxiReservationRequest",
       "@version": "1",
       "partySize": 4,
       "pickupLocation": {
           "@type": "PostalAddress",
           "@version": "1",
           "streetAddress": "下目黒1丁目8−1",
           "locality": "目黒区",
           "region": "東京都",
           "postalCode": "1530064",
           "country": "JP"
        },
       "pickupTime": null,
       "dropoffLocation": {
           "@type": "PostalAddress",
           "@version": "v",
           "streetAddress": "石川町2969-16",
           "locality": "八王子市",
           "region": "東京都",
           "postalCode": "1920032",
           "country": "JP"
        }
    }
}

音声デザインのガイドライン

以下の例は、AMAZON.ScheduleTaxiReservationタスクで想定されるユーザーエクスペリエンスを表したものです。

  1. Alexa(開発者が決定): チケットを予約しました。
  2. Alexa(Alexaが事前に決定): {provider_skill_name}を試してみますか?
  3. ユーザー: ぜひ。
  4. Alexa (開発者が決定):{ride_fulfilling_skill}
  5. Alexa(Alexaが決定): {requester_skill_name}に戻ります。

リクエスタースキルからプロバイダースキルへの遷移中、Alexaは常に以下に示したようなプロンプトを出します。つまり、スキル側でこうしたプロンプトを出す必要はありません。

ユーザーがプロバイダーを使ったことがない場合 Alexa(Alexaが決定): {provider_skill_name}を試してみますか?
ユーザーがプロバイダーを使ったことがある場合 Alexa(Alexaが決定): {provider_skill_name}を試してみますか?

ユーザーが何らかのアクションを完了し、開発者がそのアクションは乗り物の手配に関連すると判断した場合、スキルは以下を含む応答を返す必要があります。

  • ユーザーに何らかのアクションが完了したことを伝えるプロンプト
  • 関連するinputのパラメーターを指定したConnections.StartConnectionディレクティブ

AMAZON.ScheduleFoodEstablishmentReservation

AMAZON.ScheduleFoodEstablishmentReservationタスクは、レストラン関連のスキルでユーザーが予約をする際に使用します。このタスクを使うと、スキルはユーザーが選んだ方法でレストランを予約します。これにより、リクエスタースキルはさらに便利になり、レストランは売上を伸ばすことができます。

名前 必須 説明
startTime × dateTime 予約時刻を指定します。
partySize × 数値 予約する人数です。
restaurant Restaurant 予約するレストランを指定します。

Restaurantのパラメーター

名前 必須 説明
name 文字列 レストランの名前です。
location PostalAddress レストランの住所です。

PostalAddressのパラメーター

名前 必須 説明
streetAddress 文字列 町名および番地を指定します。
locality 文字列 日本の場合は市区町村を指定します。
region 文字列 日本の場合は都道府県を指定します。
postalCode 文字列 郵便番号を指定します。
country × 文字列 国を指定します。

inputを使った応答のサンプル

{
 "type": "Connections.StartConnection",
 "uri": "connection://AMAZON.ScheduleFoodEstablishmentReservation/1",
 "input": {
       "@type": "ScheduleFoodEstablishmentReservationRequest",
       "@version": "1",
       "startTime": "2018-04-08T01:15:46Z",
       "partySize": 2,
       "restaurant": {
           "@type": "Restaurant",
           "@version": "1",
           "name": "アマゾンレストラン",
           "location": {
               "@type": "PostalAddress",
               "@version": "1",
               "streetAddress": "下目黒1丁目8−1"
               "locality": "目黒区",
               "region": "東京都",
               "postalCode": "1920032",
               "country": "JP"
            }
        }
    }
}

音声デザインのガイドライン

この例は、AMAZON.ScheduleFoodEstablishmentReservationタスクで想定されるユーザーエクスペリエンスを表しています。

  1. Alexa(リクエスタースキルの開発者が決定): この近くなら、Bytes to Eatで流行りのカクテルが楽しめます。
  2. Alexa(Alexaが決定): {provider_skill_name}を試してみますか?
  3. ユーザー: ぜひ。
  4. Alexa(プロバイダースキルの開発者が判断):{provider_skill}
  5. Alexa(Alexaが決定): {requester_skill_name}に戻ります。

リクエスタースキルからプロバイダースキルへの遷移中、Alexaは常にここに示したようなプロンプトを出します。つまり、スキル側でこうしたプロンプトを出す必要はありません。

ユーザーがプロバイダーを使ったことがない場合 Alexa(Alexaが決定): {provider_skill_name}を試してみますか?
ユーザーがプロバイダーを使ったことがある場合 Alexa(Alexaが決定): {provider_skill_name}を試してみますか?

プロバイダースキルからリクエスタースキルに戻るにあたって、次のようなプロンプトが出されます。

  • Alexa(Alexaが決定): {requester_skill_name}に戻ります。

ユーザーが話題にしたレストランの予約ができることを知らせる場合、スキルは以下を含む応答を返す必要があります。

  • ユーザーがそのレストランについて知っていることを伝えるプロンプト
  • 関連するinputのパラメーターを指定したConnections.StartConnectionディレクティブ