dialogflow chatbot ...
 

dialogflow chatbot ¿cómo ir a la base de datos de firestore y regresar con preguntas relevantes?  

  RSS
recardo1
(@recardo1)
Active Member

Estoy utilizando la base de datos "Firestore" para mi chatbot "dialogflow" que ya he creado para una tienda de comestibles en línea. El problema es que quiero que mi chatbot primero haga preguntas a los usuarios para encontrar el título correcto de los ítems en mi base de datos y luego regresar al usuario al hacer 3 o 4 preguntas relevantes sobre ese ítem. las preguntas deben ser los atributos del artículo (Marca, color, tamaño ...) y variarán de un elemento a otro. por lo que el chatbot transmitirá al usuario para encontrar el mejor artículo. ¿Pueden ayudarme a encontrar la respuesta? Ya creé los códigos pero no funcionan y no sé qué hay de malo en eso. Ya cree esto y tiene el archivo index.js, agradezco que me puedan ayudar

index.js:

'use strict';

const functions = require('firebase-functions');
// Importar SDK de administrador
const admin = require('firebase-admin');
const {
WebhookClient
} = require('dialogflow-fulfillment');
process.env.DEBUG = 'dialogflow:*'; // habilita instrucciones de depuración de lib
admin.initializeApp(functions.config().firebase);
// aquí obtenemos la base de datos en una variable
const db = admin.firestore();
const data = {...};
// Agrega un nuevo documento en la colección "dialogflow" con el ID de documento "agent"
const dialogflowAgentRef = db.collection('dialogflow').doc('agent').set(data);
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
const agent = new WebhookClient({
request,
response
});
function writeToDb(agent) {
// Obtiene el parámetro de Dialogflow con la cadena para agregar al documento de la base de datos
const databaseEntry = agent.parameters.databaseEntry;
// Obtiene la colección de la base de datos de 'dialogflow' y documento 'agent' y store
// el documento {entry: "<value of database entry>"} en el documento 'agent'
const dialogflowAgentRef = db.collection('dialogflow').doc('agent').where('title', '==', title);

return db.runTransaction(t => {
t.set(dialogflowAgentRef, {
entry: databaseEntry
});
return Promise.resolve('Write complete');
}).then(doc => {
agent.add(`Wrote "${databaseEntry}" to the Firestore database.`);
}).catch(err => {
console.log(`Error writing to Firestore: ${err}`);
agent.add(`Failed to write "${databaseEntry}" to the Firestore database.`);
});
}
function readFromDb(agent) {
// Obtiene la colección de base de datos 'dialogflow' en el documento 'agent'
const dialogflowAgentDoc = db.collection('dialogflow/agent/rss/channel/item'); // .doc('agent')

// Obtiene el valor de 'entrada' en el documento y lo envia al usuario
return dialogflowAgentDoc.get()
.then(doc => {
if (!doc.exists) {
agent.add('No data found in the database!');
} else {
agent.add(doc.data().entry);
}
return Promise.resolve('Read complete');
}).catch(() => {
agent.add('Error reading entry from the Firestore database.');
agent.add('Please add a entry to the database first by saying, "Write <your phrase> to the database"');
});
}
// Asignar nombres de intentos de Dialogflow a funciones que se ejecutarán cuando coincida la intención
let intentMap = new Map();
intentMap.set('ReadFromFirestore', readFromDb);
intentMap.set('WriteToFirestore', writeToDb);
agent.handleRequest(intentMap);
});

This topic was modified hace 8 meses 2 times by recardo1
Citar
Respondido : 16/09/2018 2:47 am
German M
(@german-m)
Active Member

Hay una serie de problemas con su código como lo ha demostrado que podrían causar problemas para leer y escribir con la base de datos de firestore.

Parece que estás tratando de encontrar una colección existente a escribir la linea:

const dialogflowAgentRef = db.collection('dialogflow').doc('agent').where('title', '==', title);

pero el título no está definido en ninguna parte, lo cual sospecho que causa un error. Además, doc() devuelve una DocumentReference, pero no hay un método where() en una DocumentReference.

Recuerde que necesita estructurar firestore utilizando colecciones y documentos alternados. Por lo tanto, su colección "firebase" puede contener un documento llamado "agent", y ese documento puede tener subcolecciones.

When you're trying to read with

const dialogflowAgentDoc = db.collection('dialogflow/agent/rss/channel/item');

Obtendrá una colección, pero luego intentará tratarla como un documento. El comentario sugiere que estás tratando de leer un documento específico de esta colección (lo cual tiene sentido), pero estás cargando ese documento por un "agente" de cadenas codificadas, en lugar de intentar que el agente pase por alto los parámetros.

Finalmente, las rutas en las secciones de lectura y escritura no coinciden. El uso de rutas codificadas está bien cuando se prueban, pero asegúrese de estar utilizando rutas de correspondencia coincidentes y que reflejen el requisito de la ruta de acceso (collection/doc/collection/doc/...)

Entonces, en ambos casos, es posible que tengas una referencia que se parezca a algo como esto:

const docTitle = agent.parameters.title;
const docRef = db.collection('dialogflow').doc(title);

Lo cual, si ha definido un parámetro de "título" en sus Intents en Dialogflow, lo usará para hacer referencia al documento, que luego puede leer o escribir.

ResponderCitar
Respondido : 16/09/2018 3:24 am
iguera
(@iguera)
Active Member

Tengo una pregunta con respecto a Firestore

¿Cual es su curva de aprendizaje?

ResponderCitar
Respondido : 03/01/2019 4:29 pm
David
(@david)
Trusted Member
Respondido por: iguera

Tengo una pregunta con respecto a Firestore

¿Cual es su curva de aprendizaje?

Aprender Firestore no requiere tanto tiempo como aprender un lenguaje de programación, yo pensaría que si le dedicas a esto unos tres meses y haces ejercicios, luego de este tiempo ya puedes hacer algo decente en firestore.

ResponderCitar
Respondido : 03/01/2019 4:34 pm
Share:
  
Trabajando

Por favor Iniciar Sesión o Registro