Как я могу создать объект, специфичный для пользователя? - PullRequest
0 голосов
/ 24 февраля 2019

Я создаю действие для Google Assistant с Dialogflow и actions-on-google-nodejs, которое обращается к GitKraken Glo API для добавления карт на доски пользователей.Я аутентифицирую своих пользователей с помощью привязки аккаунта.Я хочу, чтобы мои пользователи могли говорить что-то вроде Add a card to [board name] или Add a card.Если имя доски не указано, я хочу, чтобы действие подсказало пользователю об этом.Как я могу создать объект сеанса, который получает все имена форумов для вошедшего в систему пользователя?

Извините, если это не имеет особого смысла, я довольно новичок в действиях в Google и Dialogflow.Не стесняйтесь задавать вопросы для ясности.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Есть несколько вещей, которые вам нужно сделать в первую очередь, чтобы использовать объект сеанса:

  • Тип объекта должен уже существовать.Сеансовые сущности обновляют существующие.Самый простой способ сделать это - создать сущность, которую вы хотите, в пользовательском интерфейсе Dialogflow.В нем не должно быть никаких сущностей, но использование по умолчанию может быть полезным.
  • Вам нужна учетная запись службы для вашего проекта в Google Cloud, который будет обновлятьи секретный ключ для этой учетной записи.
  • Ваша жизнь будет на лот проще, если вы будете использовать библиотеку, такую ​​как dialogflow-nodejs библиотека.

Как правило, ваш код должен выполнять следующее, как правило, когда пользователь впервые запускает сеанс (т. Е. В вашем обработчике приветствия):

  • Получить список досок
  • Обновите тип сущности сеанса, создавая сущность для каждой доски.Это обновление включает в себя:
    • Выпуск исправления для метода projects.agent.sessions.entityTypes с SessionEntityType для Типа сущности, который вы переопределяете.
    • SessionEntityType будет содержать массив Entities с каноническим именем (вероятно, именем платы или некоторым уникальным идентификатором) и любыми псевдонимами для него (по крайней мере, именем платы).возможно, что-нибудь еще, возможно, включая псевдонимы, такие как «первый» или «самый последний»).

README для библиотеки включает ссылки на пример кода о том, каксделать это с помощью библиотеки nodejs.У моего кода, который выполняет эту работу, есть такая функция:

function setSessionEntity( env, entityType ){
  const config = envToConfig( env );
  const client = new dialogflow.SessionEntityTypesClient( config );

  let parent = env.dialogflow.parent;
  if( entityType.displayName && !entityType.name ){
    entityType.name = `${parent}/entityTypes/${entityType.displayName}`;
  }
  if( !entityType.entityOverrideMode ){
    entityType.entityOverrideMode = 'ENTITY_OVERRIDE_MODE_OVERRIDE';
  }

  const request = {
    parent: parent,
    sessionEntityType: entityType
  };
  return client.createSessionEntityType( request );
}
0 голосов
/ 05 марта 2019

conv.user.email

Вы можете использовать conv.user объект:

const Users = {};

app.intent('Get Signin', (conv, params, signin) => {
  if (signin.status === 'OK') {
    const email = conv.user.email
    Users[email] = { };
    conv.ask(`I got your email as ${email}. What do you want to do next?`)
  } else {
    conv.ask(`I won't be able to save your data, but what do you want to next?`)
  }
})

app.intent('actions.intent.TEXT', (conv, input) => {
  if (signin.status === 'OK') {
    Users[conv.user.email] = {
      lastinput: input
    };
  }
});

conv.id

Также с идентификатором convявляется уникальным идентификатором для текущего разговора.

// Create an app instance
const app = dialogflow()

// Register handlers for Dialogflow intents

const Users = {};

app.intent('Default Welcome Intent', conv => {
   Users[conv.id] = {
       conversationId: conv.id,
       name: '1234'
   };
})

app.intent('actions.intent.TEXT', (conv, input) => {
   Users[conv.id] = {
       lastinput: input
   };
});

app.intent('Goodbye', conv => {
  delete Users[conv.id];
})

...