codigoencasa / builderbot

🤖 Crear Chatbot WhatsApp en minutos. Únete a este proyecto OpenSource
https://www.builderbot.app
MIT License
2.44k stars 838 forks source link

[🐛] Las palabras claves de inicio se activan si se ponen entre la conversación de los flujos #1096

Closed goldentgd closed 20 hours ago

goldentgd commented 3 months ago

¿Que versión estas usando?

v2

¿Sobre que afecta?

Flujo de palabras (Flow)

Describe tu problema

Cuando un usuario escribe una palabra clave (Key_Words), inicia el flujo, pero si el usuario pone un hola en cualquier parte de la conversación, se traba y vuelve a entrar al inicio y no continua el flujo, esta es una parte del flujo principal:

const KEY_WORDS = ['hola', 'hi', 'buenas tardes', 'buen dia', 'buenos días', 'buenas noches']; const MSG_INITIAL = ['Bienvenido(a)']; const MSG_RFC = ['¿Me podría proporcionar su RFC?']; const MSG_CLIENTE = ['¿Me podría proporcionar su grupo de cliente?']; const MSG_OPTIONS = ['Escribe un mensaje con la palabra o número resaltado en el menú.']; const MSG_OPTIONS_ERROR = 'Opción no valida, seleccione la opción correcta'; const MSG_VALIDATERFC = ['Su número de RFC es: '] const MSG_VALIDATE = ['Su número de Grupo de cliente es: '] const MSG_ERRORRFC = 'El RFC es incorrecto'; const MSG_ERRORCLIENTE = 'El Grupo de cliente es incorrecto';

let clienteInfo = {};

const initialFlow = addKeyword(KEY_WORDS) .addAnswer(MSG_INITIAL, null, async(ctx, ctxFn) => { await getParameterGlobal("MIN-INAC").then(data => { start(ctx, ctxFn, data[0].value); saveState(ctxFn, ctx, MSG_INITIAL) }); }) .addAnswer(MSG_RFC, {capture:true}, async(ctx, ctxFn) => { const resultado = await validateText(ctx); if(resultado.error) { ctxFn.flowDynamic("Favor de proporcionar una información correcta"); return ctxFn.fallBack(resultado.message); } const rfcInput = ctx.body.trim().toUpperCase(); clienteInfo.rfc = rfcInput; await getCliente(clienteInfo.grupoCliente, clienteInfo.rfc).then(cliente => { if (cliente.error) { console.error('Error encontrado:', cliente.mensaje); return ctxFn.fallBack(MSG_ERRORRFC); } else { saveOrderState(ctx.body.trim(), ctxFn.state); const estRFC = MSGVALIDATERFC + cliente.cliente["VAT Registration No"]; ctxFn.flowDynamic(estRFC); var data = ctxFn.state.getMyState()?.history || {}; data.cliente = cliente; ctxFn.state.update({ history: data }); saveState(ctxFn, null, estRFC); } }) await saveState(ctxFn, null, MSG_RFC); await saveState(ctxFn, ctx, null) }) .addAnswer(MSG_CLIENTE, {capture:true}, async(ctx, ctxFn) => { const resultado = await validateText(ctx); if(resultado.error) { ctxFn.flowDynamic("Favor de proporcionar una información correcta"); return ctxFn.fallBack(resultado.message); } const grupoClienteInput = ctx.body.trim().toUpperCase(); clienteInfo.grupoCliente = grupoClienteInput; //saveState(ctxFn, null, 'Grupo de Cliente'); await getCliente(clienteInfo.grupoCliente, clienteInfo.rfc).then(cliente => { if (cliente.error) { console.error('Error encontrado:', cliente.mensaje); return ctxFn.fallBack(MSG_ERRORCLIENTE); } else { if (cliente.cliente["Grupo Cliente"] !== clienteInfo.grupoCliente) { console.error('Error: Grupo de Cliente no coincide con el RFC'); return ctxFn.fallBack(MSG_ERRORCLIENTE); }
saveOrderState(ctx.body.trim(), ctxFn.state); const estCliente = MSG_VALIDATE + cliente.cliente["Grupo Cliente"]; const estName = 'Bienvenido(a) ' + cliente.cliente["Name"].trim() + ''; const datosCliente = ${estCliente}\r\n${estName}; var data = ctxFn.state.getMyState()?.history || {}; data.cliente = cliente; ctxFn.state.update({ history: data });

            ctxFn.flowDynamic(datosCliente);

            saveState(ctxFn, null, estCliente);
            saveState(ctxFn, null, estName);
        }
    });
    await saveState(ctxFn, null, MSG_CLIENTE);
    await saveState(ctxFn, ctx, null)
})

Reproducir error

No response

Información Adicional

Estoy usando builderbot y Baileys como proveedor, así se ve en whatsapp al poner hola en lugar de un RFC me activa de nuevo el flujo y se queda trabado y ya no pasa de ahí al menos que reinicie el sistema de nuevo: [28/08/2024 10:55 a. m.]usuario: Buenos días [28/08/2024 10:55 a. m.]Chat : Bienvenido(a), soy tu agente virtual [28/08/2024 10:55 a. m.]Chat: ¿Me podría proporcionar su RFC? [28/08/2024 10:56 a. m.] usuario: Hola usuario: Hola [28/08/2024 10:56 a. m.] Chat: El RFC es incorrecto [28/08/2024 10:56 a. m.] Chat: Bienvenido(a), soy tu agente virtual

Este es otro ejemplo de como se ve en whatsapp y se traba después del primer hola y ya no funciona, se cicla: error en ciclo

leifermendez commented 2 months ago

Buenas eso lo puedes controlar con la propiedad sensitive true or false https://www.builderbot.app/en/add-functions#sensitive

ozzyoss77 commented 2 months ago

Otra forma de solucionarlo es validad la respuesta del usuario, en ctx.body llega la respuesta, validas si lo que te respondio concuerda con algun flujo que debe dispararse, ejemplo: un if o switch con los flujos habilitados, usando gotoFlow puedes enviar al usuario al flujo que sea correcto.

github-actions[bot] commented 1 day ago

¿Alguna novedad sobre esta ISSUE?