Исследуйте в Dialogflow
Нажмите «Продолжить» , чтобы импортировать наш образец данных сохранения в Dialogflow. Затем выполните следующие действия, чтобы развернуть и протестировать образец:
- Введите имя агента и создайте новый агент Dialogflow для образца.
- После завершения импорта агента нажмите Перейти к агенту .
- В главном навигационном меню перейдите к Выполнение .
- Включите встроенный редактор , затем нажмите «Развернуть» . Редактор содержит пример кода.
- В главном меню навигации выберите «Интеграции» и нажмите «Google Ассистент» .
- В появившемся модальном окне включите автоматический предварительный просмотр изменений и нажмите «Тест» , чтобы открыть симулятор действий.
- В симуляторе введите
Talk to my test app
, чтобы протестировать образец!
Частью обеспечения отличного взаимодействия с пользователем часто является возможность сохранять данные между поворотами разговора или между несколькими разговорами с пользователем. Это полезно, если вы предоставляете полезные подсказки в одном разговоре, сохраняете игровые результаты между сеансами или запоминаете небольшие фрагменты информации для пользователя.
Требования немного различаются в зависимости от того, нужно ли вам сохранять данные в разговоре или между разговорами. Чтобы сохранить данные в разговоре, вы можете использовать поле conversationToken
вашего объекта AppResponse
.
Вместо этого, чтобы сохранить данные между разговорами, выполните следующие действия:
- Определите, является ли пользователь верифицированным или гостем.
- Храните или получайте доступ к пользовательским данным, используя поле
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
в вызванном вами действии. Вы также можете удалить сохраненные пользовательские данные из этого конкретного действия, запретив службе запоминать вас.
- Откройте приложение «Ассистент» на своем телефоне.
- Коснитесь значка ящика.
- На вкладке «Обзор» найдите действие, для которого вы хотите просмотреть или очистить хранилище пользователя, и нажмите на него, чтобы открыть страницу сведений.
- Прокрутите страницу вниз.
- Чтобы просмотреть содержимое поля
userStorage
, нажмите [Просмотр сохраненных данных] . - Чтобы удалить сохраненные пользовательские данные, коснитесь Остановить $действие , чтобы меня не запомнить .
- Чтобы просмотреть содержимое поля