Использование эмулятора облачных функций для локального тестирования выполнения Dialogflow - PullRequest
0 голосов
/ 19 октября 2018

Можно ли проверить ваш веб-крючок выполнения Dialogflow локально с помощью эмулятора облачных функций, и если да, то как мне отформатировать запрос?

Я прочитал всю документацию, которую могу найти, включая руководство по https://firebase.google.com/docs/functions/local-emulator,, и особый интерес вызвал этот предыдущий вопрос, который, похоже, натолкнулся на похожую точку: Юнит-тестЛокальные действия в Google Dialogflow

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

В симуляторе Actions on Google я могу убедиться, что мой webhook успешно отвечает желаемым намерением по умолчанию, когда вводится "привет", но при использовании тех же данных JSON запроса в качестве ввода в мою функцию локальноЯ направлен к резервному намерению.

Это тот случай, когда эмулятор функций не может выполнить надлежащее совпадение намерений локально и, следовательно, всегда вызывает резервное намерение, или я просто неправильно форматирую свой запрос?Любая помощь будет принята с благодарностью!

Вот формат вызова, который я использую, и ответ от оболочки:

firebase > fulfillment({method: 'POST',json: true,body: 
require("project/collabrec/testData.json")});
Sent request to function.
firebase > info: User function triggered, starting execution
info: Fallback intent triggered.
info: Execution took 15 ms, user function completed successfully

RESPONSE RECEIVED FROM FUNCTION: 200, {
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "I didn't quite catch that. Could you say that again?"
            }
          }
        ]
      }
    }
  }
}

Вот содержимое testData.json:

{
  "user": {
    "userId": "ABwppHFR0lfRsG_UM3NkvAptIkD2iUpIUNxFt-ia05PFuPajV6kRQKXu_H_ECMMe0lP_WcCsK64sH2MEIg8eqA",
    "locale": "en-US",
    "lastSeen": "2018-10-19T15:20:12Z"
  },
  "conversation": {
    "conversationId": "ABwppHHerN4CIsBZiWg7M3Tq6NwlTWkfN-_zLIIOBcKbeaz4ruymv-nZ4TKr6ExzDv1tOzszsfcgXikgqRJ9gg",
    "type": "ACTIVE",
    "conversationToken": "[]"
  },
  "inputs": [
    {
      "intent": "actions.intent.TEXT",
      "rawInputs": [
        {
          "inputType": "KEYBOARD",
          "query": "hello"
        }
      ],
      "arguments": [
        {
          "name": "text",
          "rawText": "hello",
          "textValue": "hello"
        }
      ]
    }
  ],
  "surface": {
    "capabilities": [
      {
        "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
      },
      {
        "name": "actions.capability.SCREEN_OUTPUT"
      },
      {
        "name": "actions.capability.AUDIO_OUTPUT"
      },
      {
        "name": "actions.capability.WEB_BROWSER"
      }
    ]
  },
  "isInSandbox": true,
  "availableSurfaces": [
    {
      "capabilities": [
        {
          "name": "actions.capability.SCREEN_OUTPUT"
        },
        {
          "name": "actions.capability.AUDIO_OUTPUT"
        },
        {
          "name": "actions.capability.WEB_BROWSER"
        }
      ]
    }
  ],
  "requestType": "SIMULATOR"
}

А вот моя облачная функция webhook:

const {dialogflow, Image} = require('actions-on-google');
const admin = require('firebase-admin');
const functions = require('firebase-functions');
const app = dialogflow();


app.catch((conv, error) => {
  console.log("Error intent triggered.")
  console.error(error);
  conv.ask('Sorry, I ran into an error. Please try that again.');
});

app.fallback((conv) => {
  console.log("Fallback intent triggered.")
  conv.ask("I didn't quite catch that. Could you say that again?");
})

app.intent('Default Welcome Intent', (conv) => {
  console.log("Welcome intent triggered.")
    conv.ask("Welcome!!");
});

exports.fulfillment = functions.region('europe-west1').https.onRequest(app);

Использование Node v8.1.4 и версии пакета:

"@google-cloud/common-grpc": "^0.9.0",
"@google-cloud/firestore": "^0.17.0",
"@google-cloud/functions-emulator": "^1.0.0-beta.5",
"actions-on-google": "^2.4.1",
"firebase-admin": "^6.0.0",
"firebase-functions": "^2.0.5"

1 Ответ

0 голосов
/ 19 октября 2018

Проблема в том, что вы используете JSON, полученный из симулятора AoG, но это показывает JSON, который AoG отправляет в Dialogflow.Dialogflow обрабатывает это и отправляет вашему веб-крюку другой JSON, который включает результаты обработки JSON AoG и определения намерения, параметров и другой информации.

То, что вы делаете, должно работать - если у вас есть JSON Dialogflow.У вас есть несколько способов сделать это:

  • Самое простое - запустить веб-крючок в месте, которое может получить POST от Dialogflow, и посмотреть на объект conv.request, которыйдолжен быть в состоянии дать вам JSON, который вам нужен.

  • Если вы запускаете webhook на локальной машине разработчика (как вы и предлагаете), я, как правило, запускаю нгрок туннель.Туннель предоставляет общедоступный HTTPS-сервер, который очень полезен, и побочный эффект дает мне консоль, которую я могу использовать, чтобы точно видеть содержимое запроса и ответа JSON.

  • Наконец, вы должны иметь возможность зайти в настройки проекта в Dialogflow и включить Cloud Logging.Журнал содержит запрос, отправленный вашему веб-крюку, а также полученный от него ответ.

...