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 の 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' }