Посмотреть в Dialogflow
Нажмите Continue (Продолжить), чтобы импортировать пример выборки данных в Dialogflow. Затем выполните следующие действия, чтобы развернуть и протестировать пример:
- Введите название агента и создайте новый агент Dialogflow для примера.
- После завершения импорта нажмите Перейти к агенту.
- В главном меню навигации выберите Выполнение заказов.
- Включите встроенный редактор и нажмите Развернуть. В редакторе появится образец кода.
- В главном меню навигации выберите Integrations (Интеграции), а затем нажмите Google Assistant (Google Ассистент).
- В появившемся модальном окне включите Auto-preview changes (Автоматический предпросмотр изменений) и нажмите Test (Протестировать), чтобы открыть симулятор действий.
- Введите
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?`);
Java
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 Ассистента на мобильном устройстве, статус подтверждения будет 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!`); } });
Java
@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!`); }
Java
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, вы должны использовать Confirmation helper, чтобы запрашивать согласие пользователя и получать его, прежде чем сохранять такую информацию в userStorage.
Срок действия хранилища пользователя
Если Ассистент может сопоставить личность с пользователем, срок действия содержимого userStorage не истекает. Очистить его может только пользователь или само действие.
Если Ассистент не может сопоставить личность с пользователем, содержимое userStorage удаляется в конце разговора. Вот несколько примеров ситуаций, когда Ассистент не может сопоставить личность с пользователем:
- Функция Voice Match настроена, но совпадений не найдено.
- Пользователь отключил персональные данные.
Очистить содержимое поля 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?`); });
Java
@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?`);
Java
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, нажмите Просмотр сохраненных данных. - Чтобы удалить сохраненные пользовательские данные, нажмите Запретить $action запоминать меня.
- Чтобы посмотреть содержимое поля