我在Google Cloud函数中使用node.js 8运行时,该函数连接到我的DialogFlow应用程序(V2 API(。我可以使用conv.data在当前会话中存储临时数据。不幸的是,conv.data似乎在进行后续操作后无法保留数据
例如,在我的意图中,以下代码:
conv.data.result = "Hello!";
console.log("[DEBUG] conv.data.result = "+conv.data.result);
conv.followup("customEvent1");
生成以下日志:
[DEBUG] conv.data.result = Hello!
这是我的后续意图:
app.intent('CUSTOM_EVENT_INTENT', (conv) => {
console.log("[DEBUG] - CUSTOM_EVENT_INTENT");
console.log("[DEBUG] - conv.data.result = "+conv.data.result);
if(!conv.data.result) {
console.log("[DEBUG] - I give up");
conv.close("Nessuna risposta");
}
else conv.ask(conv.data.result);
});
生成以下日志:
[DEBUG] - conv.data.result = undefined
[DEBUG] - I give up
看来我在后续行动中遗漏了一些非常重要的东西
谢谢,
Roberto
我建议使用上下文而不是数据。与数据对象相比,上下文几乎没有什么优势。它可以在多个对话框和意图中访问。
function getParamFromContext(key){
// get the value set earlier in the context
let globalContext = agent.context.get('global_main_context');
return globalContext.parameters[key];
}
function updateGlobalContext(agent, key, value) {
// create a global method to maintain all required data within conversation
let globalContext = agent.context.get('global_main_context');
let param = globalContext ? globalContext.parameters : {};
param[key] = value;
agent.context.set({
name: 'global_main_context',
lifespan: 5,
parameters: param
});
}
在与代理对象的对话中调用方法。在app.js中
intentMap.set("Size Intent", setSize);
function setSize(){
let size = agent.parameters.size;
updateShippingObjectContext(agent, 'size', size);
}
我认为您谈论的是后续事件,而不是后续意图。Followup Intents被设置为Intents,该Intents可以在用户执行某些操作后触发——这是通过设置上下文来完成的。后续事件是在履行期间设置的,旨在触发设置了此事件的意向。
在大多数情况下,您不需要使用Followup Events
相反,只需调用一个进行处理的函数,并回复您希望它做的事情。没有什么可以说您的Handler函数必须自己做所有事情——它可以像任何其他函数一样调用一个函数,并且可以使用参数来调用它。
因此,拥有像这样的意向处理程序是完全合理的
app.intent('intent.one', (conv) => {
reply( conv, "Hello!" );
});
app.intent('intent.two', (conv) => {
reply( conv, "How are you?" );
});
app.intent('intent.quit', (conv) => {
reply( conv );
});
function reply( conv, msg ){
if( !msg ){
conv.close( "I give up!" );
} else {
cov.ask( msg );
}
}
这仍然不能解释为什么它不起作用
在使用Followup Events的过程中,您"缺少"的是,使用conv.followup()
不会发送任何,当Dialogflow重定向到Event时,您可能会将这些发送回它。正如文件所说:
通过从webhook发送后续事件来触发您选择的意图。[…]Dialogflow不会将任何信息传递回谷歌助手,因此谷歌助手的特定信息,尤其是conv.user.storage,将被忽略。
但是,可以执行的操作是向从事件中检测到的新Intent发送参数。像这样的东西可能会起作用:
const params = {
result: "Hello!"
};
conv.followup("customEvent1", params);
然后在事件意图的处理程序中:
app.intent('CUSTOM_EVENT_INTENT', (conv) => {
console.log("[DEBUG] - CUSTOM_EVENT_INTENT");
console.log("[DEBUG] - conv.parameters.result = "+conv.parameters.result);
if(!conv.parameters.result) {
console.log("[DEBUG] - I give up");
conv.close("Nessuna risposta");
}
else conv.ask(conv.parameters.result);
});