応答のビルド
標準的な応答
AWS Lambdaをスキルのエンドポイントに使用している場合は、Alexaがユーザーリクエストに応答するための応答本文を提供するだけで済みます。応答本文のJSON構造についてのドキュメントは、こちらを参照してください。
応答本文には、次のプロパティが含まれる場合があります。
- version
- sessionAttributes
- response
ASK SDK for Pythonを使用すると、versionとsessionAttributesを入力してくれるので、ボイラープレートコード(毎回書かなければならないお決まりのコード)を書く手間が省けるので、その分応答の作成に集中できます。
標準的な応答と同様に、SDKは応答オブジェクトを逆シリアル化されたモデルオブジェクト(ask-sdk-model
パッケージ)として作成し、内部でシリアル化の処理を行って、JSON応答をAlexaサービスに送信します。
Response Factory
SDKには、応答を作成するヘルパー関数を含むResponseFactory
クラスが含まれます。Response
には複数の要素が含まれる場合があり、ヘルパー関数によって応答を生成しやすくなり、各応答の要素を初期化したり設定したりする時間を削減できます。
インターフェース
class ResponseFactory(object):
def __init__(self):
self.response = .... # 応答オブジェクト
def speak(self, speech, play_behavior=None):
# type: (str, ask_sdk_model.ui.play_behavior.PlayBehavior) -> 'ResponseFactory'
....
def ask(self, speech, play_behavior=None):
# type: (str, ask_sdk_model.ui.play_behavior.PlayBehavior) -> 'ResponseFactory'
....
def set_card(self, card):
# type: (ask_sdk_model.ui.card.Card) -> 'ResponseFactory'
....
def add_directive(self, directive):
# type: (ask_sdk_model.directive.Directive) -> 'ResponseFactory'
....
def set_should_end_session(self, end_session):
# type: (bool) -> 'ResponseFactory'
....
def set_can_fulfill_intent(self, can_fulfill_intent):
# type: (ask_sdk_model.canfulfill.can_fulfill_intent.CanFulfillIntent) -> 'ResponseFactory'
....
response_builder
はResponseFactory
クラスのインスタンスであり、HandlerInputオブジェクトを介してスキル開発者に提供されます。これはスキルコンポーネントに渡される標準の引数です。
サンプルコード
次の例ではStandardCard
およびBodyTemplate2
表示オブジェクトを含む応答をhandler_input.response_builder
を使用して作成する方法を示しています。
from ask_sdk_core.dispatch_components import AbstractRequestHandler
from ask_sdk_core.handler_input import HandlerInput
from ask_sdk_core.utils import is_intent_name
from ask_sdk_core.response_helper import get_plain_text_content
from ask_sdk_model.response import Response
from ask_sdk_model.interfaces.display import (
ImageInstance, Image, RenderTemplateDirective,
BackButtonBehavior, BodyTemplate2)
from ask_sdk_model import ui
class HelloIntentHandler(AbstractRequestHandler):
def can_handle(self, handler_input):
# type: (HandlerInput) -> bool
return is_intent_name("HelloIntent")(handler_input)
def handle(self, handler_input):
# type: (HandlerInput) -> Response
response_builder = handler_input.response_builder
speech = "これはサンプルの応答です"
response_builder.set_card(
ui.StandardCard(
title="カードのタイトル",
text="これはサンプルカードです",
image=ui.Image(
small_image_url="<小さい画像のURL>",
large_image_url="<大きい画像のURL>"
)
)
)
if supports_display(handler_input):
img = Image(
sources=[ImageInstance(url="<大きい画像のURL>")])
title = "テンプレートのタイトル"
primary_text = get_plain_text_content(
primary_text="テキスト")
response_builder.add_directive(
RenderTemplateDirective(
BodyTemplate2(
back_button=BackButtonBehavior.VISIBLE,
image=img, title=title,
text_content=primary_text)))
return response_builder.speak(speech).response
テキストヘルパー
次のヘルパー関数がスキル開発者用に用意されており、テキストコンテンツの生成に役立ちます。
get_plain_text_content
def get_plain_text_content(primary_text, secondary_text, tertiary_text):
# type: (str, str, str) -> TextContent
# PlainText型のテキストを含むテキストコンテンツオブジェクトを作成します
....
get_rich_text_content
def get_rich_text_content(primary_text, secondary_text, tertiary_text):
# type: (str, str, str) -> TextContent
# RichText型のテキストを含むテキストコンテンツオブジェクトを作成します
....
get_text_content
def get_text_content(
primary_text, primary_text_type,
secondary_text, secondary_text_type,
tertiary_text, tertiary_text_type):
# type: (str, str, str, str, str, str) -> TextContent
# 指定された型のテキストを含むテキストコンテンツオブジェクトを作成します
# デフォルトの型はPlainTextです
....