我正在为智能扬声器创建一个问卷调查机器人,该机器人会问用户几个问题。答案存储在firebase中。我正在使用node.js,Google上的操作。
对话看起来像这样:
在此对话中,如果用户不响应(输入编号),我希望在履行时进行处理。
对于编号输入,我正在使用来自https://developers.google.com/assistant/conversational/reprompts#dialogflow_2的代码。我的意图是“无输入提示”,带有“动作和参数”输入。此意图没有后续意图或任何上下文。
我的问题是:如何为No.input事件的每种意图提供自定义重新提示?
我正在做这样的事情:
const { dialogflow, SignIn, Confirmation } = require('actions-on-google');
const functions = require('firebase-functions');
const app = dialogflow({
debug: true
});
const admin = require("firebase-admin");
admin.initializeApp({
credential: admin.credential.applicationDefault(),
databaseURL: 'DATABASE URL',
});
const db = admin.firestore();
const db_ref = db.collection('users');
var current_context = '';
app.intent('q1', (conv, {response}) =>{
const payload = conv.user.profile.payload
db_ref.doc(`${payload.email}`).collection(today).doc('q1').set({
answer: response,
timestamp: time
});
current_context='q1';
conv.ask(question('Whats your answer for q1?'));
})
app.intent('No Input Prompt', (conv) => {
const repromptCount = parseInt(conv.arguments.get('REPROMPT_COUNT'));
if(current_context === 'q1'){
if (repromptCount === 0) {
conv.ask("What is your answer for Q1?");
} else if (repromptCount === 1) {
conv.ask("What is your answer for Q1? You can say option 1,2,3 or 4");
} else if (conv.arguments.get('IS_FINAL_REPROMPT')) {
conv.close("Lets talk some other time.");
}
}
})
使用此代码,当我模拟无输入时,出现此错误:
由于以下原因,无法将Dialogflow响应解析为AppResponse无效的平台响应:找不到RichResponse或平台对agentId的响应中的SystemIntent:12ae4038-8f17-4005-9bfa-1691ffcde5e5和intentId:218605f2-e718-47e0-97f6-e1925755fa7c
您发布的代码存在三个主要问题
current-context
不是有效的变量名。current-context
声明为常量。顾名思义,这意味着它无法更改。然后,您尝试更改它。要解决(3),您需要在调用之间传递信息给任何Intent Handler。在大多数情况下,您可以使用Google动作conv.data
storage或Dialogflow上下文来执行此操作。
但是,由于您要检测的是上下文,因此您可以做得更好,而只需查看当前处于活动状态的上下文即可。您可以通过调用conv.data
获取上下文来查看上下文是否处于活动状态。如果它处于活动状态,您将获得结果。如果未激活,则它将是不确定的。所以您的代码可能看起来像
conv.contexts.get('name')