我如何针对无输入事件的每种意图提供自定义重新提示?

问题描述 投票:0回答:1

我正在为智能扬声器创建一个问卷调查机器人,该机器人会问用户几个问题。答案存储在firebase中。我正在使用node.js,Google上的操作。

对话看起来像这样:

  • Bot:嗨,用户您准备好回答问题了吗? [欢迎意图,是/否跟随意图] {输出上下文= q1}
  • 用户:是
  • Bot:您对第一季度的回答是什么? [意图q1] {输入上下文= q1,输出上下文= q2}
  • 用户:这是我的答案。
  • Bot:您对第二季度的回答是什么? [意图q2] {输入上下文= q2,输出上下文= q2}
  • ...
  • ...
  • 用户:这是我的答案。
  • Bot:谢谢您的回答。再见。

在此对话中,如果用户不响应(输入编号),我希望在履行时进行处理。

对于编号输入,我正在使用来自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

dialogflow actions-on-google google-home
1个回答
0
投票

您发布的代码存在三个主要问题

  1. 在JavaScript中,变量名称中不能包含破折号。因此current-context不是有效的变量名。
  2. 您将current-context声明为常量。顾名思义,这意味着它无法更改。然后,您尝试更改它。
  3. 您没有指出执行环境是什么,但是如果使用的是Firebase Cloud Functions之类的内容,则不能保证在运行“ q1” Intent Handler以及运行“ q1” Intent Handler时将使用同一台服务器。没有输入提示”意图处理器运行。

要解决(3),您需要在调用之间传递信息给任何Intent Handler。在大多数情况下,您可以使用Google动作conv.data storage或Dialogflow上下文来执行此操作。

但是,由于您要检测的是上下文,因此您可以做得更好,而只需查看当前处于活动状态的上下文即可。您可以通过调用conv.data获取上下文来查看上下文是否处于活动状态。如果它处于活动状态,您将获得结果。如果未激活,则它将是不确定的。所以您的代码可能看起来像

conv.contexts.get('name')

© www.soinside.com 2019 - 2024. All rights reserved.