Jalankan aplikasi Alexa di baris perintah. Jalankan di Slack. Jalankan di mana saja! Mendukung keterampilan dan niat Amazon Alexa.
$ npm install chatskills
Keterampilan Obrolan adalah cara cepat dan mudah untuk menjalankan aplikasi Alexa di luar Amazon. Ciptakan keterampilan dan niat Anda dengan mudah dan jalankan langsung di baris perintah!
Chatskills tidak memerlukan server dan dapat dijalankan langsung di konsol. Itu juga dapat berjalan di web, atau Slack, atau di mana saja. Ini menangani permintaan dari banyak pengguna dan memelihara memori sesi. Saat pengguna memulai percakapan dengan salah satu keterampilan, keterampilan tersebut terus dijalankan dalam konteks sesi, hingga keterampilan tersebut berakhir.
Berikut tampilan aplikasi Amazon Alexa, yang berjalan pada baris perintah.
> 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?
Dalam contoh ini, pengguna mengakses tiga keterampilan berbeda: halo, horoskop, dan lucu.
Menggunakan keterampilan obrolan itu mudah. Gunakan sintaks Alexa untuk menambahkan keterampilan baru, lalu buat beberapa maksud. Berikut ini contoh sederhananya.
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 ) ;
} ) ;
Dalam contoh di atas, tata bahasa ucapan secara otomatis diperluas untuk mencocokkan frasa berikut:
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
...
Untuk berinteraksi dengan chatbot menggunakan keterampilan ini, ucapkan salah satu frasa target. Pada contoh di atas, kami menggunakan frasa "mengatakan hai", namun Anda dapat mencocokkannya dengan frasa apa pun yang dihasilkan. Misalnya:
> 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!
Untuk membuat chatbot yang berjalan secara lokal di konsol, cukup sertakan loop untuk input membaca.
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 ) ;
} ) ;
}
Jika Anda menggunakan panggilan async dalam keahlian Anda (seperti permintaan, dll) maka Anda sebaiknya menggunakan loop async, bukan loop while di atas. Berikut ini contohnya.
Anda tidak harus hanya menggunakan konsol! Anda dapat menjalankan chatbot di mana saja, seperti Slack. Lihat di sini untuk contoh selengkapnya.
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 ) ;
}
} ) ;
}
} ) ;
Keterampilan adalah program yang dapat dijalankan oleh chatbot Anda. Mereka terdiri dari maksud, yang terdiri dari ucapan (frasa yang cocok dengan masukan pengguna), tanggapan, dan memori sesi. Setiap keterampilan dapat mengakses memori sesi, sehingga Anda dapat menyimpan dan mengambil variabel untuk membantu merespons pengguna secara cerdas.
Berikut contoh pembuatan skill baru yang diberi nama "horoskop".
var horoscope = chatskills . app ( 'horoscope' ) ;
Keterampilan terdiri dari niat. Di sinilah masukan dari pengguna dicocokkan dengan serangkaian ucapan. Ketika kecocokan ditemukan, maksud itu dijalankan. Suatu maksud bisa mendapatkan/mengatur variabel dalam sesi pengguna dengan memanggil req.get('variable')
dan req.set('variable', value)
. Intent dapat mengeluarkan respons dengan memanggil res.say('hello')
.
Berikut contoh pembuatan niat baru untuk skill "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' ) + '.' ) ;
}
) ;
Niat ini dapat berinteraksi dengan seperti ini:
> chatskills, ask horoscope for Scorpio
Things are looking up today for Scorpio.
Ada dua cara untuk mulai menjalankan suatu keterampilan.
Cara pertama untuk meluncurkan suatu keterampilan adalah dengan menciptakan maksud seperti, "berlari". Ini akan memungkinkan Anda memasukkan: "keterampilan obrolan, minta [nama keterampilan] untuk dijalankan.". Asalkan niat memiliki nilai balik yang benar (untuk menjaga sesi tetap hidup), keahlian Anda sekarang akan berjalan.
Contoh keterampilan “lari” dapat ditemukan pada permainan tebak-tebakan.
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 ) ;
}
) ;
Cara kedua untuk meluncurkan keterampilan adalah dengan membuat metode peluncuran yang dijalankan secara otomatis saat memulai aplikasi Anda. Kemudian cukup hubungi chatskills.launch(app)
untuk memulai keahlian Anda. Anda bisa meneruskan skill atau nama skillnya. Anda juga dapat memberikan sessionId unik opsional.
Contoh: chatskills.launch(app)
atau chatskills.launch('horoscope')
atau chatskills.launch('horoscope', 'some-unique-id')
.
Berikut contoh lengkapnya.
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 ) ;
} ) ;
}
Saat pengguna memberikan masukan, masukan tersebut dicocokkan dengan setiap keterampilan dan daftar maksudnya. Ketika kecocokan ditemukan, sesi baru dimulai, dan keterampilan mulai dijalankan.
Ketika sesi telah dimulai untuk pengguna, niat keterampilan yang diaktifkan bisa mendapatkan/menetapkan nilai variabel dalam sesi tersebut. Ini memungkinkan Anda untuk menyimpan dan mengambil data.
Saat sesi terbuka untuk pengguna, semua masukan dari pengguna diarahkan ke keterampilan yang diaktifkan. Dengan cara ini, pengguna tidak perlu meminta ulang suatu keterampilan ("keterampilan mengobrol, bertanya halo untuk menyapa"). Sebagai gantinya, pengguna cukup memberikan teks, yang akan dicocokkan dengan maksud dari skill yang sedang dijalankan.
Intent dapat menjaga sesi tetap terbuka dengan mengembalikan true
atau dengan memanggil res.shouldEndSession(false)
dan mengakhiri sesi dengan mengembalikan false
atau dengan memanggil res.shouldEndSession(true)
. Suatu maksud juga dapat menghilangkan pernyataan return, yang sama dengan mengembalikan false.
Untuk contoh penggunaan sesi, lihat keterampilan horoskop. Perhatikan, maksud menanyakan pertanyaan kepada pengguna dan kemudian mengembalikan nilai true agar sesi tetap berjalan. Niat hanya mengembalikan false setelah respons valid diberikan, sehingga mengakhiri sesi.
Singkatnya, ketika sesi pengguna terbuka, semua masukan dari pengguna diarahkan ke keterampilan. Ketika sesi pengguna berakhir, masukan dari pengguna harus diterima dalam format, "keterampilan mengobrol, tanyakan teks [SKILL]", untuk menjalankan keterampilan baru.
Batas waktu sesi default adalah 1 jam tanpa masukan dari pengguna. Untuk mengubah batas waktu sesi, atur chatskills.timeout = 3600
, yang nilainya ditentukan dalam hitungan detik. Untuk menonaktifkan batas waktu sesi, setel nilainya ke 0.
Nama chatbot default adalah "keterampilan mengobrol". Semua permintaan untuk mengeksekusi suatu keterampilan harus dimulai dengan nama chatbot. Misalnya, “keterampilan ngobrol, bertanya halo untuk menyapa”. Untuk menyesuaikan nama chatbot, gunakan yang berikut ini:
chatskills . name ( 'awesome' ) ;
Untuk menampilkan peringatan dan kesalahan, setel chatskills.verbose = true
.
Chatskills menggunakan aplikasi alexa untuk menghasilkan banyak contoh ucapan dari maksud Anda. Untuk deskripsi ucapan yang lebih rinci, lihat di sini.
Berikan objek dengan dua properti: slot dan ucapan.
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 ) { ... }
) ;
Objek slot adalah pemetaan Nama:Jenis yang sederhana. Jenisnya harus salah satu jenis slot yang didukung Amazon: LITERAL, NUMBER, DATE, TIME, DURATION
Sebagai pengganti jenis slot LITERAL
yang tidak lagi didukung oleh Amazon, disarankan untuk menggunakan jenis slot khusus sebagai gantinya. Berikut adalah contoh penentuan jenis slot khusus untuk 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!' ) ;
}
) ;
Anda dapat menyertakan jenis slot khusus dalam ucapan dengan menggunakan sintaksis {-|CustomTypeName}
. Hal ini menunjukkan bahwa istilah tersebut harus berasal dari daftar nilai untuk jenis slot khusus. Pada contoh di atas, ucapan menggunakan istilah {-|DragonType}
, yang menunjukkan bahwa suatu istilah harus berasal dari daftar nilai (ditampilkan di bawah). Untuk keterampilan ngobrol, daftar nilai tidak perlu disediakan - kata apa pun akan diterima untuk jenis slot khusus dan digunakan sebagai nilainya.
Jika menerbitkan ke layanan Amazon Alexa, Anda akan memberikan jenis slot khusus untuk DragonType
dengan menentukan nama jenis dan daftar nilai. Misalnya:
Jenis: DRAGONTYPE
Nilai:
golden
fire
ice
water
snow
Catatan, keterampilan obrolan dan Amazon Alexa sebenarnya akan menerima kata apa pun untuk nilai slot khusus. Itu tidak harus cocok dengan satu kata pun dari daftar nilai. Dengan cara ini, jenis slot khusus mirip dengan LITERAL
.
Sintaks ucapan memungkinkan Anda menghasilkan banyak (ratusan atau bahkan ribuan) contoh ucapan hanya dengan menggunakan beberapa contoh yang diperluas secara otomatis. Sejumlah contoh ucapan dapat diteruskan dalam susunan ucapan. Di bawah ini adalah beberapa contoh ucapan makro dan apa yang akan diperluas.
"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}"
Ini memungkinkan Anda menentukan beberapa cara untuk mengucapkan sebuah frasa, namun digabungkan menjadi satu contoh ucapan
"{what is the|what's the|check the} status"
=>
"what is the status"
"what's the status"
"check the status"
Saat menangkap nilai slot numerik, akan sangat membantu jika menghasilkan banyak contoh ucapan dengan nilai angka berbeda
"buy {2-5|NUMBER} items"
=>
"buy {two|NUMBER} items"
"buy {three|NUMBER} items"
"buy {four|NUMBER} items"
"buy {five|NUMBER} items"
Rentang angka juga dapat bertambah dalam beberapa langkah
"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"
Beberapa maksud mungkin menggunakan daftar kemungkinan nilai yang sama, jadi Anda ingin mendefinisikannya di satu tempat, bukan di setiap skema maksud. Gunakan kamus aplikasi.
app.dictionary = {"colors":["red","green","blue"]};
...
"my favorite color is {colors|FAVEORITE_COLOR}"
"I like {colors|COLOR}"
Anda dapat menampilkan Amazon Alexa Home Cards dengan menangani objek kartu yang dikembalikan dalam metode respons. Saat menggunakan aplikasi alexa, kartu rumah akan ditampilkan di Aplikasi Amazon Alexa pada perangkat seluler Anda. Saat menggunakan chatskills, kartu beranda dapat ditangani dalam metode panggilan balik chatskills.respond()
, yang mengembalikan dua argumen: response
dan card
.
Dengan menggunakan objek kartu, Anda dapat menampilkan teks dan gambar kartu sesuai keinginan Anda. Misalnya, jika menghosting aplikasi keterampilan ngobrol Anda di Slack, Anda mungkin ingin menampilkan gambar sebagai media tersemat. Demikian pula, jika menghosting sebagai chatbot teks di konsol, Anda mungkin ingin menampilkan kartu sebagai teks.
Di bawah ini adalah contohnya.
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