如何使用webhook在dialogflow中进行正确的处理?

时间:2018-12-15 17:57:52

标签: javascript node.js dialogflow

enter image description here我有一些问题。
我想用这个程序制作机器人。
br
我:你好
Bot:欢迎来到我的代理商!
Bot:你叫什么名字?
我:史密斯
机器人:史密斯
机器人:1
机器人:2
br
我将意图“ hello”的意图设为参数“ name”。
但是当它运行时,它可以按以下顺序运行。
br
我:你好
Bot:你叫什么名字?
我:史密斯
Bot:欢迎来到我的代理商!
br
我的意图完全不同。
您能推荐制作我的物体的正确方法吗?
非常感谢。

'use strict';

const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');

process.env.DEBUG = 'dialogflow:debug';

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
  console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
  console.log('Dialogflow Request body: ' + JSON.stringify(request.body));

  function hello(agent) {
    agent.add(`Welcome to my agent!`);

    let city = request.body.queryResult.parameters['name']; 
    agent.add(`${city}`);

    information().then((a) => {
    agent.add(JSON.stringify(a)); 
  });
}

  function fallback(agent) {
    agent.add(`I didn't understand`);
    agent.add(`I'm sorry, can you try again?`);
}

  let intentMap = new Map();
  intentMap.set('hello', hello);
  intentMap.set('Default Fallback Intent', fallback);

  agent.handleRequest(intentMap);
});

function information(){
  return new Promise(function (resolve, reject) {
    var a = ['1','2'];
    resolve(a);
         });
    }

1 个答案:

答案 0 :(得分:1)

由于您已将name设置为必需参数,因此Dialogflow将等待调用完成Webhook,直到所有必需参数都被填充为止(除非您切换到将实现用于插槽填充),否则您不会t)。

那么会发生什么:

  • Intent被触发,因为“ hello”与Intent相匹配
  • 缺少参数name,因此Dialogflow提示输入该参数
  • 用户答复并填写name
  • Dialogflow将信息发送到您的Webhook
  • 您的代码添加了“欢迎”消息

这是棘手的地方。并非所有客户端都支持答复中的多个消息,也不支持那么多消息,因此根据与您测试的是哪个客户端,其他add()调用可能会被忽略。通常,您应该只添加不同类型的响应(文本,卡片等)以实现跨平台兼容。