在过去,我用Java编写了两个独立的AWS。一个用于Alexa,另一个用于Api.ai。它们只是将"Hello“返回给每个辅助api。因此,尽管它们很简单,但它们是有效的。当我开始为每一个代码编写越来越多的代码时,我开始看到我的java代码是多么相似,我只是通过拥有两个单独的lambda来重复自己。
快到今天。
我现在正在做的是拥有一个单 Alexa,它可以处理来自、、Alexa和Api.ai的输入,但我遇到了一些麻烦。目前,我的想法是,在运行lambda时,会有这样一个简单的if语句:
以下不是真正的代码,只是我认为我能在脑海中做的事情
if (figureOutIfInputType.equals("alexa")){
runAlexaCode();
} else if (figureOutIfInputType.equals("api.ai")){
runApiAiCode();
}问题是,现在我需要知道函数是由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";
}然后,我从Alexa和Api.ai运行lambda,以查看将在java中生成哪些对象输入。
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}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}}}所以现在我有了我的Alexa和Api.ai输出,它们是不同的。所以这很好。我就能分辨出哪一个是哪个。但我被困住了。我不太确定是否应该尝试创建一个AlexaInput对象和一个ApiAIinput对象。
,我是不是做错了?如果我试图让一个“助手”满足来自多个服务(Alexa和ApiAI)的“助手”请求,我会错吗?
任何帮助都将不胜感激。当然,其他人必须用AWS编写他们的辅助功能,并且希望在两个“助手”平台上重用他们的代码。
发布于 2017-07-29 05:31:49
我有着同样的问题和相同的想法,但随着我在实施过程中越来越深入,我意识到这是不太实际的,原因之一是:
虽然我的很多逻辑都是一样的--结果的格式是不同的。有时,甚至结果的细节或格式也会有所不同。
我所做的是回到web编程中熟悉的一些概念,将其分为两部分:
前端组件对于每种代理类型都是不同的lambda函数,主要是为了使逻辑更加简洁。后端组件可以是一个库函数,也可以是另一个lambda函数,这对于任务来说是最有意义的,但是独立于前端实现。
我想,我们也可以通过拥有一个实现后端逻辑的抽象父类,并将前端逻辑作为它的子类来实现这一点。我不会这样做,因为它没有提供清晰的界面边界,但这不是不合理的。
发布于 2017-08-01 15:56:16
您可以以不同的方式实现结果(代码重用)。
首先,使用aws-lambda-java-events库为每种类型的事件(Alexa、API等)创建一个方法。这里的一些信息:http://docs.aws.amazon.com/lambda/latest/dg/java-programming-model-handler-types.html
每个入口点方法都应该处理事件的语义,触发它(API ),并调用公共代码以实现代码重用。
其次,将JAR/ZIP上传到一个S3桶中。
第三,对于您想要处理的每个事件--创建一个Lambda函数,在S3桶中引用相同的ZIP/JAR并指定相关的入口点。
这样,您就可以获得代码重用,而不必在AWS上篡改多个代码副本,尽管代价是定义了多个Lambdas。
有一个支持以这种方式工作的很好的工具叫做Serverless框架,我强烈建议您看看这个工具:https://serverless.com/framework/docs/providers/aws/
发布于 2017-07-31 17:38:47
我一直在使用一个Lambda来处理Alexa和微软的Luis.ai响应。我使用的是Python而不是Java,但想法是一样的,我认为使用AlexaInput和ApiAIinput对象,这两者都应该扩展相同的接口。
我首先使用上下文信息来标识请求来自何处,并将其解析为适当的对象(我使用一个简单的嵌套字典)。然后将其传递给我的主处理函数,最后,根据上下文再次将输出传递给格式化程序。格式化程序将知道您需要返回什么。唯一的注意事项是处理会话信息;在我的示例中,这将序列化到我自己的DynamoDB表中。
https://stackoverflow.com/questions/45385461
复制相似问题