我们可以使用 Dialogflow 的节点实现库以编程方式设置和删除上下文,而不涉及 UI 吗?
Can we programmatically set and delete contexts with Dialogflow's Node fulfilment library, without involving the UI?
使用 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
中发送的内容。他们确实根据上下文解决了正确的意图。
我究竟做错了什么?
我是否需要 fiddle 使用 Dialogflow 的 UI 才能发送上下文参数?
基于真实日志的示例交互(删除了不相关的参数):
/*
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' }
您没有显示您的 Intents 是什么,但看起来第二遍和第三遍都是由具有 both value
和 product
参数。
如果 Intent 指定了参数,它会将某些内容(可能是空字符串)传递给 webhook。
它还会在当时处于活动状态的每个上下文中设置该参数,并将这些上下文也传递给 webhook。即使上下文之前为该参数设置了值。
为了确保您的值不被当前 Intent 践踏,您应该将它们作为参数存储在上下文中的参数名称下,这些名称未被任何 Intent 参数名称使用。
使用 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
中发送的内容。他们确实根据上下文解决了正确的意图。
我究竟做错了什么?
我是否需要 fiddle 使用 Dialogflow 的 UI 才能发送上下文参数?
基于真实日志的示例交互(删除了不相关的参数):
/*
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' }
您没有显示您的 Intents 是什么,但看起来第二遍和第三遍都是由具有 both value
和 product
参数。
如果 Intent 指定了参数,它会将某些内容(可能是空字符串)传递给 webhook。
它还会在当时处于活动状态的每个上下文中设置该参数,并将这些上下文也传递给 webhook。即使上下文之前为该参数设置了值。
为了确保您的值不被当前 Intent 践踏,您应该将它们作为参数存储在上下文中的参数名称下,这些名称未被任何 Intent 参数名称使用。