Можем ли мы программно устанавливать и удалять контексты с помощью библиотеки выполнения Node Dialogflow без использования пользовательского интерфейса?
Используя Dialogflow Node Fulfillment SDK, я подумал, что можно программно устанавливать и удалять контексты и извлекать из них параметры.
Я пытаюсь собрать значения для нескольких параметров, и они могут входить в несколько проходов с тем же намерением. Следующий код выполняется внутри обработчика намерений:
contextParams = agent.context.get("seek-create-params-context").parameters;
currentParams = agent.parameters;
// merge will look for required params from both current and context
newParameters = merge(currentParams, contextParams);
agent.context.set({
name: "seek-create-params-context",
lifespan: 1,
parameters: newParameters
});
Он извлекает параметры, которые были переданы в предыдущем взаимодействии, объединяет его с вновь доступными параметрами и сбрасывает контекст с новым набором доступных параметров.
Однако сейчас, на каждом проходе, "seek-create-params-context" не содержит того, что было отправлено в newParameters
предыдущий раз. Они решают правильное намерение в зависимости от контекста. Что я делаю неправильно?
Нужно ли вообще возиться с пользовательским интерфейсом Dialogflow для отправки параметров контекста?
Пример взаимодействия на основе реальных журналов (неактуальные параметры удалены):
/*
First pass:
User msg doesn't contain any of params `value` or `product`
*/
// agent.parameters:
{}
// agent.context.get('seeking-params-expense-create').parameters:
undefined
// outgoing 'seeking-params-expense-create' params (lifespan 1)
{ value: '', product: '' }
/*
Second pass:
So far, so good.
Next pass, we receive `value`, but not `product`.
*/
// agent.parameters:
{ value: 50, product: '' }
// agent.context.get('seeking-params-expense-create').parameters:
{
'value.original': '50',
'product.original': '',
value: 50,
product: ''
}
// outgoing 'seeking-params-expense-create' params (lifespan 1):
{ value: 50, product: '' }
/*
Third pass:
This time, we want to use `value` from context since we
stored in last pass and seek `product` from user.
User only supplies `product` this time.
*/
// agent.parameters:
{ value: '', product: 'MRT' }
// agent.context.get('seeking-params-expense-create').parameters:
{
'value.original': '',
'product.original': '',
product: 'MRT',
value: ''
}
// outgoing 'seeking-params-expense-create' params (lifespan 1):
{ value: '', product: 'MRT' }
1 ответ
Вы не показываете свои намерения, но похоже, что и второй, и третий проходы запускаются намерениями, которые имеют value
а также product
параметры.
Если параметр задан в Intent, он передает что-то, возможно, пустую строку, в webhook.
Он также установит этот параметр в каждом контексте, который активен в это время, и также передаст эти контексты в webhook. Даже если для контекста ранее было установлено значение для этого параметра.
Чтобы гарантировать, что ваши значения не будут вытеснены текущими Intents, вы должны сохранить их как параметры в Context под именами параметров, которые не используются ни одним из ваших имен параметров Intent.