过去,我设置了两个用 Java 编写的独立 AWS lambda。一种用于 Alexa,一种用于 Api.ai。他们只是向每个助手 api 返回“Hello world”。因此,尽管它们很简单,但它们确实有效。当我开始为每个代码编写越来越多的代码时,我开始发现我的 java 代码是多么相似,我只是通过使用两个单独的 lambda 来重复自己。
快进到今天。
我现在正在做的是有一个 单例可以处理来自 的输入的 AWS lambda两者 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}
亚历克萨
{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 对象。
我做这一切都错了吗?尝试让一个 lambda 满足来自多个服务(Alexa 和 ApiAI)的“助手”请求,我错了吗?
任何帮助,将不胜感激。当然,其他人必须在 AWS 中编写他们的助手功能,并希望在两个“助手”平台上重用他们的代码。
最佳答案
我有同样的问题和同样的想法,但随着我越来越深入地实现,我意识到由于一个重要原因,它不太实用:
虽然我的很多逻辑需要相同 - 结果的格式不同。有时,甚至结果的细节或格式也会有所不同。
我所做的是回到一些 Web 编程中熟悉的概念,将其分为两部分:
对于每种代理类型,前端组件将是不同的 lambda 函数,主要是为了使逻辑更清晰一些。后端组件可以是库函数或另一个 lambda 函数,无论对任务最有意义,但独立于前端实现。
我想也可以通过拥有一个实现后端逻辑的抽象父类,并将前端逻辑作为它的子类来实现这一点。我不会这样做,因为它没有在两者之间提供清晰的界面边界,但这并非不合理。
关于aws-lambda - 如何为 Alexa Skills Kit 和 API.AI 使用单个 AWS Lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45385461/