ASK SDK移行ガイド



ASK SDK移行ガイド

このガイドでは、ASK SDK v2 for Node.jsとASK SDK v1アダプターを使ってASK SDK v1 for Node.js(「alexa-sdk」)で開発した既存のスキルをv2 SDK(「ask-sdk」)に移行する手順を詳しく説明します。

後方互換性

ASK SDK v1アダプターにはASK SDK v1インターフェースとの後方互換性があるため、v1のAlexaスキルを簡単にSDK v2に移行できます。v1アダプターを使うと、v1とv2の形式でコーディングされたリクエストハンドラーを共存させることができます。これにより、既存のAlexaスキルをv2形式のリクエストハンドラーで拡張でき、同時に既存のハンドラーを都合のよいタイミングでアップデートできます。新規のスキルの場合、v2の機能を活用するために最初からASK SDK v2 for Node.jsで開発するようにしてください。

前提条件

  • インストールされた標準ASK SDKモジュールとの依存関係を持つNPMプロジェクト。標準ASK SDKモジュールのインストールについてはASK SDK v2 for Node.jsのセットアップセクションを参照してください。ASK SDK v1アダプターには、標準ASK SDK v2 for Node.js配布パッケージ(ask-sdk)とのpeer依存関係があります。
  • 適切なNode.js開発環境。ASK SDK v2 for Node.jsには、Node.jsのバージョン4.3.2以上が必要です。

移行の手順

ASK SDK v1アダプターをプロジェクトに追加する

NPMプロジェクトから、以下のコマンドを実行してASK SDK v1アダプターモジュールをインストールします。

npm install --save ask-sdk-v1adapter

import文をアップデートする

ASK SDK v1 for Node.jsを使用するスキルコードを移植するには、alexa-sdkパッケージではなくask-sdk-v1adapterパッケージからインポートする必要があります。アダプターは内部のロジック解釈を処理してASK SDK v2 for Node.jsを使用するSkillインスタンスを作成します。

コードの以下の部分を変更します。

const Alexa = require('alexa-sdk');

変更後は以下のようになります。

const Alexa = require('ask-sdk-v1adapter');

スキルコードのこれ以外の部分は変更しません。

exports.handler = function(event, context, callback) {
  const alexa = Alexa.handler(event, context, callback);
  alexa.appId = APP_ID // APP_IDは、スキルを作成したAmazon開発者コンソールで割り当てられたスキルIDのことです。
  alexa.registerHandlers(...)
  alexa.execute();
};

v2リクエストハンドラーを追加する

ASK SDK v1アダプターを使用することで、v1とv2のリクエストハンドラーを並存させることができます。ただし、Alexaスキルを拡張している場合は、ASK SDK v2 for Node.jsの機能をフルに活用できるv2のリクエストハンドラーを使用することをお勧めします。

リクエストを処理できるv1ハンドラーがない場合のみ、v1のリクエストハンドラーの後にv2のリクエストハンドラーにアクセスします。そのため、v1ハンドラーをv2ハンドラーで置き換えた場合、v1ハンドラーのコードを必ず削除してください。また、v2ハンドラーを追加している場合は、v1ハンドラーからUnhandled関数を削除することも重要です。削除しないと、v2ハンドラーにアクセスする前に、すべてのイベントがUnhandled関数にキャプチャされてしまいます。

以下のコードサンプルでは、AMAZON.HelpIntentを処理できるv2リクエストハンドラーを既存のhello worldサンプルスキルに追加しています。この例では、元のv1のAMAZON.HelpIntentハンドラーがhandlers定数から削除されています。

'use strict';
const Alexa = require('ask-sdk-v1adapter');

exports.handler = function(event, context, callback) {
  const alexa = Alexa.handler(event, context);
  alexa.registerHandlers(handlers);
  alexa.registerV2Handlers(HelpIntentHandler); // v2リクエストハンドラーを登録するための新しいAPI関数
  alexa.execute();
};

const handlers = {
  'LaunchRequest': function () {
    this.emit('SayHello');
  },
  'HelloWorldIntent': function () {
    this.emit('SayHello');
  },
  'SayHello': function () {
    this.response.speak('こんにちは');
    this.emit(':responseReady');
  },
  'AMAZON.CancelIntent': function () {
    this.response.speak('さようなら');
    this.emit(':responseReady');
  },
  'AMAZON.StopIntent': function () {
    this.response.speak('またね');
    this.emit(':responseReady');
  }
};

// HelpIntentHandlerは次のv2リクエストハンドラーインターフェースを再書き込みします
const HelpIntentHandler = {
  canHandle({requestEnvelope}) {
    return requestEnvelope.request.type === 'IntentRequest'
    && requestEnvelope.request.intent.name === 'AMAZON.HelpIntent';
  },
  handle({responseBuilder}){
    const speechOutput = 'これは挨拶をするサンプルスキルです。';
    const reprompt = 'こんにちは、と言ってみてください。';
    return responseBuilder
      .speak(speechOutput)
      .reprompt(reprompt)
      .getResponse();
  },
};