Las acciones de conversación dejarán de estar disponibles el 13 de junio de 2023. Para obtener más información, consulta Eliminación de acciones en conversaciones.

Webhooks

Para brindarte aún más flexibilidad a la hora de compilar acciones, puedes delegar la lógica a los servicios web HTTPS (entrega). Tus acciones pueden activar webhooks que realizan solicitudes a un extremo HTTPS. Estos son algunos ejemplos de lo que puedes hacer en la entrega:

  • Generación de un mensaje dinámico basado en la información proporcionada por el usuario
  • Realizar un pedido en un sistema externo y confirmar que se realizó correctamente
  • Validar ranuras con datos de backend
Figura 1: Los intents y escenas de invocación pueden activar webhooks.

Activadores y controladores de webhook

Tus acciones pueden activar un webhook dentro de los intents de invocación o escenas, lo que envía una solicitud al extremo de entrega. Tu entrega contiene controladores de webhook que procesan la carga útil de JSON en la solicitud. Puedes activar webhooks en las siguientes situaciones:

  • Después de la coincidencia de un intent de invocación
  • Durante la escena cuando entra a la escena
  • Después de que una condición se evalúa como verdadera en la etapa de condición de una escena
  • Durante la etapa de relleno de espacios de una escena
  • Después de que se produce una coincidencia de intent en la etapa de entrada de una escena

Cuando activas un webhook en tus acciones, Asistente de Google envía una solicitud con una carga útil de JSON a la entrega, la cual contiene el nombre del controlador que se usará para procesar el evento. Tu extremo de entrega puede enrutar el evento al controlador apropiado para llevar a cabo la lógica y mostrar la respuesta con una carga útil de JSON correspondiente.

Cargas útiles

En los siguientes fragmentos, se muestran solicitudes de ejemplo que las acciones envían a la entrega y una respuesta que la entrega envía. Consulta la documentación de referencia para obtener más información.

Solicitud de ejemplo

{
  "handler": {
    "name": "handler_name"
  },
  "intent": {
    "name": "actions.intent.MAIN",
    "params": {},
    "query": ""
  },
  "scene": {
    "name": "SceneName",
    "slotFillingStatus": "UNSPECIFIED",
    "slots": {}
  },
  "session": {
    "id": "example_session_id",
    "params": {},
    "typeOverrides": []
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED"
    }
  },
  "home": {
    "params": {}
  },
  "device": {
    "capabilities": [
      "SPEECH",
      "RICH_RESPONSE",
      "LONG_FORM_AUDIO"
    ]
  }
}

Ejemplo de respuesta

{
  "session": {
    "id": "example_session_id",
    "params": {}
  },
  "prompt": {
    "override": false,
    "firstSimple": {
      "speech": "Hello World.",
      "text": ""
    }
  },
  "scene": {
    "name": "SceneName",
    "slots": {},
    "next": {
      "name": "actions.scene.END_CONVERSATION"
    }
  }
}

Interacciones en tiempo de ejecución

En las siguientes secciones, se describen tareas comunes que puedes realizar en los controladores de webhook.

Enviar mensajes

Puedes crear mensajes con texto simple, texto enriquecido, tarjetas y hasta mensajes HTML completos respaldados por una app web con Interactive Canvas. En la documentación de mensajes, encontrarás información completa para crear un mensaje cuando se controla un evento de webhook. En los siguientes fragmentos, se muestra un mensaje de tarjeta:

Node.js

app.handle('rich_response', conv => {
  conv.add('This is a card rich response.');
  conv.add(new Card({
    title: 'Card Title',
    subtitle: 'Card Subtitle',
    text: 'Card Content',
    image: new Image({
      url: 'https://developers.google.com/assistant/assistant_96.png',
      alt: 'Google Assistant logo'
    })
  }));
});

Respuesta JSON

{
  "session": {
    "id": "example_session_id",
    "params": {}
  },
  "prompt": {
    "override": false,
    "content": {
      "card": {
        "title": "Card Title",
        "subtitle": "Card Subtitle",
        "text": "Card Content",
        "image": {
          "alt": "Google Assistant logo",
          "height": 0,
          "url": "https://developers.google.com/assistant/assistant_96.png",
          "width": 0
        }
      }
    },
    "firstSimple": {
      "speech": "This is a card rich response.",
      "text": ""
    }
  }
}

Parámetros de intents de lectura

Cuando el entorno de ejecución de Asistente coincide con un intent, extrae cualquier parámetro definido. La propiedad original era lo que el usuario proporcionó como entrada y la propiedad resuelta es a lo que la CLN resolvió la entrada según la especificación del tipo.

Node.js

conv.intent.params['param_name'].original
conv.intent.params['param_name'].resolved

Cómo solicitar JSON

{
  "handler": {
    "name": "handler_name"
  },
  "intent": {
    "name": "intent_name",
    "params": {
      "slot_name": {
        "original": "1",
        "resolved": 1
      }
    },
    "query": ""
  },
  "scene": {
    "name": "SceneName",
    "slotFillingStatus": "UNSPECIFIED",
    "slots": {},
    "next": {
      "name": "actions.scene.END_CONVERSATION"
    }
  },
  "session": {
    "id": "session_id",
    "params": {},
    "typeOverrides": []
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED"
    }
  },
  "home": {
    "params": {}
  },
  "device": {
    "capabilities": [
      "SPEECH",
      "RICH_RESPONSE",
      "LONG_FORM_AUDIO"
    ]
  }
}

Leer la configuración regional del usuario

Este valor corresponde a la configuración regional del usuario para Asistente de Google.

Node.js

conv.user.locale

JSON

{
  "handler": {
    "name": "handler_name"
  },
  "intent": {
    "name": "actions.intent.MAIN",
    "params": {},
    "query": ""
  },
  "scene": {
    "name": "SceneName",
    "slotFillingStatus": "UNSPECIFIED",
    "slots": {}
  },
  "session": {
    "id": "session_id",
    "params": {},
    "typeOverrides": []
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED"
    }
  },
  "home": {
    "params": {}
  },
  "device": {
    "capabilities": [
      "SPEECH",
      "RICH_RESPONSE",
      "LONG_FORM_AUDIO"
    ]
  }
}

Almacenamiento de lectura y escritura

Consulta la documentación de almacenamiento para obtener información completa sobre cómo usar diversas funciones de almacenamiento.

Node.js

//read
conv.session.params.key
conv.user.params.key
conv.home.params.key

// write
conv.session.params.key = value
conv.user.params.key = value
conv.home.params.key = value 

Cómo solicitar JSON

{
  "handler": {
    "name": "handler_name"
  },
  "intent": {
    "name": "actions.intent.MAIN",
    "params": {},
    "query": ""
  },
  "scene": {
    "name": "SceneName",
    "slotFillingStatus": "UNSPECIFIED",
    "slots": {}
  },
  "session": {
    "id": "session_id",
    "params": {
      "key": "value"
    },
    "typeOverrides": [],
    "languageCode": ""
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED",
      "key": "value"
    }
  },
  "home": {
    "params": {
      "key": "value"
    }
  },
  "device": {
    "capabilities": [
      "SPEECH",
      "RICH_RESPONSE",
      "LONG_FORM_AUDIO"
    ]
  }
}

Respuesta JSON

{
  "session": {
    "id": "session_id",
    "params": {
      "key": "value"
    }
  },
  "prompt": {
    "override": false,
    "firstSimple": {
      "speech": "Hello world.",
      "text": ""
    }
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED",
      "key": "value"
    }
  },
  "home": {
    "params": {
      "key": "value"
    }
  }
}

Verifica las capacidades del dispositivo

Puedes verificar las capacidades de un dispositivo para ofrecer diferentes experiencias o flujos de conversación.

Node.js

const supportsRichResponse = conv.device.capabilities.includes("RICH_RESPONSE");
const supportsLongFormAudio = conv.device.capabilities.includes("LONG_FORM_AUDIO");
const supportsSpeech = conv.device.capabilities.includes("SPEECH");
const supportsInteractiveCanvas = conv.device.capabilities.includes("INTERACTIVE_CANVAS");

Cómo solicitar JSON

{
  "handler": {
    "name": "handler_name"
  },
  "intent": {
    "name": "actions.intent.MAIN",
    "params": {},
    "query": ""
  },
  "scene": {
    "name": "SceneName",
    "slotFillingStatus": "UNSPECIFIED",
    "slots": {}
  },
  "session": {
    "id": "session_id",
    "params": {},
    "typeOverrides": [],
    "languageCode": ""
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED"
    }
  },
  "home": {
    "params": {}
  },
  "device": {
    "capabilities": [
      "SPEECH",
      "RICH_RESPONSE",
      "LONG_FORM_AUDIO",
      "INTERACTIVE_CANVAS"
    ]
  }
}

Para obtener una lista completa de las funciones de la plataforma, consulta la referencia de Capability.

Anulaciones del tipo de entorno de ejecución

Los tipos de entorno de ejecución te permiten modificar las especificaciones de tipos en el entorno de ejecución. Puedes usar esta función para cargar datos de otras fuentes a fin de propagar valores válidos de un tipo. Por ejemplo, puedes usar anulaciones del tipo de entorno de ejecución para agregar opciones dinámicas a una pregunta de la encuesta o para agregar un elemento diario a un menú.

Para usar tipos de entorno de ejecución, debes activar un webhook desde la acción que llama a un controlador en la entrega. Desde allí, puedes propagar el parámetro session.typeOverrides en una respuesta a tu acción. Los modos disponibles incluyen TYPE_MERGE para conservar las entradas de tipo existentes o TYPE_REPLACE a fin de reemplazar entradas existentes con las anulaciones.

Node.js

conv.session.typeOverrides = [{
    name: type_name,
    mode: 'TYPE_REPLACE',
    synonym: {
      entries: [
        {
          name: 'ITEM_1',
          synonyms: ['Item 1', 'First item']
        },
        {
          name: 'ITEM_2',
          synonyms: ['Item 2', 'Second item']
       },
       {
          name: 'ITEM_3',
          synonyms: ['Item 3', 'Third item']
        },
        {
          name: 'ITEM_4',
          synonyms: ['Item 4', 'Fourth item']
        },
    ]
  }
}];

Respuesta JSON

{
  "session": {
    "id": "session_id",
    "params": {},
    "typeOverrides": [
      {
        "name": "type_name",
        "synonym": {
          "entries": [
            {
              "name": "ITEM_1",
              "synonyms": [
                "Item 1",
                "First item"
              ]
            },
            {
              "name": "ITEM_2",
              "synonyms": [
                "Item 2",
                "Second item"
              ]
            },
            {
              "name": "ITEM_3",
              "synonyms": [
                "Item 3",
                "Third item"
              ]
            },
            {
              "name": "ITEM_4",
              "synonyms": [
                "Item 4",
                "Fourth item"
              ]
            }
          ]
        },
        "typeOverrideMode": "TYPE_REPLACE"
      }
    ]
  },
  "prompt": {
    "override": false,
    "firstSimple": {
      "speech": "This is an example prompt.",
      "text": "This is an example prompt."
    }
  }
}

Proporcionar personalización de voz

La personalización de la voz le permite especificar sugerencias a la CLN para mejorar la coincidencia de intents. Puedes especificar hasta 1,000 entradas.

Node.js

conv.expected.speech = ['value_1', 'value_2']
conv.expected.language = 'locale_string'

Respuesta JSON

{
  "session": {
    "id": "session_id",
    "params": {}
  },
  "prompt": {
    "override": false,
    "firstSimple": {
      "speech": "This is an example prompt.",
      "text": "This is an example prompt."
    }
  },
  "expected": {
    "speech": "['value_1', 'value_2']",
    "language": "locale_string"
  }
}

Escenas de transición

Además de definir las transiciones estáticas en tu proyecto de acciones, puedes hacer que ocurran transiciones de escena durante el tiempo de ejecución.

Node.js

app.handle('transition_to_hidden_scene', conv => {
  // Dynamic transition
  conv.scene.next.name = "HiddenScene";
});

Respuesta JSON

{
  "session": {
    "id": "session_id",
    "params": {}
  },
  "prompt": {
    "override": false,
    "firstSimple": {
      "speech": "This is an example prompt.",
      "text": ""
    }
  },
  "scene": {
    "name": "SceneName",
    "slots": {},
    "next": {
      "name": "HiddenScene"
    }
  }
}

Leer ranuras

Durante el llenado de ranuras, puedes usar la entrega para validar la ranura o verificar el estado del relleno (SlotFillingStatus).

Node.js

conv.scene.slotFillingStatus  // FINAL means all slots are filled
conv.scene.slots  // Object that contains all the slots
conv.scene.slots['slot_name'].<property_name> // Accessing a specific slot's properties

Por ejemplo, supongamos que desea extraer la zona horaria de una respuesta. En este ejemplo, el nombre del espacio es datetime1. Para obtener la zona horaria, debes usar lo siguiente:

conv.scene.slots['datetime1'].value.time_zone.id

Cómo solicitar JSON

{
  "handler": {
    "name": "handler_name"
  },
  "intent": {
    "name": "",
    "params": {
      "slot_name": {
        "original": "1",
        "resolved": 1
      }
    },
    "query": ""
  },
  "scene": {
    "name": "SceneName",
    "slotFillingStatus": "FINAL",
    "slots": {
      "slot_name": {
        "mode": "REQUIRED",
        "status": "SLOT_UNSPECIFIED",
        "updated": true,
        "value": 1
      }
    },
    "next": {
      "name": "actions.scene.END_CONVERSATION"
    }
  },
  "session": {
    "id": "session_id",
    "params": {
      "slot_name": 1
    },
    "typeOverrides": []
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED"
    }
  },
  "home": {
    "params": {}
  },
  "device": {
    "capabilities": [
      "SPEECH",
      "RICH_RESPONSE",
      "LONG_FORM_AUDIO"
    ]
  }
}

Invalida ranuras de escena

Puedes invalidar ranuras y hacer que el usuario proporcione un valor nuevo.

Node.js

conv.scene.slots['slot_name'].status = 'INVALID'

Respuesta JSON

{
  "session": {
    "id": "session_id",
    "params": {
      "slot_name": 1
    }
  },
  "prompt": {
    "override": false,
    "firstSimple": {
      "speech": "This is an example prompt.",
      "text": ""
    }
  },
  "scene": {
    "name": "SceneName",
    "slots": {
      "slot_name": {
        "mode": "REQUIRED",
        "status": "INVALID",
        "updated": true,
        "value": 1
      }
    },
    "next": {
      "name": "actions.scene.END_CONVERSATION"
    }
  }
}

Opciones de desarrollo

Actions Builder proporciona un editor directo llamado editor de Cloud Functions, que te permite crear e implementar una Cloud Function para Firebase directamente en la consola. También puedes compilar y, luego, implementar la entrega en el hosting que elijas y registrar el extremo de entrega de HTTPS como tu controlador de webhook.

Editor directo

Para desarrollar con el editor de Cloud Functions, sigue estos pasos:

  1. Abre tu proyecto de acciones y ve a la pestaña Desarrollo > Webhook > Cambiar método de entrega. Aparecerá la ventana Fulfillment method.
  2. Selecciona Cloud Functions intercaladas y haz clic en Confirmar.

Extremo HTTPS externo

En esta sección, se describe cómo configurar Cloud Functions para Firebase como servicio de entrega para la acción de conversación. Sin embargo, puedes implementar la entrega en un servicio de hosting de tu elección.

Cómo configurar el entorno

Para configurar tu entorno, sigue estos pasos:

  1. Descarga y, luego, instala Node.js.
  2. Configura y, luego, inicializa Firebase CLI. Si el siguiente comando falla con un error EACCES, es posible que debas cambiar los permisos de npm.

    npm install -g firebase-tools
    
  3. Autentica la herramienta de Firebase con tu Cuenta de Google:

    firebase login
    
  4. Inicia el directorio del proyecto en el que guardaste tu proyecto de Actions. Se te pedirá que selecciones las funciones de Firebase CLI que deseas configurar para el proyecto de Actions. Elige Functions y otras funciones que tal vez quieras usar, como Firestore; luego, presiona Intro para confirmar y continuar:

    $ cd <ACTIONS_PROJECT_DIRECTORY>
    $ firebase init
    
  5. Selecciona la herramienta Firebase con tu proyecto de Actions mediante las teclas de flecha para asociarla con la lista de proyectos.

  6. Después de elegir el proyecto, la herramienta de Firebase inicia la configuración de Functions y te pregunta qué idioma quieres usar. Selecciona con las teclas de flecha y presiona Intro para continuar.

    === Functions Setup
    A functions directory will be created in your project with a Node.js
    package pre-configured. Functions can be deployed with firebase deploy.
    
    ? What language would you like to use to write Cloud Functions? (Use arrow keys)
    > JavaScript
    TypeScript
    
  7. Para elegir si deseas usar ESLint para detectar posibles errores y aplicar el estilo, escribe Y o N:

    ? Do you want to use ESLint to catch probable bugs and enforce style? (Y/n)
  8. Para obtener las dependencias del proyecto, escriba Y en el mensaje:

    ? Do you want to install dependencies with npm now? (Y/n)

    Una vez completada la configuración, verás un resultado similar al siguiente:

    ✔  Firebase initialization complete!
    
  9. Instala la dependencia @assistant/Conversation:

    $ cd <ACTIONS_PROJECT_DIRECTORY>/functions
    $ npm install @assistant/conversation --save
    
  10. Obtén las dependencias de entrega y, luego, implementa la función de entrega:

    $ npm install
    $ firebase deploy --only functions
    

    La implementación tarda unos minutos. Cuando termines, verás un resultado similar al siguiente. Necesitas la URL de función para ingresar en Dialogflow.

    ✔  Deploy complete!
    Project Console: https://console.firebase.google.com/project/<PROJECT_ID>/overview Function URL (<FUNCTION_NAME>): https://us-central1-<PROJECT_ID>.cloudfunctions.net/<FUNCTION_NAME>
  11. Copia la URL de entrega que se usará en la siguiente sección.

Registra el controlador de webhook

Para registrar tu extremo de Cloud Function como un controlador de webhook, haz lo siguiente:

  1. En la Consola de Actions, haz clic en Develop > Webhook.
  2. Haz clic en Cambiar método de entrega. Aparecerá la ventana Fulfillment method.
  3. Selecciona Webhook y haz clic en Confirmar.
  4. Pega la URL del servicio web en el campo Webhook.
  5. Haz clic en Guardar.