Чтобы дать вам еще больше гибкости при создании действий, вы можете делегировать логику веб-службам HTTPS (выполнение). Ваши действия могут запускать веб-перехватчики, которые отправляют запросы к конечной точке HTTPS. Некоторые примеры того, что вы можете сделать для реализации, включают в себя:
- Генерация динамической подсказки на основе информации, предоставленной пользователем.
- Размещение заказа во внешней системе и подтверждение успеха.
- Проверка слотов с серверными данными.
Триггеры и обработчики вебхуков
Ваши действия могут активировать веб-перехватчик в намерениях или сценах вызова, который отправляет запрос на вашу конечную точку выполнения. Ваше выполнение содержит обработчики веб-перехватчиков, которые обрабатывают полезные данные JSON в запросе. Вы можете активировать веб-перехватчики в следующих ситуациях:
- После совпадения намерения вызова
- Во время сцены на сцене
- После того, как условие оценивается как истинное на этапе условия сцены
- На этапе заполнения слота сцены
- После совпадения намерений на этапе ввода сцены
Когда вы активируете веб-перехватчик в своих действиях, Google Assistant отправляет запрос с полезной нагрузкой JSON на ваше выполнение, которое содержит имя обработчика, который будет использоваться для обработки события. Ваша конечная точка выполнения может направить событие соответствующему обработчику для выполнения логики и возврата соответствующего ответа с полезной нагрузкой JSON .
Полезная нагрузка
В следующих фрагментах показаны примеры запросов, которые ваши Действия отправляют на выполнение, и ответ, который ваше выполнение отправляет обратно. Дополнительные сведения см. в справочной документации .
Пример запроса
{
"handler": {
"name": "handler_name"
},
"intent": {
"name": "actions.intent.MAIN",
"params": {},
"query": ""
},
"scene": {
"name": "SceneName",
"slotFillingStatus": "UNSPECIFIED",
"slots": {}
},
"session": {
"id": "example_session_id",
"params": {},
"typeOverrides": []
},
"user": {
"locale": "en-US",
"params": {
"verificationStatus": "VERIFIED"
}
},
"home": {
"params": {}
},
"device": {
"capabilities": [
"SPEECH",
"RICH_RESPONSE",
"LONG_FORM_AUDIO"
]
}
}
Пример ответа
{
"session": {
"id": "example_session_id",
"params": {}
},
"prompt": {
"override": false,
"firstSimple": {
"speech": "Hello World.",
"text": ""
}
},
"scene": {
"name": "SceneName",
"slots": {},
"next": {
"name": "actions.scene.END_CONVERSATION"
}
}
}
Взаимодействие во время выполнения
В следующих разделах описаны общие задачи, которые можно выполнять в обработчиках веб-перехватчиков.
Отправить подсказки
Вы можете создавать подсказки с простым текстом, форматированным текстом, карточками и даже полноценными подсказками HTML, поддерживаемыми веб-приложением с Interactive Canvas . Документация по подсказкам содержит полную информацию о том, как создать подсказку при обработке события веб-перехватчика. В следующих фрагментах показано приглашение карты:
Node.js
app.handle('rich_response', conv => {
conv.add('This is a card rich response.');
conv.add(new Card({
title: 'Card Title',
subtitle: 'Card Subtitle',
text: 'Card Content',
image: new Image({
url: 'https://developers.google.com/assistant/assistant_96.png',
alt: 'Google Assistant logo'
})
}));
});
Ответ JSON
{
"session": {
"id": "example_session_id",
"params": {}
},
"prompt": {
"override": false,
"content": {
"card": {
"title": "Card Title",
"subtitle": "Card Subtitle",
"text": "Card Content",
"image": {
"alt": "Google Assistant logo",
"height": 0,
"url": "https://developers.google.com/assistant/assistant_96.png",
"width": 0
}
}
},
"firstSimple": {
"speech": "This is a card rich response.",
"text": ""
}
}
}
Чтение параметров намерения
Когда среда выполнения Assistant соответствует намерению, она извлекает все определенные параметры. Исходное свойство — это то, что пользователь предоставил в качестве входных данных, а разрешенное свойство — это то, что NLU разрешил входные данные на основе спецификации типа.
Node.js
conv.intent.params['param_name'].original
conv.intent.params['param_name'].resolved
Запросить JSON
{
"handler": {
"name": "handler_name"
},
"intent": {
"name": "intent_name",
"params": {
"slot_name": {
"original": "1",
"resolved": 1
}
},
"query": ""
},
"scene": {
"name": "SceneName",
"slotFillingStatus": "UNSPECIFIED",
"slots": {},
"next": {
"name": "actions.scene.END_CONVERSATION"
}
},
"session": {
"id": "session_id",
"params": {},
"typeOverrides": []
},
"user": {
"locale": "en-US",
"params": {
"verificationStatus": "VERIFIED"
}
},
"home": {
"params": {}
},
"device": {
"capabilities": [
"SPEECH",
"RICH_RESPONSE",
"LONG_FORM_AUDIO"
]
}
}
Чтение локали пользователя
Это значение соответствует языковому стандарту пользователя для Google Assistant.
Node.js
conv.user.locale
JSON
{
"handler": {
"name": "handler_name"
},
"intent": {
"name": "actions.intent.MAIN",
"params": {},
"query": ""
},
"scene": {
"name": "SceneName",
"slotFillingStatus": "UNSPECIFIED",
"slots": {}
},
"session": {
"id": "session_id",
"params": {},
"typeOverrides": []
},
"user": {
"locale": "en-US",
"params": {
"verificationStatus": "VERIFIED"
}
},
"home": {
"params": {}
},
"device": {
"capabilities": [
"SPEECH",
"RICH_RESPONSE",
"LONG_FORM_AUDIO"
]
}
}
Хранилище чтения и записи
См. документацию по хранилищу для получения полной информации о том, как использовать различные функции хранилища.
Node.js
//read
conv.session.params.key
conv.user.params.key
conv.home.params.key
// write
conv.session.params.key = value
conv.user.params.key = value
conv.home.params.key = value
Запросить JSON
{
"handler": {
"name": "handler_name"
},
"intent": {
"name": "actions.intent.MAIN",
"params": {},
"query": ""
},
"scene": {
"name": "SceneName",
"slotFillingStatus": "UNSPECIFIED",
"slots": {}
},
"session": {
"id": "session_id",
"params": {
"key": "value"
},
"typeOverrides": [],
"languageCode": ""
},
"user": {
"locale": "en-US",
"params": {
"verificationStatus": "VERIFIED",
"key": "value"
}
},
"home": {
"params": {
"key": "value"
}
},
"device": {
"capabilities": [
"SPEECH",
"RICH_RESPONSE",
"LONG_FORM_AUDIO"
]
}
}
Ответ JSON
{
"session": {
"id": "session_id",
"params": {
"key": "value"
}
},
"prompt": {
"override": false,
"firstSimple": {
"speech": "Hello world.",
"text": ""
}
},
"user": {
"locale": "en-US",
"params": {
"verificationStatus": "VERIFIED",
"key": "value"
}
},
"home": {
"params": {
"key": "value"
}
}
}
Проверить возможности устройства
Вы можете проверить возможности устройства для предоставления различных возможностей или потоков общения.
Node.js
const supportsRichResponse = conv.device.capabilities.includes("RICH_RESPONSE");
const supportsLongFormAudio = conv.device.capabilities.includes("LONG_FORM_AUDIO");
const supportsSpeech = conv.device.capabilities.includes("SPEECH");
const supportsInteractiveCanvas = conv.device.capabilities.includes("INTERACTIVE_CANVAS");
Запросить JSON
{
"handler": {
"name": "handler_name"
},
"intent": {
"name": "actions.intent.MAIN",
"params": {},
"query": ""
},
"scene": {
"name": "SceneName",
"slotFillingStatus": "UNSPECIFIED",
"slots": {}
},
"session": {
"id": "session_id",
"params": {},
"typeOverrides": [],
"languageCode": ""
},
"user": {
"locale": "en-US",
"params": {
"verificationStatus": "VERIFIED"
}
},
"home": {
"params": {}
},
"device": {
"capabilities": [
"SPEECH",
"RICH_RESPONSE",
"LONG_FORM_AUDIO",
"INTERACTIVE_CANVAS"
]
}
}
Полный список возможностей поверхности см. в справочнике Capability
.
Переопределение типа среды выполнения
Типы среды выполнения позволяют изменять спецификации типов во время выполнения. Вы можете использовать эту функцию для загрузки данных из других источников, чтобы заполнить допустимые значения типа. Например, вы можете использовать переопределение типа во время выполнения, чтобы добавить динамические параметры к вопросу опроса или добавить ежедневный элемент в меню.
Чтобы использовать типы времени выполнения, вы запускаете веб-перехватчик из своего действия, которое вызывает обработчик в вашем выполнении. Оттуда вы можете заполнить параметр session.typeOverrides
в ответ на ваше действие. Доступные режимы включают TYPE_MERGE
для сохранения существующих записей типов или TYPE_REPLACE
для замены существующих записей переопределениями.
Node.js
conv.session.typeOverrides = [{
name: type_name,
mode: 'TYPE_REPLACE',
synonym: {
entries: [
{
name: 'ITEM_1',
synonyms: ['Item 1', 'First item']
},
{
name: 'ITEM_2',
synonyms: ['Item 2', 'Second item']
},
{
name: 'ITEM_3',
synonyms: ['Item 3', 'Third item']
},
{
name: 'ITEM_4',
synonyms: ['Item 4', 'Fourth item']
},
]
}
}];
Ответ JSON
{
"session": {
"id": "session_id",
"params": {},
"typeOverrides": [
{
"name": "type_name",
"synonym": {
"entries": [
{
"name": "ITEM_1",
"synonyms": [
"Item 1",
"First item"
]
},
{
"name": "ITEM_2",
"synonyms": [
"Item 2",
"Second item"
]
},
{
"name": "ITEM_3",
"synonyms": [
"Item 3",
"Third item"
]
},
{
"name": "ITEM_4",
"synonyms": [
"Item 4",
"Fourth item"
]
}
]
},
"typeOverrideMode": "TYPE_REPLACE"
}
]
},
"prompt": {
"override": false,
"firstSimple": {
"speech": "This is an example prompt.",
"text": "This is an example prompt."
}
}
}
Обеспечьте искажение речи
Смещение речи позволяет указать подсказки для NLU, чтобы улучшить сопоставление намерений. Вы можете указать до 1000 записей.
Node.js
conv.expected.speech = ['value_1', 'value_2']
conv.expected.language = 'locale_string'
Ответ JSON
{
"session": {
"id": "session_id",
"params": {}
},
"prompt": {
"override": false,
"firstSimple": {
"speech": "This is an example prompt.",
"text": "This is an example prompt."
}
},
"expected": {
"speech": "['value_1', 'value_2']",
"language": "locale_string"
}
}
Сцены перехода
Помимо определения статических переходов в проекте Actions, вы можете вызывать переходы между сценами во время выполнения.
Node.js
app.handle('transition_to_hidden_scene', conv => {
// Dynamic transition
conv.scene.next.name = "HiddenScene";
});
Ответ JSON
{
"session": {
"id": "session_id",
"params": {}
},
"prompt": {
"override": false,
"firstSimple": {
"speech": "This is an example prompt.",
"text": ""
}
},
"scene": {
"name": "SceneName",
"slots": {},
"next": {
"name": "HiddenScene"
}
}
}
Читать слоты сцен
Во время заполнения слота вы можете использовать выполнение для проверки слота или проверки состояния заполнения слота ( SlotFillingStatus
).
Node.js
conv.scene.slotFillingStatus // FINAL means all slots are filled
conv.scene.slots // Object that contains all the slots
conv.scene.slots['slot_name'].<property_name> // Accessing a specific slot's properties
Например, предположим, что вы хотите извлечь часовой пояс из ответа. В этом примере имя слота — datetime1
. Чтобы получить часовой пояс, вы должны использовать:
conv.scene.slots['datetime1'].value.time_zone.id
Запросить JSON
{
"handler": {
"name": "handler_name"
},
"intent": {
"name": "",
"params": {
"slot_name": {
"original": "1",
"resolved": 1
}
},
"query": ""
},
"scene": {
"name": "SceneName",
"slotFillingStatus": "FINAL",
"slots": {
"slot_name": {
"mode": "REQUIRED",
"status": "SLOT_UNSPECIFIED",
"updated": true,
"value": 1
}
},
"next": {
"name": "actions.scene.END_CONVERSATION"
}
},
"session": {
"id": "session_id",
"params": {
"slot_name": 1
},
"typeOverrides": []
},
"user": {
"locale": "en-US",
"params": {
"verificationStatus": "VERIFIED"
}
},
"home": {
"params": {}
},
"device": {
"capabilities": [
"SPEECH",
"RICH_RESPONSE",
"LONG_FORM_AUDIO"
]
}
}
Недействительные слоты сцены
Вы можете аннулировать слоты и заставить пользователя указать новое значение.
Node.js
conv.scene.slots['slot_name'].status = 'INVALID'
Ответ JSON
{
"session": {
"id": "session_id",
"params": {
"slot_name": 1
}
},
"prompt": {
"override": false,
"firstSimple": {
"speech": "This is an example prompt.",
"text": ""
}
},
"scene": {
"name": "SceneName",
"slots": {
"slot_name": {
"mode": "REQUIRED",
"status": "INVALID",
"updated": true,
"value": 1
}
},
"next": {
"name": "actions.scene.END_CONVERSATION"
}
}
}
Варианты развития
Actions Builder предоставляет встроенный редактор под названием «Редактор облачных функций» , который позволяет создавать и развертывать облачные функции для Firebase непосредственно в консоли. Вы также можете создать и развернуть выполнение на выбранном вами хостинге и зарегистрировать конечную точку выполнения HTTPS в качестве обработчика веб-перехватчиков.
Встроенный редактор
Для разработки с помощью редактора Cloud Functions:
- Откройте проект Actions и перейдите на вкладку «Разработка» > «Веб-перехватчик» > «Изменить метод выполнения» . Появится окно Методы выполнения .
- Выберите «Встроенные облачные функции» и нажмите «Подтвердить» .
Внешняя конечная точка HTTPS
В этом разделе описывается, как настроить облачные функции для Firebase в качестве службы выполнения вашего разговорного действия. Однако вы можете развернуть выполнение в выбранной вами службе хостинга.
Настройка среды
Чтобы настроить среду, выполните следующие действия.
- Скачайте и установите Node.js.
Настройте и инициализируйте Firebase CLI. Если следующая команда завершается с ошибкой
EACCES
, вам может потребоваться изменить разрешения npm .npm install -g firebase-tools
Аутентифицируйте инструмент firebase с помощью своей учетной записи Google:
firebase login
Запустите каталог проекта, в котором вы сохранили проект Actions . Вам будет предложено выбрать, какие функции интерфейса командной строки Firebase вы хотите настроить для своего проекта Actions. Выберите
Functions
и другие функции, которые вы, возможно, захотите использовать, например Firestore, затем нажмите Enter, чтобы подтвердить и продолжить:$ cd <ACTIONS_PROJECT_DIRECTORY> $ firebase init
Свяжите инструмент Firebase с вашим проектом Actions, выбрав его с помощью клавиш со стрелками для навигации по списку проектов:
После выбора проекта инструмент Firebase запускает настройку функций и спрашивает, какой язык вы хотите использовать. Выберите с помощью клавиш со стрелками и нажмите Enter , чтобы продолжить.
=== Functions Setup A functions directory will be created in your project with a Node.js package pre-configured. Functions can be deployed with firebase deploy. ? What language would you like to use to write Cloud Functions? (Use arrow keys) > JavaScript TypeScript
Выберите, хотите ли вы использовать ESLint для выявления возможных ошибок и применения стиля, набрав Y или N :
? Do you want to use ESLint to catch probable bugs and enforce style? (Y/n)
Получите зависимости проекта, введя Y в командной строке:
? Do you want to install dependencies with npm now? (Y/n)
После завершения настройки вы увидите вывод, подобный следующему:
✔ Firebase initialization complete!
Установите зависимость @assistant/conversation :
$ cd <ACTIONS_PROJECT_DIRECTORY>/functions $ npm install @assistant/conversation --save
Получите зависимости выполнения и разверните функцию выполнения:
$ npm install $ firebase deploy --only functions
Развертывание занимает несколько минут. После завершения вы увидите вывод, подобный следующему. Вам понадобится URL-адрес функции для входа в Dialogflow.
✔ Deploy complete!
Project Console: https://console.firebase.google.com/project/<PROJECT_ID>/overview Function URL (<FUNCTION_NAME>): https://us-central1-<PROJECT_ID>.cloudfunctions.net/<FUNCTION_NAME>Скопируйте URL-адрес выполнения, чтобы использовать его в следующем разделе.
Зарегистрировать обработчик вебхука
Чтобы зарегистрировать конечную точку Cloud Function в качестве обработчика веб-перехватчиков:
- В консоли Actions щелкните Develop > Webhook .
- Щелкните Изменить способ выполнения . Появится окно Методы выполнения .
- Выберите Webhook и нажмите «Подтвердить» .
- Вставьте URL-адрес веб-службы в поле Webhook .
- Нажмите Сохранить .