Поддержка диалоговых действий будет прекращена 13 июня 2023 г. Дополнительные сведения см. в разделе Закрытие диалоговых действий .

Сохранение данных в беседе (Dialogflow)

Исследуйте в Dialogflow

Нажмите «Продолжить» , чтобы импортировать наш образец данных сохранения в Dialogflow. Затем выполните следующие действия, чтобы развернуть и протестировать образец:

  1. Введите имя агента и создайте новый агент Dialogflow для образца.
  2. После завершения импорта агента нажмите Перейти к агенту .
  3. В главном навигационном меню перейдите к Выполнение .
  4. Включите встроенный редактор , затем нажмите «Развернуть» . Редактор содержит пример кода.
  5. В главном меню навигации выберите «Интеграции» и нажмите «Google Ассистент» .
  6. В появившемся модальном окне включите автоматический предварительный просмотр изменений и нажмите «Тест» , чтобы открыть симулятор действий.
  7. В симуляторе введите Talk to my test app , чтобы протестировать образец!
Продолжить

Частью обеспечения отличного взаимодействия с пользователем часто является возможность сохранять данные между поворотами разговора или между несколькими разговорами с пользователем. Это полезно, если вы предоставляете полезные подсказки в одном разговоре, сохраняете игровые результаты между сеансами или запоминаете небольшие фрагменты информации для пользователя.

Требования немного различаются в зависимости от того, нужно ли вам сохранять данные в разговоре или между разговорами. Чтобы сохранить данные в разговоре, вы можете использовать поле conversationToken вашего объекта AppResponse .

Вместо этого, чтобы сохранить данные между разговорами, выполните следующие действия:

  1. Определите, является ли пользователь верифицированным или гостем.
  2. Храните или получайте доступ к пользовательским данным, используя поле userStorage вашего объекта AppResponse .

Сохранение данных между ходами разговора

Поле conversationToken представляет собой строку, содержащую непрозрачный токен, который рециркулируется в действие при каждом ходе диалога. Например, если вы установите значение "count=1" в своем AppResponse для первого хода диалога, AppRequest , полученный вашим действием для второго хода диалога, будет содержать "count=1" в его conversationToken .

Маркер всегда инициализируется пустой строкой в ​​начале диалога. Если вы используете клиентскую библиотеку Actions on Google Node.js , вы можете взаимодействовать с токеном диалога как с объектом JSON, используя conv.data , где conv — это ваш экземпляр Conversation .

В следующем примере показано, как сохранить счетчик в поле conversationToken вашего AppResponse :

Node.js

conv.data.firstNum = firstNum;
conv.ask(`Got it, the first number is ${firstNum}.`);
conv.ask(`What's the second number?`);

Джава

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.getConversationData().put("firstNum", firstNum);
responseBuilder.add("Got it, the first number is " + firstNum + ".");
responseBuilder.add("What's the second number?");
return responseBuilder.build();

JSON

Обратите внимание, что приведенный ниже JSON описывает ответ веб-перехватчика, который использует outputContexts вместо conversationToken .

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Got it, the first number is 23."
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "What's the second number?"
            }
          }
        ]
      }
    }
  },
  "outputContexts": [
    {
      "name": "projects/save-data-df-js/agent/sessions/ABwppHGfFkWJdHKPpBEYiGkhdoakWmYj_2sZa4o8pbGG9nj4q5_GfDTtNEXOY34mLX8G4o_d7oZdUW9bnBZC/contexts/_actions_on_google",
      "lifespanCount": 99,
      "parameters": {
        "data": "{\"firstNum\":23}"
      }
    }
  ]
}

JSON

Обратите внимание, что приведенный ниже JSON описывает ответ веб-перехватчика.

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Got it, the first number is 23."
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "What's the second number?"
              }
            }
          ]
        }
      }
    }
  ],
  "conversationToken": "{\"data\":{\"firstNum\":23}}"
}

См. практический пример использования в нашем Руководстве по рекомендациям по предоставлению полезных повторных подсказок и корректному отказу .

Сохранение данных между разговорами

Поле userStorage вашего объекта AppResponse представляет собой строку, содержащую непрозрачный токен, предоставленный действием, который сохраняется в разговорах для определенного пользователя. Например, игра может сохранить наивысший балл пользователя в userStorage и использовать его значение в приветственном сообщении каждый раз, когда пользователь начинает новый разговор.

Определение и обработка статуса проверки пользователя

Статус проверки пользователя может иметь значение GUEST или VERIFIED . В начале каждой беседы Actions on Google устанавливает статус проверки пользователя на основе множества индикаторов, когда начинается беседа. Например, пользователь, выполнивший вход в Google Assistant на своем мобильном устройстве, имеет статус подтверждения VERIFIED .

Ниже приведены возможные причины, по которым пользователь может иметь статус подтверждения GUEST :

  • У пользователя отключены персональные результаты .
  • Пользователь отключил свою активность в Интернете и приложениях . Имейте в виду, что у некоторых пользователей этот параметр может быть отключен на уровне домена.
  • Если на устройстве включена функция Voice Match, но сопоставление не удается или пользователь вызывает помощника, не используя свой голос (например, долгое нажатие на Google Home).
  • Пользователь не авторизован.

Всегда проверяйте статус проверки пользователя перед сохранением данных в userStorage или запуском процесса связывания учетной записи , чтобы предотвратить взаимодействие гостевых пользователей с функцией, которая не будет работать для них.

Если вы используете клиентскую библиотеку Actions On Google для Node.js , вы можете взаимодействовать с пользовательским хранилищем как с объектом JSON, используя conv.user.storage , где conv — это ваш экземпляр Conversation . В следующем примере показано, как сохранить счетчик в поле userStorage вашего AppResponse :

Node.js

app.intent('Save Sum', (conv) => {
  if (conv.user.verification === 'VERIFIED') {
    conv.user.storage.sum = conv.data.sum;
    conv.close(`Alright, I'll store that for next time. See you then.`);
  } else {
    conv.close(`I can't save that right now, but we can add ` +
      `new numbers next time!`);
  }
});

Джава

@ForIntent("Save Sum")
public ActionResponse saveSum(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  Integer sum = ((Double) request.getConversationData().get("sum")).intValue();
  String verificationStatus = request.getUser().getUserVerificationStatus();
  if (verificationStatus.equals("VERIFIED")) {
    responseBuilder.getUserStorage().put("sum", sum);
    responseBuilder.add("Alright, I'll store that for next time. See you then.");
  } else {
    responseBuilder.add("I can't save that right now, but we can add new numbers next time!");
  }
  responseBuilder.endConversation();
  return responseBuilder.build();
}

Node.js

if (conv.user.verification === 'VERIFIED') {
  conv.user.storage.sum = conv.data.sum;
  conv.close(`Alright, I'll store that for next time. See you then.`);
} else {
  conv.close(`I can't save that right now, but we can add ` +
    `new numbers next time!`);
}

Джава

ResponseBuilder responseBuilder = getResponseBuilder(request);
Integer sum = ((Double) request.getConversationData().get("sum")).intValue();
String verificationStatus = request.getUser().getUserVerificationStatus();
if (verificationStatus.equals("VERIFIED")) {
  responseBuilder.getUserStorage().put("sum", sum);
  responseBuilder.add("Alright, I'll store that for next time. See you then.");
} else {
  responseBuilder.add("I can't save that right now, but we can add new numbers next time!");
}
responseBuilder.endConversation();
return responseBuilder.build();

JSON

Обратите внимание, что приведенный ниже JSON описывает ответ веб-перехватчика.

{
  "payload": {
    "google": {
      "expectUserResponse": false,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Alright, I'll store that for next time. See you then."
            }
          }
        ]
      },
      "userStorage": "{\"data\":{\"sum\":68}}"
    }
  }
}

JSON

Обратите внимание, что приведенный ниже JSON описывает ответ веб-перехватчика.

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "simpleResponse": {
            "textToSpeech": "Alright, I'll store that for next time. See you then."
          }
        }
      ]
    }
  },
  "conversationToken": "{\"data\":{\"firstNum\":23,\"sum\":68}}",
  "userStorage": "{\"data\":{\"sum\":68}}"
}

Ознакомьтесь с практическим примером использования в нашем руководстве по персонализации беседы с помощью пользовательских настроек .

Юридическое примечание: получение согласия перед доступом userStorage . В некоторых странах действуют правила, требующие от разработчиков получения согласия пользователя, прежде чем они смогут получить доступ или сохранить определенную информацию (например, личную информацию) в userStorage . Если вы работаете в одной из этих стран и хотите получить доступ или сохранить такую ​​информацию в userStorage , вы должны использовать помощник подтверждения , чтобы запросить согласие у пользователя и получить согласие, прежде чем вы сможете начать хранить такую ​​информацию в userStorage .

Срок хранения пользовательского хранилища

Когда Помощник может сопоставить идентификатор с пользователем, срок действия содержимого userStorage никогда не истечет, и только пользователь или само действие может его очистить.

Когда помощник не может сопоставить идентификатор пользователя, содержимое userStorage очищается в конце разговора. Вот несколько примеров случаев, когда Ассистент не может сопоставить личность с пользователем:

  • Голосовое совпадение настроено, а соответствия нет.
  • Пользователь отключил личные данные.

Очистить содержимое поля userStorage

Вы можете очистить содержимое поля userStorage вашего действия, установив для поля resetUserStorage вашего AppResponse значение true. Если вы установите значение userStorage в пустую строку, значение userStorage останется неизменным в следующем ходе диалога. Это позволяет избежать повторной отправки всего userStorage , если его содержимое не изменилось.

Если вы используете клиентскую библиотеку Actions On Google для Node.js , вы можете просто установить значение conv.user.storage в {} (пустой объект).

Node.js

app.intent('Forget Number', (conv) => {
  conv.user.storage = {};
  conv.ask(`Alright, I forgot your last result.`);
  conv.ask(`Let's add two new numbers. What is the first number?`);
});

Джава

@ForIntent("Forget Number")
public ActionResponse forgetNumber(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  responseBuilder.getUserStorage().clear();
  responseBuilder.add("Alright, I forgot your last result.");
  responseBuilder.add("Let's add two new numbers. What is the first number?");
  return responseBuilder.build();
}

Node.js

conv.user.storage = {};
conv.ask(`Alright, I forgot your last result.`);
conv.ask(`Let's add two new numbers. What is the first number?`);

Джава

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.getUserStorage().clear();
responseBuilder.add("Alright, I forgot your last result.");
responseBuilder.add("Let's add two new numbers. What is the first number?");
return responseBuilder.build();

JSON

Обратите внимание, что приведенный ниже JSON описывает ответ веб-перехватчика.

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Alright, I forgot your last result."
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "Let's add two new numbers. What is the first number?"
            }
          }
        ]
      },
      "userStorage": "{\"data\":{}}"
    }
  }
}

JSON

Обратите внимание, что приведенный ниже JSON описывает ответ веб-перехватчика.

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Alright, I forgot your last result."
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "Let's add two new numbers. What is the first number?"
              }
            }
          ]
        }
      }
    }
  ],
  "userStorage": "{\"data\":{}}"
}

Как пользователь, вы можете просматривать содержимое поля userStorage в вызванном вами действии. Вы также можете удалить сохраненные пользовательские данные из этого конкретного действия, запретив службе запоминать вас.

  1. Откройте приложение «Ассистент» на своем телефоне.
  2. Коснитесь значка ящика.

  3. На вкладке «Обзор» найдите действие, для которого вы хотите просмотреть или очистить хранилище пользователя, и нажмите на него, чтобы открыть страницу сведений.
  4. Прокрутите страницу вниз.
    • Чтобы просмотреть содержимое поля userStorage , нажмите [Просмотр сохраненных данных] .
    • Чтобы удалить сохраненные пользовательские данные, коснитесь Остановить $действие , чтобы меня не запомнить .