aws-lambda - 如何为 Alexa Skills Kit 和 API.AI 使用单个 AWS Lambda?

标签 aws-lambda alexa alexa-skills-kit actions-on-google api-ai

过去,我设置了两个用 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 编程中熟悉的概念,将其分为两部分:

  • A 后端负责获取参数并应用业务逻辑以产生结果的系统。这些结果将是相当低级的,不是整个短语,而是一组键/值对,指示要给出什么样的结果以及在该结果中需要什么值。
  • A 前端负责处理特定于 Alexa/Assistant 的事情的系统。因此,它将接受请求,提取参数和状态,使用此信息调用后端系统,返回结果,其中包括要发送的回复类型和所需的值,然后格式化确切的短语(以及任何其他支持信息,例如卡片或其他任何东西)并将其放入格式正确的响应中。

  • 对于每种代理类型,前端组件将是不同的 lambda 函数,主要是为了使逻辑更清晰一些。后端组件可以是库函数或另一个 lambda 函数,无论对任务最有意义,但独立于前端实现。

    我想也可以通过拥有一个实现后端逻辑的抽象父类,并将前端逻辑作为它的子类来实现这一点。我不会这样做,因为它没有在两者之间提供清晰的界面边界,但这并非不合理。

    关于aws-lambda - 如何为 Alexa Skills Kit 和 API.AI 使用单个 AWS Lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45385461/

    相关文章:

    amazon-web-services - 如何在 Ask cli 中设置范围

    python - 使用 X-Ray 检测 Python 3.6 Lambda 函数会导致错误

    amazon-web-services - 上传到 S3 时触发 Lambda 函数然后等待其响应,并将其响应返回给用户

    python - AWS Lambda 部署包每次更新都需要分钟代码更改

    python - Alexa 技能 : Get user location

    node.js - alexa sdk传递 session 属性

    javascript - 本例中的 Alexa 技能 : How to insert a AMAZON. yesintent 和 AMAZON.nointent ?

    aws-lambda - 如何在 Echo Alexa 卡片中显示超链接

    node.js - aws 上的 ETag 缓存

    javascript - 以编程方式将自定义内容插入 Intent Confirmation 消息?