Führen Sie Alexa-Apps über die Befehlszeile aus. Führen Sie sie in Slack aus. Führen Sie sie überall hin! Unterstützt die Fähigkeiten und Absichten von Amazon Alexa.
$ npm install chatskills
Chatskills ist eine schnelle und einfache Möglichkeit, Alexa-Apps außerhalb von Amazon auszuführen. Erstellen Sie ganz einfach Ihre Fähigkeiten und Absichten und führen Sie sie direkt in der Befehlszeile aus!
Chatskills erfordert keinen Server und kann direkt in der Konsole ausgeführt werden. Es kann auch im Web, in Slack oder überall ausgeführt werden. Es verarbeitet Anfragen von mehreren Benutzern und verwaltet den Sitzungsspeicher. Wenn ein Benutzer eine Konversation mit einem der Skills beginnt, wird der Skill in einem Sitzungskontext weiter ausgeführt, bis der Skill beendet wird.
So sieht eine Amazon Alexa-App aus, die auf der Befehlszeile ausgeführt wird.
> 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?
In diesem Beispiel greift der Benutzer auf drei verschiedene Fähigkeiten zu: Hallo, Horoskop und lustig.
Die Verwendung von Chatskills ist einfach. Verwenden Sie die Alexa-Syntax, um einen neuen Skill hinzuzufügen, und erstellen Sie dann einige Absichten. Hier ist ein einfaches Beispiel.
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 ) ;
} ) ;
Im obigen Beispiel wird die Grammatik der Äußerungen automatisch erweitert, um sie mit den folgenden Phrasen abzugleichen:
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
...
Um mit diesem Skill mit dem Chatbot zu interagieren, sagen Sie eine der Zielphrasen. Im obigen Beispiel haben wir die Phrase „um Hallo zu sagen“ verwendet, aber Sie können einen Abgleich mit jeder der generierten Phrasen durchführen. Zum Beispiel:
> 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!
Um einen Chatbot zu erstellen, der lokal auf der Konsole ausgeführt wird, fügen Sie einfach eine Schleife zum Lesen der Eingaben ein.
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 ) ;
} ) ;
}
Wenn Sie in Ihren Skills asynchrone Aufrufe verwenden (z. B. Anfragen usw.), sollten Sie anstelle der oben genannten while-Schleife eine asynchrone Schleife verwenden. Hier ist ein Beispiel.
Sie müssen nicht nur die Konsole verwenden! Sie können Ihren Chatbot überall ausführen, wie z. B. Slack. Das vollständige Beispiel finden Sie hier.
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 ) ;
}
} ) ;
}
} ) ;
Fähigkeiten sind Programme, die Ihr Chatbot ausführen kann. Sie bestehen aus Absichten, die aus Äußerungen (aus der Benutzereingabe übereinstimmende Phrasen), Antworten und Sitzungsspeicher bestehen. Jeder Skill kann auf den Sitzungsspeicher zugreifen, sodass Sie Variablen speichern und abrufen können, um intelligent auf den Benutzer zu reagieren.
Hier ist ein Beispiel für die Erstellung einer neuen Fähigkeit mit dem Namen „Horoskop“.
var horoscope = chatskills . app ( 'horoscope' ) ;
Fähigkeiten bestehen aus Absichten. Hierbei werden die Eingaben des Benutzers mit einer Reihe von Äußerungen abgeglichen. Wenn eine Übereinstimmung gefunden wird, wird diese Absicht ausgeführt. Ein Intent kann Variablen in der Benutzersitzung abrufen/festlegen, indem er req.get('variable')
und req.set('variable', value)
aufruft. Ein Intent kann eine Antwort ausgeben, indem er res.say('hello')
aufruft.
Hier ist ein Beispiel für die Erstellung einer neuen Absicht für die Fertigkeit „Horoskop“.
horoscope . intent ( 'predict' , {
'slots' : { 'SIGN' : 'LITERAL' } ,
'utterances' : [ 'for {signs|SIGN}' ]
} ,
function ( req , res ) {
res . say ( 'Things are looking up today for ' + req . get ( 'SIGN' ) + '.' ) ;
}
) ;
Mit dieser Absicht kann wie folgt interagiert werden:
> chatskills, ask horoscope for Scorpio
Things are looking up today for Scorpio.
Es gibt zwei Möglichkeiten, mit der Ausführung eines Skills zu beginnen.
Die erste Möglichkeit, einen Skill zu starten, besteht darin, eine Absicht wie „run“ zu erstellen. Dadurch könnten Sie Folgendes eingeben: „chatskills, bitten Sie [Skillname], ihn auszuführen.“ Vorausgesetzt, die Absicht hat den Rückgabewert „true“ (um die Sitzung am Leben zu halten), wird Ihr Skill jetzt ausgeführt.
Ein Beispiel für eine „Lauf“-Fähigkeit findet sich im Ratespiel.
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 ) ;
}
) ;
Die zweite Möglichkeit, einen Skill zu starten, besteht darin, eine Startmethode zu erstellen, die beim Starten Ihrer App automatisch ausgeführt wird. Dann rufen Sie einfach chatskills.launch(app)
auf, um Ihren Skill zu starten. Sie können den Skill oder den Namen des Skills übergeben. Sie können optional auch eine eindeutige Sitzungs-ID angeben.
Beispiel: chatskills.launch(app)
oder chatskills.launch('horoscope')
oder chatskills.launch('horoscope', 'some-unique-id')
.
Hier ist ein vollständiges Beispiel.
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 ) ;
} ) ;
}
Wenn ein Benutzer eine Eingabe macht, wird die Eingabe mit jeder Fertigkeit und ihrer Absichtsliste abgeglichen. Wenn eine Übereinstimmung gefunden wird, beginnt eine neue Sitzung und die Ausführung des Skills beginnt.
Wenn eine Sitzung für einen Benutzer gestartet wurde, kann die Absicht des aktivierten Skills variable Werte innerhalb der Sitzung abrufen/festlegen. Dadurch können Sie Daten speichern und abrufen.
Während eine Sitzung für einen Benutzer geöffnet ist, werden alle Eingaben des Benutzers an den aktivierten Skill weitergeleitet. Auf diese Weise muss der Benutzer einen Skill nicht erneut anfordern („chatskills, ask hello to say hi“). Stattdessen kann der Benutzer einfach Text bereitstellen, der mit den Absichten des aktuell ausgeführten Skills abgeglichen wird.
Eine Absicht kann eine Sitzung offen halten, indem sie true
zurückgibt oder res.shouldEndSession(false)
aufruft, und eine Sitzung beenden, indem sie false
zurückgibt oder res.shouldEndSession(true)
aufruft. Ein Intent kann auch eine Return-Anweisung weglassen, was der Rückgabe von false gleichkommt.
Ein Beispiel für die Verwendung einer Sitzung finden Sie in der Fertigkeit „Horoskop“. Beachten Sie, dass der Intent dem Benutzer eine Frage stellt und dann „true“ zurückgibt, um die Sitzung aufrechtzuerhalten. Der Intent gibt nur dann „false“ zurück, wenn eine gültige Antwort gegeben wird, wodurch die Sitzung beendet wird.
Zusammenfassend lässt sich sagen, dass bei geöffneter Benutzersitzung alle Eingaben des Benutzers an den Skill weitergeleitet werden. Wenn eine Benutzersitzung beendet wird, muss die Eingabe des Benutzers im Format „chatskills, ask [SKILL] text“ empfangen werden, um einen neuen Skill auszuführen.
Das standardmäßige Sitzungszeitlimit beträgt 1 Stunde ohne Eingaben des Benutzers. Um das Sitzungszeitlimit zu ändern, legen Sie chatskills.timeout = 3600
fest, wobei der Wert in Sekunden angegeben wird. Um das Sitzungszeitlimit zu deaktivieren, legen Sie den Wert auf 0 fest.
Der Standard-Chatbot-Name ist „chatskills“. Alle Anfragen zur Ausführung eines Skills müssen mit dem Chatbot-Namen beginnen. Zum Beispiel „Chatskills, bitte um Hallo, um Hallo zu sagen“. Um den Chatbot-Namen anzupassen, verwenden Sie Folgendes:
chatskills . name ( 'awesome' ) ;
Um Warnungen und Fehler anzuzeigen, setzen Sie chatskills.verbose = true
.
Chatskills nutzt die Alexa-App, um viele Beispieläußerungen aus Ihren Absichten zu generieren. Eine detailliertere Beschreibung der Äußerungen finden Sie hier.
Übergeben Sie ein Objekt mit zwei Eigenschaften: Slots und Utterances.
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 ) { ... }
) ;
Das Slots-Objekt ist eine einfache Name:Type-Zuordnung. Der Typ muss einer der von Amazon unterstützten Slot-Typen sein: LITERAL, NUMBER, DATE, TIME, DURATION
Als Ersatz für den LITERAL
-Slot-Typ, der von Amazon nicht mehr unterstützt wird, wird empfohlen, stattdessen benutzerdefinierte Slot-Typen zu verwenden. Hier ist ein Beispiel für die Definition eines benutzerdefinierten Slot-Typs für 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!' ) ;
}
) ;
Mithilfe der Syntax {-|CustomTypeName}
können Sie benutzerdefinierte Slot-Typen in Äußerungen einschließen. Dies weist darauf hin, dass der Begriff aus einer Werteliste für den benutzerdefinierten Slot-Typ stammen sollte. Im obigen Beispiel verwendet die Äußerung den Begriff {-|DragonType}
, was angibt, dass ein Begriff aus der Werteliste (siehe unten) stammen sollte. Für Chatskills muss keine Werteliste bereitgestellt werden – jedes Wort wird für einen benutzerdefinierten Slot-Typ akzeptiert und als Wert verwendet.
Bei der Veröffentlichung im Amazon Alexa-Dienst würden Sie die benutzerdefinierten Slot-Typen für DragonType
bereitstellen, indem Sie den Typnamen und eine Werteliste angeben. Zum Beispiel:
Typ: DRAGONTYPE
Werte:
golden
fire
ice
water
snow
Beachten Sie, dass Chatskills und Amazon Alexa tatsächlich jedes Wort für den benutzerdefinierten Slot-Wert akzeptieren. Es muss nicht mit einem Wort aus der Werteliste übereinstimmen. Auf diese Weise ähneln benutzerdefinierte Slot-Typen LITERAL
.
Mit der Äußerungssyntax können Sie viele (Hunderte oder sogar Tausende) Beispieläußerungen generieren, indem Sie nur wenige Beispiele verwenden, die automatisch erweitert werden. Im Äußerungsarray kann eine beliebige Anzahl von Beispieläußerungen übergeben werden. Nachfolgend finden Sie einige Beispiel-Äußerungsmakros und deren Erweiterung.
"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}"
Auf diese Weise können Sie mehrere Möglichkeiten definieren, eine Phrase auszusprechen, diese jedoch in einer einzigen Beispieläußerung kombinieren
"{what is the|what's the|check the} status"
=>
"what is the status"
"what's the status"
"check the status"
Beim Erfassen eines numerischen Slot-Werts ist es hilfreich, viele Beispieläußerungen mit unterschiedlichen Zahlenwerten zu generieren
"buy {2-5|NUMBER} items"
=>
"buy {two|NUMBER} items"
"buy {three|NUMBER} items"
"buy {four|NUMBER} items"
"buy {five|NUMBER} items"
Nummernkreise können auch schrittweise erhöht werden
"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"
Mehrere Absichten verwenden möglicherweise dieselbe Liste möglicher Werte. Sie sollten sie daher an einer Stelle und nicht in jedem Absichtsschema definieren. Nutzen Sie das Wörterbuch der App.
app.dictionary = {"colors":["red","green","blue"]};
...
"my favorite color is {colors|FAVEORITE_COLOR}"
"I like {colors|COLOR}"
Sie können Amazon Alexa Home Cards anzeigen, indem Sie das in der Antwortmethode zurückgegebene Kartenobjekt verarbeiten. Bei Nutzung der Alexa-App wird die Home-Karte in der Amazon Alexa App auf Ihrem Mobilgerät angezeigt. Bei Verwendung von Chatskills kann die Home-Karte in der Rückrufmethode chatskills.respond()
verarbeitet werden, die zwei Argumente zurückgibt: response
und card
.
Mithilfe des Kartenobjekts können Sie den Text und das Bild der Karte auf beliebige Weise anzeigen. Wenn Sie beispielsweise Ihre Chatskills-App in Slack hosten, möchten Sie das Bild möglicherweise als eingebettetes Medium anzeigen. Ebenso möchten Sie beim Hosten als Text-Chatbot auf der Konsole möglicherweise einfach die Karte als Text ausgeben.
Unten finden Sie ein Beispiel.
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