Tworzenie realizacji za pomocą biblioteki klienta Actions on Google w środowisku Node.js (Dialogflow)

Biblioteka klienta Actions on Google w środowisku Node.js to zalecany sposób uzyskiwania dostępu do platformy Actions on Google i interakcji z nią, jeśli tworzysz webhooka realizacji w języku JavaScript.

Wstęp

Biblioteka klienta Node.js to biblioteka realizacji w Actions on Google, która udostępnia te funkcje:

  • Obsługuje wszystkie funkcje Actions on Google, w tym odpowiedzi tekstowe i multimedialne, logowanie się na konto, przechowywanie danych, transakcje i nie tylko.
  • Udostępnia idiomatyczną warstwę abstrakcji w JavaScripcie, która opakowuje interfejs API webhooka HTTP/JSON conversation.
  • Obsługuje niskopoziomowe szczegóły komunikacji między realizacją zamówienia a platformą Actions on Google.
  • Można ją zainstalować za pomocą znanych narzędzi do zarządzania pakietami, takich jak npm lub yarn.
  • Umożliwia łatwe wdrożenie webhooka realizacji na bezserwerowych platformach obliczeniowych, takich jak Cloud Functions dla Firebase lub AWS Lambda. Możesz też hostować webhooka realizacji u dostawcy usług w chmurze lub w własnym środowisku zarządzanym.
  • Jest zgodny z Node.js w wersji 6.0.0 i nowszych.

Możesz korzystać z biblioteki klienta w połączeniu z integracją Dialogflow z Actions on Google lub z pakietem SDK Actions.

Więcej przykładów kodu do korzystania z biblioteki klienta znajdziesz na stronie z przykładami.

Wyświetl dokumentację API

Dokumentacja interfejsu API znajduje się na stronie w GitHub bibliotece klienta Actions on Google w środowisku Node.js.

Możesz też wygenerować lokalną kopię pliku referencyjnego, uruchamiając to polecenie z katalogu, do którego został pobrany kod biblioteki klienta:

yarn docs

Wygenerowane dokumenty będą dostępne w folderze docs katalogu, do którego został pobrany kod biblioteki klienta.

Jak to działa

Zanim skorzystasz z biblioteki klienta, warto sprawdzić, w jaki sposób webhook realizacji transakcji wykorzystuje bibliotekę klienta do przetwarzania żądań użytkowników, które Actions on Google wysyła do Twojej realizacji.

Po utworzeniu webhooka realizacji w języku JavaScript możesz wdrożyć i hostować kod w bezserwerowym środowisku obliczeniowym, takim jak Cloud Functions dla Firebase czy AWS Lambda. Możesz też hostować kod samodzielnie bez dodatkowych czynności, korzystając z Express web Framework.

W środowisku wykonawczym webhook zamówienia może wywoływać funkcje w bibliotece klienta, aby przetwarzać żądania użytkowników i wysyłać odpowiedzi z powrotem do Actions on Google, aby renderować je w danych wyjściowych użytkownika.

Poniżej podsumowaliśmy najważniejsze zadania, które wykonuje webhook w ramach realizacji za pomocą biblioteki klienta:

Rysunek 1. Architektura wysokiego poziomu biblioteki klienta w środowisku Node.js
  1. Odbieranie żądań użytkownika: gdy użytkownik wysyła zapytanie do Asystenta Google, platforma Actions on Google wysyła żądanie HTTP do webhooka realizacji. Żądanie zawiera ładunek JSON zawierający intencję i inne dane, takie jak nieprzetworzony tekst danych wejściowych użytkownika i możliwości powierzchni urządzenia użytkownika. Więcej przykładów zawartości ładunku JSON znajdziesz w przewodnikach na temat formatu webhooka Dialogflow i formatu webhooka rozmowy.
  2. Wykrywanie formatu wywołania Framework: w przypadku obsługiwanych platform biblioteka klienta automatycznie wykrywa format wywołania platformy (np. jeśli żądanie pochodzi z platformy Express Web Framework lub z AWS Lambda) i wie, jak płynnie obsługiwać komunikację z platformą Actions on Google.
  3. Przetwarzanie modułu obsługi usług: biblioteka klienta reprezentuje interfejs API webhooka HTTP/JSON webhooka rozmowy na potrzeby Dialogflow i Actions SDK jako funkcję usługi. Webhook realizacji używa odpowiedniej usługi, by utworzyć globalną instancję app. Instancja app jest modułem obsługi żądań HTTP i rozumie określony protokół usługi.
  4. Przetwarzanie rozmowy: biblioteka klienta przedstawia informacje o poszczególnych rozmowach jako obiekt Conversation dołączony do instancji app. Webhook w ramach realizacji może używać obiektu Conversation do pobierania informacji o stanie lub danych z różnych rozmów, wysyłania odpowiedzi do użytkowników lub zamykania mikrofonu.
  5. Przetwarzanie oprogramowania pośredniczącego: biblioteka klienta umożliwia tworzenie własnych oprogramowania pośredniczącego usług rozmów, które składa się z co najmniej 1 określonej przez Ciebie funkcji, która ma być uruchamiana automatycznie przed wywołaniem modułu obsługi intencji. Webhook realizacji może używać oprogramowania pośredniczącego, aby dodawać właściwości lub klasy pomocnicze do obiektu Conversation.
  6. Przetwarzanie przez moduł obsługi intencji: biblioteka klienta umożliwia definiowanie modułów obsługi intencji rozpoznawanych przez webhooka realizacji. W przypadku Dialogflow: biblioteka klienta przekierowuje żądanie do odpowiedniego modułu obsługi intencji, mapując żądanie na dokładny ciąg znaków z nazwą intencji zdefiniowanej w konsoli Dialogflow. W przypadku pakietu Actions on Google jest on kierowany na podstawie właściwości intent wysłanej z Actions on Google.
  7. Wysyłanie odpowiedzi do użytkowników: aby tworzyć odpowiedzi, webhook zamówienia wywołuje funkcję Conversation#ask(). Funkcję ask() można wywoływać wielokrotnie, aby stopniowo zwiększać odpowiedź. Biblioteka klienta zserializuje odpowiedź na żądanie HTTP z ładunkiem JSON i wysyła ją do Actions on Google. Funkcja close() działa podobnie jak funkcja ask(), ale zamyka rozmowę.

Konfigurowanie lokalnego środowiska programistycznego

Zanim zaimplementujesz webhooka realizacji, zainstaluj najpierw bibliotekę klienta.

Instalowanie biblioteki klienta

Najprostszym sposobem zainstalowania biblioteki klienta w lokalnym środowisku programistycznym jest użycie menedżera pakietów, takiego jak npm lub yarn.

Aby zainstalować, uruchom jedno z tych poleceń z terminala:

  • Jeśli używasz npm: npm install actions-on-google
  • Jeśli używasz włókna: yarn add actions-on-google

Konfigurowanie folderów projektu

W zależności od miejsca, w którym zamierzasz wdrożyć webhooka realizacji (Google Cloud Functions dla Firebase, AWS Lambda lub własnej usługi Express), może być konieczne utworzenie określonej struktury folderów projektu do zapisywania plików.

Jeśli na przykład korzystasz z Cloud Functions dla Firebase, możesz skonfigurować wymagane foldery projektu, wykonując czynności opisane w sekcjach Konfigurowanie Node.js i interfejsu wiersza poleceń Firebase oraz Zainicjowanie Firebase dla Cloud Functions. W przypadku Cloud Functions dla Firebase musisz zwykle zapisać webhooka w pliku /functions/index.js.

Tworzenie instancji aplikacji

Actions on Google używa określonych formatów wiadomości do wymiany żądań i odpowiedzi z webhookiem realizacji w zależności od tego, czy tworzysz działanie konwersacyjne za pomocą Dialogflow, pakietu SDK Actions, czy też tworzysz akcję inteligentnego domu.

Aby reprezentować te różne protokoły żądań i odpowiedzi, biblioteka klienta udostępnia 3 funkcje usług:

Protokół webhooka konwersacji jest używany przez obie usługi konwersacyjne (Dialogflow i SDK Actions), ale każda usługa inaczej pakuje wiadomości.

Aby utworzyć instancję app, użyj usługi. Wystąpienie app zawiera globalną logikę stanu i realizacji webhooka oraz obsługuje komunikację między Actions on Google a Twoją realizacją za pomocą protokołu konkretnej usługi.

Możesz skonfigurować właściwości instancji app i wywołać jej metody, aby wskazać działanie webhooka realizacji. Możesz też łatwo podłączyć instancję app do bezserwerowego środowiska obliczeniowego, np. do Cloud Functions dla Firebase, które akceptuje funkcje JavaScript jako moduły obsługi żądań HTTP.

Aby utworzyć wystąpienie app w webhooku realizacji, wykonaj te czynności:

  1. Wywołaj funkcję require(), aby zaimportować moduł „actions-on-google” i załadować odpowiednią usługę. Na przykład ten fragment kodu pokazuje, jak możesz wczytać usługę dialogflow i niektóre elementy używane do tworzenia odpowiedzi, a także przypisać ją do stałej o nazwie dialogflow:

    // Import the service function and various response classes
    const {
      dialogflow,
      actionssdk,
      Image,
      Table,
      Carousel,
    } = require('actions-on-google');

    W tym przypadku actions-on-google odnosi się do zależności określonej w pliku package.json w folderze projektu (możesz zapoznać się z tym przykładowym plikiem package.json).

    Uzyskując instancję app, możesz opcjonalnie określić klasy reprezentujące odpowiedzi rozszerzone, intencje pomocnicze i inne funkcje Actions on Google, których chcesz używać. Pełną listę prawidłowych klas, które możesz wczytać, znajdziesz w dokumentacji modułów odpowiedzi rozmowy i intencji pomocniczej.

  2. Utwórz instancję app, wywołując załadowaną usługę. Przykład:

    const app = dialogflow();

  3. Aby skonfigurować instancję app podczas inicjowania, możesz podać obiekt options jako pierwszy argument podczas wywoływania usługi. (Więcej informacji: DialogflowOptions). Na przykład ten fragment pokazuje, jak zarejestrować nieprzetworzony ładunek JSON z żądania lub odpowiedzi użytkownika za pomocą flagi { debug: true }:

const app = dialogflow({
  debug: true
});

Ustawianie modułów obsługi zdarzeń

Aby przetwarzać zdarzenia związane z działaniami w Google utworzone przez bibliotekę klienta w trakcie cyklu życia interakcji użytkownika z akcją, musisz wykorzystać bibliotekę klienta do utworzenia modułów obsługi, które będą przetwarzać żądania użytkowników i odsyłać odpowiedzi.

Możesz tworzyć funkcje działające jako moduły obsługi tych głównych typów zdarzeń rozpoznawanych przez bibliotekę klienta:

  • Zdarzenia intencji: intencje to unikalne identyfikatory, które Actions on Google wysyła do Twojej realizacji, gdy użytkownik prosi o określoną funkcję. Jeśli korzystasz z Dialogflow, odpowiada to Dialogflow dopasowywania zapytania użytkownika do intencji w agencie Dialogflow.
  • Zdarzenia błędu: jeśli wystąpi błąd kodu JavaScript lub biblioteki klienta, możesz użyć funkcji catch instancji app, aby odpowiednio przetworzyć wyjątek błędu. Należy wdrożyć 1 funkcję catch do obsługi wszystkich błędów, które są istotne w realizacji realizacji.
  • Zdarzenia kreacji zastępczej: zdarzenie kreacji zastępczej ma miejsce, gdy użytkownik wysyła zapytanie, którego Actions on Google nie może rozpoznać. Możesz użyć funkcji fallback instancji app, aby zarejestrować ogólny moduł obsługi zastępczej, który będzie aktywowany, gdy żaden moduł obsługi intencji nie zostanie dopasowany do przychodzącego żądania realizacji. Należy wdrożyć 1 funkcję fallback do obsługi wszystkich zdarzeń zastępczych. Jeśli korzystasz z Dialogflow, Dialogflow może wywołać konkretną intencję zastąpienia, gdy nie będzie pasować żadna inna intencja. Dla tej intencji zastępczej należy utworzyć odpowiedni moduł obsługi intencji.

Za każdym razem, gdy użytkownik wysyła żądanie do akcji, wystąpienie app tworzy obiekt Conversation reprezentujący tę sesję rozmowy. Dostęp do tego obiektu uzyskuje się za pomocą nazwy zmiennej conv przekazanej w funkcji obsługi intencji jako pierwszego argumentu funkcji. Obiektu conv zwykle używa się w modułach obsługi do wysyłania odpowiedzi do użytkownika.

Zapytania użytkowników mogą też zawierać parametry, które akcja może wyodrębnić i wykorzystywać do precyzowania odpowiedzi.

  • Jeśli używasz pakietu Actions SDK, parametry określasz w pakiecie akcji. Przykład pobierania parametrów z intencji znajdziesz w przykładowym kodzie Eliza.
  • Jeśli używasz Dialogflow, możesz uzyskać dostęp do wartości parametrów za pomocą zmiennej params. Przykłady obsługi intencji z parametrami w Dialogflow znajdziesz w artykule Parametry i konteksty dostępu.

Ustawianie modułów obsługi intencji

Aby ustawić moduł obsługi intencji, wywołaj funkcję intent() instancji app. Jeśli na przykład korzystasz z Dialogflow, oto funkcja DialogflowApp#intent(). W argumentach określ nazwę intencji i podaj funkcję obsługi.

Jeśli używasz Dialogflow, nie musisz konfigurować modułów obsługi dla każdej intencji w agencie. Zamiast tego możesz skorzystać z wbudowanego modułu obsługi odpowiedzi Dialogflow, aby automatycznie obsługiwać intencje bez implementowania własnych funkcji obsługi. W ten sposób można na przykład przekazać do Dialogflow domyślną intencję powitalną.

Przykład poniżej pokazuje moduły obsługi intencji dla intencji „powitanie” i „bye”. Ich funkcje anonimowego obsługi przyjmują argument conv i odsyłają użytkownikowi prostą odpowiedź w postaci ciągu za pomocą funkcji conv.ask():

app.intent('Default Welcome Intent', (conv) => {
  conv.ask('How are you?');
});

app.intent('bye', (conv) => {
  conv.close('See you later!');
});

Zwróć uwagę, że funkcja close() jest podobna do funkcji ask(), ale zamyka mikrofon i cała rozmowa się zakończyła.

Więcej informacji o tym, jak tworzyć moduły obsługi intencji, znajdziesz w artykule o tworzeniu modułu obsługi intencji.

Ustawianie modułów obsługi zdarzeń błędów

Aby ustawić moduły obsługi błędów, wywołaj funkcję catch() instancji app. Jeśli na przykład używasz Dialogflow, jest to funkcja DialogflowApp#catch() .

Poniższy przykład przedstawia prosty moduł obsługi błędów typu catch-all, który wysyła błąd do danych wyjściowych konsoli i zwraca prostą odpowiedź w postaci ciągu tekstowego, aby wysłać użytkownikowi prośbę za pomocą funkcji conv.ask():

app.catch((conv, error) => {
  console.error(error);
  conv.ask('I encountered a glitch. Can you say that again?');
});

Ustawianie modułów obsługi zdarzeń zastępczych

Aby ustawić ogólny moduł obsługi zastępczej, gdy żadna intencja nie jest dopasowana do przychodzącego żądania realizacji, wywołaj funkcję fallback() instancji app. Jeśli na przykład używasz Dialogflow, jest to funkcja DialogflowApp#fallback() .

Poniższy przykład przedstawia prosty moduł obsługi zastępczej, który wysyła prostą odpowiedź w postaci ciągu tekstowego, aby wysłać użytkownikowi prośbę za pomocą funkcji conv.ask():

app.fallback((conv) => {
  conv.ask(`I couldn't understand. Can you say that again?`);
});

Tworzenie modułu obsługi intencji

W tej sekcji opisano kilka typowych przypadków użycia implementacji modułów obsługi intencji za pomocą biblioteki klienta. Aby sprawdzić, jak biblioteka klienta pasuje do intencji, zapoznaj się z sekcją „Przetwarzanie modułu obsługi intencji” w artykule Jak to działa.

Parametry dostępu i konteksty

Jeśli korzystasz z Dialogflow, możesz zdefiniować parametry i konteksty w agencie Dialogflow, aby utrzymywać informacje o stanie i kontrolować przebieg rozmowy.

Parametry przydają się do rejestrowania ważnych słów, wyrażeń i wartości w zapytaniach użytkowników. Dialogflow wyodrębnia odpowiednie parametry z zapytań użytkowników w czasie działania. Możesz przetwarzać te wartości parametrów w webhooku realizacji, aby określać, jak odpowiadać użytkownikom.

Za każdym razem, gdy użytkownik wysyła żądanie do akcji, instancja DialogflowApp tworzy obiekt parameters reprezentujący wartości parametrów wyodrębnione z tego żądania przez Dialogflow. Dostęp do tego obiektu uzyskuje się po nazwie zmiennej params.

Ten fragment kodu pokazuje, jak uzyskać dostęp do właściwości name z poziomu obiektu params, gdy użytkownik wysyła żądanie:

app.intent('Default Welcome Intent', (conv, params) => {
  conv.ask(`How are you, ${params.name}?`);
});

Oto alternatywny fragment kodu, który działa tak samo. Nawiasy klamrowe ({}) wykonują demontowanie JavaScriptu, by pobrać właściwość name z obiektu parameters i wykorzystać ją jako zmienną lokalną:

app.intent('Default Welcome Intent', (conv, {name}) => {
  conv.ask(`How are you, ${name}?`);
});

W tym fragmencie kodu nazwa parametru to full-name, ale jest zdeorganizowana i przypisana do zmiennej lokalnej o nazwie name:

app.intent('Default Welcome Intent', (conv, {'full-name': name}) => {
  conv.ask(`How are you, ${name}?`);
});

Konteksty to zaawansowana funkcja Dialogflow. Za pomocą kontekstów możesz zarządzać stanem, przepływem i rozgałęzieniem rozmowy. Biblioteka klienta zapewnia dostęp do kontekstu za pomocą obiektu DialogflowConversation#contexts. Ten fragment kodu pokazuje, jak automatycznie ustawić kontekst w webhooku realizacji i jak pobrać obiekt kontekstu:

app.intent('intent1', (conv) => {
  const lifespan = 5;
  const contextParameters = {
    color: 'red',
  };
  conv.contexts.set('context1', lifespan, contextParameters);
  // ...
  conv.ask('...');
});

app.intent('intent2', (conv) => {
  const context1 = conv.contexts.get('context1');
  const contextParameters = context1.parameters;
  // ...
  conv.ask('...');
});

app.intent('intent3', (conv) => {
  conv.contexts.delete('context1');
  // ...
  conv.ask('...');
});

Uzyskiwanie dostępu do wyników intencji pomocniczej

Dla wygody użytkowników biblioteka klienta udostępnia klasy intencji pomocniczej, które opakowują typowe typy danych użytkownika, których często żąda aplikacja. Obejmuje to klasy reprezentujące wyniki różnych intencji pomocniczych Actions on Google. Intencje pomocnicze są używane, gdy chcesz, aby Asystent Google odpowiadał tym fragmentom rozmowy, w których użytkownik musi wprowadzić dane wejściowe, aby kontynuować rozmowę.

Przykład: wyniki Asystenta potwierdzenia

Intencja pomocnicza potwierdzania umożliwia proszenie użytkownika o potwierdzenie tak/nie i uzyskanie ostatecznej odpowiedzi. Poniższy fragment kodu pokazuje, jak webhook może dostosować swoją odpowiedź na podstawie wyników zwróconych przez intencję pomocniczą potwierdzenia. Pełniejszy przykład znajdziesz w dokumentacji referencyjnej klas Confirmation.

// Create Dialogflow intent with `actions_intent_CONFIRMATION` event
app.intent('get_confirmation', (conv, input, confirmation) => {
  if (confirmation) {
    conv.close(`Great! I'm glad you want to do it!`);
  } else {
    conv.close(`That's okay. Let's not do it now.`);
  }
});

Poniższy fragment kodu pokazuje, jak webhook realizacji transakcji może dostosować swoją odpowiedź na podstawie danych wejściowych użytkownika w karuzeli. Dzięki komponentowi karuzela akcja może przedstawiać użytkownikom kilka opcji do wyboru. Pełny przykład znajdziesz w dokumentacji referencyjnej klas Carousel.

app.intent('carousel', (conv) => {
  conv.ask('Which of these looks good?');
  conv.ask(new Carousel({
    items: {
      car: {
        title: 'Car',
        description: 'A four wheel vehicle',
        synonyms: ['automobile', 'vehicle'],
      },
      plane: {
        title: 'Plane',
        description: 'A flying machine',
        synonyms: ['aeroplane', 'jet'],
      }
    }
  }));
});

// Create Dialogflow intent with `actions_intent_OPTION` event
app.intent('get_carousel_option', (conv, input, option) => {
  if (option === 'one') {
    conv.close(`Number one is a great choice!`);
  } else {
    conv.close(`Number ${option} is a great choice!`);
  }
});

Konfigurowanie obiektów odpowiedzi w rozmowie

Biblioteka klienta udostępnia klasy odpowiedzi na konwersację, które reprezentują odpowiedzi rozszerzone lub elementy multimedialne, które akcja może wysyłać. Zwykle wysyłasz te odpowiedzi lub elementy wtedy, gdy użytkownicy nie muszą nic wpisywać, aby kontynuować rozmowę.

Przykład: obraz

Ten fragment kodu pokazuje, jak webhook realizacji transakcji może wysłać Image w odpowiedzi, która zostanie automatycznie dołączona do odpowiedzi BasicCard przez bibliotekę:

app.intent('Default Welcome Intent', (conv) => {
  conv.ask('Hi, how is it going?');
  conv.ask(`Here's a picture of a cat`);
  conv.ask(new Image({
    url: '/web/fundamentals/accessibility/semantics-builtin/imgs/160204193356-01-cat-500.jpg',
    alt: 'A cat',
  }));
});

Wykonywanie asynchronicznych wywołań funkcji

Biblioteka klienta Actions on Google w środowisku Node.js jest przeznaczona do programowania asynchronicznego. Moduł obsługi intencji może zwrócić obietnicę, która znika po zakończeniu generowania odpowiedzi przez webhooka realizacji.

Z poniższego fragmentu kodu dowiesz się, jak wykonać asynchroniczne wywołanie funkcji w celu zwrócenia obiektu typu obiecujące, a następnie odpowiedzieć komunikatem, jeśli element w realizacji webhooka otrzyma intencję „powitanie”. W tym fragmencie kodu obietnica oznacza, że webhook realizacji będzie zwracać odpowiedź konwersacyjną dopiero po realizacji obietnicy dotyczącej zewnętrznego wywołania interfejsu API.

W tym przykładzie do pobierania danych pogodowych używamy fałszywego interfejsu API.

/**
 * Make an external API call to get weather data.
 * @return {Promise<string>}
 */
const forecast = () => {
  // ...
};

app.intent('Default Welcome Intent', (conv) => {
  return forecast().then((weather) => {
    conv.ask('How are you?');
    conv.ask(`Today's weather is ${weather}.`);
  });
});

Poniższy uproszczony fragment kodu ma ten sam efekt, ale korzysta z funkcji async await wprowadzonej w ECMA 2017 (Node.js w wersji 8). Aby użyć tego kodu w Cloud Functions dla Firebase, sprawdź, czy używasz prawidłowej wersji narzędzia firebase-tools i masz prawidłową konfigurację.

app.intent('Default Welcome Intent', async (conv) => {
  const weather = await forecast();
  conv.ask('How are you?');
  conv.ask(`Today's weather is ${weather}.`);
});

Przechowuj dane rozmów

Biblioteka klienta umożliwia webhookowi realizacji zamówienia zapisywanie danych w rozmowach do wykorzystania w przyszłości. Najważniejsze obiekty, których możesz używać do przechowywania danych, to:

Poniższy fragment kodu pokazuje, jak webhook realizacji transakcji może przechowywać dane w zdefiniowanej przez Ciebie dowolnej usłudze (someProperty) i dołączać je do obiektu Conversation#user.storage. Pełniejszy przykład znajdziesz w dokumentacji referencyjnej klas Conversation#user.storage.

app.intent('Default Welcome Intent', (conv) => {
  conv.user.storage.someProperty = 'someValue';
  conv.ask('...');
});

Możesz użyć obiektu Conversation#user, aby uzyskać informacje o użytkowniku, w tym identyfikator ciągu znaków i dane osobowe. Niektóre pola, takie jak conv.user.name.display i conv.user.email, wymagają żądania conv.ask(new Permission) odpowiednio dla NAME i conv.ask(new SignIn) w przypadku Logowania przez Google.

const {Permission} = require('actions-on-google');
app.intent('Default Welcome Intent', (conv) => {
  if (conv.user.last.seen) {
    conv.ask('Welcome back! How are you?');
  } else {
    conv.ask('Nice to meet you! How are you doing?');
  }
});

app.intent('permission', (conv) => {
  conv.ask(new Permission({
    context: 'To greet you personally',
    permissions: 'NAME',
  }));
});

// Create Dialogflow intent with `actions_intent_PERMISSION` event
app.intent('get_permission', (conv, input, granted) => {
  if (granted) {
    conv.close(`Hi ${conv.user.name.display}!`);
  } else {
    // User did not grant permission
    conv.close(`Hello!`);
  }
});

Skalowanie za pomocą oprogramowania pośredniczącego

Możesz rozszerzyć bibliotekę klienta za pomocą oprogramowania pośredniczącego.

Warstwa oprogramowania pośredniczącego składa się z co najmniej 1 określonej przez Ciebie funkcji, która jest uruchamiana automatycznie przed wywołaniem modułu obsługi intencji. Za pomocą warstwy oprogramowania pośredniczącego możesz modyfikować wystąpienie Conversation i dodawać do niego dodatkowe funkcje.

Usługi Dialogflow i Actions SDK udostępniają funkcję app.middleware(), która umożliwia dodawanie właściwości lub klas pomocniczych do instancji Conversation.

Ten fragment kodu pokazuje przykład użycia oprogramowania pośredniczącego:

class Helper {
  constructor(conv) {
    this.conv = conv;
  }

  func1() {
    this.conv.ask(`What's up?`);
  }
}

app.middleware((conv) => {
  conv.helper = new Helper(conv);
});

app.intent('Default Welcome Intent', (conv) => {
  conv.helper.func1();
});

Eksportowanie aplikacji

Aby udostępnić webhooka realizacji dla platformy internetowej lub bezserwerowej platformy obliczeniowej, musisz wyeksportować obiekt app jako publicznie dostępny webhook. Biblioteka klienta od razu umożliwia wdrażanie w różnych środowiskach.

Poniższe fragmenty kodu pokazują, jak wyeksportować plik app w różnych środowiskach wykonawczych:

Przykład: Cloud Functions dla Firebase

const functions = require('firebase-functions');
// ... app code here
exports.fulfillment = functions.https.onRequest(app);

Przykład: wbudowany edytor Dialogflow

const functions = require('firebase-functions');

// ... app code here

// Exported function name must be 'dialogflowFirebaseFulfillment'
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

Przykład: własny serwer Express na serwerze (prosty)

const express = require('express');
const bodyParser = require('body-parser');  

// ... app code here

express().use(bodyParser.json(), app).listen(3000);

Przykład: własny serwer Express na serwerze (wiele tras)

const express = require('express');
const bodyParser = require('body-parser');

// ... app code here

const expressApp = express().use(bodyParser.json());

expressApp.post('/fulfillment', app);

expressApp.listen(3000);

Przykład: brama AWS Lambda API

// ... app code here

exports.fulfillment = app;