问题与Claudia.js文本答复和Alexa

我正在研究Claudia.js机器人,它可以通过Slack,FB信使和Alexa技能来实现。 假设在克劳迪娅,你可以返回纯文本,框架将正确地返回到“前端”…我现在有什么这里工作正常与FB和松弛,但是当我通过Alexa“服务模拟器”我总是得到“回应无效”。 这是使用Claudia.js的lambda。 基本上,它从客户端获取消息,然后将它们分stream到另一个“AI”的Lambda。 Alexa似乎窒息了第67行。想法?

const promiseDelay = require('promise-delay'); // const aws = require('aws-sdk'); // const lambda = new aws.Lambda(); const lambda = require('aws-lambda-invoke'); const botBuilder = require('claudia-bot-builder'); const stackTrace = require('stack-trace'); //const slackDelayedReply = botBuilder.slackDelayedReply; const getIntentName = alexaPayload => alexaPayload && alexaPayload.request && alexaPayload.request.type === 'IntentRequest' && alexaPayload.request.intent && alexaPayload.request.intent.name; const api = botBuilder((message, apiRequest) => { console.log = console.log.bind(null, '[LOG]'); console.info = console.info.bind(null, '[INFO]'); console.error = console.error.bind(null, '[ERROR]'); console.warn = console.warn.bind(null, '[WARN]'); console.info(message, apiRequest); console.log(apiRequest.body); const requestData = { 'user-id': { type: message.type, ID: message.sender }, epoch: 1484771343.01, 'payload-type': 'luis', facets: {}, utterance: 'Seek Showtimes', payload: { query: 'Seek Showtime', topScoringIntent: { intent: 'SeekShowtime', score: 1.0 }, intents: [{ intent: 'SeekShowtime', score: 1 }], entities: [] } }; if (message.text) { return new Promise((resolve, reject) => { lambda.raw.invoke({ FunctionName: 'ca2', Payload: JSON.stringify(requestData), }, (err, done) => { if (err) { const trace = stackTrace.parse(err); console.warn(err); console.error(trace); return reject(err); } resolve(done); }); }).then((result) => { // the initial response const payload = JSON.parse(result.Payload); console.log(payload.utterance); return payload.utterance; }).catch((error) => { const trace = stackTrace.parse(error); console.warn(error); console.error(trace); return 'Could not setup'; }); } else if (getIntentName(apiRequest.body) === 'ExitApp') { return { response: { outputSpeech: { type: 'PlainText', text: 'Bye from Bot!' }, shouldEndSession: true } }; } else { return {}; } }, { platforms: ['facebook', 'slackSlashCommand', 'alexa'] } ); module.exports = api; 

更新 – 即使我硬编码一个纯文本string响应或使用Alexa消息生成器,我仍然得到“响应是无效的。 因为服务回应“未定义”。

查看日志,一旦返回响应(通过botBuilderparsing并传递给Alexa),会发生此错误[TypeError: Cannot read property 'replace' of undefined]


另一个更新:

如果我用类似的东西replacereturn payload.utterance

 if (type === 'alexa-skill') { Console.warn('trying to contact alexa'); return "Hi from Alexa"; } 

问题依然存在。

这是Json请求进入的地方,没有问题:

 2017-04-27T18:06:30.552Z 3d70c273-2b74-11e7-a1c8-bf3fec00cbff STORE Map { "user-id": Map { "type": "alexa-skill", "ID": "amzn1.ask.account.AF6FUNJDSHGCXPVSAO5HUSRYFBD3SPCJJLILC4HLPS3K3L4AOWIMXPS4ZDDCXQ3ZVIV5L4FOMYD23PWZXEIAKYQBVXIQTPE2WW2PMBIXQIY3TUATXADCVNYO7NYUR2B45EU5GRIWBFHQIPLQVDQZMXD7IYVGTKAV3OWPHROCPR7XIUGNSJEAGQZJOMULSKT5HYSNUNJONASE34Y" }, "epoch": 1484771343.01, "payload-type": "luis", "utterance": "when is Logan playing", "payload": Map { "query": "when is Logan playing" } } 

这是从其他lambda(有效载荷)返回的响应:

 017-04-27T18:06:32.513Z 3d70c273-2b74-11e7-a1c8-bf3fec00cbff [LOG] mnlpData { StatusCode: 200, Payload: '{"utterance": "To find movies playing near you, I need to know where you are. Please tell me your zip code.", "AskLocation": 1, "context": {"updated": 1493316392.162429, "user_id": "TEST_ID_TUES_14", "sessions": [{"intents": ["SeekShowtime", "SeekShowtime"], "facet-delta": {}, "facets": {"ity.location": {"ity.zip": "", "ity.code": "", "ity.theatre-name": ""}, "ity.movie": {"ity.title": "", "ity.code": ""}, "ity.time": [], "ity.date": []}, "modes": ["", "SHOWTIME_SWITCH", "AskLocation", "SHOWTIME_SWITCH", "AskLocation"]}], "created": 1493316379.950335, "mode_process_count": 2, "user-id": {"type": "alexa-skill", "ID": "amzn1.ask.account.AF6FUNJDSHGCXPVSAO5HUSRYFBD3SPCJJLILC4HLPS3K3L4AOWIMXPS4ZDDCXQ3ZVIV5L4FOMYD23PWZXEIAKYQBVXIQTPE2WW2PMBIXQIY3TUATXADCVNYO7NYUR2B45EU5GRIWBFHQIPLQVDQZMXD7IYVGTKAV3OWPHROCPR7XIUGNSJEAGQZJOMULSKT5HYSNUNJONASE34Y"}, "utterance": ["To find movies playing near you, I need to know where you are. Please tell me your zip code."]}}' } 

然后:

 2017-04-27T18:06:32.514Z 3d70c273-2b74-11e7-a1c8-bf3fec00cbff [WARN] trying to contact alexa 

然后错误:

 2017-04-27T18:06:32.514Z 3d70c273-2b74-11e7-a1c8-bf3fec00cbff [TypeError: Cannot read property 'replace' of undefined] 

首先,如果您注意到从其他lambda发送给您的有效内容,您可以看到该utterance是一个数组,因此您可能必须传递第一个元素(如果存在)。

通过查看机器人构build器的代码,我最好的select是,你得到的错误是由于你的alexaAppName是未定义的,而当它传递给在base64中编码的响应者时,不可能运行这个variables的replace 。

我会尝试确保我的应用程序名称已正确configuration,并且给出的是有效的string,如alexa claudia示例中所示 。

如果您尚未运行,请运行claudia update --configure-alexa-skill并input您的机器人的名称,然后使用它在您的alexa技能构build器设置中提供的url。 selectHTTPS而不是lambda arn。

目前, message.text被作为一个空string传递,这意味着你的任何一个日志块都没有被触发,并且你在代码的最底部返回一个空对象。 通过用一个stringreplace空对象来testing,alexatesting人员不再抱怨。

那么为什么message.text是一个空string? 克劳迪娅js通过连接所有为您的意图填充的插槽来填充文本字段。 如果你的意图没有插槽,那么克劳迪娅传递一个空string。

为您的意图添加插槽,确保configuration技能,并修复逻辑语句问题。