Пользовательские карточки чата Google с использованием веб-перехватчика диалогового процесса

Я пытаюсь интегрировать бота DialogFlow с Hangouts Chat (для G Suite). Я включил интеграцию с DialogFlow, и основные намерения работают нормально.

Чтобы выполнять бэкэнд-операции с использованием выполнения, я создал облачную функцию firebase и добавил ее в качестве URL-адреса веб-перехватчика на странице выполнения DialogFlow.

Я написал код облачной функции, чтобы определить намерение и сгенерировать формат ответа Webhook для простого текстового ответа. Это работает, и я вижу, что данные firestore изменяются в ответ на намерение.

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

Я видел следующий код на странице https://cloud.google.com/dialogflow/docs/integrations/hangouts. Когда я вставляю это в пользовательский интерфейс редактора намерений диалогового потока в пользовательскую полезную нагрузку Hangouts (после отключения интеграции с веб-перехватчиком), он работает

{
  "hangouts": {
    "header": {
      "title": "Pizza Bot Customer Support",
      "subtitle": "[email protected]",
      "imageUrl": "..."
    },
    "sections": [{
      "widgets": [{
        "keyValue": {
          "icon": "TRAIN",
          "topLabel": "Order No.",
          "content": "12345"
        }
      },
      {
        "keyValue": {
          "topLabel": "Status",
          "content": "In Delivery"
        }
      }]
    },
    {
      "header": "Location",
      "widgets": [{
        "image": {
          "imageUrl": "https://dummyimage.com/600x400/000/fff"
        }
      }]
    },
    {
      "header": "Buttons - i could leave the header out",
      "widgets": [{
        "buttons": [{
          "textButton": {
            "text": "OPEN ORDER",
            "onClick": {
              "openLink": {
                "url": "https://example.com/orders/..."
              }
            }
          }
        }]
      }]
    }]
  }
}

output

Это именно то, что мне нужно, но мне нужен этот ответ от вебхука. Я не получаю правильный формат ответа для сопоставления между ними.

Когда я пытаюсь интегрировать тот же код с веб-перехватчиком, я не получаю ответа в чате Hangouts. Когда я проверяю раздел истории в пользовательском интерфейсе диалогового потока, вот структура ответа, как указано в журнале необработанных взаимодействий.

{
  "queryText": "<redacted>",
  "parameters": {},
  "intent": {
    "id": "<redacted>",
    "displayName": "<redacted>",
    "priority": 500000,
    "webhookState": "WEBHOOK_STATE_ENABLED"
  },
  "intentDetectionConfidence": 1,
  "diagnosticInfo": {
    "webhook_latency_ms": 284
  },
  "languageCode": "en",
  "slotfillingMetadata": {
    "allRequiredParamsPresent": true
  },
  "id": "<redacted>",
  "sessionId": "<redacted>",
  "timestamp": "2020-07-30T12:05:29.094Z",
  "source": "agent",
  "webhookStatus": {
    "webhookUsed": true,
    "webhookPayload": {
      "hangouts": {
        "header": {
          "subtitle": "[email protected]",
          "title": "Pizza Bot Customer Support",
          "imageUrl": "..."
        },
        "sections": [
          {
            "widgets": [
              {
                "keyValue": {
                  "content": "12345",
                  "topLabel": "Order No.",
                  "icon": "TRAIN"
                }
              },
              {
                "keyValue": {
                  "topLabel": "Status",
                  "content": "In Delivery"
                }
              }
            ]
          },
          {
            "widgets": [
              {
                "image": {
                  "imageUrl": "https://dummyimage.com/600x400/000/fff"
                }
              }
            ],
            "header": "Location"
          },
          {
            "widgets": [
              {
                "buttons": [
                  {
                    "textButton": {
                      "text": "OPEN ORDER",
                      "onClick": {
                        "openLink": {
                          "url": "https://example.com/orders/..."
                        }
                      }
                    }
                  }
                ]
              }
            ],
            "header": "Buttons - i could leave the header out"
          }
        ]
      }
    },
    "webhookStatus": {
      "message": "Webhook execution successful"
    }
  },
  "agentEnvironmentId": {
    "agentId": "<redacted>",
    "cloudProjectId": "<redacted>"
  }
}

Я также нашел эту ссылку в документации чата, в которой объясняется, как показать пользовательский интерфейс на основе интерактивных карточек https://developers.google.com/hangouts/chat/how-tos/cards-onclick. Однако я не могу понять, как интегрировать то же самое с веб-перехватчиком.

ОБНОВЛЕНИЕ. Я изучил руководство по адресу https://www.leeboonstra.com/Bots/custom-payloads-rich-cards-dialogflow/ и смог получить ответ карты, используя упомянутый ими образец кода. Он использует эту устаревшую библиотеку (https://github.com/dialogflow/dialogflow-fulfillment-nodejs). Вот код для этого,

let payload = new Payload("hangouts", json, {
        rawPayload: true,
        sendAsMessage: true,
});
agent.add(payload);

Здесь переменная json должна быть предыдущей структурой JSON, о которой я упоминал. Итак, теперь я могу сопоставить правильный формат ответа с помощью устаревшего API. Однако я не могу получить кнопку для отправки правильного ответа на серверную часть < / сильный>. Вот поле кнопок, которое я изменил из предыдущего json,

  "buttons": [
    {
      "textButton": {
        "text": "Click Me",
        "onClick": {
          "action": {
            "actionMethodName": "snooze",
            "parameters": [
              {
                "key": "time",
                "value": "1 day"
              },
              {
                "key": "id",
                "value": "123456"
              }
            ]
          }
        }
      }
    }
  ]

person Kenny John Jacob    schedule 30.07.2020    source источник


Ответы (1)


Насколько мне известно, ответить на кнопку Google Chat (ранее Hangouts Chat) невозможно при использовании прямой интеграции Dialogflow.

Проблема в том, что ответ на кнопку можно отправить одним из двух способов:

  • На код бота будет отправлено событие, указывающее на клик.
  • Использование свойства onClick.openLink.url, как показано в большинстве ваших тестов. Это приведет к тому, что человек, щелкнув его, перейдет на соответствующий URL-адрес. Но как только вы окажетесь там, вы окажетесь вне потока ботов.

Однако документация по интеграции Hangouts Chat с Dialogflow не предоставляет никаких информация о том, как это событие передается в Dialogflow, и в последний раз, когда я его тестировал - это не так.

Вы можете написать свою собственную интеграцию с помощью API Google Chat для чего-то вроде Cloud Functions или Apps Script и пусть ваш скрипт вызовет Dialogflow's API обнаружения намерений, чтобы определить, какое намерение будет инициировано пользователем (и определить ответы или вызовите веб-перехватчик для дополнительной обработки). По этой схеме вы можете выбрать, как обрабатывать событие onClick. Собственная интеграция также дает вам возможность выполнять Incoming Webhooks, что невозможно при использовании интеграции Dialogflow.

person Prisoner    schedule 31.07.2020
comment
Спасибо Аллену за помощь, позвольте мне посмотреть, может ли что-то из этого сработать для нас. - person Kenny John Jacob; 01.08.2020