Skip to content

Vaynerov Technologies

No solo desarrollamos — conjuramos cada línea de código y píxel.

Todos los artículosHistorias de construcción

Un conserje que leyó todo lo que hemos publicado

Todos los sitios de agencia tienen una burbuja de chat. La mayoría son un formulario disfrazado. El nuestro tenía que conocer el trabajo, el paradero de los precios, los límites del fundador y los veintiún ensayos de este Journal — así que lo construimos como construimos todo lo demás, y dejamos por escrito lo que costó.

Edward AmirainFundador, Vaynerov Technologies
Publicado 8 min de lectura
En esta página
  1. Identidad sin cuenta
  2. Siempre 200
  3. El archivo que escribimos para otros robots
  4. Enseñarle el Journal
  5. Cuando alguien quiere contratarnos
  6. Números que podemos imprimir
  7. Límites, dichos en voz alta

En la esquina de esta página hay una pequeña pastilla que dice pregunta al estudio. Detrás está lo que todos los sitios de consultoría prometen desde 2016 y casi ninguno ha entregado: una caja de chat que de verdad conoce a la empresa a la que representa. Pregúntale qué incluye un proyecto de plataforma web y recita los entregables reales. Pregúntale qué pensamos del código generado y cita el ensayo. Pregúntale dónde vive Edward y declina con cortesía, porque le enseñamos modales junto con los hechos.

Podríamos haber pegado un widget de terceros encima del pie de página y pasado a otra cosa. Pero hemos impreso conjuramos cada línea de código y cada píxel bajo nuestro propio nombre, y una burbuja de chat alquilada, emitiendo la marca de otro por nuestra esquina, habría discutido con cada página sobre la que flotara. Así que el conserje es nuestro de punta a punta: una Edge Function de Supabase, un modelo de OpenAI, un cliente del tamaño de una tarjeta de visita y una capa de conocimiento con una historia que no esperábamos contar.

Identidad sin cuenta

La primera decisión de diseño fue quién es el visitante. El historial del chat debe sobrevivir a una recarga de página — perder la conversación por haber mirado la página de precios es de aficionados — pero nadie quiere crearse una cuenta para hacer una pregunta, y no queríamos montar autenticación anónima para lo que es, estructuralmente, un libro de visitas con opiniones.

Así que la identidad es un token: el widget acuña un id de hilo aleatorio y un secreto en el almacenamiento de tu navegador, y el servidor guarda solo un hash del secreto. Presenta el par y la conversación continúa; piérdelo y simplemente empiezas de cero. Las tablas de hilos están cerradas al service role — no existe ninguna política de lectura pública, así que no hay nada que configurar mal. Es la misma forma que los tokens de compartición que nuestras páginas de presupuesto usan desde el primer día, y exactamente por eso nos fiamos de ella.

Siempre 200

Las respuestas llegan en streaming, token a token, por server-sent events, y el transporte tiene una regla heredada del generador de /blueprint: la respuesta es siempre un flujo de eventos HTTP 200, incluso cuando trae malas noticias. ¿Límite de peticiones alcanzado? Eso es un evento error. ¿Token de hilo inválido? Un evento error. La alternativa — un 4xx pelado después de que el preflight de CORS ya haya pasado — es un fallo que el navegador puede ver pero tu JavaScript no puede leer, lo peor de los dos mundos.

El flujo lleva algo más que texto. Cuando el modelo termina, un evento done entrega el id de la respuesta almacenada, que es lo que hace funcionar los pulgarcitos bajo la respuesta. Cuando se captura un lead a mitad de conversación, un evento lead se lo dice a la página para que nuestra analítica lo cuente. El protocolo mide tres verbos de ancho y pensamos mantenerlo así.

El abuso se acota con aritmética y no con optimismo: diez peticiones por minuto y dirección a través del mismo limitador duradero que usan los formularios de contacto, dos mil caracteres por mensaje, una ventana de contexto de veinte mensajes, mil tokens de respuesta. Un bot que quiera gastarse nuestro presupuesto de inferencia tiene que ponerse a la cola detrás del curl de los demás.

El archivo que escribimos para otros robots

El problema interesante era el conocimiento. Un conserje que responde desde el entrenamiento general de un modelo es un pasivo con buen traje: inventará servicios que no vendemos y precios que nunca dimos. Todo lo que diga sobre el estudio tiene que salir del estudio.

Aquí viene la parte que no planeamos. Hace meses publicamos /llms-full.txt — un resumen del sitio entero legible por máquinas, mantenido automáticamente desde el mismo contenido que renderizan las páginas, para que los asistentes de IA de otros nos describieran con exactitud. Cuando salimos a buscar un corpus con el que cimentar nuestro propio conserje, ya estaba ahí: al día, completo y probado durante medio año por los robots de desconocidos. La función lo descarga, lo cachea un momento y se lo entrega al modelo con cada pregunta. El archivo que escribimos para otros robots resultó ser el cerebro del nuestro.

Tres niveles, una respuesta: el canon fijo, el resumen vivo del sitio y lo que el Journal tenga que decir sobre tu pregunta.

Sobre el resumen se asientan dos niveles más. Un canon corto, escrito a mano, lleva las reglas que no pueden derivar jamás: las palabras prohibidas de la marca, la negativa a inventar números y un perfil del fundador con un límite explícito — todo lo que el conserje puede decir de Edward en lo personal cabe en seis viñetas, y tiene instrucciones de rechazar la séptima. No porque el modelo fuera a cotillear si no, sino porque los límites de un bot público deben ser una decisión de diseño, puesta por escrito, no una propiedad emergente.

Enseñarle el Journal

El tercer nivel es este Journal. Veintiún ensayos sobre cómo construimos las cosas son exactamente el material que piden las preguntas más difíciles de un visitante — cómo hicisteis rápido Safari, qué se rompió en el museo, por qué publicar precios siquiera — pero con sus cerca de sesenta mil palabras no puede viajar en cada petición.

Así que los ensayos se cortan en pasajes y se embeben como vectores, y cada pregunta entrante se embebe igual y se compara contra ellos. Los cuatro pasajes más cercanos, por encima de un suelo de similitud, viajan con el prompt; al modelo se le dice que cite con libertad y enlace la fuente. Pregunta cómo hicimos rápido Mobile Safari y el conserje responde con los números reales de /articles/making-mobile-safari-fast — el TTFB de 250 a 950 milisegundos que se volvió de un solo dígito, los 91 kilobytes de JavaScript que salieron del bundle inicial — porque está leyendo los mismos párrafos que leerías tú.

El índice se reconstruye solo en cada despliegue. Lo que produce una frase que disfrutamos teclear: para cuando leas esto, el conserje ya lo habrá leído también. Los artículos sobre la máquina pasan a formar parte de la máquina — pregúntale cómo funciona y te citará esta misma página.

Cuando alguien quiere contratarnos

Una caja de chat de estudio tiene un solo trabajo comercial: darse cuenta de cuándo una conversación deja de ser curiosidad y empieza a ser un proyecto. El modelo lleva una única herramienta para esto — puede registrar un lead con un nombre, un email y un brief de una línea, y tiene instrucciones de usarla como mucho una vez, solo con datos que el visitante haya tecleado de verdad, y de no preguntar nunca dos veces. El lead cae en la misma tabla que los del formulario de contacto, al estudio le llega el aviso y el visitante recibe una frase de confirmación en lugar de una secuencia de seguimiento.

Mecánicamente es la parte menos glamurosa de la obra y la más instructiva: a mitad de flujo, el modelo pausa su propia respuesta, llama a la herramienta, recibe el resultado y sigue hablando — dos peticiones aguas arriba cosidas sobre una sola conexión con el navegador, invisibles salvo que estés mirando el cable. El visitante experimenta una frase. Esa asimetría es casi todo lo que es la ingeniería.

Números que podemos imprimir

~5,800
tokens de prompt viajando con cada pregunta
130
pasajes del Journal en el índice vectorial
6
idiomas en los que te saluda el conserje
10/min
peticiones por visitante antes de que el limitador proteste

Medido el día del lanzamiento, no estimado — la respuesta que produjo el recuento de tokens decía, entera, «OK».

Cada respuesta escribe sus propios recibos de tokens en la base de datos, así que el coste mensual del conserje es una consulta, no una conjetura. También vemos qué respuestas se ganan el pulgar arriba y cuáles no — las valoraciones caen junto a los recibos. Una funcionalidad que no puedes medir es una funcionalidad que no puedes defender; esta sale con su propio libro de cuentas.

Límites, dichos en voz alta

  • El índice del Journal está solo en inglés, por ahora. El emparejamiento entre idiomas funciona más veces de las que debería, pero una pregunta en ruso se encuentra con pasajes en inglés; embeber los ensayos traducidos es el arreglo honesto y está en la lista.
  • El modelo ve los últimos veinte mensajes de un hilo. El comienzo de una conversación larga acaba cayendo fuera de la vista; hay un resumen rodante diseñado, pero no construido.
  • El límite de peticiones es por dirección, así que una oficina detrás de un mismo router comparte cupo. Nadie lo ha alcanzado todavía; el día que alguien lo haga, la clave se volverá más lista.
  • El conserje habla por el estudio, pero sigue siendo un modelo de lenguaje. Está cimentado, acotado y medido — y si alguna vez dice algo que el sitio no dice, gana el sitio.

Que una caja de chat pinte algo en el sitio de un estudio es una pregunta justa — escribimos un ensayo entero sobre herramientas que te respetan, y un mal conserje es lo contrario de eso. Nuestra respuesta fue exigirle el mismo listón que a todo lo demás de aquí: emite en streaming porque hacer esperar es de mala educación, rechaza porque los límites son contenido, cita porque leyó las fuentes, y se retira cuando estás en una página que ya tiene su propio mobiliario. El museo conserva su propio chat; el nuestro se queda fuera del encuadre.