Créer un traitement avec la bibliothèque cliente Actions on Google Node.js (Dialogflow)

Si vous créez un webhook de fulfillment en JavaScript, nous vous recommandons d'utiliser la bibliothèque cliente Node.js pour Actions on Google pour accéder à la plate-forme Actions on Google et interagir avec elle.

Introduction

La bibliothèque cliente Node.js est une bibliothèque de traitement pour Actions on Google. Elle offre les fonctionnalités suivantes:

  • Compatible avec toutes les fonctionnalités d'Actions on Google, y compris les réponses textuelles et multimédias enrichies, la connexion au compte, le stockage de données, les transactions, etc.
  • Fournit une couche d'abstraction idiomatique en JavaScript qui encapsule l'API de webhook HTTP/JSON Conversation.
  • Il gère les détails de bas niveau de la communication entre votre traitement et la plate-forme Actions on Google.
  • peuvent être installées à l'aide d'outils de gestion de packages connus, tels que npm ou yarn ;
  • Permet de déployer facilement votre webhook de fulfillment sur des plates-formes de calcul sans serveur telles que Cloud Functions for Firebase ou AWS Lambda. Vous pouvez également héberger votre webhook de fulfillment sur un fournisseur de services cloud ou dans un environnement auto-hébergé et autogéré.
  • Il est compatible avec Node.js v6.0.0 ou version ultérieure.

Vous pouvez utiliser la bibliothèque cliente conjointement avec l'intégration de Dialogflow pour Actions on Google ou avec le SDK Actions.

Pour voir des exemples de code complets permettant d'utiliser la bibliothèque cliente, consultez la page d'exemples.

Consulter la documentation de référence de l'API

La documentation de référence de l'API est hébergée sur la page GitHub de la bibliothèque cliente Actions on Google pour Node.js.

Vous pouvez également générer une copie locale de la référence en exécutant la commande suivante à partir du répertoire dans lequel vous avez téléchargé le code de la bibliothèque cliente:

yarn docs

Les documents générés seront disponibles dans le dossier docs du répertoire dans lequel vous avez téléchargé le code de la bibliothèque cliente.

Comprendre le fonctionnement

Avant d'utiliser la bibliothèque cliente, il est utile de comprendre comment le webhook de fulfillment utilise la bibliothèque cliente pour traiter les requêtes utilisateur qu'Actions on Google envoie à votre traitement.

Lorsque vous créez un webhook de fulfillment en JavaScript, vous pouvez déployer et héberger votre code dans un environnement informatique sans serveur, tel que Cloud Functions for Firebase de Google ou AWS Lambda. Vous pouvez également héberger le code vous-même sans effort supplémentaire à l'aide du framework Express Web.

Dans l'environnement d'exécution, le webhook de fulfillment peut appeler des fonctions de la bibliothèque cliente pour traiter les requêtes des utilisateurs et renvoyer les réponses à Actions on Google pour les afficher dans la sortie utilisateur.

Les tâches clés gérées par votre webhook de fulfillment à l'aide de la bibliothèque cliente sont brièvement résumées ci-dessous:

Figure 1 : Architecture de haut niveau de la bibliothèque cliente Node.js
  1. Réception de requêtes utilisateur: lorsqu'un utilisateur envoie une requête à l'Assistant Google, la plate-forme Actions on Google envoie une requête HTTP à votre webhook de fulfillment. La requête inclut une charge utile JSON contenant l'intent et d'autres données, telles que le texte brut de l'entrée utilisateur et les fonctionnalités de surface de l'appareil de l'utilisateur. Pour plus d'exemples de contenu de charge utile JSON, consultez les guides Format de webhook Dialogflow et format de webhook de conversation.
  2. Détection du format d'appel du framework: pour les frameworks compatibles, la bibliothèque cliente détecte automatiquement le format d'appel du framework (par exemple, si la requête provient du framework Web Express ou d'AWS Lambda) et sait comment gérer de manière fluide la communication avec la plate-forme Actions on Google.
  3. Traitement du gestionnaire de services:la bibliothèque cliente représente l'API de webhook HTTP/JSON de conversation pour Dialogflow et le SDK Actions en tant que fonction de service. Votre webhook de fulfillment utilise le service approprié pour créer une instance app globale. L'instance app agit en tant que gestionnaire des requêtes HTTP et comprend le protocole spécifique du service.
  4. Traitement de la conversation:la bibliothèque cliente représente les informations par conversation sous la forme d'un objet Conversation associé à l'instance app. Votre webhook de traitement peut utiliser l'objet Conversation pour récupérer des données ou des informations d'état stockées entre conversations, envoyer des réponses aux utilisateurs ou désactiver le micro.
  5. Traitement du middleware:la bibliothèque cliente vous permet de créer votre propre middleware de services de conversation. Il consiste en une ou plusieurs fonctions que vous définissez et que la bibliothèque cliente s'exécute automatiquement avant d'appeler le gestionnaire d'intents. Le webhook de fulfillment peut utiliser votre middleware pour ajouter des propriétés ou des classes d'assistance à l'objet Conversation.
  6. Traitement du gestionnaire d'intents: la bibliothèque cliente vous permet de définir des gestionnaires d'intents que votre webhook de fulfillment peut comprendre. Pour Dialogflow, la bibliothèque cliente achemine la requête vers le gestionnaire d'intent approprié en la mappant à la chaîne exacte du nom de l'intent définie dans la console Dialogflow. Pour le SDK Actions, il est acheminé en fonction de la propriété intent envoyée par Actions on Google.
  7. Envoyer des réponses aux utilisateurs:pour créer des réponses, le webhook de fulfillment appelle la fonction Conversation#ask(). La fonction ask() peut être appelée plusieurs fois pour créer la réponse de manière incrémentielle. La bibliothèque cliente sérialise la réponse dans une requête HTTP avec une charge utile JSON et l'envoie à Actions on Google. La fonction close() a un comportement semblable à ask(), mais ferme la conversation.

Configurer l'environnement de développement local

Avant d'implémenter votre webhook de fulfillment, veillez à installer la bibliothèque cliente.

Installer la bibliothèque cliente

Le moyen le plus simple d'installer la bibliothèque cliente dans votre environnement de développement local consiste à utiliser un gestionnaire de packages tel que npm ou yarn.

Pour l'installer, exécutez l'une des commandes suivantes à partir du terminal:

  • Si npm est utilisé: npm install actions-on-google
  • Si vous utilisez du fil: yarn add actions-on-google

Configurer les dossiers de votre projet

Selon l'emplacement où vous prévoyez de déployer le webhook de fulfillment (Cloud Functions de Google pour Firebase, AWS Lambda ou Express auto-hébergé), vous devrez peut-être créer une structure de dossiers de projet spécifique pour enregistrer vos fichiers.

Par exemple, si vous utilisez Cloud Functions for Firebase, vous pouvez configurer les dossiers de projet requis en suivant les étapes décrites dans les pages Configurer Node.js et la CLI Firebase et Initialiser Firebase pour Cloud Functions. Pour Cloud Functions for Firebase, vous écrivez généralement votre webhook de fulfillment dans le fichier /functions/index.js.

Créer une instance d'application

Actions on Google utilise des formats de messagerie spécifiques pour échanger des requêtes et des réponses avec votre webhook de fulfillment, selon que vous créez une action de conversation à l'aide de Dialogflow ou du SDK Actions, ou une action de maison connectée.

Pour représenter ces différents protocoles de requête et de réponse, la bibliothèque cliente fournit trois fonctions de service:

Le protocole de webhook de conversation est utilisé par les deux services de conversation (Dialogflow et SDK Actions), mais chaque service encapsule les messages différemment.

Vous utilisez un service pour créer une instance app. L'instance app encapsule l'état global et la logique de traitement pour votre webhook, et gère la communication entre Actions on Google et votre traitement à l'aide du protocole spécifique au service.

Vous pouvez configurer les propriétés de l'instance app et appeler ses méthodes pour diriger le comportement du webhook de fulfillment. Vous pouvez également brancher facilement l'instance app dans un environnement d'informatique sans serveur, tel que Cloud Functions for Firebase, qui accepte les fonctions JavaScript en tant que gestionnaires pour les requêtes HTTP.

Pour créer une instance app dans votre webhook de fulfillment, procédez comme suit:

  1. Appelez la fonction require() pour importer le module "actions-on-google" et charger le service souhaité. Par exemple, l'extrait de code suivant montre comment charger le service dialogflow et certains éléments utilisés pour créer des réponses, et l'attribuer à une constante nommée dialogflow :

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

    Ici, actions-on-google fait référence à une dépendance spécifiée dans un fichier package.json du dossier de votre projet (vous pouvez consulter cet exemple de fichier package.json).

    Lorsque vous obtenez une instance app, vous pouvez éventuellement spécifier des classes représentant des réponses enrichies, des intents d'aide et d'autres fonctionnalités Actions on Google que vous souhaitez utiliser. Pour obtenir la liste complète des classes valides que vous pouvez charger, consultez la documentation de référence sur les modules de réponse de conversation et d'intent d'aide.

  2. Créez une instance app en appelant le service que vous avez chargé. Exemple :

    const app = dialogflow();
    .

  3. Pour configurer l'instance app lors de l'initialisation, vous pouvez fournir un objet options comme premier argument lorsque vous appelez le service. (Pour en savoir plus, consultez DialogflowOptions.) Par exemple, l'extrait de code suivant montre comment consigner la charge utile JSON brute de la requête ou de la réponse de l'utilisateur en définissant l'indicateur { debug: true }:

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

Définir des gestionnaires pour des événements

Pour traiter les événements liés aux actions sur Google créés par la bibliothèque cliente pendant le cycle de vie de l'interaction utilisateur avec votre action, vous utiliserez la bibliothèque cliente pour créer des gestionnaires afin de traiter les requêtes des utilisateurs et de renvoyer des réponses.

Vous pouvez créer des fonctions qui agissent en tant que gestionnaires pour les principaux types d'événements reconnus par la bibliothèque cliente:

  • Événements d'intent:les intents sont des identifiants uniques qu'Actions on Google envoie à votre traitement chaque fois qu'un utilisateur demande une fonctionnalité spécifique. Si vous utilisez Dialogflow, cela correspond à la mise en correspondance d'une requête utilisateur avec un intent dans votre agent Dialogflow.
  • Événements d'erreur:lorsqu'une erreur JavaScript ou de la bibliothèque cliente se produit, vous pouvez utiliser la fonction catch de l'instance app pour traiter l'exception d'erreur de manière appropriée. Vous devez implémenter une seule fonction catch pour gérer toutes les erreurs dont votre traitement tient compte.
  • Événements de remplacement:un événement de remplacement se produit lorsque l'utilisateur envoie une requête qu'Actions on Google n'est pas en mesure de reconnaître. Vous pouvez utiliser la fonction fallback de l'instance app pour enregistrer un gestionnaire de remplacement générique qui se déclenchera si aucun gestionnaire d'intent n'a été mis en correspondance pour la demande de traitement entrante. Vous devez implémenter une seule fonction fallback pour gérer tous les événements de remplacement. Si vous utilisez Dialogflow, il peut déclencher un intent de remplacement spécifique lorsqu'aucun autre intent n'est mis en correspondance. Vous devez créer un gestionnaire d'intent correspondant à cet intent de remplacement.

Chaque fois que l'utilisateur envoie une requête à votre action, l'instance app crée un objet Conversation qui représente cette session de conversation. Cet objet est accessible via le nom de variable conv transmis dans la fonction de gestionnaire d'intents en tant que premier argument de la fonction. L'objet conv est généralement utilisé dans vos gestionnaires pour envoyer une réponse à l'utilisateur.

Les requêtes utilisateur peuvent également inclure des paramètres que votre action peut extraire et utiliser pour affiner les réponses.

  • Si vous utilisez le SDK Actions, vous devez définir des paramètres dans le package d'actions. Pour savoir comment extraire des paramètres à partir d'intents, consultez l'exemple de code Eliza.
  • Si vous utilisez Dialogflow, vous pouvez accéder aux valeurs de paramètres via la variable params. Pour voir des exemples de gestion des intents avec des paramètres dans Dialogflow, consultez Paramètres d'accès et contextes.

Définir des gestionnaires pour les intents

Pour définir le gestionnaire pour un intent, appelez la fonction intent() de votre instance app. Par exemple, si vous utilisez Dialogflow, il s'agit de la fonction DialogflowApp#intent(). Dans les arguments, spécifiez le nom de l'intent et fournissez une fonction de gestionnaire.

Si vous utilisez Dialogflow, il n'est pas nécessaire de définir des gestionnaires pour chaque intent de votre agent. À la place, vous pouvez utiliser le gestionnaire de réponses intégré de Dialogflow pour gérer automatiquement les intents sans implémenter vos propres fonctions de gestionnaire. Par exemple, l'intent d'accueil par défaut peut être délégué à Dialogflow de cette manière.

L'exemple suivant montre des gestionnaires d'intent pour les intents "greeting" et "bye". Ses fonctions de gestionnaire anonyme utilisent un argument conv et renvoient une réponse de chaîne simple à l'utilisateur via la fonction conv.ask():

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

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

Notez que la fonction close() est semblable à ask(), sauf qu'elle ferme le micro et la conversation est terminée.

Pour en savoir plus sur la création de gestionnaires d'intents, consultez Créer un gestionnaire d'intents.

Définir des gestionnaires pour les événements d'erreur

Pour définir les gestionnaires pour les erreurs, appelez la fonction catch() de votre instance app. (Par exemple, si vous utilisez Dialogflow, il s'agit de la fonction DialogflowApp#catch().)

L'exemple suivant montre un simple gestionnaire d'erreurs "catch" qui envoie l'erreur à la sortie de la console et renvoie une réponse de chaîne simple pour inviter l'utilisateur via la fonction conv.ask():

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

Définir des gestionnaires pour les événements de remplacement

Pour définir un gestionnaire de remplacement générique lorsqu'aucun intent n'est mis en correspondance pour la requête entrante de traitement, appelez la fonction fallback() de votre instance app. (Par exemple, si vous utilisez Dialogflow, il s'agit de la fonction DialogflowApp#fallback().)

L'exemple suivant montre un gestionnaire de remplacement simple qui renvoie une réponse de chaîne simple pour inviter l'utilisateur via la fonction conv.ask():

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

Créer votre gestionnaire d'intents

Cette section présente certains cas d'utilisation courants lorsque vous implémentez des gestionnaires d'intents avec la bibliothèque cliente. Pour savoir comment la bibliothèque cliente correspond à l'intent, consultez la section "Traitement du gestionnaire d'intents" de l'article Comprendre le fonctionnement.

Accéder aux paramètres et aux contextes

Si vous utilisez Dialogflow, vous pouvez définir des paramètres et des contextes dans votre agent Dialogflow pour gérer les informations d'état et contrôler le flux de conversation.

Les paramètres sont utiles pour capturer des mots, des expressions ou des valeurs importants dans les requêtes des utilisateurs. Dialogflow extrait les paramètres correspondants des requêtes utilisateur au moment de l'exécution. Vous pouvez traiter ces valeurs de paramètre dans votre webhook de fulfillment pour déterminer comment répondre aux utilisateurs.

Chaque fois que l'utilisateur envoie une requête à votre action, l'instance DialogflowApp crée un objet parameters qui représente les valeurs de paramètre que Dialogflow a extraites de cette requête. Cet objet est accessible via le nom de variable params.

L'extrait de code suivant montre comment accéder à la propriété name à partir de l'objet params lorsque l'utilisateur envoie une requête:

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

Voici un autre extrait de code qui fait la même chose. Les accolades ({}) effectuent la déstructuration JavaScript pour récupérer la propriété name de l'objet parameters et l'utiliser comme variable locale:

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

Dans l'extrait de code suivant, le nom du paramètre est full-name, mais il est déstructuré et attribué à une variable locale appelée name:

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

Les contextes sont une fonctionnalité avancée de Dialogflow. Vous pouvez utiliser des contextes pour gérer l'état, le flux et l'embranchement de la conversation. La bibliothèque cliente permet d'accéder à un contexte via l'objet DialogflowConversation#contexts. L'extrait de code suivant montre comment définir un contexte de manière automatisée dans votre webhook de fulfillment et comment récupérer l'objet de contexte:

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('...');
});

Accéder aux résultats de l'intent d'assistance

Pour plus de commodité, la bibliothèque cliente fournit des classes d'intent d'aide qui encapsulent les types courants de données utilisateur que les actions demandent fréquemment. Celles-ci incluent des classes représentant les résultats des différents intents d'aide d'Actions on Google. Les intents d'assistance sont utilisés lorsque vous souhaitez que l'Assistant Google gère des parties de la conversation où l'utilisateur doit fournir des entrées pour la poursuivre.

Exemple: résultats de l'outil d'aide à la confirmation

L'intent d'aide à la confirmation vous permet de demander à l'utilisateur une confirmation oui/non et d'obtenir la réponse qui en résulte. L'extrait de code suivant montre comment votre webhook peut personnaliser sa réponse en fonction des résultats renvoyés par l'intent d'aide à la confirmation. Pour obtenir un exemple plus complet, consultez la documentation de référence de la classe 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.`);
  }
});

L'extrait de code suivant montre comment le webhook de fulfillment peut personnaliser sa réponse en fonction de l'entrée utilisateur pour un carrousel. Le composant carrousel permet à votre action de présenter une sélection d'options aux utilisateurs. Pour obtenir un exemple plus complet, consultez la documentation de référence sur la classe 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!`);
  }
});

Configurer les objets de réponse de conversation

La bibliothèque cliente fournit des classes de réponse de conversation qui représentent des réponses enrichies ou des éléments multimédias que votre action peut envoyer. Vous envoyez généralement ces réponses ou ces éléments lorsque les utilisateurs n'ont pas besoin de fournir d'informations pour poursuivre la conversation.

Exemple: Image

L'extrait de code suivant montre comment votre webhook de fulfillment peut envoyer un Image dans une réponse qui sera automatiquement associée à une réponse BasicCard par la bibliothèque:

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',
  }));
});

Effectuer des appels de fonction asynchrones

La bibliothèque cliente Node.js Actions on Google est conçue pour la programmation asynchrone. Votre gestionnaire d'intents peut renvoyer une promesse qui se résout une fois que le webhook de fulfillment a généré une réponse.

L'extrait de code suivant montre comment effectuer un appel de fonction asynchrone pour renvoyer un objet de promesse, puis répondre avec un message si votre webhook de fulfillment reçoit l'intent "greeting". Dans cet extrait de code, la promesse garantit que votre webhook de fulfillment ne renvoie une réponse conversationnelle qu'une fois la promesse de l'appel d'API externe résolue.

Dans cet exemple, nous utilisons une API fictive pour obtenir les données météorologiques.

/**
 * 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}.`);
  });
});

L'extrait de code simplifié suivant a le même effet, mais utilise la fonctionnalité await async introduite dans ECMA 2017 (Node.js version 8). Pour utiliser ce code avec Cloud Functions for Firebase, assurez-vous d'utiliser la version correcte de firebase-tools et de disposer de la configuration appropriée.

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

Stocker des données de conversation

La bibliothèque cliente permet à votre webhook de fulfillment d'enregistrer des données dans des conversations pour une utilisation ultérieure. Voici les principaux objets que vous pouvez utiliser pour le stockage des données:

L'extrait de code suivant montre comment votre webhook de fulfillment peut stocker des données dans une propriété arbitraire que vous avez définie (someProperty) et l'associer à l'objet Conversation#user.storage. Pour un exemple plus complet, consultez la documentation de référence de la classe Conversation#user.storage.

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

L'objet Conversation#user vous permet d'obtenir des informations sur l'utilisateur, y compris un identifiant de chaîne et des informations personnelles. Certains champs tels que conv.user.name.display et conv.user.email nécessitent de demander respectivement conv.ask(new Permission) pour NAME et conv.ask(new SignIn) pour Google Sign-In.

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!`);
  }
});

Scaling avec un middleware

Vous pouvez étendre la bibliothèque cliente via un middleware.

La couche middleware comprend une ou plusieurs fonctions que vous définissez, que la bibliothèque cliente exécute automatiquement avant d'appeler le gestionnaire d'intents. L'utilisation d'une couche de middleware vous permet de modifier l'instance Conversation et d'ajouter des fonctionnalités.

Les services Dialogflow et du SDK Actions exposent une fonction app.middleware() qui vous permet d'ajouter des propriétés ou des classes d'assistance à l'instance Conversation.

L'extrait de code suivant montre un exemple d'utilisation d'un middleware:

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();
});

Exporter l'application

Pour exposer votre webhook de fulfillment pour un framework Web ou une plate-forme informatique sans serveur, vous devez exporter l'objet app en tant que webhook accessible publiquement. La bibliothèque cliente est directement compatible avec le déploiement dans un certain nombre d'environnements.

Les extraits de code suivants montrent comment exporter app dans différents environnements d'exécution:

Exemple: Cloud Functions for Firebase

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

Exemple: Éditeur intégré Dialogflow

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

// ... app code here

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

Exemple: serveur Express auto-hébergé (simple)

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

// ... app code here

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

Exemple: serveur Express auto-hébergé (plusieurs itinéraires)

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);

Exemple: passerelle API AWS Lambda

// ... app code here

exports.fulfillment = app;