Guía de inicio rápido: Entrega

En esta guía de inicio rápido, se describe cómo integrar tu agente en tus servicios mediante entregas. La integración de tu servicio te permite realizar distintas acciones según las expresiones del usuario final y enviarle respuestas dinámicas a este.

Antes de comenzar

Si no planeas usar la entrega, puedes omitir esta guía de inicio rápido.

En estos pasos se usa Cloud Functions para Firebase y se supone que tienes conocimientos básicos de Node.js. Si deseas crear entregas con tu propio servidor o con otro lenguaje, consulta la documentación sobre entregas para obtener más detalles.

Debes hacer lo siguiente antes de leer esta guía:

  1. Lee los conceptos básicos de Dialogflow.
  2. Realiza los pasos de configuración.
  3. Realiza los pasos de la guía de inicio rápido para compilar un agente. Los siguientes pasos continúan el trabajo en el mismo agente.

El editor intercalado

Dialogflow Console tiene un editor de código integrado, llamado editor intercalado, que puedes usar para crear código de entrega y, luego, implementarlo en Cloud Functions para Firebase. El editor intercalado solo es compatible con Node.js y usa la biblioteca de entregas de Dialogflow.

Cuando habilitas por primera vez el editor intercalado, se propagan automáticamente en el código de la entrega los controladores predeterminados para intents predeterminadas que se incluyen en todos los agentes. El código también tiene instrucciones comentadas a fin de agregar controladores para intents definidos por el desarrollador.

Habilita e implementa la entrega con el editor intercalado

Para habilitar e implementar el código de entrega predeterminado con el editor intercalado, haz lo siguiente:

  1. Haz clic en Entregas en el menú de la barra lateral izquierda.
  2. Establece el Editor intercalado como Habilitado.
  3. Haz clic en Implementar en la parte inferior del formulario.

Debes habilitar la entrega para cada intent que la requiera. Para habilitar la entrega en el intent de bienvenida predeterminado, haz lo siguiente:

  1. Haz clic en Intents, en el menú de la barra lateral izquierda.
  2. Haz clic en Intent de bienvenida predeterminado.
  3. En la sección Frases de entrenamiento, agrega la siguiente frase:
    • hi
  4. Desplázate hasta la sección Entregas y activa la opción Habilitar llamadas de webhook para este intent.

  5. Haz clic en Guardar.

Ahora puedes probar tu entrega en el simulador. Ingresa Hi en el simulador, que responde con Welcome to my agent!. Esta respuesta se envía desde el webhook de entrega que acabas de implementar. En particular, la respuesta vino de este código:

    function welcome(agent) {
      agent.add(`Welcome to my agent!`);
    }
    

Crea un controlador de entregas personalizado

Los pasos anteriores usan un controlador proporcionado por el código del editor intercalado predeterminado. Para crear un controlador personalizado, sigue estos pasos:

  1. Habilita la entrega para el intent name que creaste en los pasos anteriores.
  2. Haz clic en Entregas en el menú de la barra lateral izquierda y examina el código en el editor intercalado.
  3. Busca esta línea:

    exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
        

    La función onRequest controla todas las solicitudes de Dialogflow. En el cuerpo de esta función, se definen las funciones específicas del controlador. Estas funciones del controlador se invocan cuando se detecta una coincidencia con los intents asociados. Por ejemplo, la función que se usaste en la sección anterior es function welcome(agent).

  4. Debajo de los controladores existentes, agrega esta función para la intent name:

    function nameHandler(agent) {
          agent.add('My name is Dialogflow!');
        }
        
  5. Debajo de las definiciones de la función del controlador, hay intentMap.set() llamadas. Estas llamadas asocian controladores específicos con intents por nombre. Por ejemplo, intentMap.set('Default Welcome Intent', welcome) asocia el controlador welcome con el intent denominado Default Welcome Intent.

  6. Debajo de las llamadas intentMap.set existentes, agrega esta línea para el intent name:

    intentMap.set('name', nameHandler);
        
  7. Haz clic en Implementar en la parte inferior del formulario.

  8. Ingresa What's your name? en el simulador. Se envía la respuesta “My name is Dialogflow” (“Me llamo Dialogflow”) desde tu nuevo controlador.

Accede a valores de parámetros

En pasos anteriores, creaste un intent Languages para identificar idiomas hablados y lenguajes de programación. El intent usa los parámetros language y ProgrammingLanguage. En esta sección, accederás a los valores de estos parámetros en tu controlador de entregas.

Para agregar el controlador, sigue estos pasos:

  1. Habilita la entrega para el intent Languages.
  2. Haz clic en Entregas en el menú de la barra lateral izquierda.
  3. Como en los pasos anteriores, agrega el siguiente controlador y la llamada intentMap:

    function languageHandler(agent) {
            const language = agent.parameters.language;
            const programmingLanguage = agent.parameters.ProgrammingLanguage;
            if (language) {
                agent.add(`From fulfillment: Wow! I didn't know you knew ${language}`);
            } else if (programmingLanguage) {
                agent.add(`From fulfillment: ${programmingLanguage} is cool`);
            } else {
                agent.add(`From fulfillment: What language do you know?`);
            }
        }
        ...
        intentMap.set('Languages', languageHandler);
        
  4. Haz clic en Implementar.

Este controlador recupera los parámetros language y ProgrammingLanguage, y los almacena en variables. Recupera estos valores del atributo agent.parameters, que es un objeto que contiene todos los nombres y valores de los parámetros que los usuarios finales especifican en sus solicitudes.

Para probarlo, ingresa "I know how to speak German" ("Sé hablar alemán") en el simulador.

Establecer contexto de salida

En los pasos anteriores, creaste una intent de seguimiento para el intent Languages. A fin de imitar de forma adecuada el mismo comportamiento en la entrega, debes configurar el mismo contexto de salida, la misma vida útil y los mismos parámetros que tiene la respuesta estática. Modifica tu función languageHandler para incluir el contexto mediante el método agent.setContext:

function languageHandler(agent) {
        const language = agent.parameters.language;
        const programmingLanguage = agent.parameters.ProgrammingLanguage;
        if (language) {
            agent.add(`From fulfillment: Wow! I didn't know you knew ${language}`);
            agent.setContext({
                  name: 'languages-followup',
                  lifespan: 2,
                  parameters:{language: language}
                });
        } else if (programmingLanguage) {
            agent.add(`From fulfillment: ${programmingLanguage} is cool.`);
            agent.setContext({
                  name: 'languages-followup',
                  lifespan: 2,
                  parameters:{ProgrammingLanguage: programmingLanguage}
                });
        } else {
            agent.add(`From fulfillment: What language do you know?`);
        }
    }
    

En este controlador, se agrega un contexto de salida con el nombre “languages-followup” que tiene una vida útil de 2 turnos y un valor de parámetro (language o ProgrammingLanguage) en el contexto para su posterior recuperación. Haz clic en Implementar y, luego, interactúa con el simulador para probarlo.

Para recuperar los contextos en la entrega, puedes usar el método agent.getContext o puedes obtener una lista de todos los contextos con agent.contexts. Por ejemplo, un controlador de entregas para el intent de seguimiento languages - custom sería similar a lo siguiente:

function languagesCustomHandler(agent) {
        const context = agent.getContext('languages-followup');
        const allContexts = agent.contexts; // [{ name: 'languages-followup', ...}]
        const language = context.parameters.language || context.parameters.ProgrammingLanguage;
        const duration = agent.parameters.duration;
        agent.add(`I can't believe you've know ${language} for ${duration}!`);
    }