EGH*_*HDK 7 alexa aws-lambda alexa-skills-kit actions-on-google api-ai
过去,我已经设置了两个用Java编写的独立AWS lambda.一个用于Alexa,一个用于Api.ai. 他们只是向每个助手api返回"Hello world".所以虽然它们很简单,但它们都有效 当我开始为每个代码编写越来越多的代码时,我开始看到我的java代码有多么相似,而我只是通过拥有两个单独的lambdas来重复自己.
快进到今天.
什么我现在工作的是有一个单一的 AWS拉姆达可从处理输入都 Alexa和Api.ai但我遇到了一些麻烦.目前,我的想法是,当运行lambda时,会有一个简单的if语句,如下所示:
以下不是真正的代码,只是我认为我可以做的事情
if (figureOutIfInputType.equals("alexa")){
runAlexaCode();
} else if (figureOutIfInputType.equals("api.ai")){
runApiAiCode();
}
Run Code Online (Sandbox Code Playgroud)
事情是现在我需要以某种方式告诉函数是否被alexa或api.ai调用.
这是我现在的实际java:
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";
}
Run Code Online (Sandbox Code Playgroud)
然后我从Alexa和Api.ai运行lambda来查看在java中生成的Object输入.
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}
Run Code Online (Sandbox Code Playgroud)
Alexa的
{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}}}
Run Code Online (Sandbox Code Playgroud)
所以现在我有Alexa和Api.ai输出,它们是不同的.这很好.我能分辨出哪一个是哪个.但我被困住了.我不确定是否应该尝试创建AlexaInput对象和ApiAIinput对象.
我做错了吗?我试图让一个lambda满足来自多个服务(Alexa和ApiAI)的"助手"请求,这是错误的吗?
任何帮助,将不胜感激.当然,其他人必须在AWS中编写他们的助手功能,并希望将他们的代码重用于两个"助手"平台.
我有同样的问题和同样的想法,但随着我越来越深入地实施,我意识到它不太实用,原因有一个:
虽然我的很多逻辑需要相同,但结果的格式不同。有时,甚至结果的细节或格式也会有所不同。
我所做的就是回到 Web 编程中熟悉的一些概念,将其分为两部分:
负责获取参数并应用业务逻辑来生成结果的后端系统。这些结果将是相当低级的,不是整个短语,而是一组键/值对,指示给出什么样的结果以及该结果中需要什么值。
负责处理 Alexa/Assistant 特定事务的前端系统。因此,它将接受请求,提取参数和状态,使用此信息调用后端系统,获取结果,其中包括要发送的回复类型和所需的值,然后格式化确切的短语(以及任何其他支持)信息,例如卡片或其他内容)并将其放入格式正确的响应中。
对于每种代理类型,前端组件将是不同的 lambda 函数,主要是为了使逻辑更清晰一些。后端组件可以是库函数或另一个 lambda 函数,只要对任务最有意义即可,但独立于前端实现。
我想也可以通过拥有一个实现后端逻辑的抽象父类,并使前端逻辑成为它的子类来实现这一点。我不会这样做,因为它没有提供两者之间清晰的接口边界,但它并非不合理。
| 归档时间: |
|
| 查看次数: |
619 次 |
| 最近记录: |