Ejecute aplicaciones de Alexa en la línea de comandos. Ejecútelos en Slack. ¡Ejecútalos en cualquier lugar! Admite habilidades e intenciones de Amazon Alexa.
$ npm install chatskills
Chatskills es una forma rápida y sencilla de ejecutar aplicaciones de Alexa fuera de Amazon. ¡Cree fácilmente sus habilidades e intenciones y ejecútelas directamente en la línea de comandos!
Chatskills no requiere un servidor y puede ejecutarse directamente en la consola. También puede ejecutarse en la web, en Slack o en cualquier lugar. Maneja solicitudes de múltiples usuarios y mantiene la memoria de sesión. Cuando un usuario inicia una conversación con una de las habilidades, la habilidad continúa ejecutándose dentro de un contexto de sesión, hasta que finaliza.
Así es como se ve una aplicación de Amazon Alexa ejecutándose en la línea de comandos.
> chatskills, ask hello to say hi.
Hello, World!
> chatskills, ask horoscope for Scorpio.
Things are looking up today for Scorpio.
> chatskills, ask funny to tell me a joke
Knock knock.
> who's there?
Banana.
> banana who
Knock knock.
> whos there
Orange.
> orange who?
Orange you glad I didn't say banana?
En este ejemplo, el usuario accede a tres habilidades diferentes: hola, horóscopo y gracioso.
Usar chatskills es fácil. Utilice la sintaxis de Alexa para agregar una nueva habilidad y luego cree algunas intenciones. He aquí un ejemplo sencillo.
var chatskills = require ( 'chatskills' ) ;
// Create a skill.
var hello = chatskills . app ( 'hello' ) ;
// Create an intent.
hello . intent ( 'helloWorld' , {
'slots' : { } ,
'utterances' : [ '{to |}{say|speak|tell me} {hi|hello|howdy|hi there|hiya|hi ya|hey|hay|heya}' ]
} ,
function ( req , res ) {
res . say ( 'Hello, World!' ) ;
}
) ;
// Respond to input.
chatskills . respond ( 'chatskills, ask hello to say hi' , function ( response ) {
console . log ( response ) ;
} ) ;
En el ejemplo anterior, la gramática de las expresiones se expande automáticamente para coincidir con las siguientes frases:
helloWorld to say hi
helloWorld say hi
helloWorld to speak hi
helloWorld speak hi
helloWorld to tell me hi
helloWorld tell me hi
helloWorld to say hello
helloWorld say hello
helloWorld to speak hello
helloWorld speak hello
helloWorld to tell me hello
helloWorld tell me hello
helloWorld to say howdy
...
Para interactuar con el chatbot usando esta habilidad, diga cualquiera de las frases objetivo. En el ejemplo anterior, hemos usado la frase "para decir hola", pero puedes compararla con cualquiera de las frases generadas. Por ejemplo:
> chatskills, ask hello to tell me hi
Hello, World!
> chatskills, ask hello to say hello
Hello, World!
> chatskills, ask hello to say howdy
Hello, World!
Para crear un chatbot que se ejecute localmente en la consola, simplemente incluya un bucle para leer la entrada.
var readlineSync = require ( 'readline-sync' ) ;
// Console client.
var text = ' ' ;
while ( text . length > 0 && text != 'quit' ) {
text = readlineSync . question ( '> ' ) ;
// Respond to input.
chatskills . respond ( text , function ( response ) {
console . log ( response ) ;
} ) ;
}
Si está utilizando llamadas asíncronas en sus habilidades (como solicitudes, etc.), entonces querrá usar un bucle asíncrono, en lugar del bucle while anterior. He aquí un ejemplo.
¡No tienes que usar solo la consola! Puedes ejecutar tu chatbot en cualquier lugar, como Slack. Vea aquí un ejemplo completo.
var SlackBot = require ( 'slackbots' ) ;
var bot = new SlackBot ( { token : token , name : 'awesome' } ) ;
// Listen to slack messages.
bot . on ( 'message' , function ( message ) {
// Reply to humans.
if ( message . type == 'message' && message . text && message . subtype != 'bot_message' ) {
var author = getUserById ( message . user ) ;
var channel = getChannelById ( message . channel ) ;
// Respond to input, use author.name as the session id.
chatskills . respond ( message . text , author . name , function ( response ) {
if ( channel ) {
// Public channel message.
bot . postMessageToChannel ( channel . name , response ) ;
}
else {
// Private message.
bot . postMessageToUser ( author . name , response ) ;
}
} ) ;
}
} ) ;
Las habilidades son programas que tu chatbot puede ejecutar. Consisten en intenciones, que se componen de expresiones (frases que coinciden con las entradas del usuario), respuestas y memoria de sesión. Cada habilidad puede acceder a la memoria de la sesión, por lo que puede almacenar y recuperar variables para ayudar a responder de manera inteligente al usuario.
A continuación se muestra un ejemplo de cómo crear una nueva habilidad, llamada "horóscopo".
var horoscope = chatskills . app ( 'horoscope' ) ;
Las habilidades se componen de intenciones. Aquí es donde la entrada del usuario se compara con una serie de expresiones. Cuando se encuentra una coincidencia, se ejecuta esa intención. Una intención puede obtener/establecer variables en la sesión del usuario llamando a req.get('variable')
y req.set('variable', value)
. Una intención puede generar una respuesta llamando a res.say('hello')
.
A continuación se muestra un ejemplo de cómo crear una nueva intención para la habilidad "horóscopo".
horoscope . intent ( 'predict' , {
'slots' : { 'SIGN' : 'LITERAL' } ,
'utterances' : [ 'for {signs|SIGN}' ]
} ,
function ( req , res ) {
res . say ( 'Things are looking up today for ' + req . get ( 'SIGN' ) + '.' ) ;
}
) ;
Se puede interactuar con esta intención de esta manera:
> chatskills, ask horoscope for Scorpio
Things are looking up today for Scorpio.
Hay dos formas de empezar a ejecutar una habilidad.
La primera forma de iniciar una habilidad es crear una intención como "ejecutar". Esto le permitirá ingresar: "chatskills, solicite a [nombre de habilidad] que se ejecute". Siempre que la intención tenga un valor de retorno verdadero (para mantener viva la sesión), su habilidad ahora se estará ejecutando.
Se puede encontrar un ejemplo de habilidad de "correr" en el juego de adivinanzas.
app . intent ( 'run' , {
"slots" : { } ,
"utterances" : [ "{to|} {run|start|go|launch}" ]
} , function ( req , res ) {
var prompt = "Guess a number between 1 and 100!" ;
res . say ( prompt ) . reprompt ( prompt ) . shouldEndSession ( false ) ;
}
) ;
La segunda forma de iniciar una habilidad es crear un método de inicio que se ejecute automáticamente al iniciar su aplicación. Luego simplemente llama chatskills.launch(app)
para iniciar tu habilidad. Puedes pasar la habilidad o el nombre de la habilidad. También puede proporcionar un ID de sesión único opcional.
Ejemplo: chatskills.launch(app)
o chatskills.launch('horoscope')
o chatskills.launch('horoscope', 'some-unique-id')
.
Aquí tienes un ejemplo completo.
var chatskills = require ( './lib/chatskills' ) ;
var readlineSync = require ( 'readline-sync' ) ;
// Create a skill.
var hello = chatskills . app ( 'hello' ) ;
// Launch method to run at startup.
hello . launch ( function ( req , res ) {
res . say ( "Ask me to say hi!" ) ;
// Keep session open.
res . shouldEndSession ( false ) ;
} ) ;
// Create an intent.
hello . intent ( 'helloWorld' , {
'slots' : { } ,
'utterances' : [ '{to |}{say|speak|tell me} {hi|hello|howdy|hi there|hiya|hi ya|hey|hay|heya}' ]
} ,
function ( req , res ) {
res . say ( 'Hello, World!' ) ;
}
) ;
// Start running our skill.
chatskills . launch ( hello ) ;
// Console client.
var text = ' ' ;
while ( text . length > 0 && text != 'quit' ) {
text = readlineSync . question ( '> ' ) ;
// Respond to input.
chatskills . respond ( text , function ( response ) {
console . log ( response ) ;
} ) ;
}
Cuando un usuario proporciona información, la información se compara con cada habilidad y su lista de intenciones. Cuando se encuentra una coincidencia, comienza una nueva sesión y la habilidad comienza a ejecutarse.
Cuando se inicia una sesión para un usuario, la intención de la habilidad activada puede obtener/establecer valores variables dentro de la sesión. Esto le permite almacenar y recuperar datos.
Mientras una sesión está abierta para un usuario, toda la entrada del usuario se dirige a la habilidad activada. De esta manera, el usuario no necesita volver a solicitar una habilidad ("chatskills, pide hola para saludar"). En su lugar, el usuario puede simplemente proporcionar texto, que se comparará con las intenciones de la habilidad que se está ejecutando actualmente.
Una intención puede mantener una sesión abierta devolviendo true
o llamando res.shouldEndSession(false)
y finalizar una sesión devolviendo false
o llamando res.shouldEndSession(true)
. Un intent también puede omitir una declaración de devolución, que es lo mismo que devolver falso.
Para ver un ejemplo de uso de sesión, consulte la habilidad del horóscopo. Observe que la intención le hace una pregunta al usuario y luego devuelve verdadero para mantener la sesión. La intención solo devuelve falso una vez que se da una respuesta válida, finalizando así la sesión.
En resumen, cuando una sesión de usuario está abierta, toda la entrada del usuario se dirige a la habilidad. Cuando finaliza una sesión de usuario, la entrada del usuario debe recibirse en el formato "chatskills, preguntar texto [SKILL]" para ejecutar una nueva habilidad.
El tiempo de espera predeterminado de la sesión es de 1 hora sin intervención del usuario. Para cambiar el tiempo de espera de la sesión, establezca chatskills.timeout = 3600
, donde el valor se especifica en segundos. Para desactivar el tiempo de espera de la sesión, establezca el valor en 0.
El nombre predeterminado del chatbot es "chatskills". Todas las solicitudes para ejecutar una habilidad deben comenzar con el nombre del chatbot. Por ejemplo, "chatskills, saluda para saludar". Para personalizar el nombre del chatbot, utilice lo siguiente:
chatskills . name ( 'awesome' ) ;
Para mostrar advertencias y errores, configure chatskills.verbose = true
.
Chatskills utiliza alexa-app para generar muchos ejemplos de expresiones a partir de sus intenciones. Para obtener una descripción más detallada de las expresiones, consulte aquí.
Pase un objeto con dos propiedades: espacios y expresiones.
app . intent ( 'sampleIntent' ,
{
"slots" : { "NAME" : "LITERAL" , "AGE" : "NUMBER" } ,
"utterances" : [ "my {name is|name's} {names|NAME} and {I am|I'm} {1-100|AGE}{ years old|}" ]
} ,
function ( request , response ) { ... }
) ;
El objeto de ranuras es un nombre simple: asignación de tipo. El tipo debe ser uno de los tipos de espacios admitidos por Amazon: LITERAL, NÚMERO, FECHA, HORA, DURACIÓN
Como reemplazo del tipo de ranura LITERAL
, que Amazon ya no admite, se recomienda utilizar tipos de ranura personalizados en su lugar. A continuación se muestra un ejemplo de cómo definir un tipo de ranura personalizado para DragonType
.
app . intent ( 'attack' ,
{
'slots' : { 'DragonType' : 'DRAGONTYPE' } ,
'utterances' : [ '{attack|fight|hit|use} {sword|dagger|wand} on {-|DragonType} dragon' ]
} , function ( request , response ) {
response . say ( 'You are attacking the ' + request . slot ( 'DragonType' ) + ' dragon!' ) ;
}
) ;
Puede incluir tipos de espacios personalizados dentro de las expresiones utilizando la sintaxis {-|CustomTypeName}
. Esto indica que el término debe provenir de una lista de valores para el tipo de ranura personalizado. En el ejemplo anterior, la expresión usa el término {-|DragonType}
, lo que indica que un término debe provenir de la lista de valores (que se muestra a continuación). Para chatskills, no es necesario proporcionar una lista de valores: cualquier palabra se aceptará para un tipo de espacio personalizado y se usará como su valor.
Si publica en el servicio Amazon Alexa, deberá proporcionar los tipos de ranuras personalizados para DragonType
especificando el nombre del tipo y una lista de valores. Por ejemplo:
Tipo: DRAGONTYPE
Valores:
golden
fire
ice
water
snow
Tenga en cuenta que chatskills y Amazon Alexa aceptarán cualquier palabra para el valor del espacio personalizado. No es necesario que coincida con una palabra de la lista de valores. De esta manera, los tipos de ranuras personalizadas son similares a LITERAL
.
La sintaxis de expresiones le permite generar muchos (cientos o incluso miles) de expresiones de muestra utilizando solo unas pocas muestras que se expanden automáticamente. Se puede pasar cualquier número de expresiones de muestra en la matriz de expresiones. A continuación se muestran algunos ejemplos de macros de expresiones y a qué se ampliarán.
"my favorite color is {red|green|blue|NAME}"
=>
"my favorite color is {red|NAME}"
"my favorite color is {green|NAME}"
"my favorite color is {blue|NAME}"
Esto le permite definir múltiples formas de decir una frase, pero combinadas en una sola expresión de muestra.
"{what is the|what's the|check the} status"
=>
"what is the status"
"what's the status"
"check the status"
Al capturar un valor de espacio numérico, es útil generar muchas expresiones de muestra con diferentes valores numéricos.
"buy {2-5|NUMBER} items"
=>
"buy {two|NUMBER} items"
"buy {three|NUMBER} items"
"buy {four|NUMBER} items"
"buy {five|NUMBER} items"
Los rangos de números también pueden incrementarse en pasos
"buy {5-20 by 5|NUMBER} items"
=>
"buy {five|NUMBER} items"
"buy {ten|NUMBER} items"
"buy {fifteen|NUMBER} items"
"buy {twenty|NUMBER} items"
"what is your {favorite |}color"
=>
"what is your color"
"what is your favorite color"
Varias intenciones pueden usar la misma lista de valores posibles, por lo que conviene definirlos en un solo lugar, no en cada esquema de intención. Utilice el diccionario de la aplicación.
app.dictionary = {"colors":["red","green","blue"]};
...
"my favorite color is {colors|FAVEORITE_COLOR}"
"I like {colors|COLOR}"
Puede mostrar Amazon Alexa Home Cards manejando el objeto de tarjeta devuelto en el método de respuesta. Cuando utilice la aplicación Alexa, la tarjeta de inicio se mostrará en la aplicación Amazon Alexa de su dispositivo móvil. Cuando se usa chatskills, la tarjeta de inicio se puede manejar en el método de devolución de llamada chatskills.respond()
, que devuelve dos argumentos: response
y card
.
Usando el objeto de la tarjeta, puede mostrar el texto y la imagen de la tarjeta de la forma que desee. Por ejemplo, si aloja su aplicación Chatskills en Slack, es posible que desee mostrar la imagen como medio incrustado. Del mismo modo, si lo aloja como un chatbot de texto en la consola, es posible que simplemente desee generar la tarjeta como texto.
A continuación se muestra un ejemplo.
app . intent ( 'example' , {
"slots" : { } ,
"utterances" : [ "show a card" ]
} , function ( req , res ) {
// Show home card in Alexa app.
res . card ( {
type : 'Standard' ,
title : 'My Awesome Card' , // this is not required for type Simple or Standard
text : 'This is an example of an Alexa home card.' ,
image : { // image is optional
smallImageUrl : 'http://www.yoursite.com/image.jpg' , // required
largeImageUrl : null
}
} ) ;
} ) ;
// Respond to input.
chatskills . respond ( text , function ( response , card ) {
if ( ! card ) {
// Text response from res.say() method.
console . log ( response ) ;
}
else {
// Home card response from res.card() method.
console . log ( '[DISPLAYING CARD: Title=' + card . title + ', Text=' + card . text + ']' ) ;
}
} ) ;
MIT
Kory Becker http://www.primaryobjects.com/kory-becker