Entrega de compilación (Dialogflow)

La entrega define la interfaz de conversación de tu Acción para obtener la entrada del usuario y la lógica para procesar la entrada y, finalmente, completar la Acción.

Define la conversación

Ahora que definiste acciones, puedes compilar la conversación correspondiente para esas acciones. Para ello, crea intents de Dialogflow que definan la gramática o lo que los usuarios deben decir para activar el intent y la entrega correspondiente a fin de procesar el intent cuando se active.

Puedes crear tantos intents como desees para definir la gramática completa de la conversación.

Crea intents

Haz clic en el signo + del elemento de menú Intents en la navegación izquierda de Dialogflow. Aparecerá el Editor de intents, donde puedes ingresar la siguiente información:

  • Intent name es el nombre del intent que se muestra en el IDE.
  • Los contextos te permiten definir el alcance de la activación del intent en casos específicos. Lee la documentación de Dialogflow sobre contextos para obtener más información.
  • Los eventos activan intents sin que los usuarios tengan que decir nada. Un ejemplo de evento es el evento GOOGLE_ASSISTANT_WELCOME, que permite que el Asistente de Google invoque tu acción. Este evento se usa para la Acción predeterminada de tu Acción. Consulta nuestra documentación para obtener más información sobre intents auxiliares integrados.
  • Las frases de entrenamiento definen lo que los usuarios deben decir (la gramática) para activar el intent. Escribe algunas frases (5 a 10) de lo que los usuarios pueden decir para activar el intent. Dialogflow controla automáticamente las variaciones naturales de las frases de ejemplo que proporcionas.
  • La opción Acción y parámetros define qué datos se pasarán a la entrega si la entrega está habilitada para este intent. Esto incluye los datos analizados de la entrada del usuario y el nombre que puedes usar en tu entrega para detectar qué intent se activó. Usarás este nombre más adelante para asignar el intent a su lógica de entrega correspondiente. Consulta Acciones y parámetros en la documentación de Dialogflow para obtener más información sobre la definición de acciones.

  • Responses es el compilador de respuestas de Dialogflow, en el que puedes definir la respuesta a este intent directamente dentro de Dialogflow, sin llamar a la entrega. Esta función es útil para las respuestas estáticas que no requieren entrega. Puedes usarlo para proporcionar mensajes sencillos de bienvenida o despedida. Sin embargo, es probable que uses la entrega para responder a los usuarios en la mayoría de los intents.

  • Entrega especifica si deseas o no llamar a tu entrega cuando se activa este intent. Lo más probable es que habilites esto para la mayoría de los intents en tu agente de Dialogflow. Si quieres ver este elemento en el intent, debes tener habilitada la entrega para el agente en el menú Entrega.

Compila respuestas en Dialogflow

Para algunos intents, es posible que no necesites que tu entrega devuelva una respuesta. En estos casos, puedes usar el generador de respuestas en Dialogflow para crear respuestas.

En el área Respuestas, proporciona la respuesta textual que deseas mostrar a los usuarios. Las respuestas de texto predeterminadas son respuestas de texto de TTS simples que pueden funcionar en varias integraciones de Dialogflow. Las respuestas de Asistente de Google se describen en la página Respuestas.

Cómo compilar respuestas de entrega

Tu código de entrega se aloja en la lógica de entrega de webhook para una Acción. Por ejemplo, en la muestra de Silly Name Maker, esta lógica se encuentra en index.js de Cloud Functions para Firebase.

Cuando se activa un intent que usa la entrega, recibes una solicitud de Dialogflow que contiene información sobre el intent. Luego, debes responder a la solicitud; para ello, procesa el intent y muestra una respuesta. El webhook de Dialogflow define esta solicitud y respuesta.

Te recomendamos que uses la biblioteca cliente de Node.js para procesar solicitudes y mostrar respuestas. Este es el proceso general para usar la biblioteca cliente:

  1. Inicializa el objeto de Dialogflow. Este objeto controla automáticamente la detección de solicitudes y su análisis para que puedas procesarlas en tu entrega.
  2. Crea funciones para controlar solicitudes. Estas funciones procesan la entrada del usuario y otros componentes del intent y crean la respuesta para mostrar a Dialogflow.

Inicializa el objeto Dialogflow

El siguiente código crea una instancia de Dialogflow y realiza la configuración estándar de Node.js para Google Cloud Functions:

Node.js
'use strict';

const {dialogflow} = require('actions-on-google');
const functions = require('firebase-functions');

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

app.intent('Default Welcome Intent', (conv) => {
  // Do things
});
exports.yourAction = functions.https.onRequest(app);
Java
public class DfFulfillment extends DialogflowApp {
  private static final Logger LOGGER = LoggerFactory.getLogger(DfFulfillment.class);

  @ForIntent("Default Welcome Intent")
  public ActionResponse welcome(ActionRequest request) {
    // Do things
    // ...
  }

Crea funciones para controlar solicitudes

Cuando los usuarios dicen una frase que activa un intent, recibes una solicitud de Dialogflow que controlas con una función en tu entrega. Por lo general, en esta función, harás lo siguiente:

  1. Lleva a cabo la lógica necesaria para procesar la entrada del usuario.
  2. Compila tus respuestas para responder a los intents activados. Ten en cuenta la plataforma que usan los usuarios para crear respuestas adecuadas. Consulta las capacidades de superficie a fin de obtener más información sobre cómo entregar respuestas para diferentes plataformas.
  3. Llama a la función ask() con tu respuesta.

En el siguiente código, se muestra cómo compilar dos respuestas de TTS que controlan un intent de invocación (input.welcome) y un intent de diálogo (input.number) que le da la bienvenida al usuario a tu acción y repite un número que un usuario habló para un intent de Dialogflow con el nombre:

Node.js
const app = dialogflow();
app.intent('Default Welcome Intent', (conv) => {
conv.ask('Welcome to number echo! Say a number.');
});
app.intent('Input Number', (conv, {num}) => {
// extract the num parameter as a local string variable
conv.close(`You said ${num}`);
});
Java
@ForIntent("Default Welcome Intent")
public ActionResponse defaultWelcome(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  rb.add("Welcome to number echo! Say a number.");
  return rb.build();
}

@ForIntent("Input Number")
public ActionResponse inputNumber(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  Integer number = (Integer) request.getParameter("num");
  rb.add("You said " + number.toString());
  return rb.endConversation().build();
}

El número de entrada del intent personalizado, que acompaña al código anterior, usa la entidad @sys.number para extraer un número de las declaraciones del usuario. Luego, el intent envía el parámetro num, que contiene el número del usuario, a la función en la entrega.

En lugar de tener controladores individuales para cada intent, también puedes agregar una función de resguardo. Dentro de la función de resguardo, verifica qué intent la activó y haz lo correcto según corresponda.

Node.js
const WELCOME_INTENT = 'Default Welcome Intent';
const NUMBER_INTENT = 'Input Number';
const NUMBER_PARAMETER = 'num';
// you can add a fallback function instead of a function for individual intents
app.fallback((conv) => {
 // intent contains the name of the intent
 // you defined in the Intents area of Dialogflow
 const intent = conv.intent;
 switch (intent) {
   case WELCOME_INTENT:
     conv.ask('Welcome! Say a number.');
     break;
   case NUMBER_INTENT:
     const num = conv.parameters[NUMBER_PARAMETER];
     conv.close(`You said ${num}`);
     break;
 }
});
Java
// you can add a fallback function instead of a function for individual intents
@ForIntent("Default Fallback Intent")
public ActionResponse fallback(ActionRequest request) {
  final String WELCOME_INTENT = "Default Welcome Intent";
  final String NUMBER_INTENT = "Input Number";
  final String NUMBER_ARGUMENT = "num";
  // intent contains the name of the intent
  // you defined in the Intents area of Dialogflow
  ResponseBuilder rb = getResponseBuilder(request);
  String intent = request.getIntent();
  switch (intent) {
    case WELCOME_INTENT:
      rb.add("Welcome! Say a number.");
      break;
    case NUMBER_INTENT:
      Integer num = (Integer) request.getParameter(NUMBER_ARGUMENT);
      rb.add("You said " + num).endConversation();
      break;
  }
  return rb.build();
}

Repeticiones sin coincidencias

Cuando Dialogflow no puede hacer coincidir ninguna de las gramáticas de entrada definidas en las frases de entrenamiento de tus intents, activa un intent de resguardo. Por lo general, los intents de resguardo vuelven a solicitar al usuario que proporcione la entrada necesaria para tu Acción. Puedes proporcionar frases que vuelvan a solicitarse si las especificas en el área Respuesta de un intent de resguardo o puedes usar un webhook para proporcionar respuestas.

Cuando la respuesta de un usuario no coincide con las frases de entrenamiento de tu Acción, Asistente de Google intenta controlar la entrada. Este comportamiento facilita a los usuarios cambiar acciones en medio de una conversación. Por ejemplo, un usuario pregunta: "¿Qué películas proyectarán esta semana?" y, luego, cambia el contexto en medio de la conversación: "¿Cómo estará el clima mañana?". En este ejemplo, debido a que "¿Cómo estará el clima mañana?" no es una respuesta válida a la conversación activada por el mensaje inicial, Asistente intenta automáticamente controlar la coincidencia y mover al usuario a una conversación adecuada.

Si Asistente no puede encontrar una acción adecuada que coincida con la entrada del usuario, este regresa al contexto de tu acción.

Como Asistente puede interrumpir tu acción para responder a una situación válida sin coincidencias, no uses intents de resguardo como una forma de entregar las consultas de los usuarios. Solo debes usar intents de resguardo para volver a solicitar al usuario una entrada válida.

Para crear un intent de resguardo, haz lo siguiente:

  1. En el menú de navegación de Dialogflow, haz clic en Intents.
  2. Haz clic en ⋮ junto a Create Intent y selecciona Create Fallback Intent. (También puedes hacer clic en el Intent alternativo predeterminado para editarlo).
  3. Especifica frases que vuelven a preguntar a los usuarios. Estas frases deben ser conversacionales y ser lo más útiles posible para el contexto actual del usuario.

    Para hacer esto sin entrega: Especifica frases en el área Respuesta del intent. Dialogflow elige frases de forma aleatoria de esta lista para responder a los usuarios hasta que se activa un intent más específico.

    Para hacer esto con la entrega:

    1. Activa o desactiva la opción Enable webhook call for this intent (Habilitar llamada de webhook para este intent) en la sección Fulfillment (Entrega) del intent.
    2. En la lógica de entrega, controla el intent de resguardo como cualquier otro intent, como se describe en la sección Crea funciones para controlar solicitudes.

    Por ejemplo, la siguiente función usa el objeto conv.data (una carga útil de datos arbitraria que puedes usar para mantener el estado) de la biblioteca cliente de Node.js para almacenar un contador que realiza un seguimiento de cuántas veces se activa un intent de resguardo. Si se activa más de una vez, se cierra la acción. Si bien no se muestra en el código, debes hacer que otros intents restablezcan este contador a 0 cuando se active un intent que no sea de resguardo. (Consulta la muestra de Number Genie para obtener detalles sobre cómo implementar esto).

    Node.js
    app.intent('Default Fallback Intent', (conv) => {
     conv.data.fallbackCount++;
     // Provide two prompts before ending game
     if (conv.data.fallbackCount === 1) {
       conv.contexts.set(DONE_YES_NO_CONTEXT, 5);
       conv.ask('Are you done playing Number Genie?');
     } else {
       conv.close(`Since I'm still having trouble, so I'll stop here. ` +
         `Let's play again soon.`);
     }
    });
    Java
    @ForIntent("Default Fallback Intent")
    public ActionResponse defaultFallback(ActionRequest request) {
      final String DONE_YES_NO_CONTEXT = "done_yes_no_context";
      ResponseBuilder rb = getResponseBuilder(request);
    
      int fallbackCount =
          request.getConversationData().get("fallbackCount") == null
              ? 0
              : (Integer) request.getConversationData().get("fallbackCount");
      fallbackCount++;
      request.getConversationData().put("fallbackCount", fallbackCount);
    
      if (fallbackCount == 1) {
        rb.add(new ActionContext(DONE_YES_NO_CONTEXT, 5));
        rb.add("Are you done playing Number Genie?");
      } else {
        rb.add("Since I'm still having trouble, so I'll stop here. Let's play again soon")
            .endConversation();
      }
      return rb.build();
    }

Cómo usar contextos

Usa contextos si quieres que Dialogflow active intents de resguardo solo en determinadas situaciones. Esto es útil si deseas tener diferentes intents de resguardo para diferentes situaciones sin coincidencias.

  • Si no configuras contextos en un intent de resguardo, se considera un intent de resguardo global que Dialogflow activa cuando no hay otro intent coincidente. Solo debes tener una de ellas definida si eliges usar una.
  • Si configuras contextos de entrada en un intent de resguardo, Dialogflow activa este intent de resguardo cuando se cumplan las siguientes condiciones:

    • Los contextos actuales del usuario son un superconjunto de los contextos definidos en el intent.
    • No coincide ningún otro intent.

    Esto te permite usar varios intents de resguardo con diferentes contextos de entrada para personalizar la reafirmación sin coincidencias en situaciones específicas.

  • Si configuras un contexto de salida en un intent de resguardo, mantienes al usuario en el mismo contexto después de que se activa y procesa el intent de resguardo.

Consulta Contextos de Dialogflow para obtener más información.

Reintento sin entrada

Consulta la página Remensajes para obtener detalles sobre cómo controlar el momento en que el usuario no proporciona más entradas en un dispositivo de voz, como Google Home, que requiere una interacción continua.