
Google Hackathon und alles, was Sie brauchen, um Ihre Anwendungen für einen Assistenten zu entwickeln.
Google hat einen Hackathon organisiert, der sich der Actions On Google-Technologie widmet. Dies ist eine gute Gelegenheit, um Erfahrungen zu sammeln und darüber nachzudenken, wie Sie mit der Erstellung der CUI (Conversation User Interface) für unsere Anwendungen beginnen können. Aus diesem Grund haben wir ein Team von zwei Android-Entwicklern zusammengestellt: shipa_o , raenardev und designer comradeguest und sind zur Teilnahme gegangen.
Was sind Aktionen bei Google?
Aktionen bei Google (AoG) ist eine Möglichkeit, Ihre Aktion dem Assistenten hinzuzufügen.
Sie können dies mit 4 Werkzeugen tun:
Beim Hackathon haben wir eine Fertigkeit entwickelt - eine Anwendung, die die Fähigkeiten eines Assistenten erweitert, also werden wir dort aufhören.
Nach dem Appell „Ok Google. Ich möchte mit ${_}
sprechen “, öffnet der Assistent die Fähigkeit, mit der der Benutzer einen Dialog führt:

Wie schreibe ich eine Fähigkeit?
Sie benötigen zwei Fähigkeiten:
- Verständnis der Conversational User Interface (CUI), der Fähigkeit, sie zu entwerfen;
- Fähigkeit, mit Natural Language Processing (NLP) zu arbeiten, z. B. Dialogflow.
Stufe 1: Design
Damit Ihre Fähigkeiten jemals einen Protein-Gesprächspartner haben, ist es besser, jetzt über die Zukunft nachzudenken. Die Nachfrage wird diejenigen sein, die den Nutzungskontext berücksichtigen. Dialogschnittstellen werden verwendet, wenn es möglich ist, lauter zu sprechen und mit Geräten bequemer und schneller mit Geräten zu interagieren als mit Händen, Augen und anderen Körperteilen.
Die Sprachschnittstelle ist seriell. Wenn es möglich ist, die gesamte Form der Bestellung auf einer Grafik anzuzeigen, und die Person selbst auswählt, was zuerst und dann was angezeigt werden soll, können Sie nur nacheinander Fragen stellen. Um eine beliebte und bequeme Anwendung zu entwickeln, müssen Sie den Schnittpunkt zwischen den Anforderungen des Benutzers und der Fähigkeit zur Verwendung der Sprachschnittstelle (oder der Unfähigkeit, andere zu verwenden) ermitteln.
Das erste, was mir in den Sinn kommt, ist ein Sprachassistent für Blinde, der bei der Lösung alltäglicher Probleme hilft. Geben Sie beispielsweise eine Bestellung in einem Geschäft auf, rufen Sie ein Taxi und rufen Sie Verwandte an. Das zweite ist ein sprechendes Rezeptbuch für Hausfrauen mit Händen in Mehl. Drittens Spiele, in denen Sie etwas erklären müssen.
Wir haben uns für einen einfachen entschieden und einen Roboter entwickelt, der Menschen bei guten Filmen berät. Wir besiegen die Unvollkommenheit von Sprachsynthesizern: Unser Assistent gibt nicht einmal vor, ein Mann zu sein, und betont in jeder Hinsicht seine lebendige elektronische Persönlichkeit.
Google hat hervorragende Richtlinien für die Entwicklung interaktiver Benutzeroberflächen verfasst. Und wir werden darüber sprechen, wie wir unser Gespräch als Erstgeborener gestaltet haben.
1. Aufruf
Zuerst müssen Sie einen Assistenten anrufen. Der Aufruf kann explizit (expliziter Aufruf) und indirekt (impliziter Aufruf) sein. Menschen werden explizit behandelt, wenn sie die Anwendung bereits kennen. Indirekt kann der Google-Assistent in einer bestimmten Situation eine geeignete Anwendung empfehlen. Richtig gewählte Optionen für indirekte Attraktivität - wie die richtigen Keywords in der kontextbezogenen Werbung - sind nur „menschlicher“.
Es ist wichtig, dass indirekte Anrufe nicht zu allgemein sind. Wie allgemeine Keywords in der Kontextwerbung verhindern sie nur, dass Sie die richtige Anwendung finden, und senken die Bewertung der Anwendung bei der Ausgabe des Assistenten.
Anrufe können eine tiefe Verknüpfung zu einzelnen Funktionen des Sprachassistenten enthalten. Zum Beispiel beginnt unser Filmroboter normalerweise die Kommunikation mit der Tatsache, dass er einer Person die Wahl eines Genres anbietet. Wenn er jedoch zu einem indirekten Aufruf aufgefordert wird: "Ich möchte eine lustige Komödie sehen", ist es logisch, einen Dialog mit dem Angebot eines garantiert guten Films des genannten Genres zu beginnen.
2. Erste Begrüßung
Die erste Begrüßung ist das, was die Anwendung der Person unmittelbar nach dem Anruf mitteilt.
Zuerst müssen Sie den Benutzer wissen lassen, dass der Assistent bereits hier ist:
Hallo, eine Proteinform des Lebens. Ich bin ein roter leidenschaftlicher Filmroboter. Der Zweck meiner Existenz ist es, biologische Filme über gute Filme zu beraten.
Und dann - schlagen Sie vor, was als nächstes zu tun ist. Unser Roboter sucht nach Filmen nach Genre, daher schlagen wir vor, mit welcher Anfrage eine Person noch weiter gehen kann:
Was willst du sehen: vielleicht Comedy, Action oder Horror?
Neue und erfahrene Benutzer können auf viele Arten begrüßt werden. Wenn eine Person zum ersten Mal mit Ihrem Assistenten spricht, können Sie ein wenig über sich selbst sprechen. Wenn nicht der erste - ein langer Gruß wird ihn nerven. So können Sie sofort zur Sache kommen:
3. Menschliches Gespräch
Bringen Sie Ihrem Assistenten bei, die natürliche Sprache zu verstehen und das Gespräch aufrechtzuerhalten. Der einfachste Weg, dies zu tun, besteht darin, bereits vor Beginn der Entwicklung mit Personen aus der Zielgruppe zu kommunizieren. Darüber hinaus ist es mündlich und nicht schriftlich wünschenswert, da die umgangssprachliche Sprache seltener als mündlich ist. Spielen Sie die Rolle des Roboters und bitten Sie den Gesprächspartner, sich vorzustellen, dass er Ihre zukünftige Anwendung verwendet. Zeichnen Sie alle Dialoge auf dem Rekorder auf und entschlüsseln Sie sie anschließend. Auf diese Weise können Sie ein typisches Konversationsdiagramm entwerfen und herausfinden, wo Zweige angezeigt werden können.
Stufe 2: Entwicklung
Es gibt verschiedene Möglichkeiten, Ihre Aktion für einen Assistenten zu entwickeln:
- Mit Dialogflow.
- Mit Aktionen im Google SDK.
- Text kann unabhängig verarbeitet werden - beispielsweise wenn Sie eine eigene Lösung für die Verarbeitung natürlicher Sprache haben (NLP - Natural Language Processing).
Das Folgende ist die Interaktion eines Assistenten mit Ihren Fähigkeiten.
Der Dialog sieht ungefähr so aus:
Der Assistent übersetzt die Rede in Text und sendet sie an Ihre Aktion.
Der Text wird auf eine der oben genannten Arten verarbeitet. In diesem Diagramm über Dialogflow.
Dialogflow definiert die Absicht (die spezifische Absicht des Benutzers) und empfängt
daraus Entitäten (Parameter).
(Optional) Dialogflow kann den entsprechenden Webhook aufrufen, die Daten im Backend verarbeiten und eine Antwort erhalten.
Dialogflow bildet die Antwort.
Der Assistent gibt die Antwort, schaltet das Mikrofon ein und hört zu, was der Benutzer sagt.

Assistent Aktionsdiagramm
Dialogfluss
Wir werden die Grundlagen von Dialogflow nicht näher erläutern - Google hat gute Tutorial-Videos veröffentlicht.
- Absichten - über das Erkennen von Absichten, wie genau Dialogflow versteht, was der Benutzer fragt oder welche Aktion er ausführen möchte.
- Entitäten - über das Erkennen von Parametern innerhalb einer Phrase. Wenn Sie beispielsweise Filme empfehlen, ist dies ein bestimmtes Genre.
- Dialogsteuerung - Informationen zum Kontextmechanismus (siehe unten) und zur Erfüllung: Informationen zum Verarbeiten der Benutzeranforderung selbst durch Zugriff auf Ihr Backend und zum Zurückgeben von etwas Interessanterem als einer Textantwort.
Wir gehen davon aus, dass Sie das Video bereits angesehen und die Dialogflow-Konsole herausgefunden haben. Schauen wir uns die Probleme an, die in den einzelnen Teilen des Implementierungsprozesses aufgetreten sind, und was interessant ist, kann festgestellt werden.
Denken Sie auch an die Regeln für den Aufbau eines guten Dialogs, wenn Sie mit der Implementierung fortfahren. Dies wirkt sich auf die Anzahl der Absichten, die Menge der Entitäten und deren Verwendung in Antworten, die Verwendung von Kontexten und alles andere aus.
Absichten
Es gibt Empfehlungen - eine detailliertere Begrüßung für den neuen Benutzer und für den Rest eine präzisere Begrüßung. Wie implementiere ich das?
In der Dialogflow-Konsole kann diese Logik nicht ermittelt werden. Dies kann innerhalb der Erfüllung aus willkommenen Gründen erfolgen. Mit anderen Worten, Sie müssen dies mit Ihren Händen tun.
Dies gilt auch für die Fehlerbehandlung. Zum Beispiel können Sie zum ersten Mal einfach erneut fragen und zum zweiten Mal feststellen, welche Art von Antwort Sie vom Benutzer erwarten.
Sie tun dies nicht durch Antworten - es wird eine zufällige Antwort ausgewählt. Sie können es durch Erfüllung oder etwas kniffliger tun, indem Sie es an den Kontext binden (mehr dazu weiter unten).
Entitäten
"Automatisierte Erweiterung zulassen" und sys.Any
Wenn der Ausdruck in seiner Struktur ähnlich ist, kann beim Aktivieren von "Automatisierte Erweiterung zulassen" als anerkannte Entität etwas hineingelangen, das immer noch nicht mit Gewinn verarbeitet werden kann.
Beispielsweise erkennt Ihre Anwendung den Ausdruck "Schlagen Sie mir etwas von <genre> vor" für Filmtipps. Wenn Sie sagen "Raten Sie mir etwas vom Essen", dann erhalten Sie als Parameter "Genre" nicht das, was Sie erwarten würden. Dies ist sinnvoll, wenn die Genres, die Sie im Backend ständig dynamisch aktualisieren, und die Antwort des Benutzers dort verarbeitet werden, Sie jedoch keine Zeit haben, die Entität zu aktualisieren.
Eine andere Lösung ist die Verwendung von sys.Any. In diesem Fall wird er alles übermitteln, was nach dem erwarteten Entwurf war, was der gesamte Vorschlag sein kann. Dies bietet mehr Möglichkeiten als eine automatisierte Erweiterung, aber es gibt auch mehr Nachteile.
Singular und Plural, Fälle, Geschlecht
Lassen Sie uns ein einfaches Beispiel finden. Wir werden über Ihre Lieblingsfrüchte sprechen und die Anwendung wird antworten, wie cool sie sind. In den folgenden Beispielen ist P der Benutzer, A ist unsere Aktion.
P: Ananas sind am leckersten.
A: Ja, Ananas sind die coolsten Früchte!
In diesem Beispiel haben wir Entität: Ananas
Aber was ist, wenn der Benutzer "Ananas" sagt? Wir können ein Synonym hinzufügen.
P: Ich mochte die Ananas.
A: Ja, Ananas sind die coolsten Früchte!
Der Standardwert ist das Referenzformular - d. H. es ist die ursprüngliche Form, nicht ihre Synonyme. Deshalb sagt die Anwendung nicht "Ja, Ananas ist die coolste Frucht!"
Es ist auch eine Überlegung wert, wenn Sie Antworten schreiben. Wenn wir die Antwort „Ja, $ Obst ist das coolste!“ Hätten, würden wir Folgendes erhalten:
P: Ich mochte die Ananas.
A: Ja, Ananas sind die coolsten!
Und vergessen Sie nicht die Fälle:
P: Ich will Drama
A: Hier ist ein cooles Drama ...
Daher sollten Sie sowohl die Anfangswerte der Entität als auch die Antworten in einer konsistenten Form schreiben. Zum Beispiel können wir alle ursprünglichen Entitätsformen für Früchte im Plural und Synonyme in jedem machen.
Wir werden im Nominativ Genres auf Russisch machen, aber in beliebiger Anzahl (Drama, Horror).
Wenn wir zu den Antworten kommen, schreiben wir nicht "Ja, $ Obst ist die coolste Frucht!" und "Ja, $ Obst ist das coolste!" - Früchte sind immer im Plural.
Bei der russischen Sprache lohnt es sich, noch weiter zu gehen und darüber nachzudenken, wie man eine vereinbarte Antwort schreibt - wir haben nicht nur Fälle (Drama / Drama), sondern auch Geschlecht (Drama / Western).
P: Ich möchte einen Western
A: Hier ist ein cooler Western ...
P: Ich möchte einen Western
A: Westlich? Ok, hier ist ein cooler Film ...
Aber wie kann man genau das Entitätsformular zurückgeben, das der Benutzer gesagt hat?
Im Fall von Genres könnte das Synonym für "Science Fiction" "Aliens" sein. Wenn der Benutzer dann "Aliens" sagt, wird "Science Fiction" als Parameter zurückgegeben.
Wenn wir die Entität in der Form erhalten möchten, in der der Benutzer sie angegeben hat, lohnt es sich, den Wert von $ entity.original zu wählen

Dann kann es jedoch zu Problemen mit der Inkonsistenz der Anzahl und (insbesondere) der Inkonsistenz der Fälle kommen. Ist es wirklich notwendig? Wenn ja, erstellen Sie eine Entität für Singular, Plural und Groß- / Kleinschreibung. Die Antworten müssen auch mit dem von ihnen verwendeten Entitätsformular übereinstimmen.
Kontexte
Vielleicht damit die meisten Probleme.
Eingabekontext
Dies ist der Kontext, an den eine bestimmte Absicht gebunden ist. Mehrere Absichten können auf dieselbe Phrase reagieren, und die mit dem aktiven Eingabekontext wird höchstwahrscheinlich funktionieren.
So können Sie beispielsweise einer bestimmten Frage eine Ja / Nein-Antwort hinzufügen, die in Dialogflow mithilfe der Folgeabsicht erfolgt
Ausgabekontext
Dies ist der Kontext, der aktiviert wird, wenn die Absicht ausgelöst wird. Auf diese Weise werden Kontexte in der Dialogflow-Konsole aktiviert (dies kann auch in Erfüllung erfolgen). Wir geben die Anzahl der Umdrehungen des Dialogs an, in denen er aktiv ist, und nach dem Zurücksetzen des Zählers oder nach 20 Minuten wird er deaktiviert. Dies bedeutet, dass die Daten in diesem Kontext nicht mehr verfügbar sind und Absichten, für die sie eingegeben werden, nicht funktionieren.
Ein weiterer Trick ist mit demselben verbunden: Sie können einen Kontext mit einer Absicht aktivieren und manuell mit einer anderen deaktivieren, indem Sie ihn einfach als Ausgabekontext für die zweite Absicht mit der Anzahl der Antworten 0 angeben.
Wenn Sie keinen Code in Erfüllung schreiben möchten, können Sie auf diese Weise eine interessante Logik implementieren, z. B. den Kontext als Zähler verwenden und die Fehlerbehandlung implementieren, wenn der Assistent den Benutzer nicht versteht.
Dialogflow-Tipps
Es ist nicht erforderlich, die Seite mit der Assistentenvorschau neu zu starten. Wenn Sie Änderungen am Dialogflow-Agenten vorgenommen haben, können Sie warten, bis das Training abgeschlossen ist, und die nicht erkannte Phrase im Simulator sofort wiederholen. Dialogflow kann als Backend betrachtet werden, auf das sich ein Assistent bezieht.
Verwenden Sie vorgefertigte Agenten - dort können Sie sehen, wie Sie ein typisches Szenario implementieren.
Seien Sie vorsichtig mit dem Abschnitt Small Talk. Durch die Verwendung wird das Mikrofon am Ende des Gesprächs nicht ausgeschaltet, und solche Antworten enthalten normalerweise keine Handlungsaufforderung. Sie leiten den Benutzer nicht zur nächsten Dialogrunde, und es ist ihm nicht ganz klar, was weiter gesagt werden soll. Aus diesem Grund können Sie die Überprüfung mit hoher Wahrscheinlichkeit nicht bestehen. Es ist besser, separate Absichten dafür zu machen, wenn Sie sie in den Dialog eingeben können.
Bearbeiten Sie nicht dieselbe Absicht gleichzeitig. Jetzt wird die gleichzeitige Arbeit mehrerer Personen nicht unterstützt - es ist nicht bekannt, wessen Änderungen überschrieben werden.
Wenn es notwendig ist, die Arbeit mit Absicht zu parallelisieren, kann sie in separaten Projekten ausgeführt werden. Wählen Sie dann einfach die erforderlichen aus und übertragen Sie sie. Importieren und exportieren Sie Entitäten auch in json / xml und importieren / exportieren Sie sie absichtlich.
Es lohnt sich sofort zu berücksichtigen, dass Sie Aktionen für eine bestimmte Sprache schreiben. Das Schreiben von Antworten auf Russisch hat zusätzliche Nuancen. Die Lokalisierung der Aktion scheint daher schwieriger zu sein als mit der Benutzeroberfläche der mobilen Anwendung.
Berücksichtigen Sie die Entwurfsregeln für Sprachschnittstellen - sie wirken sich nicht nur auf die Replikate aus, sondern auch auf die gesamte Struktur. Sie bauen einen Dialog auf, daher sollte jede Antwort einen Aufruf zum Handeln hinterlassen, damit der Benutzer versteht, was er sagen soll.
Wenn alles fertig ist und Sie mit dem Testen beginnen, haben Sie keine Angst mehr, einzelne Zweige des Dialogs oder der Frageformulare aufzugeben. Vielleicht werden Sie in der Testphase verstehen, wie Sie Absichten verbinden und was zur Vereinfachung der Verwendung fehlt.
Serververbindung
Um den Server zu verbinden, müssen Sie Fulfillment verwenden. Hierfür gibt es zwei Möglichkeiten:
- Webhook-Client . Viele Sprachen werden unterstützt.
- Inline-Editor zu Cloud-Funktionen für Firebase (node.js).
Betrachten wir den einfachsten - den Inline-Editor.
Wir geben nicht vor, ein Experte für node.js zu sein. Das Beheben von Fehlern in Kommentaren ist willkommen.
Es ist wichtig, auf die Version der Dialogflow-API zu achten.
Neueste Version v2. Alles, was für Version v1 geschrieben wurde, funktioniert nicht damit.
Lesen Sie hier mehr über Migration.
Nützliche Links:
Analysieren Sie die Standardvorlage
Wenn Sie den Abschnitt Erfüllung öffnen, wird der folgende Code in der Datei / Registerkarte `index.js` angezeigt: 'use strict'; const functions = require('firebase-functions'); const {WebhookClient} = require('dialogflow-fulfillment'); const {Card, Suggestion} = require('dialogflow-fulfillment'); process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { const agent = new WebhookClient({ request, response }); console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers)); console.log('Dialogflow Request body: ' + JSON.stringify(request.body)); function welcome(agent) { agent.add(`Welcome to my agent!`); } function fallback(agent) { agent.add(`I didn't understand`); agent.add(`I'm sorry, can you try again?`); } // // Uncomment and edit to make your own intent handler // // uncomment `intentMap.set('your intent name here', yourFunctionHandler);` // // below to get this function to be run when a Dialogflow intent is matched // function yourFunctionHandler(agent) { // agent.add(`This message is from Dialogflow's Cloud Functions for Firebase editor!`); // agent.add(new Card({ // title: `Title: this is a card title`, // imageUrl: 'https://developers.google.com/actions/images/badges/XPM_BADGING_GoogleAssistant_VER.png', // text: `This is the body text of a card. You can even use line\n breaks and emoji! `, // buttonText: 'This is a button', // buttonUrl: 'https://assistant.google.com/' // }) // ); // agent.add(new Suggestion(`Quick Reply`)); // agent.add(new Suggestion(`Suggestion`)); // agent.setContext({ name: 'weather', lifespan: 2, parameters: { city: 'Rome' }}); // } // // Uncomment and edit to make your own Google Assistant intent handler // // uncomment `intentMap.set('your intent name here', googleAssistantHandler);` // // below to get this function to be run when a Dialogflow intent is matched // function googleAssistantHandler(agent) { // let conv = agent.conv(); // Get Actions on Google library conv instance // conv.ask('Hello from the Actions on Google client library!') // Use Actions on Google library // agent.add(conv); // Add Actions on Google library responses to your agent's response // } // // See https://github.com/dialogflow/dialogflow-fulfillment-nodejs/tree/master/samples/actions-on-google // // for a complete Dialogflow fulfillment library Actions on Google client library v2 integration sample // Run the proper function handler based on the matched Dialogflow intent name let intentMap = new Map(); intentMap.set('Default Welcome Intent', welcome); intentMap.set('Default Fallback Intent', fallback); // intentMap.set('your intent name here', yourFunctionHandler); // intentMap.set('your intent name here', googleAssistantHandler); agent.handleRequest(intentMap); });
Und solche Abhängigkeiten in der Datei / Registerkarte `package.json`: { "name": "dialogflowFirebaseFulfillment", "description": "This is the default fulfillment for a Dialogflow agents using Cloud Functions for Firebase", "version": "0.0.1", "private": true, "license": "Apache Version 2.0", "author": "Google Inc.", "engines": { "node": "~6.0" }, "scripts": { "start": "firebase serve --only functions:dialogflowFirebaseFulfillment", "deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment" }, "dependencies": { "actions-on-google": "2.0.0-alpha.4", "firebase-admin": "^4.2.1", "firebase-functions": "^0.5.7", "dialogflow": "^0.1.0", "dialogflow-fulfillment": "0.3.0-beta.3" } }
Aktualisieren Sie zunächst die Alpha- und Beta-Abhängigkeiten auf die neuesten stabilen.
Hier sind die aktuellsten Versionen. { "dependencies": { "actions-on-google": "^2.2.0", "firebase-admin": "^5.2.1", "firebase-functions": "^0.6.2", "dialogflow": "^0.6.0", "dialogflow-fulfillment": "^0.5.0" } }
Und jetzt schauen wir uns den Code genauer an.
Oben ist das Importieren von Abhängigkeiten abgeschlossen // Cloud Functions Firebase library const functions = require('firebase-functions'); // const {WebhookClient} = require('dialogflow-fulfillment'); // const {Card, Suggestion} = require('dialogflow-fulfillment');
Der springende Punkt bei der Erfüllung ist das Überschreiben des Rückrufs - ein "dialogflowFirebaseFulfillment" exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers)); console.log('Dialogflow Request body: ' + JSON.stringify(request.body)); // . const agent = new WebhookClient({ request, response }); // let result = request.body.queryResult; // action entities https://dialogflow.com/docs/actions-and-parameters let action = result.action; let parameters = result.parameters; // https://dialogflow.com/docs/contexts let outputContexts = result.outputContexts; // let intentRequest = request.body.originalDetectIntentRequest; });
Dieser Rückruf wird für diejenigen Absichten aufgerufen, für die Sie die vollständige Erfüllung aktivieren.
Definieren Sie nun die Antwort auf die Absicht neu exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { const agent = new WebhookClient({ request, response }); function welcome(agent) { // agent.add(`Welcome to my agent!`); } function fallback(agent) { agent.add(`I didn't understand`); agent.add(`I'm sorry, can you try again?`); } // , : // key - intent-. // value - , . let intentMap = new Map(); intentMap.set('Default Welcome Intent', welcome); intentMap.set('Default Fallback Intent', fallback); agent.handleRequest(intentMap); });
Gleichzeitig ersetzt der Code die Absichtsantwort aus dem Abschnitt "Antworten" vollständig.
Antworten werden nur aufgerufen, wenn der Rückruf fehlschlägt, sodass Sie dort eine Fehlerbehandlung durchführen können.
Wir entfernen die Intent-Verarbeitungsfunktionen aus dem Rückruf.
Die Begrüßungs- und Fallback-Funktionen befinden sich im Abschluss .
Um sie aus dem Rückruf zu entfernen, müssen Sie die Übertragung des Kontexts der Funktion und der Parameter über `bind` hinzufügen exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { const agent = new WebhookClient({ request, response }); let intentMap = new Map(); // set Map. intentMap .set('Default Welcome Intent', welcome.bind(this, agent)) .set('Default Fallback Intent', fallback.bind(this, agent)); agent.handleRequest(intentMap); }); function welcome(agent) { agent.add(`Welcome to my agent!`); } function fallback(agent) { // 2 add agent.add([ `I didn't understand`, `I'm sorry, can you try again?` ]); }
, , Google Assistant. , .