Menús, quick replies y handoff humano
Reduce la ambigüedad con opciones guiadas y deriva a una persona en el momento justo.
Las quick replies son botones efímeros que sugieren la siguiente respuesta. Reducen errores de tipeo, aceleran la conversación y hacen visible lo que el bot sabe hacer.
Menús que guían
- Etiquetas cortas y con verbo: «Ver pedido», «Cambiar dirección».
- Siempre una salida: «Hablar con una persona».
- Acepta también el texto equivalente: el usuario puede escribir en lugar de pulsar.
Derivación a humanos
El handoff transfiere la conversación a un agente humano. Debe ocurrir cuando el usuario lo pide, cuando el bot falla dos veces seguidas en entender, o cuando el tema es sensible (reclamos, fraude). Al derivar, envía al agente el resumen y el historial: que el usuario no tenga que repetir nada.
if (intent === "humano" || session.misses >= 2) {
await handoff.create({
user: session.userId,
summary: summarize(session.history),
priority: session.topic === "fraude" ? "alta" : "normal",
});
return reply("Te comunico con una persona del equipo. Suele tardar 2 minutos.");
}Los menús reducen la ambigüedad: en lugar de adivinar qué quiso decir el usuario, le ofreces opciones. Las quick replies son la versión rica de ese menú, pero el bot debe aceptar también el número de opción o la palabra escrita, porque en SMS no hay botones.
El handoff es el momento en que el bot reconoce su límite y transfiere a una persona. Hacerlo bien significa conservar el contexto: el agente debe ver la conversación completa y los datos ya recolectados, para que el usuario no repita nada.
Pruébalo
// Numbered menu that also accepts words, with human handoff
const MENU = "Elige una opción:\n1) Estado de mi pedido\n2) Cambiar dirección\n3) Hablar con una persona";
let intentosFallidos = 0;
mx.bot.onMessage(({ text }) => {
const t = text.trim().toLowerCase();
if (t === "1" || t.includes("estado")) { intentosFallidos = 0; return mx.bot.reply("Tu pedido #4821 está en reparto. Llega hoy."); }
if (t === "2" || t.includes("direcc")) { intentosFallidos = 0; return mx.bot.reply("Envíame la nueva dirección en un solo mensaje."); }
if (t === "3" || t.includes("persona") || t.includes("agente")) {
return mx.bot.reply("Te conecto con el equipo. Les dejé tu pedido #4821 para que no repitas nada. ⏳");
}
intentosFallidos++;
if (intentosFallidos >= 2) return mx.bot.reply("Parece que no te estoy ayudando. Te paso con una persona. ⏳");
return mx.bot.reply("No te entendí. " + MENU);
});
mx.bot.reply("Hola 👋 " + MENU);