Conv.data потерян в последующем намерении в DialogFlow - PullRequest
0 голосов
/ 02 марта 2020

Я использую node.js 8 runtime в своей функции Google Cloud, прикрепленной к моему приложению 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

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Я думаю, вы говорите о последующих событиях , а не о последующих действиях. Следующие Интенты устанавливаются как Интенты, которые могут быть запущены после того, как Пользователь намерен выполнить какое-либо действие - это делается путем установки контекста. Последующие события устанавливаются во время выполнения и предназначены для запуска намерения, для которого установлено это Событие.

В большинстве случаев вам не нужно использовать Последующие события.

Вместо этого - просто вызовите функцию, которая выполняет обработку и отвечает так, как вы хотите. Ничто не говорит о том, что ваша функция-обработчик должна делать все сама - она ​​может вызывать функцию точно так же, как любая другая функция, и может вызывать ее с параметрами.

Так что вполне разумно иметь обработчики намерений, такие как

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, когда он перенаправляет на событие. Как документация гласит:

Запускает намерение по вашему выбору, отправляя событие отслеживания из webhook. [...] Диалоговый поток не передает ничего обратно в Google Assistant, поэтому информация, заданная Google Assistant c, прежде всего conv.user.storage, игнорируется.

То, что вы можете do, однако, отправляет параметры новому намерению, обнаруженному в событии. Примерно так может работать:

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);
});
0 голосов
/ 02 марта 2020

Я бы предложил использовать контекст вместо данных. Контекст имеет немного больше преимуществ по сравнению с объектами данных. Он может быть доступен в нескольких диалогах и намерениях.

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
    });
}

Вызовите метод в диалоге с объектом агента. в приложении. js

intentMap.set("Size Intent", setSize);
function setSize(){
  let size = agent.parameters.size;
  updateShippingObjectContext(agent, 'size', size);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...