Bot Framwork:多步瀑布

我想发送一个类似于这个的机器人

"[Person] wants to meet at [Place] at [Date]" 

然而,如果人们错过了一些信息,我想让机器人一块一块地去索要。

例如,如果一个人写道:

 "Let's meet!" 

机器人会提出一系列问题来满足所有的数据要求。 就像是:

  1. 我会和谁见面?
  2. 他们应该在哪里见面?
  3. 什么date和时间?

如果这个人问:

 "Alex would like to meet tomorrow" 

那么机器人只会问

 "Where should they meet?" 

一旦所有需要的数据完成,它会发送一个响应,如:

 "Great, I will meet [Person] in [Location] at [DateTime]" 

我一直在尝试这样的方法,运气不好,并得到“太多的电话session.EndDialog()”错误:

 dialog.on('Meeting', [ function (session, results, next) { var person = builder.EntityRecognizer.findEntity(results.entities, 'Person'); if(!person){ builder.Prompts.text(session, prompts.meetingPersonMissing); } else { next({ response: { person: person.entity } }); } }, function (session, results, next) { var location = builder.EntityRecognizer.findEntity(results.entities, 'location'); if(!location){ builder.Prompts.text(session, prompts.meetingLocationMissing); } else { // Pass title to next step. next({ response: { person: results.person, location: location.entity } }); } }, function (session, results, next) { var time = builder.EntityRecognizer.findEntity(results.entities, 'builtin.datetime.date'); if(!time){ builder.Prompts.text(session, prompts.meetingTimeMissing); } else { next({ response: { person: results.person, location: results.location, time: time.entity } }); } }, function (session, results) { if (results.response) { session.send(prompts.meetingSubmited); } else { session.send(prompts.canceled); } } ]); 

不成功的尝试#2(不再传递来自'next()'的数据)。 这导致相同的EndDialog错误

 dialog.on('Meeting', [ function (session, results, next) { var person = builder.EntityRecognizer.findEntity(results.entities, 'Person'); var location = builder.EntityRecognizer.findEntity(results.entities, 'location'); var time = builder.EntityRecognizer.findEntity(results.entities, 'builtin.datetime'); session.messageData = { person: person || null, location: location || null, time: time || null } if(!session.messageData.person){ builder.Prompts.text(session.messageData.person, prompts.meetingPersonMissing); } else { next(); } }, function (session, results, next) { if(!session.messageData.location){ builder.Prompts.text(session.messageData.location, prompts.meetingLocationMissing); } else { next(); } }, function (session, results, next) { if(!session.messageData.time){ builder.Prompts.text(session.messageData.time, prompts.meetingTimeMissing); } else { next(); } }, function (session, results) { debugger; if (results.response) { session.send('Meeting scheduled'); } else { session.send(prompts.canceled); } } ]); 

更新#3:在这个版本中,如果话语不包含任何相关的实体,则效果很好。 例如“我们可以见面吗?” 工作正常。

这个版本的问题是当我尝试“我们明天可以见面吗?”。 明天被成功识别为date时间实体,但是一旦它碰到这个块中的next()

  function getDate(session, results){ session.dialogData.topic = results.response; if(session.dialogData.date){ next(); }else{ builder.Prompts.time(session, "What date would you like to meet?"); } } 

它失败,并给我相同的Too many calls to to session.EndDialog()问题

 dialog.on('Meeting', [meetingQuery, getDate, getTime, respondMeeting]); function meetingQuery(session, results){ if (results.response) { session.dialogData.date = builder.EntityRecognizer.resolveTime([results.response]); } session.userData = { person: session.message.from.name } builder.Prompts.text(session, "Hi "+ session.userData.person +"!\n\n What is the meeting in reference too?"); } function getDate(session, results){ session.dialogData.topic = results.response; if(session.dialogData.date){ next(); }else{ builder.Prompts.time(session, "What date would you like to meet?"); } } function getTime(session, results){ if (results.response) { session.dialogData.date = builder.EntityRecognizer.resolveTime([results.response]); } if(session.dialogData.time){ next(); }else{ builder.Prompts.choice(session, "Your professor has the follow times availeble?", ["1pm", "2pm", "3pm"]); } } function respondMeeting(session, results){ var time = results.response; session.send("Your meeting has been schedueld for " + session.dialogData.date + " at " + time.entity + ". Check your email for the invite."); } 

试试这个,它适用于我的机器人。

 dialog.on('QuieroQueMeLlamen', [ function (session, args) { var Telefono = builder.EntityRecognizer.findEntity(args.entities, 'Usuario::Telefono'); if(!Telefono){ builder.Prompts.number(session, "Dame un número telefónico donde pueda llamarte una de nuestras enfermeras (sin espacios ni caracteres: ej: 3206907529)"); } }, function (session, results) { if (results.response) { //IF STRLEN es un celular entonces: session.send("Te estamos llamando al número %s, por favor contesta", results.response); } } ]); 

您不应该将parameter passing给next()函数,而是使用session.YOUVARIABLES通过瀑布来存储数据。

就像是 :

 function (session, results, next) { var person = builder.EntityRecognizer.findEntity(results.entities, 'Person'); if(!person){ builder.Prompts.text(session, prompts.meetingPersonMissing); } else { session.person = person.entity next(); } } 

我想你应该访问

 results.response.person 

代替

 results.person 

这同样适用于这个瀑布的其他closures。