В этом разделе описывается формат полезных данных JSON, когда Actions on Google вызывает ваше выполнение через Dialogflow v2.
Если вы используете Dialogflow для создания действий, ваше выполнение связывается с Dialogflow через его собственный стандартный формат веб-перехватчика вместо формата веб-перехватчика Actions on Google. Формат веб-перехватчика Dialogflow содержит всю информацию о формате веб-перехватчика диалога , а также дополнительные данные, специфичные для Dialogflow, такие как информация о контекстах и параметрах.
Чтобы увидеть больше примеров сообщений JSON для веб-хуков Dialogflow, вы можете обратиться к этому проекту GitHub .
Тело запроса
Сообщение запроса от Dialogflow содержит данные в формате веб-перехватчика Dialogflow. Этот объект включает в себя действия над информацией, относящейся к Google, как описано ниже:
-  Значение originalDetectIntentRequest.source— «google».
-  originalDetectIntentRequest.versionуказывает версию Actions on Google для запроса.
-  Файл originalDetectIntentRequest.payloadсодержит ключевые действия с информацией, специфичной для Google, включая JSON -запрос разговора от Ассистента.
-  Поле Conversation.conversationTokenне поддерживается запросами веб-перехватчика Dialogflow. Вместо этого ваше выполнение может использовать контекст Dialogflow для сохранения данных на протяжении всего разговора.
Простой пример запроса на вызов
В приведенном ниже фрагменте показан пример запроса на вызов в формате веб-перехватчика Dialogflow.
{
  "responseId": "c4b863dd-aafe-41ad-a115-91736b665cb9",
  "queryResult": {
    "queryText": "GOOGLE_ASSISTANT_WELCOME",
    "action": "input.welcome",
    "parameters": {},
    "allRequiredParamsPresent": true,
    "fulfillmentText": "",
    "fulfillmentMessages": [],
    "outputContexts": [
      {
        "name": "projects/${PROJECTID}/agent/sessions/${SESSIONID}/contexts/google_assistant_welcome"
      },
      {
        "name": "projects/${PROJECTID}/agent/sessions/${SESSIONID}/contexts/actions_capability_screen_output"
      },
      {
        "name": "projects/${PROJECTID}/agent/sessions/${SESSIONID}/contexts/google_assistant_input_type_voice"
      },
      {
        "name": "projects/${PROJECTID}/agent/sessions/${SESSIONID}/contexts/actions_capability_audio_output"
      },
      {
        "name": "projects/${PROJECTID}/agent/sessions/${SESSIONID}/contexts/actions_capability_web_browser"
      },
      {
        "name": "projects/${PROJECTID}/agent/sessions/${SESSIONID}/contexts/actions_capability_media_response_audio"
      }
    ],
    "intent": {
      "name": "projects/${PROJECTID}/agent/intents/8b006880-0af7-4ec9-a4c3-1cc503ea8260",
      "displayName": "Default Welcome Intent"
    },
    "intentDetectionConfidence": 1,
    "diagnosticInfo": {},
    "languageCode": "en-us"
  },
  "originalDetectIntentRequest": {
    "source": "google",
    "version": "2",
    "payload": {
      "isInSandbox": true,
      "surface": {
        "capabilities": [
          {
            "name": "actions.capability.SCREEN_OUTPUT"
          },
          {
            "name": "actions.capability.AUDIO_OUTPUT"
          },
          {
            "name": "actions.capability.WEB_BROWSER"
          },
          {
            "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
          }
        ]
      },
      "inputs": [
        {
          "rawInputs": [
            {
              "query": "Talk to my test app",
              "inputType": "VOICE"
            }
          ],
          "intent": "actions.intent.MAIN"
        }
      ],
      "user": {
        "lastSeen": "2018-03-16T22:08:48Z",
        "permissions": [
          "UPDATE"
        ],
        "locale": "en-US",
        "userId": "ABwppHEvwoXs18xBNzumk18p5h02bhRDp_riW0kTZKYdxB6-LfP3BJRjgPjHf1xqy1lxqS2uL8Z36gT6JLXSrSCZ"
      },
      "conversation": {
        "conversationId": "${SESSIONID}",
        "type": "NEW"
      },
      "availableSurfaces": [
        {
          "capabilities": [
            {
              "name": "actions.capability.SCREEN_OUTPUT"
            },
            {
              "name": "actions.capability.AUDIO_OUTPUT"
            }
          ]
        }
      ]
    }
  },
  "session": "projects/${PROJECTID}/agent/sessions/${SESSIONID}"
}
Пример простого запроса на разговор
В приведенном ниже фрагменте показан пример диалогового запроса в формате веб-перехватчика Dialogflow, где пользовательский ввод представляет собой текстовую строку.
{
  "responseId": "68efa569-4ba1-4b7f-9b1b-ac2865deb539",
  "queryResult": {
    "queryText": "query from the user",
    "action": "action.name.of.matched.dialogflow.intent",
    "parameters": {},
    "allRequiredParamsPresent": true,
    "outputContexts": [
      {
        "name": "projects/${PROJECTID}/agent/sessions/${SESSIONID}/contexts/actions_capability_screen_output"
      },
      {
        "name": "projects/${PROJECTID}/agent/sessions/${SESSIONID}/contexts/actions_capability_audio_output"
      },
      {
        "name": "projects/${PROJECTID}/agent/sessions/${SESSIONID}/contexts/google_assistant_input_type_keyboard"
      },
      {
        "name": "projects/${PROJECTID}/agent/sessions/${SESSIONID}/contexts/actions_capability_media_response_audio"
      },
      {
        "name": "projects/${PROJECTID}/agent/sessions/${SESSIONID}/contexts/actions_capability_web_browser"
      }
    ],
    "intent": {
      "name": "projects/${PROJECTID}/agent/intents/1f4e5bd9-a670-4161-a22e-2c97b077f29f",
      "displayName": "Name of Dialogflow Intent"
    },
    "intentDetectionConfidence": 1,
    "diagnosticInfo": {},
    "languageCode": "en-us"
  },
  "originalDetectIntentRequest": {
    "source": "google",
    "version": "2",
    "payload": {
      "isInSandbox": true,
      "surface": {
        "capabilities": [
          {
            "name": "actions.capability.SCREEN_OUTPUT"
          },
          {
            "name": "actions.capability.AUDIO_OUTPUT"
          },
          {
            "name": "actions.capability.WEB_BROWSER"
          },
          {
            "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
          }
        ]
      },
      "inputs": [
        {
          "rawInputs": [
            {
              "query": "query from the user",
              "inputType": "KEYBOARD"
            }
          ],
          "arguments": [
            {
              "rawText": "query from the user",
              "textValue": "query from the user",
              "name": "text"
            }
          ],
          "intent": "actions.intent.TEXT"
        }
      ],
      "user": {
        "lastSeen": "2017-10-06T01:06:56Z",
        "locale": "en-US",
        "userId": "AI_yXq-AtrRh3mJX5D-G0MsVhqun"
      },
      "conversation": {
        "conversationId": "1522951193000",
        "type": "ACTIVE",
        "conversationToken": "[]"
      },
      "availableSurfaces": [
        {
          "capabilities": [
            {
              "name": "actions.capability.SCREEN_OUTPUT"
            },
            {
              "name": "actions.capability.AUDIO_OUTPUT"
            }
          ]
        }
      ]
    }
  },
  "session": "projects/${PROJECTID}/agent/sessions/${SESSIONID}"
}
Пример результата помощника
Во фрагменте ниже показан пример вспомогательного результата в формате веб-перехватчика Dialogflow. В этом примере показан ответ пользователя после того, как веб-перехватчик указывает Помощнику, что ему необходимо получить подтверждение пользователя.
{
  "responseId": "cb6f5ec2-c26e-4349-b561-a9ddd6a0e495",
  "queryResult": {
    "queryText": "actions_intent_CONFIRMATION",
    "action": "Dialogflow action name of matched intent",
    "parameters": {},
    "allRequiredParamsPresent": true,
    "outputContexts": [
      {
        "name": "projects/${PROJECTID}/agent/sessions/${SESSIONID}/contexts/actions_intent_confirmation",
        "parameters": {
          "CONFIRMATION": true
        }
      }
    ],
    "intent": {
      "name": "projects/${PROJECTID}/agent/intents/1777d616-a5f7-4838-a9a9-870f2956bd14",
      "displayName": "Dialogflow action name of matched intent"
    },
    "intentDetectionConfidence": 1,
    "diagnosticInfo": {},
    "languageCode": "en-us"
  },
  "originalDetectIntentRequest": {
    "source": "google",
    "version": "2",
    "payload": {
      "isInSandbox": true,
      "surface": {},
      "inputs": [
        {
          "rawInputs": [
            {
              "query": "yes",
              "inputType": "VOICE"
            }
          ],
          "arguments": [
            {
              "name": "CONFIRMATION",
              "boolValue": true
            }
          ],
          "intent": "actions.intent.CONFIRMATION"
        }
      ],
      "user": {},
      "conversation": {},
      "availableSurfaces": []
    }
  },
  "session": "projects/${PROJECTID}/agent/sessions/${SESSIONID}"
}
Тело ответа
 Content-Type сообщений от вашей конечной точки выполнения до Ассистента должен быть application/json .
Ответное сообщение, которое ваше выполнение отправляет в Dialogflow, должно быть в формате веб-перехватчика Dialogflow .
 При общении с Ассистентом ваш ответ обычно содержит объект payload , инкапсулирующий объект « google ». Объект полезных данных " google " включает в себя действия над информацией, специфичной для Google. Он должен содержать как минимум поле expectUserResponse и поле richResponse или systemIntent .
 Ключевые поля объекта полезных данных " google " приведены ниже:
| Поле | Описание | 
|---|---|
| expectUserResponse | Указывает, ожидает ли ваше выполнение ответа пользователя. Установите значение true, чтобы продолжить разговор, иfalse, чтобы завершить разговор. | 
| userStorage | Хранит постоянные данные, привязанные к конкретному пользователю. Общий объем хранилища составляет 10 000 байт. | 
| richResponse | Это поле содержит аудио, текст, карточки, предложения или структурированные данные для обработки Помощником. Дополнительную информацию об использовании расширенных ответов для Actions on Google см. в разделе Расширенные ответы. | 
| systemIntent | Это поле имеет ту же структуру, что и ExpectedInput.possibleIntents. Ваш ответ обычно содержитsystemIntent, если при выполнении используется вспомогательное намерение . ПолеpossibleIntentsвsystemIntentдолжно быть установлено в объектExpectedIntent, а имя поляinputValueDataдолжно быть изменено наdata. | 
 Внутри объекта ExpectedIntent вы указываете следующие значения:
- намерение : имя намерения для помощника, которое указывает тип информации, которую вы хотите предоставить пользователю, и
- data : спецификация значения, представляющая собой строку, описывающую данные, необходимые помощнику для выполнения помощника.
 Например, если вы запрашиваете разрешение пользователя, установите intent actions.intent.PERMISSSION , а data для спецификации значения — "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec" , вместе с полями для этого типа.
 В следующем списке приведены строки спецификации значений для вспомогательных функций, которые можно установить в systemIntent для ответа веб-перехватчика Dialogflow. Полный список намерений Actions on Google для диалогового управления см. в справочнике по намерениям .
| Имя намерения | Имя события диалогового потока | Спецификация значения | Описание | 
|---|---|---|---|
| actions.intent.CONFIRMATION | actions_intent_CONFIRMATION | "@type": "type.googleapis.com/google.actions.v2.ConfirmationValueSpec" | Получает подтверждение от пользователя (например, ответ на вопрос «да» или «нет»). | 
| actions.intent.DATETIME | actions_intent_DATETIME | "@type": "type.googleapis.com/google.actions.v2.DateTimeValueSpec" | Получает введенные пользователем дату и время. | 
| actions.intent.DELIVERY_ADDRESS | actions_intent_DELIVERY_ADDRESS | "@type": "type.googleapis.com/google.actions.v2.DeliveryAddressValueSpec" | Получает ввод адреса доставки от пользователя. | 
| actions.intent.LINK | actions_intent_LINK | "@type": "type.googleapis.com/google.actions.v2.LinkValueSpec" | Запрашивает поток глубоких ссылок в приложение Android. | 
| actions.intent.OPTION | actions_intent_OPTION | "@type": "type.googleapis.com/google.actions.v2.OptionValueSpec" | Получает выбранный элемент из списка или пользовательского интерфейса карусели. | 
| actions.intent.PERMISSION | actions_intent_PERMISSION | "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec" | Получает информацию о пользователе, включая полное имя, приблизительное или точное местоположение. | 
| actions.intent.SIGN_IN | actions_intent_SIGN_IN | "@type": "type.googleapis.com/google.actions.v2.SignInValueSpec" | Запрашивает поток привязки учетной записи для привязки учетной записи пользователя. | 
Простой пример ответа
В приведенном ниже фрагменте показан пример простого ответа в формате веб-перехватчика Dialogflow.
{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "this is a simple response"
            }
          }
        ]
      }
    }
  }
}
Вспомогательный пример
 Во фрагменте ниже показан пример использования вспомогательного намерения в формате веб-перехватчика Dialogflow. В этом примере ваш вебхук использует вспомогательное намерение actions.intent.OPTIONS , чтобы дать помощнику указание получить выбор пользователя между двумя вариантами.
{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Choose a item"
            }
          }
        ]
      },
      "systemIntent": {
        "intent": "actions.intent.OPTION",
        "data": {
          "@type": "type.googleapis.com/google.actions.v2.OptionValueSpec",
          "listSelect": {
            "title": "Hello",
            "items": [
              {
                "optionInfo": {
                  "key": "first title key"
                },
                "description": "first description",
                "image": {
                  "url": "/assistant/images/badges/XPM_BADGING_GoogleAssistant_VER.png",
                  "accessibilityText": "first alt"
                },
                "title": "first title"
              },
              {
                "optionInfo": {
                  "key": "second"
                },
                "description": "second description",
                "image": {
                  "url": "https://lh3.googleusercontent.com/Nu3a6F80WfixUqf_ec_vgXy_c0-0r4VLJRXjVFF_X_CIilEu8B9fT35qyTEj_PEsKw",
                  "accessibilityText": "second alt"
                },
                "title": "second title"
              }
            ]
          }
        }
      }
    }
  }
}
При получении сообщения из предыдущего примера Ассистент временно берет на себя разговор и предлагает пользователю сделать выбор на основе заданных параметров. Собрав все необходимые пользовательские данные, Ассистент отправляет этот вспомогательный результат обратно к вам в запросе веб-перехватчика Dialogflow.
Во фрагменте ниже показан пример вспомогательного результата с выбором пользователя.
{
  "responseId": "ea166558-615a-48f3-ae5b-7f55d895784b",
  "queryResult": {
    "queryText": "actions_intent_OPTION",
    "action": "",
    "parameters": {},
    "allRequiredParamsPresent": true,
    "fulfillmentText": "",
    "fulfillmentMessages": [],
    "outputContexts": [
      {
        "name": "projects/${PROJECTID}/agent/sessions/${SESSIONID}/contexts/actions_intent_option",
        "parameters": {
          "OPTION": "key of selected item"
        }
      }
    ],
    "intent": {
      "name": "projects/${PROJECTID}/agent/intents/1777d616-a5f7-4838-a9a9-870f2956bd14",
      "displayName": "Dialogflow intent name of matched intent"
    },
    "intentDetectionConfidence": 1,
    "diagnosticInfo": {},
    "languageCode": "en-us"
  },
  "originalDetectIntentRequest": {
    "source": "google",
    "version": "2",
    "payload": {
      "isInSandbox": true,
      "surface": {
        "capabilities": []
      },
      "inputs": [
        {
          "rawInputs": [
            {
              "query": "Title of selected item",
              "inputType": "TOUCH"
            }
          ],
          "arguments": [
            {
              "textValue": "Key of selected item",
              "name": "OPTION"
            }
          ],
          "intent": "actions.intent.OPTION"
        }
      ],
      "user": {},
      "conversation": {},
      "availableSurfaces": []
    }
  },
  "session": "projects/${PROJECTID}/agent/sessions/${SESSIONID}"
}
Пример завершения разговора
 В приведенном ниже фрагменте показан пример простого ответа на завершение сеанса беседы в формате веб-перехватчика Dialogflow. Значение false expectUserResponse в ответном сообщении сигнализирует помощнику о том, что дальнейших действий пользователя не ожидается и что текущий разговор следует завершить.
{
  "payload": {
    "google": {
      "expectUserResponse": false,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Goodbye!"
            }
          }
        ]
      }
    }
  }
}
Чтобы узнать, как переопределить поведение по умолчанию, когда пользователи вызывают стандартную фразу для завершения разговора с Ассистентом, см. руководство по выходу из разговора .
