قم بتشغيل تطبيقات Alexa على سطر الأوامر. قم بتشغيلها في الركود. قم بتشغيلها في أي مكان! يدعم المهارات والنوايا Amazon Alexa.
$ npm install chatskills
Thatskills هي وسيلة سريعة وسهلة لتشغيل تطبيقات Alexa خارج Amazon. قم بسهولة بإنشاء مهاراتك ونواياك وتشغيلها مباشرة على سطر الأوامر!
لا يتطلب Thatskills خادمًا ويمكنه تشغيله مباشرة في وحدة التحكم. يمكن أن يعمل أيضًا على الويب ، أو الركود ، أو في أي مكان. إنه يتعامل مع طلبات من مستخدمين متعددين ويحافظ على ذاكرة الجلسة. عندما يبدأ المستخدم محادثة مع إحدى المهارات ، تستمر المهارة في التنفيذ في سياق الجلسة ، حتى تنتهي المهارة.
إليك ما يبدو عليه تطبيق 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?
في هذا المثال ، يصل المستخدم إلى ثلاث مهارات مختلفة: مرحبًا ، برجك ، ومضحك.
من السهل استخدام chatskills. استخدم بناء جملة Alexa لإضافة مهارة جديدة ، ثم إنشاء بعض النوايا. إليك مثال بسيط.
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
...
للتفاعل مع chatbot باستخدام هذه المهارة ، قل أيًا من العبارات المستهدفة. في المثال أعلاه ، استخدمنا عبارة "ليقول مرحبًا" ، ولكن يمكنك مطابقة أي من العبارات التي تم إنشاؤها. على سبيل المثال:
> 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!
لإنشاء chatbot يعمل محليًا على وحدة التحكم ، فقط قم بتضمين حلقة لقراءة الإدخال.
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 ) ;
} ) ;
}
إذا كنت تستخدم مكالمات ASYNC في مهاراتك (مثل الطلب ، إلخ) ، فستحتاج إلى استخدام حلقة ASYNC ، بدلاً من الحلقة المذكورة أعلاه. إليك مثال.
ليس عليك استخدام وحدة التحكم فقط! يمكنك تشغيل chatbot في أي مكان ، مثل 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 ) ;
}
} ) ;
}
} ) ;
المهارات هي البرامج التي يمكن أن يديرها chatbot. وهي تتكون من نوايا ، تتكون من الكلمات (عبارات لتتناسب مع إدخال المستخدم) ، والاستجابات ، وذاكرة الجلسة. يمكن لكل مهارة الوصول إلى ذاكرة الجلسة ، بحيث يمكنك تخزين المتغيرات واستردادها للمساعدة في الاستجابة بذكاء للمستخدم.
إليك مثال على إنشاء مهارة جديدة تسمى "برجك".
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.
هناك طريقتان لبدء تشغيل مهارة.
الطريقة الأولى لإطلاق مهارة هي إنشاء نية مثل "Run". هذا من شأنه أن يتيح لك الدخول: شريطة أن يكون للقصد قيمة إرجاع صواب (للحفاظ على الجلسة على قيد الحياة) ، سيتم تشغيل مهارتك الآن.
يمكن العثور على مثال على مهارة "تشغيل" في GuessingGame.
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 ) ;
} ) ;
}
عندما يوفر المستخدم المدخلات ، تتم مطابقة الإدخال مع كل مهارة وقائمة النوايا. عند العثور على مباراة ، تبدأ جلسة جديدة ، وتبدأ المهارة في التنفيذ.
عندما تبدأ الجلسة للمستخدم ، يمكن أن تحصل نية المهارة المنشطة على/تعيين قيم متغيرة داخل الجلسة. هذا يسمح لك بتخزين واستعادة البيانات.
بينما تكون الجلسة مفتوحة للمستخدم ، يتم توجيه جميع المدخلات من المستخدم إلى المهارة المنشطة. وبهذه الطريقة ، لا يحتاج المستخدم إلى إعادة تكوين مهارة ("Thatskills ، اطلب مرحبًا أن أقول مرحبًا"). بدلاً من ذلك ، يمكن للمستخدم ببساطة تقديم نص ، والذي سيتم مطابقته مع نوايا المهارة التي تنفذ حاليًا.
يمكن أن تبقي القصد على الجلسة مفتوحة من خلال العودة true
أو عن طريق الاتصال بـ res.shouldEndSession(false)
وإنهاء جلسة من خلال العودة false
أو عن طريق الاتصال بـ RES. res.shouldEndSession(true)
. يجوز للقصد أيضًا حذف بيان الإرجاع ، وهو نفسه العودة الخاطئة.
للحصول على مثال باستخدام الجلسة ، راجع مهارة برجك. إشعار ، تطلب القصد من المستخدم سؤالًا ثم يعيد صدق للحفاظ على الجلسة مستمرة. تُرجع القصد فقط كاذبة بمجرد إعطاء استجابة صالحة ، وبالتالي إنهاء الجلسة.
باختصار ، عندما تكون جلسة المستخدم مفتوحة ، يتم توجيه جميع المدخلات من المستخدم إلى المهارة. عند انتهاء جلسة المستخدم ، يجب استلام الإدخال من المستخدم بالتنسيق ، "Thatskills ، اطلب من نص [المهارة]" ، لتنفيذ مهارة جديدة.
مهلة الجلسة الافتراضية هي 1 ساعة من عدم المدخلات من المستخدم. لتغيير مهلة الجلسة ، قم بتعيين chatskills.timeout = 3600
، حيث يتم تحديد القيمة في الثواني. لتعطيل مهلة الجلسة ، اضبط القيمة على 0.
اسم chatbot الافتراضي هو "chatskills". يجب أن تبدأ جميع طلبات تنفيذ المهارة باسم chatbot. على سبيل المثال ، "Chatskills ، اطلب من مرحبًا أن أقول مرحبًا". لتخصيص اسم chatbot ، استخدم ما يلي:
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
، والذي لم يعد مدعومًا من قبل 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!' ) ;
}
) ;
يمكنك تضمين أنواع الفتحات المخصصة داخل الكلام باستخدام Syntax {-|CustomTypeName}
. يشير هذا إلى أن المصطلح يجب أن يأتي من قائمة القيم لنوع الفتحة المخصصة. في المثال أعلاه ، يستخدم الكلام المصطلح {-|DragonType}
، مما يشير إلى أن المصطلح يجب أن يأتي من قائمة القيم (الموضحة أدناه). بالنسبة إلى chatskills ، لا يلزم توفير قائمة بالقيم - سيتم قبول أي كلمة لنوع فتحة مخصصة واستخدامها كقيمة.
إذا نشرت على خدمة Amazon Alexa ، فستوفر أنواع القمار المخصصة لـ DragonType
من خلال تحديد اسم النوع وقائمة القيم. على سبيل المثال:
النوع: DRAGONTYPE
قيم:
golden
fire
ice
water
snow
ملاحظة ، سوف تقبل Thatskills و 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"
قد تستخدم العديد من النوايا نفس قائمة القيم المحتملة ، لذلك تريد تحديدها في مكان واحد ، وليس في كل مخطط نية. استخدم قاموس التطبيق.
app.dictionary = {"colors":["red","green","blue"]};
...
"my favorite color is {colors|FAVEORITE_COLOR}"
"I like {colors|COLOR}"
يمكنك عرض بطاقات Amazon Alexa المنزلية عن طريق التعامل مع كائن البطاقة الذي تم إرجاعه في طريقة الاستجابة. عند استخدام Alexa-App ، سيتم عرض البطاقة الرئيسية في تطبيق Amazon Alexa على جهازك المحمول. عند استخدام Chatskills ، يمكن التعامل مع البطاقة الرئيسية في طريقة الاتصال chatskills.respond()
، والتي تُرجع وسيطتين: response
card
.
باستخدام كائن البطاقة ، يمكنك عرض نص البطاقة والصورة بأي طريقة ترغب فيها. على سبيل المثال ، إذا استضافت تطبيق Thatskills الخاص بك في Slack ، فقد ترغب في إظهار الصورة كوسائط مضمنة. وبالمثل ، إذا استضافت chatbot النص على وحدة التحكم ، فقد ترغب ببساطة في إخراج البطاقة كنص.
أدناه مثال.
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 + ']' ) ;
}
} ) ;
معهد ماساتشوستس للتكنولوجيا
Kory Becker http://www.primaryobjects.com/kory-becker