在dialogflow中使用对象列表设置上下文作为参数

时间:2019-01-12 05:08:41

标签: node.js chatbot dialogflow

我有一个值列表,每个值都有对应的另一个KEY值,当我向用户显示此列表时,用户必须选择一个值,代理必须使用选定值的KEY调用外部api。如何在dialogflow中实现此目的?

我试图在上下文中发送整个键值对并在下一个意图中访问它,但是由于某种原因,当我将上下文参数dialogflow的列表(数组)设置为简单地忽略实现响应时,就出于某种原因。

这是怎么回事,有什么好的方法可以实现?我正在尝试开发一个食品订购聊天机器人,其中显示了菜单中项目的类别,并且当用户选择类别时将提取该菜单中的列表项,该菜单不是静态的,这就是为什么我使用api调用来获取动态菜单的原因。

function newOrder(agent)
{

  var categories = []
  var cat_parameters = {}
  var catarray = []
  const conv = agent.conv();
  //conv.ask('sure, select a category to order');
  agent.add('select a category to order');
  return  getAllCategories().then((result)=>{

    for(let i=0; i< result.restuarantMenuList.length; i++)
    {
      try{
        var name = result.restuarantMenuList[i].Name;
        var catid = result.restuarantMenuList[i].Id;
        categories.push(name)
        //categories.name = catid
        cat_parameters['id'] = catid;
        cat_parameters['name'] = name
        catarray.push(cat_parameters)
      }catch(ex)
      {
        agent.add('trouble getting the list please try again later')
      }
    }
    agent.context.set({
      name: 'categorynames',
      lifespan: 5,
      parameters: catarray, // if i omit this line, the reponse is the fultillment response with categories names, if i keep this line the reponse is fetching from default static console one.
    })
    return agent.add('\n'+categories.toString())

  })

  function selectedCategory(agent)
  {
    //agent.add('category items should be fetched and displayed here');
    var cat = agent.parameters.category
    const categories = agent.context.get('categorynames')

    const cat_ob = categories.parameters.cat_parameters

    // use the key in the catarray with the parameter cat to call the external API
    agent.add('you have selected '+ cat );
  }


}

1 个答案:

答案 0 :(得分:0)

主要问题是上下文parameters必须是一个对象,不能是数组。

因此,保存时,您可以执行类似的操作

parameters: {
  "cat_parameters": catarray
}

,当您收到答复时处理它,您可以使用

let catarray = categories.parameters.cat_parameters;

(您的代码还有其他语法和范围问题,但这似乎是您遇到的数据可用性问题。)