2017-07-29 19 views
7

अतीत में, मैंने जावा में लिखे गए दो अलग-अलग एडब्ल्यूएस लैम्बडा सेट किए हैं। एलेक्सा के साथ उपयोग करने के लिए एक और Api.ai के साथ उपयोग के लिए एक। वे बस प्रत्येक सहायक एपीआई को "हैलो वर्ल्ड" लौटते हैं। तो हालांकि वे सरल हैं वे काम करते हैं। जैसे-जैसे मैंने प्रत्येक के लिए अधिक से अधिक कोड लिखना शुरू किया, मैंने यह देखना शुरू कर दिया कि मेरा जावा कोड कैसा था और मैं दो अलग-अलग भेड़ के बच्चे बनकर खुद को दोहरा रहा था।एलेक्सा कौशल किट और API.AI दोनों के लिए एक एकल AWS Lambda का उपयोग कैसे करें?

आज के लिए तेज़ आगे।

क्या मैं अब काम कर रहा हूँ एक एकल एडब्ल्यूएस लैम्ब्डा कि दोनों एलेक्सा और Api.ai से इनपुट संभाल कर सकते हैं चल रहा है, लेकिन मैं कुछ समस्या हो रही है। वर्तमान में, मेरे विचार है कि जब लैम्ब्डा चलाया जाता है, तो इसे आसानी हो सकता है अगर बयान इसलिए की तरह है:

निम्नलिखित, वास्तविक कोड नहीं है मैं तो बस क्या लगता है कि मैं मेरे सिर में क्या कर सकते हैं

if (figureOutIfInputType.equals("alexa")){ 
runAlexaCode(); 
} else if (figureOutIfInputType.equals("api.ai")){ 
runApiAiCode(); 
} 

बात यह है कि अब मुझे किसी भी तरह यह बताने की ज़रूरत है कि फ़ंक्शन को एलेक्स या api.ai द्वारा बुलाया जा रहा है या नहीं।

यह मेरा वास्तविक जावा अभी है:

public class App implements RequestHandler<Object, String> { 

    @Override 
    public String handleRequest(Object input, Context context) { 
    System.out.println("myLog: " + input.toString()); 

     return "Hello from AWS"; 
    } 

मैं तो एलेक्सा और Api.ai से लैम्ब्डा दौड़ा देखने के लिए क्या वस्तु इनपुट जावा में उत्पन्न हो जाएगा।

API.ai

{id=asdf-6801-4a9b-a7cd-asdffdsa, timestamp=2017-07- 
28T02:21:15.337Z, lang=en, result={source=agent, resolvedQuery=hi how 
are you, action=, actionIncomplete=false, parameters={}, contexts=[], 
metadata={intentId=asdf-3a2a-49b6-8a45-97e97243b1d7, 
webhookUsed=true, webhookForSlotFillingUsed=false, 
webhookResponseTime=182, intentName=myIntent}, fulfillment= 
{messages=[{type=0, speech=I have failed}]}, score=1}, status= 
{code=200, errorType=success}, sessionId=asdf-a7ac-43c8-8ae8- 
bc1bf5ecaad0} 

एलेक्सा

{version=1.0, session={new=true, sessionId=amzn1.echo-api.session.asdf- 
7e03-4c35-9d98-d416eefc5b23, application=  
{applicationId=amzn1.ask.skill.asdf-a02e-4938-a747-109ea09539aa}, user=   
{userId=amzn1.ask.account.asdf}}, context={AudioPlayer= 
{playerActivity=IDLE}, System={application= 
{applicationId=amzn1.ask.skill.07c854eb-a02e-4938-a747-109ea09539aa}, 
user={userId=amzn1.ask.account.asdf}, device= 
{deviceId=amzn1.ask.device.asdf, supportedInterfaces={AudioPlayer={}}}, 
apiEndpoint=https://api.amazonalexa.com}}, request={type=IntentRequest, 
requestId=amzn1.echo-api.request.asdf-5de5-4930-8f04-9acf2130e6b8, 
timestamp=2017-07-28T05:07:30Z, locale=en-US, intent= 
{name=HelloWorldIntent, confirmationStatus=NONE}}} 

तो अब मैं दोनों मेरे एलेक्सा और Api.ai उत्पादन है, और वे अलग हैं। तो यह अच्छा है। मैं यह बताने में सक्षम हूं कि कौन सा है। लेकिन मैं अटक गया हूँ। मुझे वास्तव में यकीन नहीं है कि मुझे एक AlexaInput ऑब्जेक्ट और एक एपीआईआईपूट ऑब्जेक्ट बनाने का प्रयास करना चाहिए।

क्या मैं यह सब गलत कर रहा हूं? क्या मैं एक लैम्ब्डा को एक से अधिक सेवा (एलेक्सा और एपीआईएआई) से अपने "सहायक" अनुरोधों को पूरा करने की कोशिश करने में गलत हूं?

किसी भी मदद की सराहना की जाएगी। निश्चित रूप से, किसी और को एडब्ल्यूएस में उनकी सहायक कार्यक्षमता लिखनी होगी और दोनों "सहायक" प्लेटफ़ॉर्म के लिए अपना कोड पुन: उपयोग करना चाहता है।

उत्तर

2

मैं एक ही सवाल है और एक ही सोचा था, लेकिन जैसा कि मैंने लागू करने में आगे और आगे हो गया, मुझे एहसास हुआ कि यह एक बड़ा कारण के लिए काफी व्यावहारिक नहीं था:

जबकि मेरे तर्क का एक बहुत होने की जरूरत वही - परिणामों का प्रारूप अलग था। कभी-कभी, परिणामों का ब्योरा या स्वरूपण भी अलग होगा।

  1. एक बैक-एंड प्रणाली है कि मानकों को ले जा रहा है और व्यापार को लागू करने के लिए जिम्मेदार था:

    क्या मैंने किया था कुछ अवधारणाओं कि दो भागों में विभाजित करके वेब प्रोग्रामिंग में परिचित थे के लिए वापस जाना था परिणाम देने के लिए तर्क।ये परिणाम काफी कम स्तर पर होंगे, पूरे वाक्यांश नहीं, बल्कि कुंजी/मूल्य जोड़े का एक सेट जो इंगित करता है कि किस प्रकार का परिणाम देना है और उस परिणाम में किस मूल्य की आवश्यकता होगी।

  2. फ्रंट-एंड सिस्टम जो एलेक्सा/सहायक विशिष्ट थे, को संभालने के लिए ज़िम्मेदार था। तो यह अनुरोध लेगा, पैरामीटर और राज्य निकालें, इस जानकारी के साथ बैक-एंड सिस्टम को कॉल करें, परिणाम प्राप्त करें जिसमें किस प्रकार का उत्तर भेजने और मूल्यों की आवश्यकता है, और उसके बाद सटीक वाक्यांश (और कोई अन्य सहायक जानकारी, जैसे कि कार्ड या जो भी हो) और इसे उचित रूप से स्वरूपित प्रतिक्रिया में डाल दें।

फ्रंट-एंड घटक प्रत्येक एजेंट प्रकार के लिए एक अलग लैम्ब्डा फ़ंक्शन होगा, अधिकांशतः तर्क को थोड़ा क्लीनर बनाने के लिए। बैक एंड घटक या तो लाइब्रेरी फ़ंक्शन या अन्य लैम्ब्डा फ़ंक्शन हो सकते हैं, जो भी कार्य के लिए सबसे अधिक समझ में आता है, लेकिन फ्रंट एंड कार्यान्वयन से स्वतंत्र है।

मुझे लगता है कि कोई भी एक अमूर्त अभिभावक वर्ग के साथ ऐसा कर सकता है जो बैक-एंड लॉजिक लागू करता है, और फ्रंट एंड लॉजिक इस के उप-वर्ग होने के कारण होता है। मैं इसे इस तरह से नहीं करूँगा क्योंकि यह दोनों के बीच एक अंतरफलक सीमा प्रदान नहीं करता है, लेकिन यह अनुचित नहीं है।

+0

तो तुम दोनों एलेक्सा और api.ai के लिए एडब्ल्यूएस (जावा) का उपयोग करते हैं? इस बिंदु पर, मैं एक साझा लाइब्रेरी के साथ दो अलग-अलग कोड अड्डों के साथ ठीक हूं, जिसे मैं शायद बनाऊंगा, लेकिन मुझे नहीं पता कि वास्तव में इनपुट को कैसे पार्स/प्राप्त करना है। – EGHDK

+0

शायद मैं आपके प्रश्न को गलत समझ रहा हूं। क्या आप यह जानने का प्रयास कर रहे हैं कि 'अनुरोध' पैरामीटर को कैसे पार्स करें और दो मामलों के लिए इसे अलग तरीके से इलाज करें? – Prisoner

+0

मुझे लगता है कि आपने मेरे मूल प्रश्न का सही उत्तर दिया है, लेकिन मुझे इस बिंदु पर ज्यादातर फॉलो अप किया गया था। मुझे यकीन नहीं है कि api.ai से परिणामों में कैसे पढ़ा जाए। आउटपुट (ऊपर दिखाया गया है) जो कि api.ai से है, आने वाले "ऑब्जेक्ट" प्रकार पर toString() को कॉल करके बस है। क्या आने वाली बस जेसन है? यदि हां, तो मैं इसे कैसे प्राप्त करूं ताकि मैं केवल 'if (input.lang.equals ("en")) को कॉल कर सकूं? – EGHDK

0

मैं एलेक्सा एएसके और माइक्रोसॉफ्ट लुइस.ई प्रतिक्रियाओं को संभालने के लिए एक एकल लैम्ब्डा का उपयोग कर रहा हूं। मैं जावा के बजाय पायथन का उपयोग कर रहा हूं लेकिन विचार एक जैसा है और मुझे विश्वास है कि एक AlexaInput और ApiAIinput ऑब्जेक्ट का उपयोग करके, दोनों एक ही इंटरफ़ेस को विस्तारित करने का तरीका होना चाहिए।

मैं पहले संदर्भ जानकारी का उपयोग यह पहचानने के लिए करता हूं कि अनुरोध कहां से आ रहा है और इसे उपयुक्त वस्तु में पार्स करें (मैं एक साधारण नेस्टेड शब्दकोश का उपयोग करता हूं)। फिर इसे मेरे मुख्य प्रसंस्करण समारोह में पास करें और अंत में, आउटपुट को संदर्भ के आधार पर फिर से एक फॉर्मेटर में पास करें। फ़ॉर्मेटर को पता चलेगा कि आपको वापस लौटने की क्या ज़रूरत है। एकमात्र चेतावनी यह है कि सत्र की जानकारी को संभालना; जो मेरे मामले में मैं अपनी खुद की डायनेमोडीबी तालिका को क्रमबद्ध करता हूं।

1

आप परिणाम (कोड पुन: उपयोग) को एक अलग तरीके से प्राप्त कर सकते हैं।

सबसे पहले, aws-lambda-java-events लाइब्रेरी का उपयोग करके प्रत्येक प्रकार की घटना (एलेक्सा, एपीआई गेटवे, आदि) के लिए एक विधि बनाएं। यहां कुछ जानकारी: http://docs.aws.amazon.com/lambda/latest/dg/java-programming-model-handler-types.html

प्रत्येक प्रविष्टि बिंदु विधि को ईवेंट (एपीआई गेटवे) को ट्रिगर करने वाले ईवेंट के अर्थशास्त्र से निपटना चाहिए और आपको कोड पुन: उपयोग करने के लिए सामान्य कोड में कॉल करना चाहिए।

दूसरा, अपने जेएआर/ज़िप को एस 3 बाल्टी में अपलोड करें।

तीसरा, प्रत्येक घटना के लिए जिसे आप संभालना चाहते हैं - एक लैम्ब्डा फ़ंक्शन बनाएं, एस 3 बाल्टी में एक ही ज़िप/जेएआर का संदर्भ दें और प्रासंगिक प्रविष्टि बिंदु निर्दिष्ट करें।

इस तरह, आपको एडब्ल्यूएस पर कोड की कई प्रतियों को बिना किसी जुड़ाव के कोड कोड पुन: उपयोग किया जाएगा, यद्यपि एकाधिक लैम्ब्डा परिभाषित होने की लागत पर।

वहाँ एक महान उपकरण है जो इस तरह से Serverless फ्रेमवर्क कहा जाता है जो मैं अत्यधिक देखने की सलाह देते चाहते हैं काम कर रहे समर्थन करता है: https://serverless.com/framework/docs/providers/aws/

संबंधित मुद्दे