This is a simple starter project for Alexa skills using Typescript.
- Default request handlers
Name |
---|
LaunchRequest |
SessionEndedRequest |
System.ExceptionEncountered |
AMAZON.HelpIntent |
AMAZON.StopIntent and AMAZON.CancelIntent |
AMAZON.FallbackIntent |
- Extra handlers
Name | Description |
---|---|
HelloWorld |
Triggered when the user says "hello", will answer back with "hello". |
Debug |
Can be placed at the beginning of the request handlers stack and it will print the handlerInput . Useful for debugging. |
- Error handlers
Name | Description |
---|---|
Unexpected |
Catches ErrorTypes.Unexpected , which should be thrown when...something unexpected happens. It will tell the user something unexpected happend, and to try again later. |
Unknown |
Catches all other errors. It will tell the user it didn't understand the command, and to try saying it again (doesn't end session). |
- Request interceptors
Name | Description |
---|---|
Localization |
Adds i18next localization functions to the IRequestAttributes . |
ISlots |
Parses the slot values, adds additional useful information to them (e.g. if it was an exact match, or if it's ambiguous etc.), and adds them to the IRequestAttributes . Check the GetSlotValues function inside lambda/custom/lib/helpers.ts for more details. |
- Localization strings
Check lambda/custom/lib/strings.ts
.
- Constants
Including the String keys, so you can have type safety everywhere.
Check lambda/custom/lib/constants.ts
.
- Helper functions
Many helper functions which should reduce code duplication, and reduce the code needed to do common tasks.
Check lambda/custom/lib/helpers.ts
.
- Local development
Contains an http
server using express
, which you can use with ngrok
or servo.net
during local development. Check the Local development section below for more details.
- Node.js
- Register for an AWS Account
- Register for an Amazon Developer Account
- Install and Setup ASK CLI
-
Make sure you are running the latest version of the CLI
npm update -g ask-cli
-
Clone the repository and navigate into the skill's root directory.
ask new --url https://github.com/JoJ123/alexa-typescript-skill-template.git --skill-name hello-world cd hello-world
-
Install npm dependencies
yarn install
-
To start the skill locally, run the following
yarn start
ASK CLI will create the skill and the Lambda function for you. The Lambda function will be created in us-east-1 (Northern Virginia)
by default.
-
Navigate to the project's root directory. you should see a file named 'skill.json' there.
-
Deploy the skill and the Lambda function in one step by running the following command:
$ yarn deploy
In order to develop locally and see your changes reflected instantly, you will need to create an SSH tunnel or expose somehow your local development server. There are several services that allow you to do this, for example ngrok or serveo.net.
$ yarn deploy:local
This is the easiest to setup
- You need to have an SSH client installed, then simply run
$ ssh -R 80:localhost:3980 serveo.net
Forwarding HTTP traffic from [https://YOUR_URL]
Press g to start a GUI session and ctrl-c to quit.
-
Once you see the URL, copy it and go to your Skill console.
-
Open the
Endpoint
menu and selectHTTPS
-
Under
Default Region
paste the previous URL you copied. -
On the select box choose:
My development endpoint is a sub-domain of a domain that has a wildcard certificate from a certificate authority
. -
You are done! Just run
npm start
to start the local server and begin testing the skill.
-
Run
ngrok http 3980
-
Copy the URL and follow the same steps above from 3 to 6.
Command | Description |
---|---|
clean |
Deletes the dist folder |
build |
Builds the lambda function and exports it to the dist folder |
deploy |
Builds the lambda function and deploys EVERYTHING (skill, model, lambda) |
deploy:lambda |
Builds the lambda function and deploys it (just the lambda function) |
deploy:local |
Deploys the skill details for the local profile, which will update the HTTPS endpoint |
start |
Starts the local express server using nodemon for local development |
To see the actual commands, check package.json
.
Also check the ASK CLI Command Reference for more details on using the ASK CLI
.
Taken from the official hello world project.
-
To test, you need to login to Alexa Developer Console, and enable the "Test" switch on your skill from the "Test" Tab.
-
Simulate verbal interaction with your skill through the command line (this might take a few moments) using the following example:
$ ask simulate -l en-US -t "open hello world" ✓ Simulation created for simulation id: 4a7a9ed8-94b2-40c0-b3bd-fb63d9887fa7 ◡ Waiting for simulation response{ "status": "SUCCESSFUL", ...
-
Once the "Test" switch is enabled, your skill can be tested on devices associated with the developer account as well. Speak to Alexa from any enabled device, from your browser at echosim.io, or through your Amazon Mobile App and say :
Alexa, start hello world
Taken from the official hello world project.
-
./skill.json
Change the skill name, example phrase, icons, testing instructions etc ...
Remember than many information are locale-specific and must be changed for each locale (e.g. en-US, en-GB, de-DE, etc.)
See the Skill Manifest Documentation for more information.
-
./lambda/custom/index.ts
Modify messages, and data from the source code to customize the skill.
-
./models/*.json
Change the model definition to replace the invocation name and the sample phrase for each intent. Repeat the operation for each locale you are planning to support.
-
Remember to re-deploy your skill and Lambda function for your changes to take effect.
$ npm run deploy
Note that there are two package.json
files:
./package.json
, used when running the skill locally. This contains the normal dependencies, as well as some development dependencies and extra scripts./lambda/custom/package.json
, this is used only for production and it just contains the normal dependencies
If you need to update the normal dependencies (e.g. ask-sdk-model
), make sure to update it in both package.json
, otherwise the production build will miss those changes.