Asistentes que responden en los canales en los que escriben tus clientes, a partir de tu información, y que pasan la conversación a una persona cuando exceden su rol.
Implementamos asistentes de texto en nuestra plataforma, aichat.md, que funciona en producción. El trabajo incluye canales conectados con código propio, una base de conocimientos indexada, herramientas que ejecutan en tus sistemas y una vía de derivación a un humano registrada en la base de datos.
Ya construidoEl servicio se apoya en una plataforma propia en producción, no en una promesa. `https://aichat.md` responde públicamente (307 hacia `/ro`, verificado el 06.09.2026), y los comportamientos descritos más abajo se leen del esquema de la base de datos y de las rutas de la plataforma, con archivo y línea: los umbrales de búsqueda, los tipos de herramientas y su tiempo máximo, los estados del hilo de conversación, el registro de toma. La segunda implementación propia citada es la función de catálogo de tienda (`storeCatalog.service.js` más tres herramientas integradas), escrita como función de plataforma en lugar de herramientas por cliente. Lo que la prueba no sostiene lo decimos igual de explícito: los mensajes de la plantilla de WhatsApp no existen en el código, así que no prometemos mensajes proactivos fuera de la ventana de 24 horas.
Un asistente útil no es el que escribe bonito, sino el que está conectado a la información real del negocio y sabe dónde detenerse. Nuestro trabajo empieza en el canal en el que escriben tus clientes y termina en la persona que toma la conversación cuando el asistente ya no tiene nada que decir. Entre ambos ponemos el conocimiento, las herramientas y los límites.
La plataforma sobre la que construimos es aichat.md, hecha por nosotros y en producción. Eso cambia la naturaleza del servicio: no integramos una caja negra de otro, sino que configuramos un sistema en el que podemos leer cualquier umbral y cambiar cualquier comportamiento. Cuando decimos que la respuesta usa por defecto cinco fragmentos de tus documentos, con umbral de similitud 0,70 y 30% de peso en la coincidencia de palabras, son valores del esquema de la base de datos, no una descripción de folleto.
Los canales con código propio, verificados el 06.09.2026, son seis: Facebook Messenger, Instagram Direct, Telegram, 999.md, el widget del sitio y WhatsApp Business mediante Cloud API en Graph v22.0. Cada uno tiene su propio módulo, no una casilla marcada — y las diferencias entre ellos importan en la práctica: Messenger puede mostrar un carrusel de productos, Instagram no, porque Meta no ofrece plantillas genéricas en Instagram.
La parte que los clientes subestiman es el traspaso a una persona. En aichat no es una promesa, sino un estado en la base de datos: el hilo es `bot` o `human`, el registro de traspaso distingue el traspaso por una persona, el retorno al bot y la reactivación automática, y el hilo tiene además un estado separado de cumplimiento del tiempo de respuesta — `ok`, `warning`, `breached`. Se puede mostrar, al final de mes, cuántas conversaciones fueron traspasadas y en cuánto tiempo.
Qué incluye
El trabajo, por componentes
Conectamos el canal y comprobamos qué ocurre cuando calla
Seis canales tienen código propio en la plataforma: Messenger, Instagram Direct, Telegram, 999.md, widget web y WhatsApp Business Cloud API en Graph v22.0. La conexión de Meta se hace mediante Embedded Signup. En cada canal comprobamos también el caso feo, no solo el primer mensaje exitoso: un token de página expirado detiene el canal en silencio, no con un error visible, por eso la plataforma tiene monitorización de tokens y notificación de expiración.
Indexamos los conocimientos y fijamos los umbrales por los que busca
Los documentos y las páginas se dividen en fragmentos con hash de contenido y embeddings `text-embedding-3-small`. Los valores por defecto con los que arrancamos y luego ajustamos: cinco fragmentos por pregunta, umbral de similitud 0,70, búsqueda híbrida, peso 0,30 en la coincidencia de palabras, atribución de fuente activada. Cada consulta se puede registrar con los fragmentos devueltos, las puntuaciones y los tiempos — así que el «por qué respondió así» tiene respuesta con datos, no con suposiciones.
Conectamos las herramientas con los sistemas que ejecutan
Una herramienta puede ser un webhook hacia tu sistema, con método y cabeceras a elección, un fragmento de código JavaScript ejecutado por la plataforma, o una herramienta incorporada en la plataforma. Cada una tiene un tiempo máximo de ejecución, por defecto 15 segundos. La consecuencia práctica, dicha antes del contrato, no después: una integración que responde en 40 segundos debe hacerse asíncrona, no forzada en la conversación.
Catálogo vivo, conectado con la dirección de la tienda
Para las tiendas existen tres herramientas integradas — `store_catalog_search`, `store_catalog_match`, `store_catalog_product` — sobre un servicio común de catálogo. Para WooCommerce, Store API es pública, así que la tienda se conecta con la dirección del sitio, sin claves de acceso. Antes, el catálogo se escribía como herramienta separada para cada cliente; se convirtió en función de la plataforma precisamente porque la variante con herramientas escritas a nombre del cliente no se podía mantener.
Entrega a una persona, con registro
El hilo tiene estado explícito `bot` o `human`. El registro de toma conoce tres acciones: toma por parte de una persona, vuelta al bot y reactivación automática. Por separado, el hilo tiene estado de cumplimiento del tiempo de respuesta: `ok`, `warning`, `breached`. El módulo de toma de la plataforma tiene cola y roles. Establecemos desde la primera conversación quién toma y en cuánto tiempo, porque este estado se mide desde el primer hilo, no se añade más tarde.
Voz en la conversación escrita
La nota de voz recibida en WhatsApp o Telegram se transcribe con `whisper-1` y entra en la conversación como texto. La respuesta puede volver como voz, mediante `tts-1` o mediante ElevenLabs, con ajustes de estabilidad y similitud por voz. Para quien dicta en lugar de escribir — un trabajador en obra, un conductor — esa es la diferencia entre un canal usable y un canal decorativo.
Traducción en la conversación, en un solo sentido hoy
La respuesta del operador puede reescribirse en el idioma del cliente, con el tono del agente y sin añadir hechos. El sentido inverso — el mensaje del cliente traducido para el operador — no existe en el código a la fecha de verificación, así que el operador lee el original. Lo decimos porque esa es la diferencia entre un equipo que puede atender a un cliente ruso o inglés y uno que cree que puede.
El comportamiento ante mensajes duplicados y ráfagas
El webhook de Meta realmente reenvía el mismo mensaje: la deduplicación se hace por el identificador del mensaje, con 120 segundos de memoria. Y cuando alguien escribe tres líneas una tras otra, se agrupan en un búfer de 15 segundos y reciben una sola respuesta, a todo lo que escribió la persona, no tres respuestas parciales.
El modelo no está ligado a un proveedor
Las llamadas pasan por un gateway propio en `api.megapromoting.com/v1`, que habla el formato OpenAI para todos los proveedores del backend. El modelo se elige por asistente y se puede cambiar sin reescribir la integración. Para los embeddings usamos `text-embedding-3-small`.
Qué aspecto tiene
El recorrido, paso a paso.
01
Elegimos el canal y la persona que toma
Un canal, un público, un resultado perseguido. En la misma conversación se establece quién toma los hilos marcados `human` y en cuánto tiempo. Entregamos: la lista de escenarios que cubre el asistente y la lista explícita de los que no cubre.
02
Conectamos las fuentes y verificamos qué sale de ellas
Los documentos y las páginas entran como fuentes de conocimiento. En los catálogos verificamos los productos extraídos uno por uno donde importa el precio. Entregamos: las fuentes indexadas, los umbrales de búsqueda configurados para tu caso y un conjunto de preguntas de control con las respuestas obtenidas.
03
Conectamos las herramientas y probamos el caso lento
Webhook hacia CRM o ERP, código para transformaciones propias, herramienta integrada para lo que ya existe. Probamos el caso lento y el caso de error, no solo el feliz, porque el límite de 15 segundos es el que decide. Entregamos: las herramientas configuradas y el comportamiento documentado al superar el límite.
04
Abrimos el canal con la monitorización activada
El canal entra en funcionamiento con la monitorización del token activa y con la toma humana practicada al menos una vez en un caso real. Entregamos: acceso al panel, el procedimiento de toma y los puntos en los que el sistema se detiene solo.
05
Leemos los registros y ajustamos
Después de las primeras conversaciones reales, se consulta el registro de consultas: qué encontró, con qué puntuación, en cuánto tiempo. A partir de ahí se ajusta el umbral, el número de fragmentos o el texto de la fuente. Entregamos: la lista de los cambios realizados y el motivo de cada uno.
El recorrido de un mensaje
Los datos
Qué tocamos, dónde están y cuánto se quedan
Las preguntas que hace cualquiera que tenga un delegado de protección de datos — hechas aquí antes de que las haga él.
Dónde se guardan las conversaciones
MySQL, en el servidor propio de Microsoft Azure. El esquema tiene más de 80 tablas modeladas en Prisma, con tablas separadas para los hilos de Meta, los hilos de Telegram, los hilos de 999.md, comentarios, etiquetas, notas internas y registro de auditoría.
Los tokens de canal se guardan cifrados
El token de WhatsApp se almacena cifrado con Fernet, con retorno a texto plano solo para los registros antiguos. Los mensajes tienen su propio módulo de cifrado en el servicio de canales. Existe monitoreo de tokens y notificación al expirar.
Qué ve el widget y de dónde
El widget tiene una lista de orígenes permitidos por asistente. Hay que conocer el comportamiento predeterminado: si la lista está vacía, la verificación pasa — es una elección de compatibilidad con las instalaciones antiguas, escrita tal cual en el código. Significa que la restricción por dominio se configura explícitamente en cada implementación que la necesita; nosotros la configuramos, no la suponemos.
Qué datos personales entran sin que se los pidas
El campo libre de una conversación puede contener cualquier cosa — un número de teléfono, una dirección, un problema médico. No se puede detener técnicamente, pero sí se puede tratar: se establece qué se conserva, cuánto tiempo, quién tiene acceso y qué se instruye al equipo para no pedir por el canal. El registro de tratamientos de la implementación se redacta al mismo tiempo que la implementación, no después.
Plazo de conservación
Se establece por implementación y se escribe en la política publicada del cliente. La regla que aplicamos nosotros y que también pedimos en los proyectos: si un cambio de código modifica qué se recopila, a quién llega o cuánto se conserva, la política publicada se modifica en el mismo commit.
Un caso
Una consulta de precio que empieza en Instagram y termina con una persona
La situación
Una tienda con catálogo en línea recibía preguntas de precio en los DM de Instagram y en Messenger. Las mismas cinco preguntas, todo el día, y la respuesta correcta ya existía en el sitio.
Qué construimos
Conectamos los dos canales, indexamos las fuentes y vinculamos el catálogo mediante las herramientas integradas de la tienda, que para WooCommerce leen el Store API público — así que sin claves de acceso en la plataforma. Configuramos el búfer de concatenación, para que tres mensajes escritos seguidos se conviertan en una sola pregunta, y escribimos explícitamente lo que el asistente no tiene permitido hacer. En Messenger activamos el carrusel de productos, con las tres condiciones de las que depende; en Instagram nos quedamos con texto más foto, porque Meta allí no ofrece plantillas genéricas.
Qué salió
Las preguntas de precio y disponibilidad reciben respuesta con el producto mostrado y el enlace. Lo que sale del catálogo pasa al estado `human` y llega a la persona designada, con todo el contexto de la conversación. El registro de consultas muestra qué encontró el asistente, con qué puntuación y en cuánto tiempo, así que el ajuste se hace con datos.
Qué no dice el caso
El resultado depende de la calidad del catálogo. Un precio incorrecto en el sitio se convierte en un precio incorrecto en la conversación — el asistente lee la fuente, no la corrige. Y no hemos medido la reducción del volumen de trabajo del equipo, así que no la afirmamos como resultado.
Preguntas
Lo que nos pregunta la gente antes de llamar
¿Puede escribir él primero por WhatsApp a un cliente que no ha escrito en una semana?
No. Y el motivo está en Meta más una carencia real nuestra, ambas cosas dichas. Fuera de la ventana de 24 horas desde el último mensaje del cliente, Meta rechaza el texto libre con el error 131047, y la plataforma marca el mensaje como fallido y muestra el error en lugar de fingir que salió. El envío fuera de la ventana requiere mensajes de plantilla aprobados por Meta, y esos no existen en nuestro código — una búsqueda del tipo `template` en todo el código devuelve cero resultados. Así que: respuesta dentro de la ventana de 24 horas, sí; campaña proactiva en WhatsApp, no, hasta que se implementen las plantillas.
¿En qué canales funciona realmente, hoy?
Seis, con código propio verificado el 06.09.2026: Facebook Messenger, Instagram Direct, Telegram, 999.md, widget web y WhatsApp Business Cloud API. Una auditoría interna anterior encontró código también para SMS y correo electrónico; no los hemos reverificado en esta fecha, por lo que no los incluimos como disponibles sin una verificación en la implementación concreta. Un canal aparecido entre tanto no se supone conectado.
¿La integración con 999.md es oficial?
No es una integración de partner con API pública. Funciona con la sesión de tu cuenta: la plataforma te pide el valor de la cookie de sesión de tu navegador y la usa para leer y responder a los mensajes. La consecuencia práctica, dicha antes: si 999.md cambia el mecanismo de sesión, la integración se detiene y hay que reconectarla. Quien no acepte ese riesgo no debería empezar por ese canal.
¿De dónde sabe la respuesta y qué hace cuando no la sabe?
Busca en tus fuentes con una búsqueda híbrida — por defecto cinco fragmentos, umbral 0,70, 30% de ponderación por palabras, el resto semántica — y puede adjuntar la fuente a la respuesta. Cuando no encuentra, la vía diseñada es la derivación a un humano: el hilo pasa al estado `human`, y el registro anota quién lo asumió y cuándo. También existe el retorno automático al bot, igualmente como acción registrada.
¿Puede mostrar productos con foto y precio?
En Messenger, sí — carrusel de tarjetas. En Instagram, no: Meta no ofrece plantillas genéricas en Instagram, así que allí se queda texto más foto. El carrusel requiere tres cosas a la vez: estar activado en la configuración del asistente, que la herramienta devuelva al menos dos productos, y que la instrucción del asistente pida lista con precio y enlace — porque el detector mira el texto del agente, no solo los datos. Si falta cualquiera de las tres, el carrusel no se construye. Las configuramos las tres, pero conviene saber por qué.
¿Quién responde al cliente que escribe en ruso al equipo que habla rumano?
La respuesta del operador se puede reescribir automáticamente en el idioma del cliente, manteniendo el tono del agente y sin añadir hechos — eso funciona. El sentido inverso, el mensaje del cliente traducido para el operador, no existe en el código a la fecha de verificación. En la práctica: el cliente recibe respuesta en su idioma, pero el operador lee el mensaje original. Si también necesitan el otro sentido, es un trabajo por hacer, no una opción que marcar.
¿Qué pasa si un cliente envía el mismo mensaje dos veces?
No recibe dos respuestas. Los duplicados se filtran por el identificador del mensaje, con 120 segundos de memoria — el webhook de Meta de hecho reenvía. Y los mensajes escritos uno tras otro se agrupan en un búfer de 15 segundos y reciben una sola respuesta, para todo.
¿Con qué modelo de IA responde y qué pasa si quiero otro?
Las llamadas pasan por una pasarela propia en `api.megapromoting.com/v1`, que habla el formato OpenAI para todos los proveedores detrás; el modelo se elige por asistente. Cambiar el modelo no requiere reescribir la integración. Para los embeddings usamos `text-embedding-3-small`; cambiar el modelo de embeddings, en cambio, requiere reindexar las fuentes — no es lo mismo.
¿Qué no hace este servicio?
No hace voz por teléfono — esa es otra plataforma nuestra, Kallina, y es otro trabajo. No envía mensajes proactivos por WhatsApp, por el motivo anterior. No genera PDF ni adjunta las fotografías recibidas a un pedido — a la fecha de verificación, la fotografía recibida solo se marca. Y no garantizamos porcentajes de reducción de la carga de trabajo: no tenemos la medición, así que no la afirmamos.
En qué se basan las afirmaciones anteriores (21 fuentes)
20 de ellas son código y archivos de nuestros repositorios. No publicamos su nombre ni la línea: juntos, en una sola página, describirían con demasiada precisión cómo están construidos sistemas que no son solo nuestros. Los repasamos contigo, en el repositorio, a petición — la verificación sigue siendo posible, solo que se hace en una conversación.