Búsqueda Conversacional
El widget soporta un modo de búsqueda conversacional que mantiene contexto entre búsquedas sucesivas, permitiendo refinar resultados de forma natural.
Activación
La búsqueda conversacional requiere activar el asistente IA:
NeuroonWidget.init({
container: '#neuroon-search',
token: 'YOUR_TOKEN',
features: {
aiAssistant: true, // Activa el modo conversacional
},
});
Plan requerido
El asistente IA está disponible en planes Growth y superiores.
Cómo funciona
Contexto de sesión
El widget mantiene un historial de la conversación durante la sesión:
Usuario: "zapatillas para correr"
→ Resultados: zapatillas deportivas
Usuario: "que sean de Nike"
→ Contexto: zapatillas + Nike
→ Resultados: zapatillas Nike running
Usuario: "más baratas de 100€"
→ Contexto: zapatillas + Nike + precio < 100€
→ Resultados refinados
Turnos de conversación
Cada interacción genera un turno con información del usuario y del asistente:
interface ConversationTurn {
id: string;
role: 'user' | 'assistant';
content: string;
timestamp: Date;
products?: Product[]; // Productos sugeridos
suggestedFilters?: SearchFilters; // Filtros inferidos
confidence?: number; // 0-1, confianza en la interpretación
}
Interfaz de chat
Abrir el panel de chat
widget.openChat();
O mediante el icono de chat en la interfaz del widget.
Enviar mensajes
// Programáticamente
await widget.sendMessage('Busco un portátil ligero para trabajar');
// El usuario también puede escribir directamente en el chat
Historial de conversación
// Obtener historial completo
const history = widget.conversationHistory;
history.forEach(turn => {
console.log(`[${turn.role}] ${turn.content}`);
if (turn.products?.length) {
console.log(` → ${turn.products.length} productos sugeridos`);
}
});
Limpiar historial
// Reiniciar la conversación
widget.clearHistory();
Persistencia de sesión
El historial se persiste en sessionStorage durante la sesión del navegador:
// Se guarda automáticamente con clave:
// neuroon_chat_{shopId}
// El historial se restaura al recargar la página
// Se limpia al cerrar el navegador
Configurar persistencia
NeuroonWidget.init({
features: {
aiAssistant: true,
},
// Desactivar persistencia si lo prefieres
persistence: {
chat: false, // Por defecto: true
},
});
Filtros inferidos
El asistente analiza las consultas y extrae filtros automáticamente:
| Consulta | Filtros inferidos |
|---|---|
| "zapatillas Nike baratas" | brands: ['Nike'], priceMax: inferido |
| "portátil para gaming" | categories: ['gaming'], tags: ['gaming'] |
| "vestido rojo talla M" | tags: ['rojo'], size: 'M' |
| "menos de 50 euros" | priceMax: 50 |
// Escuchar filtros inferidos
widget.on('chat:message', ({ turn }) => {
if (turn.suggestedFilters) {
console.log('Filtros sugeridos:', turn.suggestedFilters);
// { brands: ['Nike'], priceMax: 100 }
}
});
Sugerencias de queries
El asistente puede sugerir queries refinadas:
widget.on('chat:message', ({ turn }) => {
if (turn.role === 'assistant' && turn.content.includes('¿Quisiste decir')) {
// Mostrar sugerencia al usuario
}
});
Indicador de confianza
Cada respuesta incluye un nivel de confianza:
widget.on('chat:message', ({ turn }) => {
if (turn.confidence !== undefined) {
if (turn.confidence > 0.8) {
// Alta confianza - aplicar filtros automáticamente
widget.setFilters(turn.suggestedFilters);
} else {
// Baja confianza - mostrar opciones al usuario
showFilterOptions(turn.suggestedFilters);
}
}
});
| Rango | Significado |
|---|---|
| 0.9 - 1.0 | Muy alta - Interpretación clara |
| 0.7 - 0.9 | Alta - Buena inferencia |
| 0.5 - 0.7 | Media - Podría necesitar confirmación |
| 0.0 - 0.5 | Baja - Consulta ambigua |
Ejemplos de uso
Chat integrado con productos
const widget = NeuroonWidget.init({
features: { aiAssistant: true },
callbacks: {
onSearch: (query) => {
// El callback se ejecuta también en búsquedas conversacionales
analytics.track('conversational_search', { query });
},
},
});
// Escuchar respuestas del asistente
widget.on('chat:message', ({ turn }) => {
if (turn.role === 'assistant') {
// Mostrar respuesta
displayAssistantMessage(turn.content);
// Mostrar productos sugeridos
if (turn.products?.length) {
displayRecommendedProducts(turn.products);
}
// Aplicar filtros sugeridos
if (turn.suggestedFilters && turn.confidence > 0.7) {
widget.setFilters(turn.suggestedFilters);
}
}
});
Flujo de conversación guiada
// Iniciar conversación programáticamente
async function startGuidedSearch(category) {
widget.openChat();
await widget.sendMessage(`Busco productos de ${category}`);
// El asistente responderá con preguntas de refinamiento
// "¿Qué rango de precio tienes en mente?"
// "¿Alguna marca en particular?"
}
// Llamar desde tu UI
document.getElementById('category-laptops').addEventListener('click', () => {
startGuidedSearch('portátiles');
});
Sincronización con UI externa
// Tu componente de chat personalizado
class CustomChat {
constructor(widget) {
this.widget = widget;
this.container = document.getElementById('my-chat');
// Sincronizar mensajes
widget.on('chat:message', ({ turn }) => {
this.renderMessage(turn);
});
}
async sendMessage(text) {
this.renderMessage({ role: 'user', content: text });
await this.widget.sendMessage(text);
}
renderMessage(turn) {
const el = document.createElement('div');
el.className = `message ${turn.role}`;
el.textContent = turn.content;
this.container.appendChild(el);
}
}
const widget = NeuroonWidget.init({ features: { aiAssistant: true } });
const chat = new CustomChat(widget);
Eventos de chat
| Evento | Payload | Descripción |
|---|---|---|
chat:open | {} | Panel de chat abierto |
chat:close | {} | Panel de chat cerrado |
chat:message | { turn } | Nuevo mensaje (usuario o asistente) |
chat:typing | { isTyping } | Indicador de escritura |
chat:error | { error } | Error en el chat |
widget.on('chat:typing', ({ isTyping }) => {
if (isTyping) {
showTypingIndicator();
} else {
hideTypingIndicator();
}
});
Buenas prácticas
- Contexto limitado: El historial se limita a las últimas 10 interacciones para mantener relevancia
- Limpieza periódica: Considera limpiar el historial al cambiar de sección o categoría
- Fallback: Si el asistente no entiende, ofrece opciones de filtro manual
- Indicadores visuales: Muestra cuando el asistente está "pensando"
- Persistencia opcional: Desactívala si el contexto no debe persistir entre recargas
Próximos pasos
- Asistente IA - Más sobre filtros guiados
- JavaScript API - Control programático del chat
- Callbacks - Eventos de chat