Alexa Service Clients
Alexa Skills Kit provides multiple service APIs that you can use to personalize your skill experience. The SDK includes service clients that you can use to call Alexa APIs from within your skill logic.
- ServiceClientFactory
- ApiClient
- DeviceAddressServiceClient
- DirectiveServiceClient
- EndpointEnumerationServiceClient
- MonetizationServiceClient
- UpsServiceClient
- ReminderManagementServiceClient
ServiceClientFactory
The service_client_factory
contained inside the Handler Input allows you to retrieve client instances for every supported Alexa service. It takes care of creating individual service clients and configuring the metadata like api_access_token
and api_endpoint
.
Since it is available in handler_input
through service_client_factory
attribute, service clients can be used in any request handler, exception handler, and request, response interceptors.
Available service clients
def get_device_address_service(self):
# type: () -> ask_sdk_model.services.device_address.DeviceAddressServiceClient
def get_directive_service(self):
# type: () -> ask_sdk_model.services.directive.DirectiveServiceClient
def get_endpoint_enumeration_service(self):
# type: () -> EndpointEnumerationServiceClient
def get_monetization_service(self):
# type: () -> ask_sdk_model.services.monetization.MonetizationServiceClient
def get_ups_service(self):
# type: () -> ask_sdk_model.services.ups.UpsServiceClient
def get_reminder_management_service(self):
# type: () -> ask_sdk_model.services.reminder_management.ReminderManagementServiceClient
service_client_factory
is only available for use, when you configure the skill instance with an ApiClient
.ApiClient
The ask_sdk_model.services.api_client.ApiClient
is used by the service_client_factory
when making API calls to Alexa services. You can register any customized ApiClient
that conforms to the following interface with the SDK.
Interface
class ask_sdk_model.services.api_client.ApiClient:
def invoke(self, request):
# type: (ApiClientRequest) -> ApiClientResponse
class ask_sdk_model.services.api_client_request.ApiClientRequest(ApiClientMessage):
def __init__(self, headers=None, body=None, url=None, method=None):
# type: (List[Tuple[str, str]], str, str, str) -> None
class ask_sdk_model.services.api_client_request.ApiClientResponse(ApiClientMessage):
def __init__(self, headers=None, body=None, status_code=None):
# type: (List[Tuple[str, str]], str, int) -> None
class ask_sdk_model.services.api_client_message.ApiClientMessage(object):
def __init__(self, headers=None, body=None):
# type: (List[Tuple[str, str]], str) -> None
The CustomSkillBuilder constructor can be used to register the ApiClient.
from ask_sdk_core.skill_builder import CustomSkillBuilder
sb = CustomSkillBuilder(api_client=<YourClassInstance>)
DefaultApiClient
A DefaultApiClient
based on the requests
library, is made available in the ask_sdk_core.api_client
module for skill developers.
This client is registered by default in the StandardSkillBuilder. Alternatively, skill developers can register this client to the CustomSkillBuilder
.
from ask_sdk_core.skill_builder import CustomSkillBuilder
from ask_sdk_core.api_client import DefaultApiClient
sb = CustomSkillBuilder(api_client=DefaultApiClient())
DeviceAddressServiceClient
DeviceAddressServiceClient
can be used to query Device Settings API for address data associated with the customer's Alexa device. You can then use this address data to provide key functionality for the skill, or to enhance the customer experience. For example, your skill could provide a list of nearby store locations or provide restaurant recommendations using this address information.
Interface
class ask_sdk_model.services.device_address.DeviceAddressServiceClient:
def get_country_and_postal_code(device_id):
# type: (str) -> Union[ShortAddress, Error]
def get_full_address(self, device_id):
# type: (str) -> Union[Address, Error]
class ask_sdk_model.services.device_address.ShortAddress:
def __init__(self, country_code=None, postal_code=None):
# type: (Optional[str], Optional[str]) -> None
class ask_sdk_model.services.device_address.Address:
def __init__(
self, address_line1=None, address_line2=None, address_line3=None,
country_code=None, state_or_region=None, city=None,
district_or_county=None, postal_code=None):
# type: (Optional[str], Optional[str], Optional[str], Optional[str], Optional[str], Optional[str], Optional[str], Optional[str]) -> None
handler_input.request_envelope.context.system.device.device_id
.More information on the models can be found here.
Code Sample
The following example shows how a request handler retrieves customer's full address.
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_model.response import Response
from ask_sdk_model.ui import AskForPermissionsConsentCard
from ask_sdk_model.services import ServiceException
NOTIFY_MISSING_PERMISSIONS = ("Please enable Location permissions in "
"the Amazon Alexa app.")
NO_ADDRESS = ("It looks like you don't have an address set. "
"You can set your address from the companion app.")
ADDRESS_AVAILABLE = "Here is your full address: {}, {}, {}"
ERROR = "Uh Oh. Looks like something went wrong."
LOCATION_FAILURE = ("There was an error with the Device Address API. "
"Please try again.")
permissions = ["read::alexa:device:all:address"]
class GetAddressIntentHandler(AbstractRequestHandler):
def can_handle(self, handler_input):
# type: (HandlerInput) -> bool
return is_intent_name("GetAddressIntent")(handler_input)
def handle(self, handler_input):
# type: (HandlerInput) -> Response
req_envelope = handler_input.request_envelope
service_client_fact = handler_input.service_client_factory
response_builder = handler_input.response_builder
if not (req_envelope.context.system.user.permissions and
req_envelope.context.system.user.permissions.consent_token):
response_builder.speak(NOTIFY_MISSING_PERMISSIONS)
response_builder.set_card(
AskForPermissionsConsentCard(permissions=permissions))
return response_builder.response
try:
device_id = req_envelope.context.system.device.device_id
device_addr_client = service_client_fact.get_device_address_service()
addr = device_addr_client.get_full_address(device_id)
if addr.address_line1 is None and addr.state_or_region is None:
response_builder.speak(NO_ADDRESS)
else:
response_builder.speak(ADDRESS_AVAILABLE.format(
addr.address_line1, addr.state_or_region, addr.postal_code))
return response_builder.response
except ServiceException:
response_builder.speak(ERROR)
return response_builder.response
except Exception as e:
raise e
DirectiveServiceClient
DirectiveServiceClient
can be used to send directives to Progressive Response API. Progressive responses can be used to keep the user engaged while your skill prepares a full response to the user's request.
Interface
class ask_sdk_model.services.directive.DirectiveServiceClient:
def enqueue(self, send_directive_request):
# type: (SendDirectiveRequest) -> Union[Error]
class ask_sdk_model.services.directive.SendDirectiveRequest:
def __init__(self, header=None, directive=None):
# type: (Optional[Header], Optional[SpeakDirective]) -> None
class ask_sdk_model.services.directive.SpeakDirective:
def __init__(self, speech=None):
# type: (Optional[str]) -> None
More information on the models can be found here.
Code Sample
The following example shows a function that can be used in a handle
method for sending a progressive response.
from ask_sdk_core.handler_input import HandlerInput
from ask_sdk_model.services.directive import (
SendDirectiveRequest, Header, SpeakDirective)
import time
def get_progressive_response(handler_input):
# type: (HandlerInput) -> None
request_id_holder = handler_input.request_envelope.request.request_id
directive_header = Header(request_id=request_id_holder)
speech = SpeakDirective(speech="Ok, give me a minute")
directive_request = SendDirectiveRequest(
header=directive_header, directive=speech)
directive_service_client = handler_input.service_client_factory.get_directive_service()
directive_service_client.enqueue(directive_request)
time.sleep(5)
return
EndpointEnumerationServiceClient
Skills can use EndpointEnumerationServiceClient
to retrieve the user's connected endpoints that the skill can interact with.
Interface
def init(self, api_configuration):
# type: (ApiConfiguration) → None
def get_endpoints(self, kwargs):
# type: (Any) -> Union[EndpointEnumerationResponse, Error]
Code Sample
The following example shows a function that gets the connected endpoints.
from ask_sdk_core.skill_builder import CustomSkillBuilder
from ask_sdk_core.api_client import DefaultApiClient
....
skill_builder = CustomSkillBuilder(api_client=DefaultApiClient())
....
def get_connected_endpoints(handler_input: HandlerInput):
return handler_input.service_client_factory.get_endpoint_enumeration_service().get_endpoints().endpoints
MonetizationServiceClient
The MonetizationServiceClient
invokes the In-Skill Purchase Service API to retrieve information about in-skill products associated with the current skill or information about paid skills. The response indicates if the product or skill is purchasable and/or already purchased by the current customer. For details about in-skill purchases, see Understand In-Skill Purchasing. For details about paid skills, see Understand Paid Skills.
In-Skill Purchase Service
The in-skill product service includes the following methods for in-skill products and paid skills.
Interface
class ask_sdk_model.services.monetization.MonetizationServiceClient:
def get_in_skill_products(
self, accept_language, purchasable=None, entitled=None,
product_type=None, next_token=None, max_results=None):
# type: (str, Optional[PurchasableState], Optional[EntitledState], Optional[ProductType], Optional[str], Optional[float]) -> Union[Error, InSkillProductsResponse]
def get_in_skill_product(self, accept_language, product_id):
# type: (str, str) -> Union[Error, InSkillProduct]
def get_in_skill_products_transactions(
self, accept_language, product_id=None, status=None,
from_last_modified_time=None, to_last_modified_time=None,
next_token=None, max_results=None):
# type: (str, Optional[str], Optional[Status], Optional[datetime], Optional[datetime], Optional[str], Optional[float]) -> Union[Error, InSkillProductTransactionsResponse]
def get_voice_purchase_setting(self):
# type: () -> Union[Error, bool]
class ask_sdk_model.services.monetization.InSkillProductsResponse:
def __init__(self, in_skill_products=None, is_truncated=None, next_token=None):
# type: (Optional[List[InSkillProduct]], Optional[bool], Optional[str]) -> None
class ask_sdk_model.services.monetization.InSkillProduct:
self, product_id=None, reference_name=None, name=None, object_type=None, summary=None, purchasable=None, entitled=None, active_entitlement_count=None, purchase_mode=None
def __init__(
self, product_id=None, reference_name=None, name=None,
object_type=None, summary=None, purchasable=None, entitled=None,
active_entitlement_count=None, purchase_mode=None):
# type: (Optional[str], Optional[str], Optional[str], Optional[ProductType], Optional[str], Optional[PurchasableState], Optional[EntitledState], Optional[int], Optional[PurchaseMode]) -> None
class ask_sdk_model.services.monetization.ProductType(Enum):
SUBSCRIPTION = "SUBSCRIPTION"
ENTITLEMENT = "ENTITLEMENT"
CONSUMABLE = "CONSUMABLE"
class ask_sdk_model.services.monetization.PurchasableState(Enum):
PURCHASABLE = "PURCHASABLE"
NOT_PURCHASABLE = "NOT_PURCHASABLE"
class ask_sdk_model.services.monetization.EntitledState(Enum):
ENTITLED = "ENTITLED"
NOT_ENTITLED = "NOT_ENTITLED"
class ask_sdk_model.services.monetization.PurchaseMode(Enum):
TEST = "TEST"
LIVE = "LIVE"
accept_language
is the locale of the request and can be retrieved from handler_input.request_envelope.request.locale
.For more details about the models, see ASK Python Monetization.
get_in_skill_products
The get_in_skill_products
method retrieves all associated in-skill products for the current skill along with purchasability and entitlement indications for each in-skill product for the current skill and customer.
from ask_sdk_core.dispatch_components import AbstractRequestHandler
from ask_sdk_core.handler_input import HandlerInput
from ask_sdk_core.utils import is_request_type
from ask_sdk_model.response import Response
from ask_sdk_model.services.monetization import (
EntitledState, PurchasableState, InSkillProductsResponse)
class LaunchRequestHandler(AbstractRequestHandler):
def can_handle(self, handler_input):
return is_request_type("LaunchRequest")(handler_input)
def handle(self, handler_input):
locale = handler_input.request_envelope.request.locale
ms = handler_input.service_client_factory.get_monetization_service()
product_response = ms.get_in_skill_products(locale)
if isinstance(product_response, InSkillProductsResponse):
total_products = len(product_response.in_skill_products)
entitled_products = len([l for l in product_response.in_skill_products
if l.entitled == EntitledState.ENTITLED])
purchasable_products = len([l for l in product_response.in_skill_products
if l.purchasable == PurchasableState.PURCHASABLE])
speech = (
"Found total {} products of which {} are purchasable and {} "
"are entitled".format(
total_products, purchasable_products, entitled_products))
else:
speech = "Something went wrong in loading your purchase history."
return handler_input.response_builder.speak(speech).response
The API response contains an array of in-skill product records.
get_in_skill_product
The get_in_skill_product
API retrieves the product record for a single in-skill product or a single paid skill identified by a given productId
. For a paid skill, set productId
to the skill ID.
from ask_sdk_core.dispatch_components import AbstractRequestHandler
from ask_sdk_core.handler_input import HandlerInput
from ask_sdk_core.utils import is_request_type
from ask_sdk_model.response import Response
from ask_sdk_model.services.monetization import InSkillProduct
class LaunchRequestHandler(AbstractRequestHandler):
def can_handle(self, handler_input):
return is_request_type("LaunchRequest")(handler_input)
def handle(self, handler_input):
locale = handler_input.request_envelope.request.locale
ms = handler_input.service_client_factory.get_monetization_service()
product_id = "amzn1.adg.product.<GUID>"
product_response = ms.get_in_skill_product(locale)
if isinstance(product_response, InSkillProduct):
# code to handle InSkillProduct goes here
speech = ""
pass
else:
speech = "Something went wrong in loading your product."
return handler_input.response_builder.speak(speech).response
The API response contains a single in-skill product record or paid skill record.
For more details, see Add In-Skill Purchases to a Custom Skill and Steps to Implement Paid Skills.
get_in_skill_products_transactions
The get_in_skill_products_transactions
method provides information about in-skill product transactions, such as if a previous purchase request was denied. You can query transactions by transaction status or date. This API only returns recent results for transactions in kid skills.
from ask_sdk_core.dispatch_components import AbstractRequestHandler
from ask_sdk_core.handler_input import HandlerInput
from ask_sdk_core.utils import is_request_type
from ask_sdk_model.response import Response
from ask_sdk_model.services.monetization import (Status, InSkillProductTransactionsResponse)
class LaunchRequestHandler(AbstractRequestHandler):
def can_handle(self, handler_input):
return is_request_type("LaunchRequest")(handler_input)
def handle(self, handler_input):
locale = handler_input.request_envelope.request.locale
ms = handler_input.service_client_factory.get_monetization_service()
transaction_response = ms.get_in_skill_products_transactions(locale)
if isinstance(transaction_response, InSkillProductTransactionsResponse):
total_transaction = len(transaction_response.results)
pending_transactions = len([l for l in transaction_response.results
if l.status == Status.PENDING_APPROVAL_BY_PARENT])
approved_transactions = len([l for l in transaction_response.results
if l.status == Status.APPROVED_BY_PARENT])
denied_transactions = len([l for l in transaction_response.results
if l.status == Status.DENIED_BY_PARENT])
speech = (
"Found total {} transaction of which {} are pending, {} "
"are approved and {} are denied".format(
total_transaction, pending_transactions, approved_transactions, denied_transactions))
else:
speech = "Something went wrong in loading your transaction history."
return handler_input.response_builder.speak(speech).response
A successful response contains a list of transactions sorted by lastModifiedTime
. The latest transaction is at index 0. By default, the list truncates to 50 transactions.
{
"results": [
{
"status": "PENDING_APPROVAL_BY_PARENT",
"productId": "amzn1.adg.product.unique-id-4",
"createdTime": "2018-11-23T12:23:10.52Z",
"lastModifiedTime": "2018-11-23T12:23:10.52Z"
},
{
"status": "PENDING_APPROVAL_BY_PARENT",
"productId": "amzn1.adg.product.unique-id-3",
"createdTime": "2018-11-23T11:21:10.52Z",
"lastModifiedTime": "2018-11-23T11:21:10.52Z"
},
{
"status": "EXPIRED_NO_ACTION_BY_PARENT",
"productId": "amzn1.adg.product.unique-id-3",
"createdTime": "2018-11-20T12:23:10.52Z",
"lastModifiedTime": "2018-11-21T12:23:10.52Z"
},
{
"status": "DENIED_BY_PARENT",
"productId": "amzn1.adg.product.unique-id-2",
"createdTime": "2018-11-15T11:03:07.52Z",
"lastModifiedTime": "2018-11-15T11:03:08.52Z"
},
{
"status": "APPROVED_BY_PARENT",
"productId": "amzn1.adg.product.unique-id-1",
"createdTime": "2018-11-14T22:21:00.52Z",
"lastModifiedTime": "2018-11-14T22:22:00.52Z"
}
],
"metadata": {
"resultSet": {
"nextToken": "EXAMPLE123456789ABCDEFGHI"
}
}
}
For more information about this API, see Build Premium Experiences for Kid Skills in the US.
get_voice_purchase_setting
The get_voice_purchase_setting
method gets the purchase control setting that the account holder chose in the Alexa app.
from ask_sdk_core.dispatch_components import AbstractRequestHandler
from ask_sdk_core.handler_input import HandlerInput
from ask_sdk_core.utils import is_request_type
from ask_sdk_model.response import Response
class LaunchRequestHandler(AbstractRequestHandler):
def can_handle(self, handler_input):
return is_request_type("LaunchRequest")(handler_input)
def handle(self, handler_input):
ms = handler_input.service_client_factory.get_monetization_service()
purchase_preference_response = ms.get_voice_purchase_setting()
if isinstance(purchase_preference_response, bool):
speech = "Customer's purchase preference value is {}".format(purchase_preference_response)
else:
speech = "Something went wrong in loading customer's purchase preference settings."
return handler_input.response_builder.speak(speech).response
The API response contains a Boolean value. The value is true
if the account holder has enabled voice purchasing in the Alexa app.
For more information about this API, see Build Premium Experiences for Kid Skills in the US.
In-Skill Purchase Interface
The add_directive()
method initiates purchase and cancellation flows for in-skill purchases and paid skills. Alexa manages the voice interaction with customers, handles the purchase transaction, and returns a status response to the requesting skill. The add_directive()
method supports the following actions
:
Upsell
Buy
Cancel
For details about these actions
and recommended use cases, see Add In-Skill Purchases to a Custom Skill and Steps to Implement Paid Skills.
Upsell
Your skill can invoke the Upsell
action to present an in-skill product contextually when the user didn't explicitly ask for it, such as, during or after your skill serves free content. The Upsell
action requires a productId
and upsell message. The upsell message allows developers to specify how Alexa can present the in-skill product to the user before beginning the purchase offer.
from ask_sdk_model.interfaces.connections import SendRequestDirective
# In the skill flow, once a decision is made to offer an in-skill product to a
# customer without an explicit ask from the customer
return handler_input.response_builder.add_directive(
SendRequestDirective(
name="Upsell",
payload={
"InSkillProduct": {
"productId": "<product_id>",
},
"upsellMessage": "<introductory upsell description for the in-skill product>",
},
token="correlationToken")
).response
Buy
Your skill should invoke the Buy
action when a customer asks to buy a specific product or paid skill. This action requires a productId
for in-skill purchases. For a paid skill, set productId
to the skill ID.
The following example shows a Buy
action for an in-skill purchase.
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_model.response import Response
from ask_sdk_model.interfaces.connections import SendRequestDirective
# Skills would implement a custom intent (BuyProductIntent below) that captures
# user's intent to buy an in-skill product and then trigger the Buy request for it.
# For e.g. 'Alexa, buy <product name>'
class BuyProductIntentHandler(AbstractRequestHandler):
def can_handle(self, handler_input):
# type: (HandlerInput) -> bool
return is_intent_name("BuyProductIntent")(handler_input)
def handle(self, handler_input):
# type: (HandlerInput) -> Response
# Obtain the corresponding product_id for the requested in-skill
# product by invoking InSkillProducts API.
# The slot variable product_name used below is only for demonstration.
locale = handler_input.request_envelope.request.locale
ms = handler_input.service_client_factory.get_monetization_service()
product_response = ms.get_in_skill_products(locale)
slots = handler_input.request_envelope.request.intent.slots
product_ref_name = slots.get("product_name").value
product_record = [l for l in product_response.in_skill_products
if l.reference_name == product_ref_name]
if product_record:
return handler_input.response_builder.add_directive(
SendRequestDirective(
name="Buy",
payload={
"InSkillProduct": {
"productId": product_record[0].product_id
}
},
token="correlationToken")
).response
else:
return handler_input.response_builder.speak(
"I am sorry. That product is not available for purchase"
).response
Cancel
Your skill should invoke the Cancel
action when a customer asks to cancel an existing entitlement or subscription for an in-skill product or paid skill. This action requires a productId
for in-skill purchases. For a paid skill, set productId
to the skill ID.
The following example shows a Cancel
action for an in-skill purchase.
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_model.response import Response
from ask_sdk_model.interfaces.connections import SendRequestDirective
# Skills would implement a custom intent (CancelProductIntent below) that captures
# user's intent to cancel an in-skill product and then trigger the Cancel request for it.
# For e.g. 'Alexa, cancel <product name>'
class CancelProductIntentHandler(AbstractRequestHandler):
def can_handle(self, handler_input):
# type: (HandlerInput) -> bool
return is_intent_name("CancelProductIntent")(handler_input)
def handle(self, handler_input):
# type: (HandlerInput) -> Response
# Obtain the corresponding product_id for the requested in-skill
# product by invoking InSkillProducts API.
# The slot variable product_name used below is only for demonstration.
locale = handler_input.request_envelope.request.locale
ms = handler_input.service_client_factory.get_monetization_service()
product_response = ms.get_in_skill_products(locale)
slots = handler_input.request_envelope.request.intent.slots
product_ref_name = slots.get("product_name").value
product_record = [l for l in product_response.in_skill_products
if l.reference_name == product_ref_name]
if product_record:
return handler_input.response_builder.add_directive(
SendRequestDirective(
name="Cancel",
payload={
"InSkillProduct": {
"productId": product_record[0].product_id
}
},
token="correlationToken")
).response
else:
return handler_input.response_builder.speak(
"I am sorry. I don't know that one").response
UpsServiceClient
UpsServiceClient
can be used to query Customer Profile API for customer contact information and Device Settings for retrieving customer preferences for the time zone, distance measuring unit and temperature measurement unit.
Interface
class ask_sdk_model.services.ups.UpsServiceClient:
def get_profile_email(self):
# type: () -> Union[str, Error]
def get_profile_given_name(self):
# type: () -> Union[str, Error]
def get_profile_mobile_number(self):
# type: () -> Union[PhoneNumber, Error]
def get_profile_name(self):
# type: () -> Union[str, Error]
def get_system_distance_units(self, device_id):
# type: (str) -> Union[Error, DistanceUnits]
def get_system_temperature_unit(self, device_id):
# type: (str) -> Union[TemperatureUnit, Error]
def get_system_time_zone(self, device_id):
# type: (str) -> Union[str, Error]
class ask_sdk_model.services.ups.PhoneNumber:
def __init__(self, country_code=None, phone_number=None):
# type: (Optional[str], Optional[str]) -> None
class ask_sdk_model.services.DistanceUnits(Enum):
METRIC = "METRIC"
IMPERIAL = "IMPERIAL"
class ask_sdk_model.services.TemparatureUnit(Enum):
CELSIUS = "CELSIUS"
FAHRENHEIT = "FAHRENHEIT"
Code Sample
Alexa Customer Settings API
The Alexa Customer Settings API provides access to three pieces of information: preferred distance units, preferred temperature units and the device's current configured time zone. When using the UpsServiceClient, get_system_distance_units
and get_system_temperature_unit
will return enum objects whose values must be accessed by using the .value
attribute. By comparison, get_system_time_zone
will simply return a string.
req_envelope = handler_input.request_envelope
device_id = req_envelope.context.system.device.device_id
user_preferences_client = handler_input.service_client_factory.get_ups_service()
# Fetch Preferred Distance Units From Alexa Settings API
preferred_distance_units = user_preferences_client.get_system_distance_units(device_id).value
print (preferred_distance_units) # String of either "IMPERIAL" or "METRIC"
# Fetch Preferred Temperature Units From Alexa Settings API
preferred_temperature_units = user_preferences_client.get_system_temperature_unit(device_id).value
print (preferred_temperature_units) # String of either "FAHRENHEIT" or "CELSIUS"
# Fetch Device's Current Configured Time Zone From Alexa Settings API
time_zone = user_preferences_client.get_system_time_zone(device_id)
print (time_zone) # String representing a time zone for example "America/Los_Angeles"
handler_input.request_envelope.context.system.device.device_id
.More information on the models can be found here.
ReminderManagementServiceClient
ReminderManagementServiceClient
can be used to create and manage Reminders for your customers.
Interface
class ask_sdk_model.services.reminder_management.ReminderManagementServiceClient:
def create_reminder(self, reminder_request):
# type: (ReminderRequest) -> Union[ReminderResponse, Error]
def update_reminder(self, alert_token, reminder_request):
# type: (str, ReminderRequest) -> Union[ReminderResponse, Error]
def delete_reminder(self, alert_token):
# type: (str) -> Union[Error]
def get_reminder(self, alert_token):
# type: (str) -> Union[GetReminderResponse, Error]
def get_reminders(self):
# type: () -> Union[GetRemindersResponse, Error]
Code Sample
The following example shows a request handler that creates an instance of the ReminderManagementServiceClient
and creates a new reminder.
import logging
import typing
from datetime import datetime
from ask_sdk_core.skill_builder import CustomSkillBuilder
from ask_sdk_model.ui import SimpleCard
from ask_sdk_core.utils import is_intent_name
from ask_sdk_core.api_client import DefaultApiClient
from ask_sdk_model.services.reminder_management import (
ReminderRequest, Trigger, TriggerType, AlertInfo, PushNotification,
PushNotificationStatus, ReminderResponse, SpokenInfo, SpokenText)
from ask_sdk_model.services import ServiceException
from ask_sdk_model.ui import AskForPermissionsConsentCard
if typing.TYPE_CHECKING:
from ask_sdk_core.handler_input import HandlerInput
from ask_sdk_model import Response
permissions = ["alexa::alerts:reminders:skill:readwrite"]
NOTIFY_MISSING_PERMISSIONS = ("Please enable Reminders permissions in "
"the Amazon Alexa app.")
sb = CustomSkillBuilder(api_client=DefaultApiClient())
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
@sb.request_handler(can_handle_func=is_intent_name("CreateReminder"))
def create_reminder_intent_handler(handler_input):
# type: (HandlerInput) -> Response
req_envelope = handler_input.request_envelope
response_builder = handler_input.response_builder
# Check if user gave permissions to create reminders.
# If not, request to provide permissions to the skill.
if not (req_envelope.context.system.user.permissions and
req_envelope.context.system.user.permissions.consent_token):
response_builder.speak(NOTIFY_MISSING_PERMISSIONS)
response_builder.set_card(
AskForPermissionsConsentCard(permissions=permissions))
return response_builder.response
reminder_client = handler_input.service_client_factory.get_reminder_management_service()
try:
reminder_response = reminder_client.create_reminder(
reminder_request=ReminderRequest(
request_time=datetime.utcnow(),
trigger=Trigger(
object_type=TriggerType.SCHEDULED_RELATIVE,
offset_in_seconds=60),
alert_info=AlertInfo(
spoken_info=SpokenInfo(
content=[SpokenText(locale="en-US", text="Test reminder")])),
push_notification=PushNotification(
status=PushNotificationStatus.ENABLED))) # type: ReminderResponse
speech_text = "Great! I've scheduled a reminder for you."
logger.info("Created reminder : {}".format(reminder_response))
return handler_input.response_builder.speak(speech_text).set_card(
SimpleCard(
"Reminder created with id", reminder_response.alert_token)).response
except ServiceException as e:
logger.info("Exception encountered : {}".format(e.body))
speech_text = "Uh Oh. Looks like something went wrong."
return handler_input.response_builder.speak(speech_text).set_card(
SimpleCard(
"Reminder not created",str(e.body))).response
More information on the models can be found here.
Last updated: Jul 15, 2024