Pour utiliser le fulfillment dans un système de production, vous devez mettre en œuvre et déployer un service de webhook. Pour gérer le fulfillment, votre service de webhook doit accepter les requêtes JSON et renvoyer des réponses JSON comme indiqué dans ce guide. Le flux de traitement détaillé pour le fulfillment et les webhooks est décrit dans le document de présentation du fulfillment.
Conditions requises pour le service de webhook
Votre service de webhook doit remplir les conditions suivantes :
- Gérer les requêtes HTTPS. Le protocole HTTP n'est pas compatible. Si vous hébergez votre webhook service sur Google Cloud à l'aide d'une solution de calcul ou de calcul sans serveur, consultez la documentation produit pour la diffusion avec HTTPS. Pour connaître les autres options d'hébergement, consultez la page Obtenir un certificat SSL pour votre domaine.
- Assurez-vous que l'URL du service de webhook est accessible au public.
- Gérer les requêtes POST avec un corps JSON
WebhookRequest. - Répondre aux
WebhookRequestrequêtes avec un corps JSONWebhookResponse.
Authentification
| X | Élément |
|---|---|
| Nom d'utilisateur et mot de passe de connexion | Pour les paramètres de webhook, vous pouvez spécifier des valeurs facultatives pour le nom d'utilisateur et le mot de passe de connexion. Si vous les fournissez, Dialogflow ajoute un en-tête HTTP d'autorisation aux requêtes webhook. Cet en-tête se présente sous la forme suivante : "authorization: Basic <base 64 encoding of the string username:password>". |
| En-têtes d'authentification | Pour les paramètres de webhook, vous pouvez spécifier des paires clé/valeur d'en-tête HTTP facultatives. Si vous les fournissez, Dialogflow ajoute ces en-têtes HTTP aux requêtes webhook. Il est courant de fournir une seule paire avec une clé authorization. |
| Authentification intégrée de Cloud Run Functions | Vous pouvez utiliser l'authentification intégrée lorsque vous utilisez Cloud Run Functions. Pour utiliser ce type d'authentification, ne fournissez pas d'en-têtes de nom d'utilisateur, de mot de passe ni d'autorisation. Si vous fournissez l'un de ces champs, ils ne seront pas utilisés pour l'authentification intégrée. |
| Jetons d'identité du service | Vous pouvez utiliser des jetons d'identité du service pour l'authentification. Si vous ne fournissez pas de nom d'utilisateur ni de mot de passe de connexion, ni d'en-tête avec une clé authorization, Dialogflow suppose automatiquement que des jetons d'identité du service doivent être utilisés et ajoute un en-tête HTTP d'autorisation aux requêtes webhook. Cet en-tête se présente sous la forme suivante : "authorization: Bearer <identity token>". |
| Authentification TLS mutuelle | Consultez la documentation sur l'authentification TLS mutuelle . |
Requête de webhook
Lorsqu'un intent configuré pour le fulfillment est mis en correspondance, Dialogflow envoie une requête de webhook POST HTTPS à votre service de webhook. Le corps de cette requête est un objet JSON contenant des informations sur l'intent mis en correspondance.
En plus de la requête de l'utilisateur final, de nombreuses intégrations envoient également des informations sur l'utilisateur final. Par exemple, un ID permettant d'identifier l'utilisateur de manière unique. Ces informations sont accessibles à l'aide du champ originalDetectIntentRequest de la requête webhook, qui contient les informations envoyées depuis la plate-forme d'intégration.
Pour en savoir plus, consultez la
WebhookRequest
documentation de référence.
Voici un exemple de requête :
{
"responseId": "response-id",
"session": "projects/project-id/agent/sessions/session-id",
"queryResult": {
"queryText": "End-user expression",
"parameters": {
"param-name": "param-value"
},
"allRequiredParamsPresent": true,
"fulfillmentText": "Response configured for matched intent",
"fulfillmentMessages": [
{
"text": {
"text": [
"Response configured for matched intent"
]
}
}
],
"outputContexts": [
{
"name": "projects/project-id/agent/sessions/session-id/contexts/context-name",
"lifespanCount": 5,
"parameters": {
"param-name": "param-value"
}
}
],
"intent": {
"name": "projects/project-id/agent/intents/intent-id",
"displayName": "matched-intent-name"
},
"intentDetectionConfidence": 1,
"diagnosticInfo": {},
"languageCode": "en"
},
"originalDetectIntentRequest": {}
}
Réponse de webhook
Une fois que votre webhook reçoit une requête, il doit envoyer une réponse. Le corps de cette réponse est un objet JSON contenant les informations suivantes :
- La réponse que Dialogflow renvoie à l'utilisateur final.
- Les mises à jour des contextes actifs pour la conversation.
- Un événement de suivi pour déclencher une mise en correspondance d'intent
- Une charge utile personnalisée à envoyer à l'intégration ou au client de détection d'intent.
Les limites suivantes s'appliquent à votre réponse :
- Répondez dans les 10 secondes pour les applications de l'Assistant Google ou dans les 5 secondes pour les autres applications. Sinon, la requête expire.
- La taille de la réponse ne doit pas dépasser 64 Kio.
Pour en savoir plus, consultez la
WebhookResponse
documentation de référence.
Réponse textuelle
Voici un exemple de réponse textuelle :
{
"fulfillmentMessages": [
{
"text": {
"text": [
"Text response from webhook"
]
}
}
]
}
Réponse sous forme de fiche
Voici un exemple de réponse sous forme de fiche :
{
"fulfillmentMessages": [
{
"card": {
"title": "card title",
"subtitle": "card text",
"imageUri": "https://example.com/images/example.png",
"buttons": [
{
"text": "button text",
"postback": "https://example.com/path/for/end-user/to/follow"
}
]
}
}
]
}
Réponse de l'Assistant Google
Voici un exemple de réponse de l'Assistant Google :
{
"payload": {
"google": {
"expectUserResponse": true,
"richResponse": {
"items": [
{
"simpleResponse": {
"textToSpeech": "this is a Google Assistant response"
}
}
]
}
}
}
}
Contexte
Voici un exemple qui définit le contexte de sortie :
{
"fulfillmentMessages": [
{
"text": {
"text": [
"Text response from webhook"
]
}
}
],
"outputContexts": [
{
"name": "projects/project-id/agent/sessions/session-id/contexts/context-name",
"lifespanCount": 5,
"parameters": {
"param-name": "param-value"
}
}
]
}
Événement
Voici un exemple qui appelle un événement personnalisé :
{
"followupEventInput": {
"name": "event-name",
"languageCode": "en-US",
"parameters": {
"param-name": "param-value"
}
}
}
Entité de session
Voici un exemple qui définit une entité de session :
{
"fulfillmentMessages": [
{
"text": {
"text": [
"Choose apple or orange"
]
}
}
],
"sessionEntityTypes":[
{
"name":"projects/project-id/agent/sessions/session-id/entityTypes/fruit",
"entities":[
{
"value":"APPLE_KEY",
"synonyms":[
"apple",
"green apple",
"crabapple"
]
},
{
"value":"ORANGE_KEY",
"synonyms":[
"orange"
]
}
],
"entityOverrideMode":"ENTITY_OVERRIDE_MODE_OVERRIDE"
}
]
}
Charge utile personnalisée
Voici un exemple qui fournit une charge utile personnalisée :
{
"fulfillmentMessages": [
{
"payload": {
"facebook": { // for Facebook Messenger integration
"attachment": {
"type": "",
"payload": {}
}
},
"slack": { // for Slack integration
"text": "",
"attachments": []
},
"richContent": [ // for Dialogflow Messenger integration
[
{
"type": "image",
"rawUrl": "https://example.com/images/logo.png",
"accessibilityText": "Example logo"
}
]
],
// custom integration payload here
}
}
]
}
Activer et gérer le fulfillment
Pour activer et gérer le fulfillment pour votre agent à l'aide de la console, procédez comme suit :
- Accédez à la console Dialogflow ES.
- Sélectionnez un agent.
- Dans le menu de la barre latérale, sélectionnez Fulfillment.
- Définissez le champ Webhook sur Enabled (Activé).
- Fournissez les détails de votre service de webhook dans le formulaire. Si votre webhook ne nécessite pas d'authentification, laissez les champs d'authentification vides.
- Cliquez sur Enregistrer.

Pour activer et gérer le fulfillment pour votre agent à l'aide de l'API, consultez la
documentation de référence de l'agent. Les méthodes getFulfillment et updateFulfillment vous permettent de gérer les paramètres de fulfillment.
Pour activer le fulfillment pour un intent avec la console, procédez comme suit :
- Cliquez sur Intents dans le menu de la barre latérale gauche.
- Sélectionnez un intent.
- Accédez à la section Fulfillment.
- Définissez l'option Enable webhook call for this intent (Activer l'appel de webhook pour cet intent) sur "On" (Activé).
- Cliquez sur Enregistrer.
Pour activer le fulfillment d'un intent avec l'API, consultez la
documentation de référence des intents et définissez le
webhookState champ sur WEBHOOK_STATE_ENABLED.
Erreurs de webhook
Si votre service de webhook rencontre une erreur, il doit renvoyer l'un des codes d'état HTTP suivants :
400: Requête incorrecte401: Opération non autorisée403: Interdit404: Introuvable500: Erreur interne du serveur503: Service indisponible
Dans les situations d'erreur suivantes, Dialogflow répond à l'utilisateur final avec la réponse intégrée configurée pour l'intent mis en correspondance :
- Le délai de réponse a été dépassé.
- Un code d'état d'erreur a été reçu.
- La réponse n'est pas valide.
- Le service de webhook n'est pas disponible.
En outre, si un appel d'API de détection d'intent
déclenche la mise en correspondance d'intent, le champ status de la réponse de détection d'intent
contient des informations sur l'erreur du webhook. Exemple :
"status": {
"code": 206,
"message": "Webhook call failed. <details of the error...>"
}
Nouvelles tentatives automatiques
Dialogflow ES inclut des mécanismes internes qui effectuent automatiquement de nouvelles tentatives en cas de certaines erreurs de webhook afin d'améliorer la robustesse. Seules les erreurs non terminales sont retentées, telles que les erreurs de délai ou de connexion.
Pour réduire le risque d'appels en double :
- Définissez des seuils de délai avant expiration plus longs pour les webhooks.
- Prenez en charge l'idempotence dans votre logique de webhook ou dédupliquez les requêtes.
Utiliser Cloud Run Functions
Vous pouvez utiliser Cloud Run Functions pour le fulfillment de plusieurs manières. L'éditeur intégré de Dialogflow s'intègre aux fonctions Cloud Run. Lorsque vous utilisez l'éditeur intégré pour créer et modifier votre code webhook, Dialogflow établit une connexion sécurisée à votre fonction Cloud.
Vous pouvez également utiliser une fonction Cloud non créée par l'éditeur intégré. Si la fonction Cloud se trouve dans le même projet que votre agent, celui-ci peut appeler votre webhook sans nécessiter de configuration particulière.
Toutefois, vous devez configurer manuellement cette intégration dans les deux situations suivantes :
- Le compte de service Agent de service Dialogflow
avec l'adresse suivante doit exister pour votre projet d'agent :
Ce compte de service spécial et la clé associée sont normalement créés automatiquement lorsque vous créez le premier agent pour un projet. Si votre agent a été créé avant le 10 mai 2021, vous devrez peut-être déclencher la création de ce compte de service spécial comme suit :service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com
- Créez un agent pour le projet.
- Exécutez la commande suivante :
gcloud beta services identity create --service=dialogflow.googleapis.com --project=agent-project-id
- Si votre fonction de webhook se trouve dans un projet différent de celui de l'agent, vous devez fournir le rôle Demandeur Cloud Functions IAM au compte de service Agent de service Dialogflow dans le projet de votre fonction.
Jetons d'identité du service
Lorsque Dialogflow appelle un webhook, il fournit un
jeton d'identité Google
avec la requête. Tout webhook peut éventuellement valider le jeton à l'aide de bibliothèques clientes Google
ou de bibliothèques Open Source telles que
github.com/googleapis/google-auth-library-nodejs.
Par exemple, vous pouvez valider l'email du jeton d'ID comme suit :
service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com
Exemples
Les exemples suivants montrent comment recevoir une requête WebhookRequest et envoyer une réponse WebhookResponse. Ces exemples utilisent des intents créés dans le
guide de démarrage rapide.
Go
Pour vous authentifier auprès de Dialogflow CX, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
import (
"encoding/json"
"fmt"
"log"
"net/http"
)
type intent struct {
DisplayName string `json:"displayName"`
}
type queryResult struct {
Intent intent `json:"intent"`
}
type text struct {
Text []string `json:"text"`
}
type message struct {
Text text `json:"text"`
}
// webhookRequest is used to unmarshal a WebhookRequest JSON object. Note that
// not all members need to be defined--just those that you need to process.
// As an alternative, you could use the types provided by
// the Dialogflow protocol buffers:
// https://godoc.org/google.golang.org/genproto/googleapis/cloud/dialogflow/v2#WebhookRequest
type webhookRequest struct {
Session string `json:"session"`
ResponseID string `json:"responseId"`
QueryResult queryResult `json:"queryResult"`
}
// webhookResponse is used to marshal a WebhookResponse JSON object. Note that
// not all members need to be defined--just those that you need to process.
// As an alternative, you could use the types provided by
// the Dialogflow protocol buffers:
// https://godoc.org/google.golang.org/genproto/googleapis/cloud/dialogflow/v2#WebhookResponse
type webhookResponse struct {
FulfillmentMessages []message `json:"fulfillmentMessages"`
}
// welcome creates a response for the welcome intent.
func welcome(request webhookRequest) (webhookResponse, error) {
response := webhookResponse{
FulfillmentMessages: []message{
{
Text: text{
Text: []string{"Welcome from Dialogflow Go Webhook"},
},
},
},
}
return response, nil
}
// getAgentName creates a response for the get-agent-name intent.
func getAgentName(request webhookRequest) (webhookResponse, error) {
response := webhookResponse{
FulfillmentMessages: []message{
{
Text: text{
Text: []string{"My name is Dialogflow Go Webhook"},
},
},
},
}
return response, nil
}
// handleError handles internal errors.
func handleError(w http.ResponseWriter, err error) {
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintf(w, "ERROR: %v", err)
}
// HandleWebhookRequest handles WebhookRequest and sends the WebhookResponse.
func HandleWebhookRequest(w http.ResponseWriter, r *http.Request) {
var request webhookRequest
var response webhookResponse
var err error
// Read input JSON
if err = json.NewDecoder(r.Body).Decode(&request); err != nil {
handleError(w, err)
return
}
log.Printf("Request: %+v", request)
// Call intent handler
switch intent := request.QueryResult.Intent.DisplayName; intent {
case "Default Welcome Intent":
response, err = welcome(request)
case "get-agent-name":
response, err = getAgentName(request)
default:
err = fmt.Errorf("Unknown intent: %s", intent)
}
if err != nil {
handleError(w, err)
return
}
log.Printf("Response: %+v", response)
// Send response
if err = json.NewEncoder(w).Encode(&response); err != nil {
handleError(w, err)
return
}
}
Java
Pour vous authentifier auprès de Dialogflow CX, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Node.js
Pour vous authentifier auprès de Dialogflow CX, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Python
Pour vous authentifier auprès de Dialogflow CX, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.