Node.js 通过Dialogflow实现在Google操作上设置上下文

Node.js 通过Dialogflow实现在Google操作上设置上下文,node.js,dialogflow-es,actions-on-google,google-assistant-sdk,Node.js,Dialogflow Es,Actions On Google,Google Assistant Sdk,我正在使用Dialogflow编辑器在Google Assistant上构建对话,但我不确定如何使用agent.setContext函数。 当我询问“关闭我的设备”时,第一步成功返回。例如,当用户以“TV”回应时,就会出现问题。系统返回另一个上下文,忽略我设置的上下文。 当用户直接询问“关掉厨房里的电视”时,系统也能正常工作。因此,我认为实体的定义是正确的 对话1(成功): 关掉厨房里的电视 对。关掉 对话2(失败): 关闭我的设备//给出与对话1相同的意图 好的,哪种设备 电视 “我的机

我正在使用Dialogflow编辑器在Google Assistant上构建对话,但我不确定如何使用
agent.setContext
函数。 当我询问“关闭我的设备”时,第一步成功返回。例如,当用户以“TV”回应时,就会出现问题。系统返回另一个上下文,忽略我设置的上下文。 当用户直接询问“关掉厨房里的电视”时,系统也能正常工作。因此,我认为实体的定义是正确的

对话1(成功):

  • 关掉厨房里的电视

  • 对。关掉

对话2(失败):

  • 关闭我的设备//给出与对话1相同的意图

  • 好的,哪种设备

  • 电视

  • “我的机器人”现在没有反应。请稍后再试//它抛出“必须设置‘最终响应’”。我认为这是因为一般的意图行为。意图。文本

我的代码:

下面的代码嵌套在
exports.dialogflowFirebaseFulfillment=functions.https.onRequest
中,意图由
intentMap.set('smarthome.device.switch.off',setDeviceOff'调用;

因此,我尝试了另一个版本,但同样的问题仍然存在:

const app = dialogflow();
app.intent('welcome', conv =>{
   conv.ask("Welcome to auto obari. What can I do for you?"); 
});
app.intent('Default Fallback Intent',conv =>{
   conv.ask("I didn't understand, can you try again?"); 
});
app.intent('smarthome.device.switch.off', (conv,{device, room})=> {
    const context= 'device-switch';
    if(device===''){
        conv.ask("OK, which device?");
    }else if (room===''){
        conv.ask("Got it. of what room?");
    }else{
        conv.ask("Right. Turning off.");
    }
    const parameters = {'device':device, 'room': room};
    conv.contexts.set(context, 5, parameters);
});
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app); //I tried exports.factsAboutGoogle, but it threw a error too.

上下文相同,但意图不同。

如果使用
conv
,您也可以这样尝试:

app.intent('<INTENT>', conv => {
  conv.ask('<RESPONSE>');
  const parameters = {'param1':param1, 'param2': param2}};
  conv.contexts.set('welcome-context', 5, parameters);
});
app.intent(“”,conv=>{
conv.ask(“”);
常量参数={'param1':param1,'param2':param2};
set('welcome-context',5,参数);
});
然后像这样访问它:

const conv.context.get().parameters[];

你也可以试试这个方法,它对我很管用

const AppContexts = {CONTEXT_ONE: 'context-one'};
const app = dialogflow();

In current intent (for output context)
conv.contexts.set(AppContexts.CONTEXT_ONE, 1);

In next intent (for input context )
const context = conv.contexts.get(AppContexts.CONTEXT_ONE);

非常感谢你!但同样的问题依然存在。我把我的新代码放在上面。我尝试了
const device=conv.contexts.get('device-switch').parameters.device格式。你检查文档了吗?我读了所有我能读的东西,我得到了上面的代码。我从文档中发现的唯一区别是“导出”功能。但当我在Dialogflow中使用factsAboutGoogle时,会显示一个错误。请尝试一个新项目,并一步一步地添加代码。从一个简单的1行消息开始到您当前的版本。看看这是否有效。您是否也可以共享firebase cloud函数或node js服务器的日志,无论您使用的是哪一个?在Google函数上,执行已完成,状态代码为200,没有任何错误。在谷歌操作中,给定的错误是“格式错误响应:必须设置“最终响应”。“无法将Dialogflow response解析为AppResponse,因为通过:1.1 google Alt Svc的语音响应为空”我认为这是因为当用户使用“TV”进行响应时,不会再次触发意图。发送的意图是通用的“actions.intent.TEXT”。我在问题日志中添加了更多详细信息。我试图设置一个函数来获取actions.intent.TEXT,但未调用意图。我真的不知道该怎么办了。
const conv.contexts.get(<context>).parameters[<param>];
const AppContexts = {CONTEXT_ONE: 'context-one'};
const app = dialogflow();

In current intent (for output context)
conv.contexts.set(AppContexts.CONTEXT_ONE, 1);

In next intent (for input context )
const context = conv.contexts.get(AppContexts.CONTEXT_ONE);