首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为Alexa技能工具包和API.AI使用单个?

如何为Alexa技能工具包和API.AI使用单个?
EN

Stack Overflow用户
提问于 2017-07-29 05:00:22
回答 3查看 720关注 0票数 7

在过去,我用Java编写了两个独立的AWS。一个用于Alexa,另一个用于Api.ai。它们只是将"Hello“返回给每个辅助api。因此,尽管它们很简单,但它们是有效的。当我开始为每一个代码编写越来越多的代码时,我开始看到我的java代码是多么相似,我只是通过拥有两个单独的lambda来重复自己。

快到今天。

我现在正在做的是拥有一个 Alexa,它可以处理来自、Alexa和Api.ai的输入,但我遇到了一些麻烦。目前,我的想法是,在运行lambda时,会有这样一个简单的if语句:

以下不是真正的代码,只是我认为我能在脑海中做的事情

代码语言:javascript
复制
if (figureOutIfInputType.equals("alexa")){
runAlexaCode();
} else if (figureOutIfInputType.equals("api.ai")){
runApiAiCode();
}

问题是,现在我需要知道函数是由alexa还是api.ai调用的。

这是我现在真正的java:

代码语言:javascript
复制
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

代码语言:javascript
复制
{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

代码语言:javascript
复制
{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编写他们的辅助功能,并且希望在两个“助手”平台上重用他们的代码。

EN

回答 3

Stack Overflow用户

发布于 2017-07-29 05:31:49

我有着同样的问题和相同的想法,但随着我在实施过程中越来越深入,我意识到这是不太实际的,原因之一是:

虽然我的很多逻辑都是一样的--结果的格式是不同的。有时,甚至结果的细节或格式也会有所不同。

我所做的是回到web编程中熟悉的一些概念,将其分为两部分:

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

前端组件对于每种代理类型都是不同的lambda函数,主要是为了使逻辑更加简洁。后端组件可以是一个库函数,也可以是另一个lambda函数,这对于任务来说是最有意义的,但是独立于前端实现。

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

票数 3
EN

Stack Overflow用户

发布于 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/

票数 1
EN

Stack Overflow用户

发布于 2017-07-31 17:38:47

我一直在使用一个Lambda来处理Alexa和微软的Luis.ai响应。我使用的是Python而不是Java,但想法是一样的,我认为使用AlexaInput和ApiAIinput对象,这两者都应该扩展相同的接口。

我首先使用上下文信息来标识请求来自何处,并将其解析为适当的对象(我使用一个简单的嵌套字典)。然后将其传递给我的主处理函数,最后,根据上下文再次将输出传递给格式化程序。格式化程序将知道您需要返回什么。唯一的注意事项是处理会话信息;在我的示例中,这将序列化到我自己的DynamoDB表中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45385461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档