Cómo guardar datos en la conversación (Dialogflow)

Explorar en Dialogflow

Haz clic en Continuar para importar nuestra muestra de Guardar datos en Dialogflow. Luego, sigue los pasos que se indican a continuación para implementar y probar la muestra:

  1. Ingresa un nombre de agente y crea un agente de Dialogflow nuevo para la muestra.
  2. Una vez que el agente termine de importar, haz clic en Ir al agente (Go to agent).
  3. En el menú de navegación principal, ve a Entrega.
  4. Habilita el Editor intercalado y, luego, haz clic en Implementar. El editor contiene el código de muestra.
  5. En el menú de navegación principal, ve a Integraciones y, luego, haz clic en Asistente de Google.
  6. En la ventana modal que aparece, habilita Auto-preview changes y haz clic en Test para abrir el simulador de Actions.
  7. En el simulador, ingresa Talk to my test app para probar la muestra.
Continuar

Parte de proporcionar una excelente experiencia del usuario a menudo consiste en poder guardar datos entre los turnos de una conversación o en múltiples conversaciones con un usuario. Esto es útil si proporcionas repeticiones útiles en una sola conversación, guardas puntuaciones de juegos en las sesiones o recuerdas pequeños fragmentos de información para un usuario.

Los requisitos varían un poco en función de si necesitas guardar datos dentro de una conversación o entre conversaciones. Para guardar datos en una conversación, puedes usar el campo conversationToken del objeto AppResponse.

Para guardar datos en todas las conversaciones, sigue estos pasos:

  1. Determina si el usuario está verificado o es un invitado.
  2. Almacena los datos del usuario o accede a ellos mediante el campo userStorage del objeto AppResponse.

Guardar datos entre turnos de conversación

El campo conversationToken es una string que contiene un token opaco que se recircula a la acción en cada turno de la conversación. Por ejemplo, si configuras el valor como "count=1" en tu AppResponse para el primer turno de la conversación, el AppRequest que recibió tu acción para el segundo turno de la conversación contendrá "count=1" en su conversationToken.

El token siempre se inicializa con una string vacía al comienzo de una conversación. Si usas la biblioteca cliente de Node.js de Actions on Google, puedes interactuar con el token de la conversación como un objeto JSON mediante conv.data, en el que conv es tu instancia de Conversation.

En el siguiente ejemplo, se muestra cómo guardar un contador en el campo conversationToken de tu AppResponse:

Node.js

conv.data.firstNum = firstNum;
conv.ask(`Got it, the first number is ${firstNum}.`);
conv.ask(`What's the second number?`);

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.getConversationData().put("firstNum", firstNum);
responseBuilder.add("Got it, the first number is " + firstNum + ".");
responseBuilder.add("What's the second number?");
return responseBuilder.build();

JSON

Ten en cuenta que, en el siguiente JSON, se describe una respuesta de webhook que usa outputContexts en lugar de conversationToken.

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Got it, the first number is 23."
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "What's the second number?"
            }
          }
        ]
      }
    }
  },
  "outputContexts": [
    {
      "name": "projects/save-data-df-js/agent/sessions/ABwppHGfFkWJdHKPpBEYiGkhdoakWmYj_2sZa4o8pbGG9nj4q5_GfDTtNEXOY34mLX8G4o_d7oZdUW9bnBZC/contexts/_actions_on_google",
      "lifespanCount": 99,
      "parameters": {
        "data": "{\"firstNum\":23}"
      }
    }
  ]
}

JSON

Ten en cuenta que el siguiente JSON describe una respuesta de webhook.

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Got it, the first number is 23."
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "What's the second number?"
              }
            }
          ]
        }
      }
    }
  ],
  "conversationToken": "{\"data\":{\"firstNum\":23}}"
}

Consulta nuestra guía de prácticas recomendadas Cómo proporcionar nuevas solicitudes útiles y fallas de forma controlada para ver un ejemplo de uso práctico.

Se guardan datos en diferentes conversaciones

El campo userStorage de tu objeto AppResponse es una string que contiene un token opaco proporcionado por la Action que se guarda en las conversaciones de un usuario en particular. Por ejemplo, un juego puede guardar la puntuación más alta de un usuario en userStorage y usar su valor en el mensaje de bienvenida cada vez que el usuario inicia una conversación nueva.

Determina y administra el estado de verificación del usuario

El estado de verificación de un usuario puede tener un valor de GUEST o VERIFIED. Al comienzo de cada conversación, Actions on Google establece el estado de verificación del usuario en función de una variedad de indicadores cuando comienza la conversación. Por ejemplo, un usuario que accedió al Asistente de Google en su dispositivo móvil tiene el estado de verificación VERIFIED.

A continuación, se incluyen algunos motivos posibles por los que un usuario puede tener un estado de verificación de GUEST:

  • El usuario tiene desactivados los resultados personales.
  • El usuario inhabilitó su Actividad web y de aplicaciones. Ten en cuenta que algunos usuarios pueden tener este parámetro de configuración inhabilitado a nivel del dominio.
  • Si un dispositivo tiene Voice Match habilitado y la coincidencia falla o el usuario invoca al Asistente sin usar su voz (por ejemplo, si se mantiene presionado un dispositivo Google Home).
  • El usuario no accedió.

Siempre comprueba el estado de verificación del usuario antes de almacenar datos con userStorage o de iniciar un flujo de vinculación de cuentas para evitar que los usuarios invitados interactúen con una función que le fallará.

Si usas la biblioteca cliente de Actions On Google para Node.js, puedes interactuar con el almacenamiento del usuario como un objeto JSON mediante conv.user.storage, en el que conv es tu instancia de Conversation. En el siguiente ejemplo, se muestra cómo guardar un contador en el campo userStorage de tu AppResponse:

Node.js

app.intent('Save Sum', (conv) => {
  if (conv.user.verification === 'VERIFIED') {
    conv.user.storage.sum = conv.data.sum;
    conv.close(`Alright, I'll store that for next time. See you then.`);
  } else {
    conv.close(`I can't save that right now, but we can add ` +
      `new numbers next time!`);
  }
});

Java

@ForIntent("Save Sum")
public ActionResponse saveSum(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  Integer sum = ((Double) request.getConversationData().get("sum")).intValue();
  String verificationStatus = request.getUser().getUserVerificationStatus();
  if (verificationStatus.equals("VERIFIED")) {
    responseBuilder.getUserStorage().put("sum", sum);
    responseBuilder.add("Alright, I'll store that for next time. See you then.");
  } else {
    responseBuilder.add("I can't save that right now, but we can add new numbers next time!");
  }
  responseBuilder.endConversation();
  return responseBuilder.build();
}

Node.js

if (conv.user.verification === 'VERIFIED') {
  conv.user.storage.sum = conv.data.sum;
  conv.close(`Alright, I'll store that for next time. See you then.`);
} else {
  conv.close(`I can't save that right now, but we can add ` +
    `new numbers next time!`);
}

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
Integer sum = ((Double) request.getConversationData().get("sum")).intValue();
String verificationStatus = request.getUser().getUserVerificationStatus();
if (verificationStatus.equals("VERIFIED")) {
  responseBuilder.getUserStorage().put("sum", sum);
  responseBuilder.add("Alright, I'll store that for next time. See you then.");
} else {
  responseBuilder.add("I can't save that right now, but we can add new numbers next time!");
}
responseBuilder.endConversation();
return responseBuilder.build();

JSON

Ten en cuenta que el siguiente JSON describe una respuesta de webhook.

{
  "payload": {
    "google": {
      "expectUserResponse": false,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Alright, I'll store that for next time. See you then."
            }
          }
        ]
      },
      "userStorage": "{\"data\":{\"sum\":68}}"
    }
  }
}

JSON

Ten en cuenta que el siguiente JSON describe una respuesta de webhook.

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "simpleResponse": {
            "textToSpeech": "Alright, I'll store that for next time. See you then."
          }
        }
      ]
    }
  },
  "conversationToken": "{\"data\":{\"firstNum\":23,\"sum\":68}}",
  "userStorage": "{\"data\":{\"sum\":68}}"
}

Consulta la guía de prácticas recomendadas Personaliza la conversación con preferencias del usuario para ver un ejemplo de uso práctico.

Nota legal: Obtener el consentimiento antes de acceder a userStorage. Algunos países tienen reglamentaciones que requieren que los desarrolladores obtengan el consentimiento del usuario antes de poder acceder a cierta información (como información personal) o guardarla en la userStorage. Si operas en uno de estos países y quieres acceder a esa información o guardarla en userStorage, debes usar el Asistente de confirmación para pedirle su consentimiento al usuario y obtenerlo antes de comenzar a almacenar esa información en userStorage.

Vencimiento del almacenamiento del usuario

Cuando Asistente puede hacer coincidir una identidad con el usuario, el contenido de userStorage nunca vence, y solo el usuario o la Acción pueden borrarlo.

Cuando Asistente no puede hacer coincidir una identidad con el usuario, se borra el contenido de userStorage al final de la conversación. Estos son algunos ejemplos de casos en los que Asistente no puede hacer coincidir una identidad con el usuario:

  • Se configuró Voice Match, pero no hay coincidencia.
  • El usuario inhabilitó los datos personales.

Borra el contenido del campo userStorage

Para borrar el contenido del campo userStorage de tu acción, establece el campo resetUserStorage de tu AppResponse como verdadero. Si configuras el valor de userStorage como una string vacía, el valor de userStorage no se modifica en el siguiente turno de la conversación. De esta manera, puedes evitar enviar el userStorage completo por turnos en los que su contenido no cambió.

Si usas la biblioteca cliente de Actions On Google para Node.js, puedes establecer el valor de conv.user.storage en {} (objeto vacío).

Node.js

app.intent('Forget Number', (conv) => {
  conv.user.storage = {};
  conv.ask(`Alright, I forgot your last result.`);
  conv.ask(`Let's add two new numbers. What is the first number?`);
});

Java

@ForIntent("Forget Number")
public ActionResponse forgetNumber(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  responseBuilder.getUserStorage().clear();
  responseBuilder.add("Alright, I forgot your last result.");
  responseBuilder.add("Let's add two new numbers. What is the first number?");
  return responseBuilder.build();
}

Node.js

conv.user.storage = {};
conv.ask(`Alright, I forgot your last result.`);
conv.ask(`Let's add two new numbers. What is the first number?`);

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.getUserStorage().clear();
responseBuilder.add("Alright, I forgot your last result.");
responseBuilder.add("Let's add two new numbers. What is the first number?");
return responseBuilder.build();

JSON

Ten en cuenta que el siguiente JSON describe una respuesta de webhook.

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Alright, I forgot your last result."
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "Let's add two new numbers. What is the first number?"
            }
          }
        ]
      },
      "userStorage": "{\"data\":{}}"
    }
  }
}

JSON

Ten en cuenta que el siguiente JSON describe una respuesta de webhook.

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Alright, I forgot your last result."
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "Let's add two new numbers. What is the first number?"
              }
            }
          ]
        }
      }
    }
  ],
  "userStorage": "{\"data\":{}}"
}

Como usuario, puedes ver el contenido del campo userStorage en una acción que invocaste. También puedes quitar los datos del usuario almacenados de esa Acción específica si el servicio deja de recordarte.

  1. Abre la app del Asistente en el teléfono.
  2. Presiona el ícono del panel lateral.

  3. En la pestaña Explorar, busca la acción que deseas ver o liberar espacio de almacenamiento del usuario y presiónala para abrir la página de detalles.
  4. Desplázate hasta la parte inferior de la página.
    • Para ver el contenido del campo userStorage, presiona [Ver datos almacenados].
    • Para quitar los datos del usuario almacenados, presiona No permitir que $action me recuerde.