Сброс или перезапись срока жизни контекста в DialogFlow

Я пытаюсь управлять контекстом своего агента Google Assistant (в DialogFlow), используя класс ApiAi в пакете npm actions-on-google.

Проблема в следующем: как я могу сбросить срок жизни / удалить контекст с помощью пакета npm?

Я легко могу установить продолжительность жизни нового контекста, и это работает.

Тем не мение:

  1. Как удалить контекст?
  2. Установка контекста на другое число, похоже, не работает. То есть, если я установил app.setContext('myContext',10), а затем, 2 намерения позже, когда продолжительность жизни в 8, я снова вызываю app.setContext('myContext',10), в следующем намерении продолжительность жизни по-прежнему будет 7. Если бы я мог ответить (1) и удалить контекст, я бы просто удалил его и снова установил.

person eran    schedule 31.10.2017    source источник
comment
Можете ли вы показать код, который вы используете, чтобы попытаться установить или изменить новое значение продолжительности жизни контекста?   -  person Prisoner    schedule 31.10.2017
comment
@Prisoner Я просто вызываю app.setContext ('myContext', 10) в каждом обработчике намерений в веб-перехватчике. Это ничего не меняет. Если я позвоню app.setContext('newIntentThatIsNotSet',10), все будет нормально.   -  person eran    schedule 31.10.2017
comment
Итак, как только контекст установлен, он начинает обратный отсчет, но я не могу его сбросить.   -  person eran    schedule 31.10.2017
comment
Я очистил и сбросил контексты, поэтому я спросил, как вы его настраивали. Посмотрим, что изменилось.   -  person Prisoner    schedule 31.10.2017


Ответы (4)


Я не думаю, что есть способ удалить или перезаписать продолжительность контекста. Вместо этого, если вы знаете, что определенный контекст не должен быть активен в определенный момент, установите контекст, который длится 1 или 2 хода, и делайте это после каждого хода. Это также даст вам больше контроля над беседой, так что у вас не будет контекстов, которые длятся 10 ходов, которые внезапно вам больше не понадобятся.

person Bart    schedule 31.10.2017
comment
Да, я тоже так думал. - person eran; 31.10.2017
comment
Другое решение - установить контекст, который вы хотите сбросить, в качестве выходного контекста с продолжительностью жизни 0 в консоли dialogFlow (не может быть выполнено в коде). Что приводит к истечению срока действия контекста, если намерение было сопоставлено с этим активным контентом. Это не оптимально, так как вы не можете сделать это из кода, и вы не можете установить новую продолжительность жизни, просто удалите контекст. (Вы МОЖЕТЕ изменить счетчик, удалив его, установив значение 0 в консоли, а затем вызвав setContext () в коде - очень неудобно, но это то, что я делаю atm). - person eran; 31.10.2017

Чтобы удалить время жизни контекста, вы просто установите его на НУЛЬ или 0, например app.setContext('your_context',0)
Убедитесь, что вы сделали это перед вызовом app.ask или app.tell

or

если вы не используете клиент, вы можете написать функцию, которая просто устанавливает this.contexts_[your_context] = {}

Первый вариант мне определенно подходит. Второй вариант не пробовал. Попробуйте и посмотрите, не устанавливаете ли вы его в Dialogflow. Кроме того, вы можете удалить настройку контекста в веб-перехватчике и указать срок жизни как 0 в Dialogflow. Это поместит строку (например, устаревший метод) в ваш контекст.

person Abhinav Tyagi    schedule 28.02.2018
comment
Это не работает, вызов метода не выполняется. Это первое, что я попробовал. Единственный способ удалить существующий контекст, у которого еще есть оставшийся срок жизни, - это поместить его в выходной контекст намерения с продолжительностью жизни = 0. Сделать это из кода просто не работает (для меня). Если у вас есть пример, где это работает, я бы хотел его увидеть и, возможно, понять, почему мой не работает. - person eran; 28.02.2018

Я знаю, что этот вопрос старый, по крайней мере, достаточно старый, так что теперь у нас есть v2 API и капитальный ремонт библиотеки, поэтому я все равно отвечу сегодняшним решением :).

1. Чтобы удалить контекст, вы можете использовать conv.contexts.delete('context1');, как указано в Node.js справочные документы по библиотеке.

2- Если conv.contexts.set('context1', 1); не изменяет продолжительность жизни контекста, вы можете легко удалить его и воссоздать с помощью этих двух вызовов.

person Amine I.    schedule 03.12.2018

Мой опыт показывает, что вы не можете перезаписать данные контекста. Однако вы можете создать новый контекст:

agent.setContext({
    name: contextName,
    lifespan: newLifeSpan,
    // Note: Parameters are not visible until the context is passed
    // console.log() won't show them now.
    parameters: {
      // Previously saved using getContext()
      param_name : paramValue,
    }
  });
person user3830747    schedule 06.03.2020