Diseñé y desarrollé MarciaBot: un sistema de dos componentes. El bot (repo privado) es un servidor Node.js + Express que recibe mensajes vía webhook de Twilio, los procesa con 3 modelos de IA de Groq (Llama 3.3 70B para conversación, Whisper Large V3 para transcribir audios y Llama 3.2 90B Vision para analizar comprobantes e imágenes), consulta la agenda real en Supabase calculando disponibilidad para los próximos 7 días, y responde con personalidad argentina completa — voseo, muletillas naturales, delay humano de 2-4s, 15+ reglas de comportamiento. Gestiona el flujo completo de turno: consulta → servicio → precio → seña → comprobante → verificación → confirmación. El panel (repo público) es una app Vue 3 con 10 vistas donde la dueña gestiona todo en tiempo real: chats con filtros inteligentes por etapa, calendario con turnos y bloqueos, estadísticas con gráficos, galería de trabajos y puede responder a clientas directo desde la web vía Supabase Realtime.
IA conversacional con Groq (Llama 3.3 70B) — personalidad argentina completa: voseo, muletillas naturales ("che", "dale", "mirá"), sin emojis, respuestas cortas tipo WhatsApp real
Transcripción de audios automática con Whisper Large V3 — la clienta manda audio y Marcia responde como si lo hubiera escuchado
Análisis de imágenes con Llama 3.2 90B Vision — detecta comprobantes de transferencia (monto, fecha, titular) y fotos de referencia de uñas/pestañas
System prompt con 15+ reglas de comportamiento: no inventa info, no habla del clima, corta si alguien se desubica, nunca confirma turno sin comprobante
Consulta de agenda real antes de cada respuesta — calcula horarios libres para los próximos 7 días cruzando turnos existentes, duración de servicios, bloqueos y horario laboral
Ofrece horarios concretos: "tengo lugar el martes a las 14 o el miércoles a las 11, te sirve?" en vez del genérico "esperame que miro la agenda"
Respeta bloqueos de días/horarios configurados desde el panel y descarta horarios ya pasados si es hoy
Flujo completo automatizado: consulta → servicio → precio → seña 50% → CBU/alias → comprobante → verificación → confirmación de turno
Delay humano aleatorio de 2-4 segundos antes de cada respuesta para simular que está tipeando
Detección automática de situaciones que requieren a la dueña — notifica por WhatsApp con el contexto y permite intervenir con TOMAR/LIBERAR
Polling cada 10 segundos de mensajes escritos desde el panel — los envía por WhatsApp vía Twilio y los agrega al historial
Recordatorios automáticos: avisa a cada clienta un día antes de su turno confirmado ("te recuerdo que mañana tenés turno a las 15 para volumen ruso")
Comandos admin por WhatsApp de la dueña: TOMAR/LIBERAR chat, HOY NO TRABAJO, HOY HASTA LAS X, ESTADO
Visor de chats estilo WhatsApp con filtros inteligentes por etapa: Consulta → Esperando comprobante → Requiere atención → Turno confirmado
Detección de etapa automática recorriendo toda la conversación — se actualiza sola a medida que avanza el flujo
Responder desde el panel como dueña — el mensaje se envía por WhatsApp y aparece con burbuja dorada diferenciada
Real-time vía Supabase Realtime — los mensajes aparecen sin refrescar cuando una clienta escribe
Notificaciones: badge rojo pulsante en sidebar, sonido con Web Audio API y push notification del browser cuando un chat entra en "Requiere atención"
Calendario mensual con turnos color-coded por estado (pendiente/confirmado/completado/cancelado), bloqueos y panel lateral de detalle
Crear turnos y bloqueos desde modales, cambiar estado con un click (confirmar, completar, cancelar)
Historial por clienta: click en la tabla de clientas despliega sus últimos turnos y la última conversación
Dashboard con KPIs del día, turnos confirmados, chats activos y señas recibidas
Estadísticas por período (semana/mes/anterior): gráfico de barras de turnos por día, ranking de servicios más pedidos, tabla de detalle
Galería de trabajos realizados organizada por servicio con fotos reales, drag & drop upload a Supabase Storage
Config dinámica: el bot carga servicios, precios, CBU, horarios y días de trabajo desde Supabase cada 60 segundos — cambios en el panel se reflejan sin reiniciar
Auth con Supabase Auth + RLS con funciones SECURITY DEFINER para evitar recursión en policies — cada usuario solo ve datos de su negocio
Historial de conversación en memoria (14 mensajes) con sync en background a Supabase — persistencia sin latencia
FLUJO — Mensaje de WhatsApp entrante: [Clienta envia mensaje] → [Twilio Webhook] POST /webhook/whatsapp {From, Body, MediaUrl?} → [Express] identifica tipo: texto / audio / imagen → si audio: Whisper Large V3 transcribe a texto → si imagen: Llama 3.2 90B Vision describe la imagen → [ConversationManager] carga historial (14 msgs en memoria) + config del negocio (servicios, precios, horarios) → construye system prompt con contexto completo → [Groq API] Llama 3.3 70B genera respuesta → parsea JSON de respuesta (mensaje + acción) → si acción=agendar: crea turno en Supabase → si acción=cobrar_seña: envía instrucciones de pago → delay 2-4s (simula humano) → [Twilio] envía respuesta por WhatsApp
FLUJO — Agendar turno: [Clienta] "quiero turno para mañana a las 15" → [LLM] detecta intención=agendar, extrae {servicio, fecha, hora} → [AgendaService] calcula disponibilidad de próximos 7 días desde Supabase (excluye días bloqueados + horarios ocupados + fuera de horario laboral) → si horario libre: crea turno con status=pendiente → responde "Perfecto, te agendé para mañana a las 15hs" → si ocupado: sugiere alternativas disponibles → [Supabase Realtime] el panel recibe el nuevo turno en tiempo real
FLUJO — Verificación de seña: [Clienta] envía foto del comprobante de transferencia → [Twilio] entrega MediaUrl → [Bot] descarga imagen → [Llama 3.2 90B Vision] analiza imagen: extrae monto, fecha, CBU destino → compara CBU con el del negocio configurado → si coincide y monto >= seña mínima: marca turno como "seña confirmada" en Supabase → responde "Recibí tu comprobante, tu turno está confirmado" → si no coincide: pide reenviar o verificar datos
FLUJO — Chat en tiempo real desde panel: [Dueña] abre vista Chats en el panel Vue → [Supabase Realtime] subscribe a tabla messages con filtro business_id → aparece lista de conversaciones activas con último mensaje y timestamp → click en conversación → carga historial completo → [Dueña] escribe respuesta en textarea → POST a Supabase messages con sender=panel → [Polling cada 10s en bot] detecta mensaje nuevo del panel → [Twilio] envía al WhatsApp de la clienta → la clienta ve el mensaje como si fuera del bot
FLUJO — Config dinámica sin reiniciar: [Dueña] cambia precio de "Alisado" de $15000 a $18000 en el panel → UPDATE en Supabase tabla services → [Bot] cada 60 segundos ejecuta cron que recarga servicios, precios, CBU, horarios y días laborales desde Supabase → actualiza cache en memoria → próximo mensaje de clienta preguntando precio de alisado → LLM recibe el precio actualizado ($18000) en el system prompt → responde con info correcta sin reiniciar el servidor