установка контекста со списком объектов в качестве параметров в диалоге - PullRequest
0 голосов
/ 12 января 2019

У меня есть список значений, каждое из которых имеет другое значение KEY, соответствующее ему, когда я представляю этот список пользователю, пользователь должен выбрать значение, а агент должен вызвать внешний API с KEY выбранного значения. Как я могу добиться этого в диалоговом потоке?

Я попытался отправить всю пару ключ-значение в контексте и получить к ней доступ в следующем намерении, но по какой-то причине, когда я установил список (массив) в диалоговом потоке параметров контекста, просто игнорируя ответ выполнения.

Что здесь происходит, и есть ли хороший способ добиться этого? Я пытаюсь разработать чат-бота для заказа еды, в котором представлена ​​категория элементов в меню и элементы списка в этом меню будут выбираться, когда пользователь выбирает категорию, это меню не является статичным, поэтому я использую вызовы 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 голосов
/ 12 января 2019

Основная проблема заключается в том, что контекст parameters должен быть объектом, он не может быть массивом.

Таким образом, когда вы сохраняете его, вы можете сделать что-то вроде

parameters: {
  "cat_parameters": catarray
}

и когда вы получите ответ, вы можете вернуть массив с помощью

let catarray = categories.parameters.cat_parameters;

(Есть некоторые другие проблемы с синтаксисом и областями видимости в вашем коде, но похоже, что это проблема доступности данных.)

...