เรียกใช้แอป Alexa บนบรรทัดคำสั่ง เรียกใช้ใน Slack วิ่งไปทุกที่! รองรับทักษะและความตั้งใจของ Amazon Alexa
$ npm install chatskills
Chatskills เป็นวิธีที่ง่ายและรวดเร็วในการเรียกใช้แอป Alexa ภายนอก Amazon สร้างทักษะและความตั้งใจของคุณได้อย่างง่ายดายแล้วรันมันบนบรรทัดคำสั่ง!
Chatskills ไม่จำเป็นต้องมีเซิร์ฟเวอร์และสามารถเรียกใช้ในคอนโซลได้โดยตรง นอกจากนี้ยังสามารถทำงานบนเว็บหรือ Slack หรือที่ใดก็ได้ จัดการคำขอจากผู้ใช้หลายรายและรักษาหน่วยความจำเซสชัน เมื่อผู้ใช้เริ่มการสนทนาด้วยทักษะอย่างใดอย่างหนึ่ง ทักษะนั้นจะยังคงดำเนินการภายในบริบทเซสชัน จนกว่าทักษะจะสิ้นสุดลง
นี่คือลักษณะของแอป Amazon Alexa ที่ทำงานบนบรรทัดคำสั่ง
> 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?
ในตัวอย่างนี้ ผู้ใช้เข้าถึงทักษะที่แตกต่างกันสามทักษะ: สวัสดี ดูดวง และตลก
การใช้ทักษะการแชทเป็นเรื่องง่าย ใช้ไวยากรณ์ของ Alexa เพื่อเพิ่มทักษะใหม่ จากนั้นสร้าง Intent ขึ้นมา นี่เป็นตัวอย่างง่ายๆ
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 ) ;
} ) ;
ในตัวอย่างข้างต้น ไวยากรณ์ของคำพูดจะขยายโดยอัตโนมัติเพื่อให้ตรงกับวลีต่อไปนี้:
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
...
หากต้องการโต้ตอบกับแชทบอทโดยใช้ทักษะนี้ ให้พูดวลีเป้าหมายใดก็ได้ ในตัวอย่างข้างต้น เราใช้วลี "กล่าวสวัสดี" แต่คุณสามารถจับคู่กับวลีที่สร้างขึ้นใดๆ ได้ ตัวอย่างเช่น:
> 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!
หากต้องการสร้างแชทบอทที่ทำงานบนคอนโซลภายในเครื่อง เพียงรวมลูปสำหรับอ่านอินพุต
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 ) ;
} ) ;
}
หากคุณใช้การเรียกแบบอะซิงก์ในทักษะของคุณ (เช่น คำขอ ฯลฯ) คุณจะต้องใช้การวนซ้ำแบบอะซิงก์ แทนการวนซ้ำแบบ while ด้านบน นี่คือตัวอย่าง
คุณไม่จำเป็นต้องใช้เพียงแค่คอนโซล! คุณสามารถเรียกใช้แชทบอทได้ทุกที่ เช่น Slack ดูที่นี่สำหรับตัวอย่างเต็ม
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 ) ;
}
} ) ;
}
} ) ;
ทักษะคือโปรแกรมที่แชทบอทของคุณสามารถรันได้ ประกอบด้วยเจตนาซึ่งประกอบด้วยคำพูด (วลีที่จะจับคู่จากการป้อนข้อมูลของผู้ใช้) การตอบสนอง และหน่วยความจำเซสชัน แต่ละทักษะสามารถเข้าถึงหน่วยความจำเซสชันได้ ดังนั้นคุณจึงสามารถจัดเก็บและดึงข้อมูลตัวแปรเพื่อช่วยตอบสนองต่อผู้ใช้อย่างชาญฉลาด
นี่คือตัวอย่างการสร้างทักษะใหม่ชื่อ "ดวง"
var horoscope = chatskills . app ( 'horoscope' ) ;
ทักษะประกอบด้วยความตั้งใจ นี่คือจุดที่อินพุตจากผู้ใช้ถูกจับคู่กับอาร์เรย์ของคำพูด เมื่อพบการแข่งขัน ความตั้งใจนั้นก็จะถูกดำเนินการ เจตนาสามารถรับ/ตั้งค่าตัวแปรในเซสชันผู้ใช้โดยการเรียก req.get('variable')
และ req.set('variable', value)
เจตนาสามารถแสดงการตอบสนองโดยการเรียก res.say('hello')
นี่คือตัวอย่างการสร้างเจตนารมณ์ใหม่สำหรับทักษะ "ดวงชะตา"
horoscope . intent ( 'predict' , {
'slots' : { 'SIGN' : 'LITERAL' } ,
'utterances' : [ 'for {signs|SIGN}' ]
} ,
function ( req , res ) {
res . say ( 'Things are looking up today for ' + req . get ( 'SIGN' ) + '.' ) ;
}
) ;
เจตนานี้สามารถโต้ตอบได้ดังนี้:
> chatskills, ask horoscope for Scorpio
Things are looking up today for Scorpio.
มีสองวิธีในการเริ่มต้นใช้งานทักษะ
วิธีแรกในการเปิดใช้ทักษะคือการสร้างเจตนา เช่น "วิ่ง" สิ่งนี้จะทำให้คุณป้อน: "chatskills, ขอให้ [ชื่อทักษะ] ทำงาน" หากเจตนามีค่าส่งคืนเป็น true (เพื่อให้เซสชั่นคงอยู่) ทักษะของคุณก็จะเริ่มทำงาน
ตัวอย่างของทักษะ "วิ่ง" สามารถพบได้ในเกมทายผล
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 ) ;
}
) ;
วิธีที่สองในการเปิดใช้งานทักษะคือการสร้างวิธีการเปิดใช้งานเพื่อให้ทำงานโดยอัตโนมัติเมื่อเริ่มแอปของคุณ จากนั้นเพียงโทรไปที่ chatskills.launch(app)
เพื่อเริ่มทักษะของคุณ คุณสามารถผ่านทักษะหรือชื่อของทักษะได้ คุณยังสามารถระบุ sessionId ที่ไม่ซ้ำกันซึ่งเป็นทางเลือกได้
ตัวอย่าง: chatskills.launch(app)
หรือ chatskills.launch('horoscope')
หรือ chatskills.launch('horoscope', 'some-unique-id')
นี่คือตัวอย่างที่สมบูรณ์
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 ) ;
} ) ;
}
เมื่อผู้ใช้ป้อนข้อมูล ข้อมูลจะถูกจับคู่กับแต่ละทักษะและรายการความตั้งใจของพวกเขา เมื่อพบการแข่งขัน เซสชั่นใหม่จะเริ่มต้นขึ้น และทักษะจะเริ่มดำเนินการ
เมื่อเซสชันเริ่มต้นสำหรับผู้ใช้ จุดประสงค์ของทักษะที่เปิดใช้งานสามารถรับ/ตั้งค่าตัวแปรภายในเซสชันได้ สิ่งนี้ทำให้คุณสามารถจัดเก็บและเรียกค้นข้อมูลได้
ในขณะที่เซสชันเปิดสำหรับผู้ใช้ ข้อมูลทั้งหมดจากผู้ใช้จะถูกส่งไปยังทักษะที่เปิดใช้งาน ในลักษณะนี้ ผู้ใช้ไม่จำเป็นต้องขอทักษะอีกครั้ง ("ทักษะการแชท ถามสวัสดี เพื่อทักทาย") ผู้ใช้สามารถระบุข้อความซึ่งจะจับคู่กับจุดประสงค์ของทักษะที่กำลังดำเนินการอยู่แทน
เจตนาสามารถเปิดเซสชันต่อไปได้โดยการส่งคืน true
หรือโดยการเรียก res.shouldEndSession(false)
และสิ้นสุดเซสชันโดยการส่งคืน false
หรือโดยการเรียก res.shouldEndSession(true)
เจตนาอาจละเว้นคำสั่ง return ซึ่งเหมือนกับการคืนค่า false
ตัวอย่างการใช้เซสชั่นดูทักษะดวงชะตา โปรดสังเกตว่า เจตนาจะถามคำถามกับผู้ใช้ จากนั้นจะคืนค่าเป็นจริงเพื่อให้เซสชันดำเนินต่อไป เจตนาจะคืนค่าเท็จเมื่อได้รับการตอบสนองที่ถูกต้องเท่านั้น ดังนั้น จึงเป็นการสิ้นสุดเซสชัน
โดยสรุป เมื่อเซสชันผู้ใช้เปิดขึ้น อินพุตทั้งหมดจากผู้ใช้จะถูกส่งไปยังทักษะโดยตรง เมื่อเซสชันผู้ใช้สิ้นสุดลง ต้องได้รับอินพุตจากผู้ใช้ในรูปแบบ "ทักษะการแชท ถามข้อความ [ทักษะ]" เพื่อดำเนินการทักษะใหม่
การหมดเวลาเซสชันเริ่มต้นคือ 1 ชั่วโมงโดยไม่มีการป้อนข้อมูลจากผู้ใช้ หากต้องการเปลี่ยนการหมดเวลาเซสชัน ให้ตั้งค่า chatskills.timeout = 3600
โดยระบุค่าเป็นวินาที หากต้องการปิดใช้งานการหมดเวลาเซสชัน ให้ตั้งค่าเป็น 0
ชื่อแชทบอทเริ่มต้นคือ "chatskills" คำขอทั้งหมดเพื่อดำเนินการทักษะจะต้องขึ้นต้นด้วยชื่อแชทบอท เช่น “ทักษะการแชท ทักทาย ทักทาย” หากต้องการปรับแต่งชื่อแชทบอท ให้ใช้ดังต่อไปนี้:
chatskills . name ( 'awesome' ) ;
หากต้องการแสดงคำเตือนและข้อผิดพลาด ให้ตั้งค่า chatskills.verbose = true
Chatskills ใช้ alexa-app เพื่อสร้างตัวอย่างคำพูดมากมายจากเจตนาของคุณ สำหรับคำอธิบายโดยละเอียดเพิ่มเติมของคำพูด ดูที่นี่
ส่งผ่านวัตถุที่มีคุณสมบัติสองประการ: ช่องและคำพูด
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 ) { ... }
) ;
ออบเจ็กต์สล็อตเป็นการแมปชื่อ:ประเภทแบบธรรมดา ประเภทดังกล่าวต้องเป็นประเภทสล็อตที่รองรับของ Amazon: LITERAL, NUMBER, DATE, TIME, DURATION
เพื่อทดแทนประเภทสล็อต LITERAL
ซึ่ง Amazon ไม่รองรับอีกต่อไป ขอแนะนำให้ใช้ประเภทสล็อตแบบกำหนดเองแทน นี่คือตัวอย่างการกำหนดประเภทสล็อตแบบกำหนดเองสำหรับ 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!' ) ;
}
) ;
คุณสามารถรวมประเภทช่องที่กำหนดเองภายในคำพูดได้โดยใช้ไวยากรณ์ {-|CustomTypeName}
ซึ่งบ่งชี้ว่าคำนี้ควรมาจากรายการค่าสำหรับประเภทช่องโฆษณาที่กำหนดเอง ในตัวอย่างข้างต้น คำพูดใช้คำว่า {-|DragonType}
ซึ่งบ่งชี้ว่าคำควรมาจากรายการค่า (แสดงด้านล่าง) สำหรับทักษะการแชท ไม่จำเป็นต้องระบุรายการค่า - คำใดๆ จะได้รับการยอมรับสำหรับประเภทช่องที่กำหนดเองและใช้เป็นค่า
หากเผยแพร่ไปยังบริการ Amazon Alexa คุณจะต้องระบุประเภทสล็อตที่กำหนดเองสำหรับ DragonType
โดยการระบุชื่อประเภทและรายการค่า ตัวอย่างเช่น:
ประเภท: DRAGONTYPE
ค่า:
golden
fire
ice
water
snow
โปรดทราบว่าทักษะการแชทและ Amazon Alexa จะยอมรับคำใดๆ สำหรับค่าช่องที่กำหนดเอง ไม่จำเป็นต้องจับคู่คำจากรายการค่า ในลักษณะนี้ ประเภทสล็อตแบบกำหนดเองจะคล้ายกับ LITERAL
ไวยากรณ์ของคำพูดช่วยให้คุณสามารถสร้างตัวอย่างคำพูดจำนวนมาก (หลายร้อยหรือหลายพัน) โดยใช้ตัวอย่างเพียงไม่กี่ตัวอย่างที่ได้รับการขยายอัตโนมัติ ตัวอย่างคำพูดจำนวนเท่าใดก็ได้อาจถูกส่งผ่านในอาร์เรย์คำพูด ด้านล่างนี้คือตัวอย่างมาโครคำพูดและสิ่งที่จะขยายออกไป
"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}"
วิธีนี้ช่วยให้คุณกำหนดวิธีพูดวลีได้หลายวิธี แต่รวมเป็นคำพูดตัวอย่างเดียว
"{what is the|what's the|check the} status"
=>
"what is the status"
"what's the status"
"check the status"
เมื่อจับค่าช่องตัวเลข การสร้างตัวอย่างคำพูดที่มีค่าตัวเลขต่างกันจะเป็นประโยชน์
"buy {2-5|NUMBER} items"
=>
"buy {two|NUMBER} items"
"buy {three|NUMBER} items"
"buy {four|NUMBER} items"
"buy {five|NUMBER} items"
ช่วงตัวเลขยังสามารถเพิ่มขึ้นเป็นขั้นๆ ได้อีกด้วย
"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"
Intent หลายรายการอาจใช้รายการค่าที่เป็นไปได้เดียวกัน ดังนั้นคุณจึงต้องการกำหนดไว้ในที่เดียว ไม่ใช่ใน Intent Schema แต่ละแห่ง ใช้พจนานุกรมของแอป
app.dictionary = {"colors":["red","green","blue"]};
...
"my favorite color is {colors|FAVEORITE_COLOR}"
"I like {colors|COLOR}"
คุณสามารถแสดงการ์ดหน้าแรกของ Amazon Alexa ได้โดยการจัดการออบเจ็กต์การ์ดที่ส่งคืนในวิธีการตอบกลับ เมื่อใช้ alexa-app การ์ดโฮมจะแสดงในแอป Amazon Alexa บนอุปกรณ์มือถือของคุณ เมื่อใช้ chatskills โฮมการ์ดสามารถจัดการได้ในเมธอด callback chatskills.respond()
ซึ่งส่งคืนอาร์กิวเมนต์สองรายการ: response
และ card
เมื่อใช้ออบเจ็กต์การ์ด คุณสามารถแสดงข้อความและรูปภาพของการ์ดในลักษณะใดก็ได้ตามที่คุณต้องการ ตัวอย่างเช่น หากโฮสต์แอป Chatskills ไว้ใน Slack คุณอาจต้องการแสดงรูปภาพเป็นสื่อแบบฝัง ในทำนองเดียวกัน หากโฮสต์เป็นแชทบอทข้อความบนคอนโซล คุณอาจต้องการส่งออกการ์ดเป็นข้อความ
ด้านล่างนี้เป็นตัวอย่าง
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 + ']' ) ;
}
} ) ;
เอ็มไอที
คอรี เบกเกอร์ http://www.primaryobjects.com/kory-becker