Skip to content

Instantly share code, notes, and snippets.

@lyxal
Created October 28, 2018 05:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lyxal/3865494bf0780d275fe08646a6dc31fa to your computer and use it in GitHub Desktop.
Save lyxal/3865494bf0780d275fe08646a6dc31fa to your computer and use it in GitHub Desktop.
An AWS Lambda Function template for working with Alexa skills
'''
This is a template for a lambda function, based off the alexa-skills-kit-color-expert-python example
'''
from __future__ import print_function
#Helper functions that build the responses -- don't change these
def build_speech(text_type, body, reprompt, card, should_end_session):
type_dict = {"PlainText" : "text", "SSML" : "ssml"}
return {
'outputSpeech': {
'type': text_type,
type_dict[text_type]: body
},
'card': card,
'reprompt': {
'outputSpeech': {
'type': text_type,
type_dict[text_type]: reprompt
}
},
'shouldEndSession': should_end_session
}
def build_card(title, body):
return {
'type' : 'Simple',
'title' : title,
'content' : body
}
def build_response(session_attributes, speechlet_response):
return {
'version': '1.0',
'sessionAttributes': session_attributes,
'response': speechlet_response
}
#Functions defined by you that control the skill go here
def session_start(): #Called upon start of skill -- keep this function
""" If we wanted to initialize the session to have some attributes we could
add those here
"""
session_attributes = {}
card_title = "" #Do change this
card_body = "" #Do change this
speech_output = "" #Do change this
# If the user either does not reply to the welcome message or says something
# that is not understood, they will be prompted again with this text.
reprompt_text = "" #Do change this
should_end_session = False
card = build_card(card_title, card_body)
speech = build_speech("change the text type", speech_output, reprompt_text, card, False)
return build_response(session_attributes, speech)
def session_end(): #Called upon end of skill -- keep this function
card_title = "" #Do change this
card_body = "" #Do change this
speech_output = "" #Do change this
# Setting this to true ends the session and exits the skill.
should_end_session = True
card = build_card(card_title, card_body)
speech = build_speech("change the text type", speech_output, None, card, False)
return build_response({}, speech)
#Events that process the Alexa side of things -- don't change these
def on_session_started(session_started_request, session):
""" Called when the session starts """
print("on_session_started requestId=" + session_started_request['requestId']
+ ", sessionId=" + session['sessionId'])
def on_launch(launch_request, session):
""" Called when the user launches the skill without specifying what they
want
"""
print("on_launch requestId=" + launch_request['requestId'] +
", sessionId=" + session['sessionId'])
# Dispatch to your skill's launch
return session_start()
def on_intent(intent_request, session): #Do change this function
""" Called when the user specifies an intent for this skill """
print("on_intent requestId=" + intent_request['requestId'] +
", sessionId=" + session['sessionId'])
intent = intent_request['intent']
intent_name = intent_request['intent']['name']
#Add functions and intents here
# Dispatch to your skill's intent handlers
#if intent_name == "IntentName":
# return intent_function(intent, session)
if intent_name == "AMAZON.HelpIntent":
return session_start()
elif intent_name == "AMAZON.CancelIntent" or intent_name == "AMAZON.StopIntent":
return session_end()
else:
raise ValueError("Invalid intent")
def on_session_ended(session_ended_request, session):
""" Called when the user ends the session.
Is not called when the skill returns should_end_session=true
"""
print("on_session_ended requestId=" + session_ended_request['requestId'] +
", sessionId=" + session['sessionId'])
# add cleanup logic here
# Main handler -- don't change this
def lambda_handler(event, context):
""" Route the incoming request based on type (LaunchRequest, IntentRequest,
etc.) The JSON body of the request is provided in the event parameter.
"""
print("event.session.application.applicationId=" +
event['session']['application']['applicationId'])
"""
Uncomment this if statement and populate with your skill's application ID to
prevent someone else from configuring a skill that sends requests to this
function.
"""
# if (event['session']['application']['applicationId'] !=
# "amzn1.echo-sdk-ams.app.[unique-value-here]"):
# raise ValueError("Invalid Application ID")
if event['session']['new']:
on_session_started({'requestId': event['request']['requestId']},
event['session'])
if event['request']['type'] == "LaunchRequest":
return on_launch(event['request'], event['session'])
elif event['request']['type'] == "IntentRequest":
return on_intent(event['request'], event['session'])
elif event['request']['type'] == "SessionEndedRequest":
return on_session_ended(event['request'], event['session'])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment