← Volver a casos

Producto Xelsus · Asistente de IA para sitios web

Sin RAG, a propósito: un asistente para sitios web construido en tres días y empaquetado para volver a desplegarse

Alfred responde a los visitantes en español o inglés usando solo el contenido del propio sitio. Lo interesante es todo lo que rodea al modelo: contexto en caché en lugar de infraestructura de búsqueda, ataques bloqueados antes de costar un token, pruebas que nunca llaman al modelo y una skill de agente que lo instala completo en otro sitio.

Probar Alfred en vivo ↗
Producto
Xelsus.ai, en vivo en el sitio de un consultor
Alcance
Asistente de IA, analítica, skill de agente reutilizable
Periodo
Cerca de tres días, 2026
Rol
Producto e ingeniería

~3 días

Del primer commit a un asistente bilingüe en vivo y una skill de agente reutilizable

0 tokens

Gastados en intentos de inyección de prompt bloqueados. Un filtro previo responde antes de llamar al modelo

32

Pruebas de punta a punta en el navegador, contra un stream simulado para no llamar nunca al modelo

1 comando

Para instalar el asistente en otro sitio Next.js, mediante una skill de agente de código de IA

01

El problema

El sitio de un consultor era un portafolio estático. Los visitantes no podían preguntar “¿hacen esto?” y recibir una respuesta basada en los servicios, casos y artículos reales, en su propio idioma.

Las restricciones eran las de cualquier negocio pequeño: costo de operación cercano a cero, nada de afirmaciones inventadas sobre el negocio, nada de filtrar las instrucciones del asistente, y un endpoint público que iba a atraer abusos desde el primer día.

02

Por qué era difícil

  • Un endpoint público invita a la inyección de prompts, a intentos de extraer las instrucciones y al spam de siempre.
  • El asistente nunca debe inventar servicios, precios ni afirmaciones sobre el negocio que representa.
  • El costo de operación tenía que mantenerse cerca de cero para un sitio personal.
  • Las interfaces de chat con streaming son difíciles de probar, y las pruebas que llaman a un modelo real son lentas, inestables y se cobran.
  • En hosting serverless, el trabajo programado después de una respuesta en streaming puede perderse sin aviso.

03

Qué construimos

Un widget de chat que acompaña al visitante entre páginas, una API con streaming y protecciones en capas, el contenido del sitio resumido y guardado en la caché del proveedor del modelo, y analítica de conversaciones. Después, todo se convirtió en una skill de agente que hace unas pocas preguntas de configuración e instala el asistente en otro sitio.

Visitante: widget de chat, conversación conservada entre páginas
Límite de frecuencia → filtro de inyecciones: lo sospechoso se responde sin llamar al modelo
Contenido del sitio resumido por idioma, en la caché del proveedor del modelo
Respaldo: las mismas instrucciones en línea si la caché no está disponible
Respuesta en streaming, solo con páginas aprobadas y enlaces en el idioma del visitante
Analítica de conversaciones en una base Postgres
Skill de agente: instala el asistente en otro sitio

04

Dónde está la innovación

01

Sin RAG, a propósito

Una vez resumido, el sitio completo cabe en el contexto del modelo. Así que en lugar de una base vectorial y un pipeline de búsqueda que mantener, el contenido se sube una vez por idioma a la caché de contexto del proveedor y se renueva antes de que venza. El contexto en caché se cobra a una fracción de los tokens normales, y no hay nada extra que mantener sincronizado.

02

Ataques que cuestan cero tokens

Los mensajes que coinciden con patrones conocidos de inyección nunca llegan al modelo. El servidor los responde por su cuenta, en el mismo formato de streaming que una respuesta real, así que el visitante ve una respuesta amable y fiel al personaje y no se gasta un solo token. Es una capa entre varias: instrucciones reforzadas, un alcance acotado, una ventana corta de historial, un límite de respuesta y un límite de frecuencia.

03

Enlaces anclados, en el idioma del visitante

El asistente solo puede enlazar a una lista aprobada de páginas, debe usar el idioma de la conversación y no puede inventar anclas. Ante preguntas vagas pide aclaración en lugar de adivinar, y nunca cita precios.

04

Falla con elegancia

Si la caché de contexto no se puede crear, las mismas instrucciones van en línea y el visitante no nota nada. Cuando resultó que el hosting descartaba el trabajo programado después del streaming, el registro de conversaciones pasó al navegador, una vez completa la respuesta.

05

Pruebas que nunca llaman al modelo

Un fixture de pruebas reproduce exactamente el formato de streaming del AI SDK, así que 32 pruebas de punta a punta en el navegador cubren el comportamiento real del widget sin llamar al modelo, sin clave de API y sin cuenta que pagar.

06

Un desarrollo, una entrega repetible

Toda la implementación está empaquetada como una skill para agentes de código de IA. Hace unas pocas preguntas de configuración, detecta cómo está construido el sitio de destino, genera los archivos, crea las tablas de analítica con seguridad a nivel de fila cuando las herramientas de base de datos están conectadas, actualiza la política de seguridad y verifica el endpoint antes de terminar.

05

Dónde estuvo la ingeniería

Un asistente para sitios web es fácil de mostrar en una demo y difícil de operar en público. La mayor parte del trabajo estuvo en lo que el visitante nunca ve: qué le pasa a un mensaje antes del modelo, y qué pasa cuando algo falla.

Qué le pasa a un mensaje

Los controles que cada mensaje debe pasar antes de poder llegar al modelo.

Ruta de la solicitud

Cuatro controles antes del modelo

Frecuencia
Límite por dirección
Filtro previo
Patrones de inyección conocidos
Historial
Últimos 10 mensajes
Respuesta
Largo acotado

Si un control falla

  • El visitante recibe una respuesta amable, fiel al personaje
  • El modelo nunca se llama
  • No se gasta ningún token

06

Resultados

  • En vivo en el sitio de un consultor, respondiendo en español e inglés a partir de los servicios, casos y artículos del propio sitio.
  • Construido en cerca de tres días, del primer commit a la skill de agente empaquetada.
  • Los intentos de inyección que coinciden con patrones conocidos se responden sin llamar al modelo, sin gastar tokens.
  • 32 pruebas de punta a punta cubren el widget contra un stream simulado, sin llamadas al modelo ni cuenta de API.
  • Cada conversación queda registrada para analítica, así que el siguiente paso es medir qué preguntan realmente los visitantes y sumar un pequeño set de evaluación con preguntas fuera de alcance e intentos de inyección.
  • El mismo asistente ya se puede instalar en otro sitio Next.js mediante una skill de agente guiada.

07

Lo que aprendimos en el camino

No todo asistente necesita RAG

RAG suele ser el reflejo automático. Cuando el contenido cabe en el contexto, guardarlo en caché es más simple, más barato y tiene menos piezas móviles. La búsqueda vale la pena cuando el contenido supera el contexto, no antes.

En serverless, el trabajo termina cuando termina el stream

El registro que corría después de la respuesta en streaming se perdía sin aviso en el hosting. Moverlo al navegador, una vez completa la respuesta, lo resolvió sin agregar infraestructura.

Un filtro es una capa, no un muro

El reconocimiento de patrones frena los ataques conocidos a bajo costo, pero nunca va a detectarlo todo. La protección real es el conjunto: alcance acotado, instrucciones reforzadas, contexto corto, respuestas limitadas y límites de frecuencia.

Stack

  • Next.js
  • React
  • Vercel AI SDK
  • Gemini 3 Flash
  • Caché de contexto de Gemini
  • Supabase (Postgres, seguridad por fila)
  • GSAP
  • Playwright
  • Netlify
  • Skills de Claude Code
  • MCP

¿Quiere un asistente que solo diga lo que su sitio puede respaldar?

Construimos y desplegamos asistentes anclados al contenido de su sitio, con protecciones, analítica y pruebas desde el primer día.

Agende su discovery session

Alfred funciona en vivo en el sitio de su autor. Las cifras de uso se agregarán cuando haya datos suficientes para reportarlas con honestidad.