Формат веб-перехватчика Dialogflow {:#dialogflow-webhook-format} (Dialogflow)

В этом разделе описывается формат полезных данных 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 в заголовке HTTP-сообщений от вашей конечной точки выполнения до Ассистента должен быть 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!"
            }
          }
        ]
      }
    }
  }
}

Чтобы узнать, как переопределить поведение по умолчанию, когда пользователи вызывают стандартную фразу для завершения разговора с Ассистентом, см. руководство по выходу из разговора .