Исследуйте в Dialogflow
Нажмите «Продолжить» , чтобы импортировать наш образец Helpers в Dialogflow. Затем выполните следующие действия, чтобы развернуть и протестировать образец:
- Введите имя агента и создайте новый агент Dialogflow для примера.
- После завершения импорта агента нажмите Перейти к агенту .
- В главном навигационном меню перейдите в раздел «Выполнение» .
- Включите встроенный редактор и нажмите «Развернуть» . Редактор содержит пример кода.
- В главном меню навигации выберите «Интеграции» и нажмите «Google Ассистент» .
- В появившемся модальном окне включите автоматический просмотр изменений и нажмите «Тест» , чтобы открыть симулятор действий.
- В симуляторе введите
Talk to my test app
чтобы протестировать образец!
Помощники говорят Ассистенту, чтобы он на мгновение взял на себя разговор и получил общие данные, такие как полное имя пользователя, дату и время или адрес доставки. Когда вы запрашиваете помощника, Ассистент предоставляет пользователям стандартный, согласованный пользовательский интерфейс для получения этой информации, поэтому вам не придется создавать свой собственный.
Обзор использования
Общий процесс использования помощника с Dialogflow и Actions SDK описан ниже для Dialogflow и Actions SDK. Дополнительные сведения о каждом помощнике см. в разделах конкретных помощников.
Диалоговый поток
Node.js
- Вызовите
conv.ask()
с соответствующим вспомогательным объектом. Когда вы вызываете вспомогательную функцию, клиентская библиотека отправляет помощнику ответ, содержащий соответствующее намерение вспомогательной функции. В зависимости от намерения помощник знает, что нужно выполнить диалог для соответствующего помощника. - Объявите намерение Dialogflow, указывающее событие, соответствующее одному из вспомогательных намерений. Список поддерживаемых событий см. в разделе «Намерения помощника» . Для этого намерения не требуется, чтобы пользователь произносил фразы, поскольку оно всегда срабатывает при возникновении события (когда помощник завершает выполнение помощника).
- Когда Ассистент возвращает результат помощника в последующем запросе на ваше выполнение, запускается соответствующее намерение Dialogflow, и вы обрабатываете это намерение обычным образом.
JSON
- Укажите намерение помощника в объекте couldIntents при ответе помощнику. Когда помощник получает ответ, он знает, что должен выполнить диалог для помощника. Посмотрите намерения помощника , чтобы получить информацию о том, какие намерения вы можете запросить для выполнения.
- Объявите намерение Dialogflow, указывающее событие, соответствующее одному из вспомогательных намерений. Список поддерживаемых событий см. в разделе «Намерения помощника» . Это намерение не требует каких-либо фраз, произнесенных пользователем , поскольку оно всегда срабатывает при возникновении события.
- Когда Ассистент вернет результат хелперу в последующем запросе на ваше выполнение, проанализируйте запрос и необходимые вам данные.
SDK действий
Node.js
- Позвоните
ask
с соответствующими параметрами. Вспомогательная функция просит Ассистента выполнить одно из намерений, описанных в вспомогательных намерениях . Когда вы вызываете вспомогательную функцию, клиентская библиотека отправляет помощнику ответ, содержащий одно из этих намерений. В зависимости от намерения помощник знает, что нужно выполнить диалог для соответствующего помощника. - Когда Ассистент возвращает результат хелпера в последующем запросе на ваше выполнение, вы получаете соответствующий интент в запросе. Это позволяет вам обнаружить, что помощник вернул результат. Используйте соответствующую функцию-получатель для помощника, чтобы получить необходимые вам данные.
JSON
- Укажите намерение помощника в объекте couldIntents при ответе помощнику. Когда помощник получает ответ, он знает, что должен выполнить диалог для помощника. Посмотрите намерения помощника , чтобы получить информацию о том, какие намерения вы можете запросить для выполнения.
- Когда Ассистент вернет результат хелперу в последующем запросе на ваше выполнение, проанализируйте запрос и необходимые вам данные.
Намерения помощника
В следующей таблице описаны поддерживаемые намерения, которые вы можете запросить у Ассистента. Если вы используете Dialogflow, вам также необходимо создать намерение Dialogflow, которое указывает соответствующее событие для вспомогательного намерения.
Имя намерения | Имя события диалогового потока | Использование |
---|---|---|
actions.intent.PERMISSION | actions_intent_PERMISSION | Получите полное имя пользователя, приблизительное местоположение или точное местоположение, или все 3. |
actions.intent.OPTION | actions_intent_OPTION | Получите выбранный элемент из списка или пользовательского интерфейса карусели. Или, если пользователь не делает выбор из списка или пользовательского интерфейса карусели, он получит речевой или текстовый ввод, соответствующий ключу в пользовательском интерфейсе списка или карусели. |
actions.intent.DATETIME | actions_intent_DATETIME | Получите ввод даты и времени от пользователя. |
actions.intent.SIGN_IN | actions_intent_SIGN_IN | Запрашивает поток привязки учетной записи для привязки учетной записи пользователя. |
actions.intent.PLACE | actions_intent_PLACE | Получите адрес или сохраненное местоположение от пользователя. |
actions.intent.CONFIRMATION | actions_intent_CONFIRMATION | Получите подтверждение от пользователя (например, ответ на вопрос «да» или «нет»). |
В следующих разделах описаны доступные помощники и связанное с ними намерение, которое вы должны запросить для использования помощника.
Информация о пользователе
С помощью этого помощника вы можете получить следующую информацию о пользователе:
- Отображаемое имя
- Собственное имя
- Фамилия
- Приблизительное местоположение устройства (почтовый индекс и город)
- Точное местоположение устройства (координаты и адрес)
Вызов помощника
В следующем примере кода показано, как можно вызвать помощник с помощью клиентской библиотеки. Фрагменты JSON показывают соответствующий ответ веб-перехватчика.
Node.js
app.intent('Permission', (conv) => { const permissions = ['NAME']; let context = 'To address you by name'; // Location permissions only work for verified users // https://developers.google.com/actions/assistant/guest-users if (conv.user.verification === 'VERIFIED') { // Could use DEVICE_COARSE_LOCATION instead for city, zip code permissions.push('DEVICE_PRECISE_LOCATION'); context += ' and know your location'; } const options = { context, permissions, }; conv.ask(new Permission(options)); });
Ява
@ForIntent("Permission") public ActionResponse getPermission(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); String[] permissions = new String[] {ConstantsKt.PERMISSION_NAME}; String context = "To address you by name"; // Location permissions only work for verified users // https://developers.google.com/actions/assistant/guest-users if (request.getUser().getUserVerificationStatus().equals("VERIFIED")) { // Could use PERMISSION_DEVICE_COARSE_LOCATION instead for city, zip code permissions = new String[] { ConstantsKt.PERMISSION_NAME, ConstantsKt.PERMISSION_DEVICE_PRECISE_LOCATION }; } responseBuilder .add("PLACEHOLDER") .add(new Permission().setPermissions(permissions).setContext(context)); return responseBuilder.build(); }
Node.js
const permissions = ['NAME']; let context = 'To address you by name'; // Location permissions only work for verified users // https://developers.google.com/actions/assistant/guest-users if (conv.user.verification === 'VERIFIED') { // Could use DEVICE_COARSE_LOCATION instead for city, zip code permissions.push('DEVICE_PRECISE_LOCATION'); context += ' and know your location'; } const options = { context, permissions, }; conv.ask(new Permission(options));
Ява
ResponseBuilder responseBuilder = getResponseBuilder(request); String[] permissions = new String[] {ConstantsKt.PERMISSION_NAME}; String context = "To address you by name"; // Location permissions only work for verified users // https://developers.google.com/actions/assistant/guest-users if (request.getUser().getUserVerificationStatus().equals("VERIFIED")) { // Could use PERMISSION_DEVICE_COARSE_LOCATION instead for city, zip code permissions = new String[] { ConstantsKt.PERMISSION_NAME, ConstantsKt.PERMISSION_DEVICE_PRECISE_LOCATION }; } responseBuilder .add("PLACEHOLDER") .add(new Permission().setPermissions(permissions).setContext(context)); return responseBuilder.build();
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "payload": { "google": { "expectUserResponse": true, "systemIntent": { "intent": "actions.intent.PERMISSION", "data": { "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec", "optContext": "To address you by name and know your location", "permissions": [ "NAME", "DEVICE_PRECISE_LOCATION" ] } } } } }
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "expectUserResponse": true, "expectedInputs": [ { "possibleIntents": [ { "intent": "actions.intent.PERMISSION", "inputValueData": { "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec", "optContext": "To address you by name and know your location", "permissions": [ "NAME", "DEVICE_PRECISE_LOCATION" ] } } ] } ] }
Получение результатов помощника
В следующем примере кода показано, как получить доступ к результату помощника с помощью клиентской библиотеки. Фрагменты JSON представляют собой запрос, содержащий результат помощника, который получит ваше выполнение.
Node.js
app.intent('Permission Handler', (conv, params, confirmationGranted) => { // Also, can access latitude and longitude // const { latitude, longitude } = location.coordinates; const {location} = conv.device; const {name} = conv.user; if (confirmationGranted && name && location) { conv.ask(`Okay ${name.display}, I see you're at ` + `${location.formattedAddress}`); } else { conv.ask(`Looks like I can't get your information.`); } conv.ask(`Would you like to try another helper?`); conv.ask(new Suggestions([ 'Confirmation', 'DateTime', 'Place', ])); });
Ява
@ForIntent("Permission Handler") public ActionResponse handlePermission(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); Location location = request.getDevice().getLocation(); String name = request.getUser().getProfile().getDisplayName(); if (request.isPermissionGranted()) { responseBuilder.add("Okay " + name + ", I see you're at " + location.getFormattedAddress()); } else { responseBuilder.add("Looks like I can't get your information"); } responseBuilder .add("Would you like to try another helper?") .addSuggestions(new String[] {"Confirmation", "DateTime", "Place"}); return responseBuilder.build(); }
Node.js
app.intent('actions.intent.PERMISSION', (conv, confirmationGranted) => { // Also, can access latitude and longitude // const { latitude, longitude } = location.coordinates; const {location} = conv.device; const {name} = conv.user; if (confirmationGranted && name && location) { conv.ask(`Okay ${name.display}, I see you're at ` + `${location.formattedAddress}`); } else { conv.ask(`Looks like I can't get your information.`); } conv.ask(`Would you like to try another helper?`); conv.ask(new Suggestions([ 'Confirmation', 'DateTime', 'Place', ])); });
Ява
@ForIntent("actions.intent.PERMISSION") public ActionResponse handlePermission(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); Location location = request.getDevice().getLocation(); String name = request.getUser().getProfile().getDisplayName(); if (request.isPermissionGranted()) { responseBuilder.add("Okay " + name + ", I see you're at " + location.getFormattedAddress()); } else { responseBuilder.add("Looks like I can't get your information"); } responseBuilder .add("Would you like to try another helper?") .addSuggestions(new String[] {"Confirmation", "DateTime", "Place"}); return responseBuilder.build(); }
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "responseId": "f26883c9-0283-4827-85bf-533f4442b4f9-712767ed", "queryResult": { "queryText": "actions_intent_PERMISSION", "parameters": {}, "allRequiredParamsPresent": true, "fulfillmentText": "Webhook failed for intent: Permission Handler", "fulfillmentMessages": [ { "text": { "text": [ "Webhook failed for intent: Permission Handler" ] } } ], "outputContexts": [ { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y/contexts/actions_capability_account_linking" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y/contexts/actions_capability_screen_output" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y/contexts/actions_capability_web_browser" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y/contexts/actions_capability_audio_output" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y/contexts/actions_capability_media_response_audio" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y/contexts/google_assistant_input_type_keyboard" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y/contexts/actions_intent_permission", "parameters": { "PERMISSION": true, "text": "yes" } } ], "intent": { "name": "projects/df-helpers-kohler/agent/intents/6475b0ef-dd52-4afa-a1b9-7a19e7e93a80", "displayName": "Permission Handler" }, "intentDetectionConfidence": 1, "languageCode": "en" }, "originalDetectIntentRequest": { "source": "google", "version": "2", "payload": { "user": { "profile": { "displayName": "Sachit Mishra", "givenName": "Sachit", "familyName": "Mishra" }, "permissions": [ "NAME", "DEVICE_PRECISE_LOCATION" ], "locale": "en-US", "userVerificationStatus": "VERIFIED" }, "conversation": { "conversationId": "ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y", "type": "ACTIVE", "conversationToken": "[]" }, "inputs": [ { "intent": "actions.intent.PERMISSION", "rawInputs": [ { "inputType": "KEYBOARD", "query": "yes" } ], "arguments": [ { "name": "PERMISSION", "boolValue": true, "textValue": "true" }, { "name": "text", "rawText": "yes", "textValue": "yes" } ] } ], "surface": { "capabilities": [ { "name": "actions.capability.ACCOUNT_LINKING" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" }, { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" } ] }, "device": { "location": { "coordinates": { "latitude": 37.42241550000001, "longitude": -122.0840805 }, "formattedAddress": "Google Building 40 1600 Amphitheatre Parkway, Mountain View, California 94043", "zipCode": "94043", "city": "Mountain View" } }, "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.WEB_BROWSER" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.AUDIO_OUTPUT" } ] } ] } }, "session": "projects/df-helpers-kohler/agent/sessions/ABwppHGu7m_m6bTsKuLb6noyG_o-9BMSf8J9cfY8dpJIPN_hHT79qfqRrZPtyx515K-sl9SU8Jy3auH6pLmy99Y" }
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "user": { "profile": { "displayName": "Sachit Mishra", "givenName": "Sachit", "familyName": "Mishra" }, "permissions": [ "DEVICE_PRECISE_LOCATION", "NAME" ], "locale": "en-US", "userVerificationStatus": "VERIFIED" }, "conversation": { "conversationId": "ABwppHEcidO2jguO4hS8maDeMVx8aasSCcBWZHrF3EmOMIaWRP9qF0BcACistiIoeyiSNTW6KD_tqN_U-xAIOXhPvA", "type": "NEW" }, "inputs": [ { "intent": "actions.intent.PERMISSION", "rawInputs": [ { "inputType": "KEYBOARD", "query": "yes" } ], "arguments": [ { "name": "PERMISSION", "boolValue": true, "textValue": "true" }, { "name": "text", "rawText": "yes", "textValue": "yes" } ] } ], "surface": { "capabilities": [ { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "name": "actions.capability.ACCOUNT_LINKING" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" } ] }, "device": { "location": { "coordinates": { "latitude": 37.4197238, "longitude": -122.08212759999999 }, "formattedAddress": "Google Building 45 1585 Charleston Road, Mountain View, California 94043", "zipCode": "94043", "city": "Mountain View" } }, "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" }, { "name": "actions.capability.AUDIO_OUTPUT" } ] } ] }
В приведенном выше фрагменте показано, как проверить, предоставил ли пользователь вам информацию, а затем получить доступ к данным.
После того как вы получите информацию о пользователе, мы рекомендуем сохранить эту информацию, чтобы вам не приходилось спрашивать снова. Вы можете использовать пользовательское хранилище для хранения информации о пользователях во время разговоров. Посмотрите наш пример Name Psychic в Node.js и Java , чтобы увидеть UserStorage в действии.
Опция списка и карусели
Вызов помощника
В следующем примере кода показано, как можно вызвать помощник с помощью клиентской библиотеки. Фрагменты JSON показывают соответствующий ответ веб-перехватчика.
Node.js
app.intent('List', (conv) => { if (!conv.screen) { conv.ask('Sorry, try this on a screen device or select the ' + 'phone surface in the simulator.'); return; } conv.ask('This is a list example.'); // Create a list conv.ask(new List({ title: 'List Title', items: { // Add the first item to the list 'SELECTION_KEY_ONE': { synonyms: [ 'synonym 1', 'synonym 2', 'synonym 3', ], title: 'Title of First List Item', description: 'This is a description of a list item.', image: new Image({ url: 'https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png', alt: 'Image alternate text', }), }, // Add the second item to the list 'SELECTION_KEY_GOOGLE_HOME': { synonyms: [ 'Google Home Assistant', 'Assistant on the Google Home', ], title: 'Google Home', description: 'Google Home is a voice-activated speaker powered by ' + 'the Google Assistant.', image: new Image({ url: 'https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png', alt: 'Google Home', }), }, // Add the third item to the list 'SELECTION_KEY_GOOGLE_PIXEL': { synonyms: [ 'Google Pixel XL', 'Pixel', 'Pixel XL', ], title: 'Google Pixel', description: 'Pixel. Phone by Google.', image: new Image({ url: 'https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png', alt: 'Google Pixel', }), }, }, })); });
Ява
@ForIntent("List") public ActionResponse list(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); if (!request.hasCapability(Capability.SCREEN_OUTPUT.getValue())) { return responseBuilder .add("Sorry, try ths on a screen device or select the phone surface in the simulator.") .add("Which response would you like to see next?") .build(); } responseBuilder .add("This is a list example.") .add( new SelectionList() .setTitle("List Title") .setItems( Arrays.asList( new ListSelectListItem() .setTitle("Title of First List Item") .setDescription("This is a description of a list item.") .setImage( new Image() .setUrl( "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png") .setAccessibilityText("Image alternate text")) .setOptionInfo( new OptionInfo() .setSynonyms( Arrays.asList("synonym 1", "synonym 2", "synonym 3")) .setKey("SELECTION_KEY_ONE")), new ListSelectListItem() .setTitle("Google Home") .setDescription( "Google Home is a voice-activated speaker powered by the Google Assistant.") .setImage( new Image() .setUrl( "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png") .setAccessibilityText("Google Home")) .setOptionInfo( new OptionInfo() .setSynonyms( Arrays.asList( "Google Home Assistant", "Assistant on the Google Home")) .setKey("SELECTION_KEY_GOOGLE_HOME")), new ListSelectListItem() .setTitle("Google Pixel") .setDescription("Pixel. Phone by Google.") .setImage( new Image() .setUrl( "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png") .setAccessibilityText("Google Pixel")) .setOptionInfo( new OptionInfo() .setSynonyms( Arrays.asList("Google Pixel XL", "Pixel", "Pixel XL")) .setKey("SELECTION_KEY_GOOGLE_PIXEL"))))); return responseBuilder.build(); }
Node.js
if (!conv.screen) { conv.ask('Sorry, try this on a screen device or select the ' + 'phone surface in the simulator.'); return; } conv.ask('This is a list example.'); // Create a list conv.ask(new List({ title: 'List Title', items: { // Add the first item to the list 'SELECTION_KEY_ONE': { synonyms: [ 'synonym 1', 'synonym 2', 'synonym 3', ], title: 'Title of First List Item', description: 'This is a description of a list item.', image: new Image({ url: 'https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png', alt: 'Image alternate text', }), }, // Add the second item to the list 'SELECTION_KEY_GOOGLE_HOME': { synonyms: [ 'Google Home Assistant', 'Assistant on the Google Home', ], title: 'Google Home', description: 'Google Home is a voice-activated speaker powered by ' + 'the Google Assistant.', image: new Image({ url: 'https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png', alt: 'Google Home', }), }, // Add the third item to the list 'SELECTION_KEY_GOOGLE_PIXEL': { synonyms: [ 'Google Pixel XL', 'Pixel', 'Pixel XL', ], title: 'Google Pixel', description: 'Pixel. Phone by Google.', image: new Image({ url: 'https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png', alt: 'Google Pixel', }), }, }, }));
Ява
ResponseBuilder responseBuilder = getResponseBuilder(request); if (!request.hasCapability(Capability.SCREEN_OUTPUT.getValue())) { return responseBuilder .add("Sorry, try ths on a screen device or select the phone surface in the simulator.") .add("Which response would you like to see next?") .build(); } responseBuilder .add("This is a list example.") .add( new SelectionList() .setTitle("List Title") .setItems( Arrays.asList( new ListSelectListItem() .setTitle("Title of First List Item") .setDescription("This is a description of a list item.") .setImage( new Image() .setUrl( "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png") .setAccessibilityText("Image alternate text")) .setOptionInfo( new OptionInfo() .setSynonyms( Arrays.asList("synonym 1", "synonym 2", "synonym 3")) .setKey("SELECTION_KEY_ONE")), new ListSelectListItem() .setTitle("Google Home") .setDescription( "Google Home is a voice-activated speaker powered by the Google Assistant.") .setImage( new Image() .setUrl( "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png") .setAccessibilityText("Google Home")) .setOptionInfo( new OptionInfo() .setSynonyms( Arrays.asList( "Google Home Assistant", "Assistant on the Google Home")) .setKey("SELECTION_KEY_GOOGLE_HOME")), new ListSelectListItem() .setTitle("Google Pixel") .setDescription("Pixel. Phone by Google.") .setImage( new Image() .setUrl( "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png") .setAccessibilityText("Google Pixel")) .setOptionInfo( new OptionInfo() .setSynonyms( Arrays.asList("Google Pixel XL", "Pixel", "Pixel XL")) .setKey("SELECTION_KEY_GOOGLE_PIXEL"))))); return responseBuilder.build();
JSON
Обратите внимание, что приведенный ниже JSON описывает ответ веб-перехватчика.
{ "payload": { "google": { "expectUserResponse": true, "systemIntent": { "intent": "actions.intent.OPTION", "data": { "@type": "type.googleapis.com/google.actions.v2.OptionValueSpec", "listSelect": { "title": "List Title", "items": [ { "optionInfo": { "key": "SELECTION_KEY_ONE", "synonyms": [ "synonym 1", "synonym 2", "synonym 3" ] }, "description": "This is a description of a list item.", "image": { "url": "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png", "accessibilityText": "Image alternate text" }, "title": "Title of First List Item" }, { "optionInfo": { "key": "SELECTION_KEY_GOOGLE_HOME", "synonyms": [ "Google Home Assistant", "Assistant on the Google Home" ] }, "description": "Google Home is a voice-activated speaker powered by the Google Assistant.", "image": { "url": "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png", "accessibilityText": "Google Home" }, "title": "Google Home" }, { "optionInfo": { "key": "SELECTION_KEY_GOOGLE_PIXEL", "synonyms": [ "Google Pixel XL", "Pixel", "Pixel XL" ] }, "description": "Pixel. Phone by Google.", "image": { "url": "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png", "accessibilityText": "Google Pixel" }, "title": "Google Pixel" } ] } } }, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "This is a list example." } } ] } } } }
JSON
Обратите внимание, что приведенный ниже JSON описывает ответ веб-перехватчика.
{ "expectUserResponse": true, "expectedInputs": [ { "possibleIntents": [ { "intent": "actions.intent.OPTION", "inputValueData": { "@type": "type.googleapis.com/google.actions.v2.OptionValueSpec", "listSelect": { "title": "List Title", "items": [ { "optionInfo": { "key": "SELECTION_KEY_ONE", "synonyms": [ "synonym 1", "synonym 2", "synonym 3" ] }, "description": "This is a description of a list item.", "image": { "url": "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png", "accessibilityText": "Image alternate text" }, "title": "Title of First List Item" }, { "optionInfo": { "key": "SELECTION_KEY_GOOGLE_HOME", "synonyms": [ "Google Home Assistant", "Assistant on the Google Home" ] }, "description": "Google Home is a voice-activated speaker powered by the Google Assistant.", "image": { "url": "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png", "accessibilityText": "Google Home" }, "title": "Google Home" }, { "optionInfo": { "key": "SELECTION_KEY_GOOGLE_PIXEL", "synonyms": [ "Google Pixel XL", "Pixel", "Pixel XL" ] }, "description": "Pixel. Phone by Google.", "image": { "url": "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png", "accessibilityText": "Google Pixel" }, "title": "Google Pixel" } ] } } } ], "inputPrompt": { "richInitialPrompt": { "items": [ { "simpleResponse": { "textToSpeech": "This is a list example." } } ] } } } ] }
Вы можете отобразить пользовательский интерфейс списка или карусели и получить выбранную опцию от пользователя с помощью намерения actions.intent.OPTION
.
Получение результатов помощника
В следующих примерах кода показано, как получить доступ к результату помощника с помощью клиентской библиотеки. Фрагменты JSON представляют собой запрос, содержащий результат помощника, который получит ваше выполнение.
Следующие фрагменты показывают, как проверить, какой вариант выбрал пользователь.
Node.js
app.intent('List - OPTION', (conv, params, option) => { const SELECTED_ITEM_RESPONSES = { 'SELECTION_KEY_ONE': 'You selected the first item', 'SELECTION_KEY_GOOGLE_HOME': 'You selected the Google Home!', 'SELECTION_KEY_GOOGLE_PIXEL': 'You selected the Google Pixel!', }; conv.ask(SELECTED_ITEM_RESPONSES[option]); conv.ask('Which response would you like to see next?'); });
Ява
@ForIntent("List - OPTION") public ActionResponse listSelected(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); String selectedItem = request.getSelectedOption(); String response; if (selectedItem.equals("SELECTION_KEY_ONE")) { response = "You selected the first item"; } else if (selectedItem.equals("SELECTION_KEY_GOOGLE_HOME")) { response = "You selected the Google Home!"; } else if (selectedItem.equals("SELECTION_KEY_GOOGLE_PIXEL")) { response = "You selected the Google Pixel!"; } else { response = "You did not select a valid item"; } return responseBuilder.add(response).add("Which response would you like to see next?").build(); }
Node.js
app.intent('actions.intent.OPTION', (conv, params, option) => { const SELECTED_ITEM_RESPONSES = { 'SELECTION_KEY_ONE': 'You selected the first item', 'SELECTION_KEY_GOOGLE_HOME': 'You selected the Google Home!', 'SELECTION_KEY_GOOGLE_PIXEL': 'You selected the Google Pixel!', }; conv.ask(SELECTED_ITEM_RESPONSES[option]); conv.ask('Which response would you like to see next?'); });
Ява
@ForIntent("actions.intent.OPTION") public ActionResponse listSelected(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); String selectedItem = request.getSelectedOption(); String response; if (selectedItem.equals("SELECTION_KEY_ONE")) { response = "You selected the first item"; } else if (selectedItem.equals("SELECTION_KEY_GOOGLE_HOME")) { response = "You selected the Google Home!"; } else if (selectedItem.equals("SELECTION_KEY_GOOGLE_PIXEL")) { response = "You selected the Google Pixel!"; } else { response = "You did not select a valid item"; } return responseBuilder.add(response).add("Which response would you like to see next?").build(); } public ActionResponse carousel(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); if (!request.hasCapability(Capability.SCREEN_OUTPUT.getValue())) { return responseBuilder .add("Sorry, try ths on a screen device or select the phone surface in the simulator.") .add("Which response would you like to see next?") .build(); } responseBuilder .add("This is a carousel example.") .add( new SelectionCarousel() .setItems( Arrays.asList( new CarouselSelectCarouselItem() .setTitle("Title of First List Item") .setDescription("This is a description of a list item.") .setImage( new Image() .setUrl( "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png") .setAccessibilityText("Image alternate text")) .setOptionInfo( new OptionInfo() .setSynonyms( Arrays.asList("synonym 1", "synonym 2", "synonym 3")) .setKey("SELECTION_KEY_ONE")), new CarouselSelectCarouselItem() .setTitle("Google Home") .setDescription( "Google Home is a voice-activated speaker powered by the Google Assistant.") .setImage( new Image() .setUrl( "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png") .setAccessibilityText("Google Home")) .setOptionInfo( new OptionInfo() .setSynonyms( Arrays.asList( "Google Home Assistant", "Assistant on the Google Home")) .setKey("SELECTION_KEY_GOOGLE_HOME")), new CarouselSelectCarouselItem() .setTitle("Google Pixel") .setDescription("Pixel. Phone by Google.") .setImage( new Image() .setUrl( "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png") .setAccessibilityText("Google Pixel")) .setOptionInfo( new OptionInfo() .setSynonyms( Arrays.asList("Google Pixel XL", "Pixel", "Pixel XL")) .setKey("SELECTION_KEY_GOOGLE_PIXEL"))))); return responseBuilder.build(); } }
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "responseId": "5d7732d1-d22d-4a0e-ad34-8bc0a7fde20c-21947381", "queryResult": { "queryText": "actions_intent_OPTION", "action": "List.List-custom", "parameters": {}, "allRequiredParamsPresent": true, "fulfillmentText": "Webhook failed for intent: List - OPTION", "fulfillmentMessages": [ { "text": { "text": [ "Webhook failed for intent: List - OPTION" ] } } ], "outputContexts": [ { "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_screen_output" }, { "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_account_linking" }, { "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_media_response_audio" }, { "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_audio_output" }, { "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_capability_web_browser" }, { "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/google_assistant_input_type_touch" }, { "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/list-followup", "lifespanCount": 1 }, { "name": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA/contexts/actions_intent_option", "parameters": { "OPTION": "SELECTION_KEY_GOOGLE_PIXEL", "text": "Google Pixel" } } ], "intent": { "name": "projects/df-responses-kohler/agent/intents/88904350-193e-4472-a2de-977eb5d9e26e", "displayName": "List - OPTION" }, "intentDetectionConfidence": 1, "languageCode": "en" }, "originalDetectIntentRequest": { "source": "google", "version": "2", "payload": { "user": { "locale": "en-US", "lastSeen": "2019-08-04T23:56:32Z", "userVerificationStatus": "VERIFIED" }, "conversation": { "conversationId": "ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA", "type": "ACTIVE", "conversationToken": "[\"list-followup\"]" }, "inputs": [ { "intent": "actions.intent.OPTION", "rawInputs": [ { "inputType": "TOUCH", "query": "Google Pixel" } ], "arguments": [ { "name": "OPTION", "textValue": "SELECTION_KEY_GOOGLE_PIXEL" }, { "name": "text", "rawText": "Google Pixel", "textValue": "Google Pixel" } ] } ], "surface": { "capabilities": [ { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.ACCOUNT_LINKING" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" } ] }, "isInSandbox": true, "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.WEB_BROWSER" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.AUDIO_OUTPUT" } ] } ], "requestType": "SIMULATOR" } }, "session": "projects/df-responses-kohler/agent/sessions/ABwppHHsebncupHK11oKhsCTgyH96GRNYH-xpeeMTqb-cvOxbd67QenbRlZM4bGAIB8_KXdTfI7-7lYVKN1ovAhCaA" }
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "user": { "locale": "en-US", "lastSeen": "2019-08-06T07:37:53Z", "userVerificationStatus": "VERIFIED" }, "conversation": { "conversationId": "ABwppHGcqunXh1M6IE0lu2sVqXdpJfdpC5FWMkMSXQskK1nzb4IkSUSRqQzoEr0Ly0z_G3mwyZlk5rFtd1w", "type": "NEW" }, "inputs": [ { "intent": "actions.intent.OPTION", "rawInputs": [ { "inputType": "TOUCH", "query": "Google Home" } ], "arguments": [ { "name": "OPTION", "textValue": "SELECTION_KEY_GOOGLE_HOME" }, { "name": "text", "rawText": "Google Home", "textValue": "Google Home" } ] } ], "surface": { "capabilities": [ { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "name": "actions.capability.ACCOUNT_LINKING" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" } ] }, "isInSandbox": true, "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.WEB_BROWSER" }, { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.SCREEN_OUTPUT" } ] } ], "requestType": "SIMULATOR" }
Дата и время
Вы можете получить дату и время от пользователей, запросив выполнение намерения actions.intent.DATETIME
.
Вызов помощника
В следующем примере кода показано, как можно вызвать помощник с помощью клиентской библиотеки. Фрагменты JSON показывают соответствующий ответ веб-перехватчика.
Вы можете указать собственные запросы при запросе у пользователя даты и времени с помощью объекта options
при создании разрешения DateTime
.
Node.js
app.intent('Date Time', (conv) => { const options = { prompts: { initial: 'When would you like to schedule the appointment?', date: 'What day was that?', time: 'What time works for you?', }, }; conv.ask(new DateTime(options)); });
Ява
@ForIntent("Date Time") public ActionResponse getDateTime(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder .add("PLACEHOLDER") .add( new DateTimePrompt() .setDateTimePrompt("When would you like to schedule the appointment?") .setDatePrompt("What day was that?") .setTimePrompt("What time works for you?")); return responseBuilder.build(); }
Node.js
const options = { prompts: { initial: 'When would you like to schedule the appointment?', date: 'What day was that?', time: 'What time works for you?', }, }; conv.ask(new DateTime(options));
Ява
ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder .add("PLACEHOLDER") .add( new DateTimePrompt() .setDateTimePrompt("When would you like to schedule the appointment?") .setDatePrompt("What day was that?") .setTimePrompt("What time works for you?")); return responseBuilder.build();
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "payload": { "google": { "expectUserResponse": true, "systemIntent": { "intent": "actions.intent.DATETIME", "data": { "@type": "type.googleapis.com/google.actions.v2.DateTimeValueSpec", "dialogSpec": { "requestDatetimeText": "When would you like to schedule the appointment?", "requestDateText": "What day was that?", "requestTimeText": "What time works for you?" } } } } } }
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "expectUserResponse": true, "expectedInputs": [ { "possibleIntents": [ { "intent": "actions.intent.DATETIME", "inputValueData": { "@type": "type.googleapis.com/google.actions.v2.DateTimeValueSpec", "dialogSpec": { "requestDatetimeText": "When would you like to schedule the appointment?", "requestDateText": "What day was that?", "requestTimeText": "What time works for you?" } } } ] } ] }
Получение результатов помощника
В следующем примере кода показано, как получить доступ к результату помощника с помощью клиентской библиотеки. Фрагменты JSON представляют собой запрос, содержащий результат помощника, который получит ваше выполнение.
В приведенном ниже фрагменте показано, как проверить, предоставил ли пользователь доступ и как получить доступ к данным.
Node.js
app.intent('Date Time Handler', (conv, params, datetime) => { const {month, day} = datetime.date; const {hours, minutes} = datetime.time; conv.ask(`<speak>` + `Great, we will see you on ` + `<say-as interpret-as="date" format="dm">${day}-${month}</say-as>` + `<say-as interpret-as="time" format="hms12" detail="2">${hours}` + `:${minutes || '00'}</say-as>` + `</speak>`); conv.ask('Would you like to try another helper?'); conv.ask(new Suggestions([ 'Confirmation', 'Permission', 'Place', ])); });
Ява
@ForIntent("Date Time Handler") public ActionResponse handleDateTime(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); DateTime dateTimeValue = request.getDateTime(); Integer day = dateTimeValue.getDate().getDay(); Integer month = dateTimeValue.getDate().getMonth(); Integer hours = dateTimeValue.getTime().getHours(); Integer minutes = dateTimeValue.getTime().getMinutes(); String minutesStr = (minutes != null) ? String.valueOf(minutes) : "00"; responseBuilder.add( "<speak>" + "Great, we will see you on " + "<say-as interpret-as=\"date\" format=\"dm\">" + day + "-" + month + "</say-as>" + "<say-as interpret-as=\"time\" format=\"hms12\" detail=\"2\">" + hours + ":" + minutesStr + "</say-as>" + "</speak>"); responseBuilder .add("Would you like to try another helper?") .addSuggestions(new String[] {"Confirmation", "Permission", "Place"}); return responseBuilder.build(); }
Node.js
app.intent('actions.intent.DATETIME', (conv) => { const datetime = conv.arguments.get('DATETIME'); const {month, day} = datetime.date; const {hours, minutes} = datetime.time; conv.ask(`<speak>` + `Great, we will see you on ` + `<say-as interpret-as="date" format="dm">${day}-${month}</say-as>` + `<say-as interpret-as="time" format="hms12" detail="2">${hours}` + `:${minutes || '00'}</say-as>` + `</speak>`); conv.ask('Would you like to try another helper?'); conv.ask(new Suggestions([ 'Confirmation', 'Permission', 'Place', ])); });
Ява
@ForIntent("actions.intent.DATETIME") public ActionResponse datetimeHandler(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); DateTime dateTimeValue = request.getDateTime(); Integer day = dateTimeValue.getDate().getDay(); Integer month = dateTimeValue.getDate().getMonth(); Integer hours = dateTimeValue.getTime().getHours(); Integer minutes = dateTimeValue.getTime().getMinutes(); String minutesStr = (minutes != null) ? String.valueOf(minutes) : "00"; responseBuilder.add( "<speak>" + "Great, we will see you on " + "<say-as interpret-as=\"date\" format=\"dm\">" + day + "-" + month + "</say-as>" + "<say-as interpret-as=\"time\" format=\"hms12\" detail=\"2\">" + hours + ":" + minutesStr + "</say-as>" + "</speak>"); responseBuilder .add("Would you like to try another helper?") .addSuggestions(new String[] {"Confirmation", "Permission", "Place"}); return responseBuilder.build(); }
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "responseId": "2b0a039d-b033-4256-bd8a-ebb1f0ad90b4-712767ed", "queryResult": { "queryText": "actions_intent_DATETIME", "action": "DateTime.DateTime-custom", "parameters": {}, "allRequiredParamsPresent": true, "fulfillmentText": "Webhook failed for intent: Date Time Handler", "fulfillmentMessages": [ { "text": { "text": [ "Webhook failed for intent: Date Time Handler" ] } } ], "outputContexts": [ { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/actions_capability_audio_output" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/actions_capability_screen_output" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/actions_capability_media_response_audio" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/actions_capability_account_linking" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/actions_capability_web_browser" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/google_assistant_input_type_keyboard" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/datetime-followup", "lifespanCount": 1 }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY/contexts/actions_intent_datetime", "parameters": { "DATETIME": "2019-08-14T10:30:00", "text": "1030am" } } ], "intent": { "name": "projects/df-helpers-kohler/agent/intents/3c145f18-32fe-40aa-842e-b99ab28c3f2a", "displayName": "Date Time Handler" }, "intentDetectionConfidence": 1, "languageCode": "en" }, "originalDetectIntentRequest": { "source": "google", "version": "2", "payload": { "user": { "locale": "en-US", "userVerificationStatus": "VERIFIED" }, "conversation": { "conversationId": "ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY", "type": "ACTIVE", "conversationToken": "[\"datetime-followup\"]" }, "inputs": [ { "intent": "actions.intent.DATETIME", "rawInputs": [ { "inputType": "KEYBOARD", "query": "1030am" } ], "arguments": [ { "name": "DATETIME", "datetimeValue": { "date": { "year": 2019, "month": 8, "day": 14 }, "time": { "hours": 10, "minutes": 30 } } }, { "name": "text", "rawText": "1030am", "textValue": "1030am" } ] } ], "surface": { "capabilities": [ { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "name": "actions.capability.ACCOUNT_LINKING" }, { "name": "actions.capability.WEB_BROWSER" } ] }, "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" } ] } ] } }, "session": "projects/df-helpers-kohler/agent/sessions/ABwppHHnU7RSIOU994H8vd2wLYXbnoIAs3rk-4zUeiRAaX3aJ0dp68Y50MgvddE2stYuI6Hlu-MfWO75Gz76EeY" }
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "user": { "profile": { "displayName": "Sachit Mishra", "givenName": "Sachit", "familyName": "Mishra" }, "permissions": [ "DEVICE_PRECISE_LOCATION", "NAME" ], "locale": "en-US", "userVerificationStatus": "VERIFIED" }, "conversation": { "conversationId": "ABwppHEcidO2jguO4hS8maDeMVx8aasSCcBWZHrF3EmOMIaWRP9qF0BcACistiIoeyiSNTW6KD_tqN_U-xAIOXhPvA", "type": "NEW" }, "inputs": [ { "intent": "actions.intent.DATETIME", "rawInputs": [ { "inputType": "KEYBOARD", "query": "430pm" } ], "arguments": [ { "name": "DATETIME", "datetimeValue": { "date": { "year": 2019, "month": 8, "day": 18 }, "time": { "hours": 16, "minutes": 30 } } }, { "name": "text", "rawText": "430pm", "textValue": "430pm" } ] } ], "surface": { "capabilities": [ { "name": "actions.capability.ACCOUNT_LINKING" }, { "name": "actions.capability.WEB_BROWSER" }, { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "name": "actions.capability.SCREEN_OUTPUT" } ] }, "device": { "location": { "coordinates": { "latitude": 37.4197238, "longitude": -122.08212759999999 }, "formattedAddress": "Google Building 45 1585 Charleston Road, Mountain View, California 94043", "zipCode": "94043", "city": "Mountain View" } }, "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" } ] } ] }
Вход в учетную запись
Вы можете разрешить пользователям входить в свои учетные записи, связанные с вашей службой, запросив выполнение намерения actions.intent.SIGN_IN
. Пользователи не могут войти в систему с помощью голоса через OAuth.
Вызов помощника
В следующем примере кода показано, как можно вызвать помощник с помощью клиентской библиотеки. Фрагменты JSON показывают соответствующий ответ веб-перехватчика.
Node.js
const {SignIn} = require('actions-on-google'); app.intent('ask_for_sign_in_detail', (conv) => { conv.ask(new SignIn()); });
Ява
ResponseBuilder responseBuilder = getResponseBuilder(request); return responseBuilder.add("This is the SignIn helper intent").add(new SignIn()).build();
JSON
{ "payload": { "google": { "expectUserResponse": true, "systemIntent": { "intent": "actions.intent.SIGN_IN", "data": { "@type": "type.googleapis.com/google.actions.v2.SignInValueSpec" } } } } }
JSON
{ "expectUserResponse": true, "expectedInputs": [ { "possibleIntents": [ { "intent": "actions.intent.SIGN_IN", "inputValueData": { "@type": "type.googleapis.com/google.actions.v2.SignInValueSpec" } } ] } ] }
Получение результатов помощника
В следующем примере кода показано, как получить доступ к результату помощника с помощью клиентской библиотеки. Фрагменты JSON представляют собой запрос, содержащий результат помощника, который получит ваше выполнение.
В приведенном ниже фрагменте показано, как проверить, предоставил ли пользователь доступ и как получить доступ к данным.
Node.js
app.intent('ask_for_sign_in_confirmation', (conv, params, signin) => { if (signin.status !== 'OK') { return conv.ask('You need to sign in before using the app.'); } // const access = conv.user.access.token; // possibly do something with access token return conv.ask('Great! Thanks for signing in.'); });
Ява
ResponseBuilder responseBuilder = getResponseBuilder(request); boolean signedIn = request.isSignInGranted(); return responseBuilder .add(signedIn ? "Great! Thanks for signin in." : "You must sign in before using the app.") .build();
JSON
{ "responseId": "", "queryResult": { "queryText": "", "action": "", "parameters": {}, "allRequiredParamsPresent": true, "fulfillmentText": "", "fulfillmentMessages": [], "outputContexts": [], "intent": { "name": "ask_for_sign_in_confirmation", "displayName": "ask_for_sign_in_confirmation" }, "intentDetectionConfidence": 1, "diagnosticInfo": {}, "languageCode": "" }, "originalDetectIntentRequest": { "source": "google", "version": "2", "payload": { "isInSandbox": true, "surface": { "capabilities": [ { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "name": "actions.capability.WEB_BROWSER" } ] }, "inputs": [ { "rawInputs": [], "intent": "", "arguments": [ { "name": "SIGN_IN", "extension": { "@type": "type.googleapis.com/google.actions.v2.SignInValue", "status": "OK" } } ] } ], "user": {}, "conversation": {}, "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "name": "actions.capability.WEB_BROWSER" } ] } ] } }, "session": "" }
JSON
{ "user": {}, "device": {}, "surface": { "capabilities": [ { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "name": "actions.capability.WEB_BROWSER" } ] }, "conversation": {}, "inputs": [ { "rawInputs": [], "intent": "ask_for_sign_in_confirmation", "arguments": [ { "name": "SIGN_IN", "extension": { "@type": "type.googleapis.com/google.actions.v2.SignInValue", "status": "OK" } } ] } ], "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "name": "actions.capability.WEB_BROWSER" } ] } ] }
Место и расположение
Вы можете получить местоположение от пользователей, запросив выполнение намерения actions.intent.PLACE
. Этот помощник используется для запроса у пользователя адресов и других местоположений, включая любые места дома/работы/контактов, которые они сохранили в Google.
Сохраненные местоположения вернут только адрес, а не связанное сопоставление (например, «123 Main St», а не «HOME = 123 Main St»).
Вызов помощника
В следующем примере кода показано, как можно вызвать помощник с помощью клиентской библиотеки. Фрагменты JSON показывают соответствующий ответ веб-перехватчика.
Node.js
app.intent('Place', (conv) => { const options = { context: 'To find a location', prompt: 'Where would you like to go?', }; conv.ask(new Place(options)); });
Ява
@ForIntent("Place") public ActionResponse getPlace(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder .add("PLACEHOLDER") .add( new Place() .setRequestPrompt("Where would you like to go?") .setPermissionContext("To find a location")); return responseBuilder.build(); }
Node.js
const options = { context: 'To find a location', prompt: 'Where would you like to go?', }; conv.ask(new Place(options));
Ява
ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder .add("PLACEHOLDER") .add( new Place() .setRequestPrompt("Where would you like to go?") .setPermissionContext("To find a location")); return responseBuilder.build();
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "payload": { "google": { "expectUserResponse": true, "systemIntent": { "intent": "actions.intent.PLACE", "data": { "@type": "type.googleapis.com/google.actions.v2.PlaceValueSpec", "dialogSpec": { "extension": { "@type": "type.googleapis.com/google.actions.v2.PlaceValueSpec.PlaceDialogSpec", "permissionContext": "To find a location", "requestPrompt": "Where would you like to go?" } } } } } } }
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "expectUserResponse": true, "expectedInputs": [ { "possibleIntents": [ { "intent": "actions.intent.PLACE", "inputValueData": { "@type": "type.googleapis.com/google.actions.v2.PlaceValueSpec", "dialogSpec": { "extension": { "@type": "type.googleapis.com/google.actions.v2.PlaceValueSpec.PlaceDialogSpec", "permissionContext": "To find a location", "requestPrompt": "Where would you like to go?" } } } } ] } ] }
Получение результатов помощника
В следующем примере кода показано, как получить доступ к результату помощника с помощью клиентской библиотеки. Фрагменты JSON представляют собой запрос, содержащий результат помощника, который получит ваше выполнение.
В приведенном ниже фрагменте показано, как проверить, предоставил ли пользователь доступ и как получить доступ к данным.
Node.js
app.intent('Place Handler', (conv, params, place) => { if (!place) { conv.ask(`Sorry, I couldn't get a location from you.`); } else { // Place also contains formattedAddress and coordinates const {name} = place; conv.ask(`${name} sounds like a great place to go!`); } conv.ask('Would you like to try another helper?'); conv.ask(new Suggestions([ 'Confirmation', 'DateTime', 'Permission', ])); });
Ява
@ForIntent("Place Handler") public ActionResponse handlePlace(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); Location location = request.getPlace(); if (location == null) { responseBuilder.add("Sorry, I couldn't get a location from you."); } else { responseBuilder.add(location.getName() + " sounds like a great place to go!"); } responseBuilder .add("Would you like to try another helper?") .addSuggestions(new String[] {"Confirmation", "DateTime", "Permission"}); return responseBuilder.build(); }
Node.js
app.intent('actions.intent.PLACE', (conv) => { const place = conv.arguments.get('PLACE'); if (!place) { conv.ask(`Sorry, I couldn't get a location from you.`); } else { // Place also contains formattedAddress and coordinates const {name} = place; conv.ask(`${name} sounds like a great place to go!`); } conv.ask('Would you like to try another helper?'); conv.ask(new Suggestions([ 'Confirmation', 'DateTime', 'Permission', ])); });
Ява
@ForIntent("actions.intent.PLACE") public ActionResponse handlePlace(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); Location location = request.getPlace(); if (location == null) { responseBuilder.add("Sorry, I couldn't get a location from you."); } else { responseBuilder.add(location.getName() + " sounds like a great place to go!"); } responseBuilder .add("Would you like to try another helper?") .addSuggestions(new String[] {"Confirmation", "DateTime", "Permission"}); return responseBuilder.build(); }
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "responseId": "ce99fd40-b9ed-4151-bc99-f25db9eda8c5-712767ed", "queryResult": { "queryText": "actions_intent_PLACE", "action": "Place.Place-custom", "parameters": {}, "allRequiredParamsPresent": true, "fulfillmentText": "Webhook failed for intent: Place Handler", "fulfillmentMessages": [ { "text": { "text": [ "Webhook failed for intent: Place Handler" ] } } ], "outputContexts": [ { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_audio_output" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_screen_output" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_media_response_audio" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_account_linking" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_web_browser" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/google_assistant_input_type_keyboard" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/place-followup", "lifespanCount": 1 }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_intent_place", "parameters": { "PLACE": "KFC, 2523 North Carson Street, Carson City, NV 89706, United States", "text": "yes" } } ], "intent": { "name": "projects/df-helpers-kohler/agent/intents/4cf9e154-e151-44db-ae79-84d8c5a707de", "displayName": "Place Handler" }, "intentDetectionConfidence": 1, "languageCode": "en" }, "originalDetectIntentRequest": { "source": "google", "version": "2", "payload": { "user": { "permissions": [ "DEVICE_PRECISE_LOCATION" ], "locale": "en-US", "userVerificationStatus": "VERIFIED" }, "conversation": { "conversationId": "ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA", "type": "ACTIVE", "conversationToken": "[\"place-followup\"]" }, "inputs": [ { "intent": "actions.intent.PLACE", "rawInputs": [ { "inputType": "KEYBOARD", "query": "Query handled by Actions on Google" } ], "arguments": [ { "name": "PLACE", "placeValue": { "coordinates": { "latitude": 39.182895, "longitude": -119.7679113 }, "formattedAddress": "KFC, 2523 North Carson Street, Carson City, NV 89706, United States", "name": "KFC", "placeId": "ChIJZfBpmMEKmYARFsfc574LgB8" } }, { "name": "text", "rawText": "yes", "textValue": "yes" } ] } ], "surface": { "capabilities": [ { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "name": "actions.capability.ACCOUNT_LINKING" }, { "name": "actions.capability.WEB_BROWSER" } ] }, "device": { "location": { "coordinates": { "latitude": 39.2814592, "longitude": -120.12421119999999 }, "formattedAddress": "Currant Road, Truckee, California 96161", "zipCode": "96161", "city": "Truckee" } }, "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.WEB_BROWSER" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.AUDIO_OUTPUT" } ] } ] } } }
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "user": { "permissions": [ "DEVICE_PRECISE_LOCATION" ], "locale": "en-US", "userVerificationStatus": "VERIFIED" }, "conversation": { "conversationId": "ABwppHEcidO2jguO4hS8maDeMVx8aasSCcBWZHrF3EmOMIaWRP9qF0BcACistiIoeyiSNTW6KD_tqN_U-xAIOXhPvA", "type": "NEW" }, "inputs": [ { "intent": "actions.intent.PLACE", "rawInputs": [ { "inputType": "KEYBOARD", "query": "Query handled by Actions on Google" } ], "arguments": [ { "name": "PLACE", "placeValue": { "coordinates": { "latitude": 37.4219999, "longitude": -122.0840575 }, "formattedAddress": "Googleplex, 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States", "name": "Googleplex", "placeId": "ChIJj61dQgK6j4AR4GeTYWZsKWw" } }, { "name": "text", "rawText": "googleplex", "textValue": "googleplex" } ] } ], "surface": { "capabilities": [ { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "name": "actions.capability.ACCOUNT_LINKING" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" } ] }, "device": { "location": { "coordinates": { "latitude": 37.4197238, "longitude": -122.08212759999999 }, "formattedAddress": "Google Building 45 1585 Charleston Road, Mountain View, California 94043", "zipCode": "94043", "city": "Mountain View" } }, "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" }, { "name": "actions.capability.AUDIO_OUTPUT" } ] } ] }
Подтверждение
Вы можете запросить у пользователя общее подтверждение (вопрос да/нет) и получить результирующий ответ. Грамматика «да» и «нет» естественным образом расширяется до таких слов, как «Да» или «Нет», что делает ее пригодной для использования во многих ситуациях.
Вызов помощника
В следующем примере кода показано, как можно вызвать помощник с помощью клиентской библиотеки. Фрагменты JSON показывают соответствующий ответ веб-перехватчика.
Вы можете указать собственный запрос при запросе у пользователя подтверждения.
Node.js
app.intent('Confirmation', (conv) => { conv.ask(new Confirmation('Can you confirm?')); });
Ява
@ForIntent("Confirmation") public ActionResponse getConfirmation(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder .add("PLACEHOLDER") .add(new Confirmation().setConfirmationText("Can you confirm?")); return responseBuilder.build(); }
Node.js
conv.ask(new Confirmation('Can you confirm?'));
Ява
ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder .add("PLACEHOLDER") .add(new Confirmation().setConfirmationText("Can you confirm?")); return responseBuilder.build();
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "payload": { "google": { "expectUserResponse": true, "systemIntent": { "intent": "actions.intent.CONFIRMATION", "data": { "@type": "type.googleapis.com/google.actions.v2.ConfirmationValueSpec", "dialogSpec": { "requestConfirmationText": "Can you confirm?" } } } } } }
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "expectUserResponse": true, "expectedInputs": [ { "possibleIntents": [ { "intent": "actions.intent.CONFIRMATION", "inputValueData": { "@type": "type.googleapis.com/google.actions.v2.ConfirmationValueSpec", "dialogSpec": { "requestConfirmationText": "Can you confirm?" } } } ] } ] }
Получение результатов помощника
В следующем примере кода показано, как получить доступ к результату помощника с помощью клиентской библиотеки. Фрагменты JSON представляют собой запрос, содержащий результат помощника, который получит ваше выполнение.
После того, как пользователь ответит помощнику, вы получите запрос на ваше выполнение и сможете проверить, подтвердил пользователь или нет.
Node.js
app.intent('Confirmation Handler', (conv, params, confirmationGranted) => { conv.ask(confirmationGranted ? 'Thank you for confirming' : 'No problem, you have not confirmed'); conv.ask('Would you like to try another helper?'); conv.ask(new Suggestions([ 'DateTime', 'Permission', 'Place', ])); });
Ява
@ForIntent("Confirmation Handler") public ActionResponse handleConfirmation(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); boolean userConfirmation = request.getUserConfirmation(); responseBuilder .add(userConfirmation ? "Thank you for confirming" : "No problem, you have not confirmed") .addSuggestions(new String[] {"Place", "DateTime", "Permission"}); return responseBuilder.build(); }
Node.js
app.intent('actions.intent.CONFIRMATION', (conv, confirmationGranted) => { conv.ask(confirmationGranted ? 'Thank you for confirming' : 'No problem, you have not confirmed'); conv.ask('Would you like to try another helper?'); conv.ask(new Suggestions([ 'DateTime', 'Permission', 'Place', ])); });
Ява
@ForIntent("actions.intent.CONFIRMATION") public ActionResponse handleConfirmation(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); boolean userConfirmation = request.getUserConfirmation(); responseBuilder .add(userConfirmation ? "Thank you for confirming" : "No problem, you have not confirmed") .addSuggestions(new String[] {"Place", "DateTime", "Permission"}); return responseBuilder.build(); }
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "responseId": "26c3dd46-321c-4ab5-9f6c-a445f6d5de01-712767ed", "queryResult": { "queryText": "actions_intent_CONFIRMATION", "parameters": {}, "allRequiredParamsPresent": true, "fulfillmentText": "Webhook failed for intent: Confirmation Handler", "fulfillmentMessages": [ { "text": { "text": [ "Webhook failed for intent: Confirmation Handler" ] } } ], "outputContexts": [ { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_account_linking" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_media_response_audio" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_audio_output" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_web_browser" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_capability_screen_output" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/google_assistant_input_type_keyboard" }, { "name": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA/contexts/actions_intent_confirmation", "parameters": { "CONFIRMATION": true, "text": "yes" } } ], "intent": { "name": "projects/df-helpers-kohler/agent/intents/11cc7c8e-0710-42ea-9cd9-723aff03e97f", "displayName": "Confirmation Handler" }, "intentDetectionConfidence": 1, "languageCode": "en" }, "originalDetectIntentRequest": { "source": "google", "version": "2", "payload": { "user": { "locale": "en-US", "userVerificationStatus": "VERIFIED" }, "conversation": { "conversationId": "ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA", "type": "ACTIVE", "conversationToken": "[]" }, "inputs": [ { "intent": "actions.intent.CONFIRMATION", "rawInputs": [ { "inputType": "KEYBOARD", "query": "yes" } ], "arguments": [ { "name": "CONFIRMATION", "boolValue": true }, { "name": "text", "rawText": "yes", "textValue": "yes" } ] } ], "surface": { "capabilities": [ { "name": "actions.capability.ACCOUNT_LINKING" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" }, { "name": "actions.capability.SCREEN_OUTPUT" } ] }, "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" } ] } ] } }, "session": "projects/df-helpers-kohler/agent/sessions/ABwppHEdLCo3vaqVs-pED_sPQDIUr_Ls5JYICyNks9vKbfUaIF8n4P7fYsKEYSiKvD3Vmnli9deu_uTB8s3nPeA" }
JSON
Обратите внимание, что приведенный ниже JSON описывает запрос веб-перехватчика.
{ "user": { "locale": "en-US", "userVerificationStatus": "VERIFIED" }, "conversation": { "conversationId": "ABwppHGY8XRtymCExS313Cc6Vp42zR0uQuGf6BwpSW0772Er-rxSTtFjs3KfGYu6jCDgHbA8IKVWjB8Gr9odc4yHhg", "type": "NEW" }, "inputs": [ { "intent": "actions.intent.CONFIRMATION", "rawInputs": [ { "inputType": "KEYBOARD", "query": "yes" } ], "arguments": [ { "name": "CONFIRMATION", "boolValue": true }, { "name": "text", "rawText": "yes", "textValue": "yes" } ] } ], "surface": { "capabilities": [ { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" }, { "name": "actions.capability.ACCOUNT_LINKING" }, { "name": "actions.capability.AUDIO_OUTPUT" } ] }, "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" } ] } ] }