• Zuhause
  • Artikel
  • So implementieren Sie die lokale Erfüllung für Google Assistant-Aktionen mithilfe von Dialogflow
Veröffentlicht am 24-02-2019

So implementieren Sie die lokale Erfüllung für Google Assistant-Aktionen mithilfe von Dialogflow

Hinweis: Dieses Blog behandelt nur Aktionen in Google node.js-Implementierungen und setzt grundlegende Kenntnisse der Aktionen in Google / Dialogflow voraus

Google Home-Geräte, auf denen der Google Assistant ausgeführt wird

Hallo Welt!

Problemstellung

Ich bin ziemlich spät in Actions bei Google eingestiegen und habe mich sehr gerne mit dummen Voice-Apps unterhalten. In erster Linie habe ich gelernt, kleine „Party-Tricks“ zu entwerfen, mit denen ich Besucher amüsieren kann. Ich habe auch mit Alexa dasselbe gemacht, aber da ich mit der Google Cloud-Plattform und insbesondere mit Firebase viel vertraut bin, habe ich mehr Prototypen bei Google.

Aktionen und das Arbeiten mit Google Assistant erfordern häufig serverseitige Logik, um die Interaktion mit dem gewünschten Personalisierungs- oder Anpassungsgrad abzuwickeln. Dies wird als "Erfüllung" bezeichnet.

Der Entwicklungszyklus für Fulfillment kann etwas mühsam sein, da Sie Ihren Servercode jedes Mal in die Cloud übertragen müssen, um zu sehen, ob er funktioniert. Jedes Mal, wenn wir Änderungen vornehmen, die wir testen möchten, müssen wir den Code in Firebase pushen und ihm 30 bis 60 Sekunden Zeit geben, ihn zu verbreiten. Es ist wie ein Web-Entwickler vor dem heißen Nachladen - ugh! Also 2011.

Zusammenfassung der Architektur

Ich werde nicht auf die Details des Errichtens von Aktionen für den Assistenten eingehen, da es viel gibt, um Ihnen dabei zu helfen. Eine allgemeine Übersicht über das System hilft Ihnen jetzt, die Problemstellung zu verstehen, die diesen Blog inspiriert hat.

Hier ein Diagramm von Google, in dem erläutert wird, wie Aktionen / Assistent-Interaktionen verarbeitet werden.

Die Interaktion eines Benutzers wird vom Gerät aufgegriffen, in Text konvertiert, der vom Gerät analysiert wird, und an einen DialogFlow-Agenten weitergeleitet, bei dem es sich um eine NLU-Engine handelt. Daraufhin wird die Absicht des Benutzers ermittelt („Phrase“ oder „Äußerung“). Diese Absicht wird dann mit einem Code abgeglichen, der die Absicht des Benutzers "erfüllt", und gibt dann eine (hoffentlich) angemessene und akzeptable Antwort zurück.

Wenn Sie das Bild studiert haben, wird in der letzten Spalte eine Anfrage gestellt, die Firebase angibt. Was es wirklich bedeutet, ist ein Back-End-Server, der über einen HTTP-Webhook verfügt, der "Anforderungen" zur Erfüllung erhält und anschließend herausfindet, wie er angemessen reagieren soll. Architektonisch sendet der Dialogflow-NLU-Agent eine POST-Anforderung an den Server-Webhook, der dann vom Server unter Verwendung von SDKs verarbeitet wird.

Der Back-End-Server, der Anfragen und Antworten verarbeitet, kann problemlos in Firebase Cloud-Funktionen gehostet werden (natürlich macht Google die Verwendung ihres Stacks einfach - das ist nur ein gutes Geschäft!).

Ein lokal ausgeführter Server generiert außerdem einen Webhook-Endpunkt wie http: // localhost: 3000, auf den die POST-Anforderungen von Google Assistant nicht zugreifen können.

Solution Statement - lokaler Fulfillment-Dev-Server!

Es gibt drei Schritte für diese Lösung:

  1. Erstellen Sie den Back-End-Fulfillment-Server als Express-Server.
    1. Behandeln Sie Dialogflow-Anforderungen und -Antworten als Express-Endpunkt. Der Standard-Server der Firebase Cloud Functions verwendet die Aktionen in der Google Nodejs Client Library, die über integrierte Funktionen zum Empfang von HTTP-POST-Anforderungen vom Dialogflow-Agenten verfügt. Dies funktioniert jedoch nicht außerhalb der Firebase-Umgebung (d. H. Auf unserem lokalen Entwicklungsserver). Daher müssen wir unseren Fulfillment-Server als Express-App bereitstellen.
    2. Verwenden Sie das Paket Ngrok Node, um einen temporären HTTP-Endpunkt zu erstellen, der HTTP-Anforderungen an unseren local: 3000-Server (oder den von Ihnen verwendeten Port) weiterleitet.
    3. Ich werde nicht auf die Schritte zur Einrichtung Ihres Basiscodes für einen einfachen Nodejs-Fulfillment-Server eingehen - die Dialogflow / Aktionen in Google Docs helfen Ihnen dabei. Ich gebe hier jedoch die Snippets, die Ihnen zeigen, wie Sie diese Dialogflow-App in eine Express-App umwandeln, und wie Ihre package.json aussehen muss.

      Beginnen wir mit der Grundeinrichtung für den Client des Dialogflow node.js. Wir werden es die Dialogflow-App nennen.

      Dies ist die App, die die Absichten „handhabt“. Der obige Code ist nur ein Gerüst. Exportieren Sie die App und importieren Sie sie in functions / index.js.

      index.js ist der Einstiegspunkt in unserem Funktionsordner, der die Cloud-Funktionen enthält, die wir für Firebase Cloud-Funktionen verwenden. In dieser Datei erstellen wir die Express-App, importieren das DialogflowApp-Objekt und übergeben es an die Express-Route, die die HTTP-POST-Anforderungen von Dialogflow empfängt. Beachten Sie, dass wir das Body-Parser-Paket npm benötigen, da die HTTP-Anforderungen JSON sind.

      Der Schlüssel dieses Codes besteht darin, dass wir eine POST-Route erstellen, die als Handler-Callback unser DialogflowApp-Objekt verwendet. Ich habe eine GET-Route erstellt, nur um schnelle Browser-GET-Anforderungen an den Endpunkt zu senden. Dialogflow verwendet jedoch nur die POST-Route.

      Beachten Sie, dass ich hier zwei Exporte durchgeführt habe. Eines ist die Express-App und das andere ist die Dialogflow-App selbst. Dadurch werden in Firebase Funktionen mit zwei Endpunkten erstellt, die durch die mit dem Exportobjekt verknüpfte Eigenschaft identifiziert werden. Ein Endpunkt ist <…… / FulfillmentExpressServer> und der andere ist <…… / dialogflowFirebaseFulfillment>.

      Ich kann einen dieser HTTP-Endpunkte zur Erfüllung verwenden, wenn ich die Entwicklung vor Ort abgeschlossen habe und den endgültigen Code auf Firebase Cloud Functions übertragen habe.

      NGROK für das Tunneln des lokalen Entwicklungsservers

      In Zeile 26 ist etwas komisch aussehender Code enthalten. Auf meinem Mac-Terminal verwende ich den Export IS_LOCAL_DEV = true, bevor ich den Server lokal starte. Mit diesem Codeblock in Zeile 26 wird der Server grundsätzlich lokal abgehört. Dies ist nicht erforderlich, wenn der Code auf Cloud-Funktionen hochgeschoben wird - dies gilt nur für den lokalen Server.

      Was bringt mich zu der obigen Konfiguration in package.json. In der Eigenschaft scripts sehen Sie einen Tunnel namens Tunnel. Notieren Sie sich dort die Portnummer 8000. Das kann beliebig eingestellt werden, aber stellen Sie sicher, dass der Code in index.js, der die PORT-Konstante (Zeile 27 in der Gist) festlegt, dieselbe Portnummer hat.

      Bevor Sie den Code ausführen, überprüfen Sie Folgendes:

      1. Sie haben Ihre Umgebungsvariable festgelegt und der Code entspricht dieser - in meinem Fall habe ich IS_LOCAL_DEV = true verwendet
      1. Ihre Portnummern stimmen in index.js und dem Tunnelskript überein

      Dann öffnen Sie zwei Terminalfenster und führen Folgendes aus:

      npm run dev und npm run tunnel

      In dem Terminal, das den Tunnel durchführte (ngrok), sehen Sie Folgendes:

      Beachten Sie die zwei Weiterleitungsadressen. Sie sind identisch, außer einer ist https. Entweder funktioniert. Dies ist Ihr Endpunkt, vorausgesetzt, Ihre POST-Route ist / und nicht / . Wenn Sie dem POST-Handler einen Pfad hinzugefügt haben, müssen Sie diesen Pfad zur Weiterleitungsadresse hinzufügen.

      Beachten Sie, dass bei jeder Ausführung von ngrok eine neue, temporäre URL für Sie generiert wird. Daher müssen Sie Ihren Dialogflow-Erfüllungshook jedes Mal aktualisieren, wenn Sie npm run tunnel ausführen.

      Und los gehts. Es ist nicht mehr nötig, jede kleine Codeänderung in Firebase Cloud-Funktionen zu verschieben und ein oder zwei Minuten zu warten, bevor der Test durchgeführt wird. Entwickeln Sie im Handumdrehen, und mit nodemon wird Ihr Server neu gestartet, und Sie können während des Codierens weiter testen!

      Ich kann auf Twitter kontaktiert werden: @ZubinPratap

      Und wenn Sie ein Code-Neuling sind und dies als überwältigend empfinden, ist das natürlich. Sie springen zu weit voraus. Ich habe auch diesen Fehler gemacht, und es hat mich zu viel gekostet.

      Wenn Sie das Codieren lernen möchten oder davon überwältigt sind, möchte ich Sie bitten, sich meinen Kurs über Udemy anzusehen. Sie lernen, wie man Code und nicht Code programmiert. Das Codieren ist einfach, aber das Erlernen von Code nicht. Wenn Sie einen Promo-Code wünschen, gehen Sie hier.

Siehe auch

Geheimnisse der New York City SubwayWie können Sie mit React Context helfen, wenn Sie Redux nicht kennen?So richten Sie eine responsive UI-Suche in Vue.js ein