Отправка параметров в webhook по диалоговому окну sdk v2

Я пытаюсь отправить некоторые параметры в dialogflow (api.ai), такие как имя пользователя, адрес электронной почты и т.д., Но я не мог понять это. Проблема в том, что я не могу получить/установить какие-либо конкретные данные (например, имя пользователя, адрес электронной почты и т.д.) С помощью Dialogflow v2 Nodejs SDK. Я попытался использовать queryParams.payload (v1: originalRequest), но это не помогло. Кроме того, я попытался вызвать пользовательское событие с данными, но я не смог получить какие-либо данные о событии. Кто-нибудь знает, как отправить некоторые конкретные данные для сеансовой беседы на dialogFlow?

ПРИМЕР ПЛАНЕТА

  const projectId = 'test-bot-test-1111';
  const sessionId = user.uuid;
  const languageCode = 'en-GB';

  const sessionClient = new dialogFlow.SessionsClient();
  const sessionPath = sessionClient.sessionPath(projectId, sessionId);

  const request = {
    session: sessionPath,
    queryInput: {
      text: {
        text: query,
        languageCode
      }
    },
    queryParams: {
      payload: {
        data: {
           username: 'bob',
           email: '[email protected]'
        }
      }
    }
  };

  let resultReq;

  console.log('request :: ', request, '\n\n');

  try {
    resultReq = await sessionClient.detectIntent(request);
  } catch (err) {
    // eslint-disable-next-line no-console
    return console.error('ERROR:', err);
  }

ПРИМЕР СОБЫТИЯ

  const projectId = 'test-bot-test-1111';
  const sessionId = user.uuid;
  const languageCode = 'en-GB';

  const sessionClient = new dialogFlow.SessionsClient();
  const sessionPath = sessionClient.sessionPath(projectId, sessionId);

const request = {
    session: sessionPath,
    queryInput: {
      event: {
        name: 'custom_event',
        languageCode,
        parameters: {
          name: 'sam',
          user_name: 'sam',
          a: 'saaaa'
        }
      }
    },
    queryParams: {
      payload: {
        data: user
      }
    }
  };

  let resultReq;

  console.log('request :: ', request, '\n\n');

  try {
    resultReq = await sessionClient.detectIntent(request);
  } catch (err) {
    // eslint-disable-next-line no-console
    return console.error('ERROR:', err);
  }

Ответ 1

Dialogflow v2 API использует gRPC и имеет несколько причуд, один из которых вы столкнулись. Если вы посмотрите на примеры для библиотеки Node.js, вы увидите, как это обойти. Вам нужно будет внедрить метод jsonToStructProto для преобразования вашего объекта JavaScript в structjson.js или просто скопировать файл structjson.js из примера в этом разделе. Ниже приведен полностью рабочий пример использования файла structjson.js:

// Imports the Dialogflow library
const dialogflow = require('dialogflow');

// Import the JSON to gRPC struct converter
const structjson = require('./structjson.js');

// Instantiates a sessison client
const sessionClient = new dialogflow.SessionsClient();

// The path to identify the agent that owns the created intent.
const sessionPath = sessionClient.sessionPath(projectId, sessionId);

// The text query request.
const request = {
  session: sessionPath,
  queryInput: {
    event: {
      name: eventName,
      parameters: structjson.jsonToStructProto({foo: 'bar'}),
      languageCode: languageCode,
    },
  },
};

sessionClient
  .detectIntent(request)
  .then(responses => {
    console.log('Detected intent');
    logQueryResult(sessionClient, responses[0].queryResult);
  })
  .catch(err => {
    console.error('ERROR:', err);
  });