Skip to content

Instantly share code, notes, and snippets.

@mfcovington
Created October 15, 2017 17:26
Show Gist options
  • Save mfcovington/d1686d5c03d09986da621b8b0635029e to your computer and use it in GitHub Desktop.
Save mfcovington/d1686d5c03d09986da621b8b0635029e to your computer and use it in GitHub Desktop.
protocols i o
{
"intents": [
{
"intent": "MyKeywordIsIntent",
"slots": [
{
"name": "Keyword",
"type": "PROTOCOL_KEYWORDS"
}
]
},
{
"intent": "WhatsMyKeywordIntent"
},
{
"intent": "AMAZON.HelpIntent"
}
]
}
"""
This sample demonstrates a simple skill built with the Amazon Alexa Skills Kit.
The Intent Schema, Custom Slots, and Sample Utterances for this skill, as well
as testing instructions are located at http://amzn.to/1LzFrj6
For additional samples, visit the Alexa Skills Kit Getting Started guide at
http://amzn.to/1LGWsLG
"""
from __future__ import print_function
import json
import os
import urllib.parse
import urllib.request
# from collections import deque
# DEFAULT_COLOR = os.environ['DEFAULT_COLOR']
PROTOCOLS_IO_ACCESS_TOKEN = os.environ['PROTOCOLS_IO_ACCESS_TOKEN']
# --------------- Helpers that build all of the responses ----------------------
def build_speechlet_response(title, output, reprompt_text, should_end_session):
return {
'outputSpeech': {
'type': 'PlainText',
'text': output
},
'card': {
'type': 'Simple',
'title': "SessionSpeechlet - " + title,
'content': "SessionSpeechlet - " + output
},
'reprompt': {
'outputSpeech': {
'type': 'PlainText',
'text': reprompt_text
}
},
'shouldEndSession': should_end_session
}
def build_response(session_attributes, speechlet_response):
return {
'version': '1.0',
'sessionAttributes': session_attributes,
'response': speechlet_response
}
# --------------- Functions that control the skill's behavior ------------------
def get_welcome_response():
""" If we wanted to initialize the session to have some attributes we could
add those here
"""
session_attributes = {}
card_title = "Welcome"
speech_output = "Welcome to Proxa. " \
"Please tell me what protocol to search for " \
"by saying, search protocols i o for cell culture"
# 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 = "Please tell me what protocol to search for by saying, " \
"search protocols i o for cell culture."
should_end_session = False
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def handle_session_end_request():
card_title = "Session Ended"
speech_output = "I hope your experiment was successful. " \
"Have a nice day! "
# Setting this to true ends the session and exits the skill.
should_end_session = True
return build_response({}, build_speechlet_response(
card_title, speech_output, None, should_end_session))
# def create_favorite_color_attributes(favorite_color):
# return {"favoriteColor": favorite_color}
def set_keyword_in_session(intent, session):
""" Sets the color in the session and prepares the speech to reply to the
user.
"""
card_title = intent['name']
session_attributes = {}
should_end_session = False
keyword = intent['slots']['Keyword']['value']
session_attributes['keyword'] = keyword
url = 'https://protocols.io/api/open/get_protocols'
values = {
'access_token': PROTOCOLS_IO_ACCESS_TOKEN,
'key': keyword,
}
data = urllib.parse.urlencode(values).encode("utf-8")
req = urllib.request.Request(url, data)
response = urllib.request.urlopen(req)
the_page = response.read()
total_results = json.loads(the_page)['total_results']
session_attributes['total_results'] = total_results
# protocol_list = deque(json.loads(the_page)['protocols'])
# protocol_list = json.loads(the_page)['protocols']
# session['attributes']['protocol_list'] = json.dumps(protocol_list)
# session_attributes['protocol_list'] = json.dumps(protocol_list)
speech_output = "I've found {} protocols related to {}".format(total_results, keyword) + \
". Say list protocols to hear the {} protocols".format(keyword)
reprompt_text = "You can ask me your search term by saying, " \
"what am I searching for?"
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def get_keyword_from_session(intent, session):
session_attributes = session.get('attributes', {})
reprompt_text = None
if "keyword" in session.get('attributes', {}):
keyword = session['attributes']['keyword']
speech_output = "Your search term is {}. ".format(keyword) + \
"Say list protocols to hear the {} protocols".format(keyword)
should_end_session = False
else:
speech_output = "I'm not sure what your search term is. " \
"You can say, search protocols i o for cell culture."
should_end_session = False
# Setting reprompt_text to None signifies that we do not want to reprompt
# the user. If the user does not respond or says something that is not
# understood, the session will end.
return build_response(session_attributes, build_speechlet_response(
intent['name'], speech_output, reprompt_text, should_end_session))
# --------------- Events ------------------
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 get_welcome_response()
def on_intent(intent_request, session):
""" 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']
# Dispatch to your skill's intent handlers
if intent_name == "MyKeywordIsIntent":
return set_keyword_in_session(intent, session)
elif intent_name == "WhatsMyKeywordIntent":
return get_keyword_from_session(intent, session)
elif intent_name == "AMAZON.HelpIntent":
return get_welcome_response()
elif intent_name == "AMAZON.CancelIntent" or intent_name == "AMAZON.StopIntent":
return handle_session_end_request()
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 ------------------
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'])
cell culture
purification
MyKeywordIsIntent Search protocols i o for {Keyword}
WhatsMyKeywordIntent what am I searching for
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment