Lo subí un viernes por la tarde, con esa satisfacción tonta de haber hecho los deberes antes que nadie. Un fichero de texto plano en la raíz, markdown limpio, un titular, un párrafo de contexto y una lista de enlaces con su descripción. /llms.txt. Le hice hasta una comprobación en el navegador para verlo servido con su content-type correcto. Cerré el portátil pensando que acababa de abrirle la puerta grande a los modelos.
El lunes me fui al log del servidor a ver quién había llamado a esa puerta.
De dónde salió la idea
La propuesta es de Jeremy Howard, el de Answer.AI y fast.ai, y la publicó en septiembre de 2024. El razonamiento tenía toda la lógica del mundo: los modelos trabajan con una ventana de contexto limitada, tu web está llena de menús, banners de cookies, scripts y plantillas, y todo eso es ruido. Dale al modelo un índice en markdown, escrito para él, con lo que de verdad importa de tu sitio y en qué orden leerlo. Un robots.txt para decir qué no toques, un sitemap.xml para decir qué existe, y ahora un llms.txt para decir qué merece la pena. Incluso venía con hermano mayor, llms-full.txt, que en vez de enlazar te sirve todo el contenido concatenado en un único fichero.
Como especificación es elegante. Se lee en cinco minutos y se implementa en veinte. Y eso, en parte, explica lo que pasó después.
Por qué parece que lo tiene medio internet
Si te dedicas a mirar estas cosas, la sensación es que la adopción ha sido brutal. Entras en la documentación de cualquier herramienta de desarrollo y ahí está el fichero, impecable, con su índice por secciones. Y la explicación es menos épica de lo que parece: plataformas de documentación como Mintlify lo generan solas. No hubo una decisión, hubo una actualización de producto. Miles de sitios amanecieron con llms.txt sin que nadie en esas empresas se enterase.
Ese es el sesgo del muestreo. Si escaneas una lista de dominios y cuentas cuántos responden 200 en esa ruta, lo que estás midiendo en gran parte es cuánta gente usa según qué plataformas de docs. Sal de ahí, vete a tiendas, a medios, a webs corporativas normales, y el fichero desaparece de golpe. La foto de la adopción cambia radicalmente según a quién le hagas la foto.
El log no miente, aunque a veces decepciona
Esta parte la puedes hacer tú en treinta segundos y te la recomiendo más que cualquier estudio, porque habla de tu web y no de la media de internet. Si tienes acceso al access log:
grep «llms» access.log | awk ‘{print $1, $12, $13, $14}’ | sort | uniq -c | sort -rn
Lo que sale suele ser una mezcla previsible: tú mismo comprobando que el fichero está bien, escáneres genéricos que piden esa ruta igual que piden /wp-config.php.bak a ver si suena la flauta, alguna herramienta de auditoría que ha añadido la comprobación a su lista, y curiosos con navegador. Lo interesante es cruzarlo con las peticiones de los agentes que sí te visitan de verdad, GPTBot, ClaudeBot, PerplexityBot, y ver por qué rutas entran. Verás que entran por donde entra todo el mundo: la home, los artículos, las fichas. Nadie pasa antes por recepción a pedir el índice que le has dejado preparado.
Qué dicen los que mandan
John Mueller, de Google, zanjó el asunto con una comparación que dolió: le recordaba a la etiqueta meta keywords, esa donde el sitio declara de qué va y nadie comprueba si es verdad. Y añadió lo que importa, que ningún servicio de inteligencia artificial había dicho que lo usara. Google, por su parte, sigue documentando lo de siempre: robots.txt, sus agentes y el token Google-Extended para el control de entrenamiento. De llms.txt, ni una línea en su documentación oficial.
OpenAI tampoco lo menciona. Su página de robots identifica a GPTBot, a OAI-SearchBot y a ChatGPT-User, y todo el control que te ofrece pasa por el fichero de siempre.
Y aquí llega mi parte favorita del asunto. Anthropic sí publica llms.txt en su documentación. Lo publica, ojo, que es distinto de consumirlo: lo tiene puesto para que su documentación se lea bien desde fuera, no porque haya anunciado que su rastreador vaya a buscar el tuyo. Los laboratorios están sirviendo el fichero mucho más de lo que lo están pidiendo.
Lo que sí mueve la aguja
Aquí conviene separar dos bichos que la gente mete en el mismo saco. Está el rastreador que recorre la web con calma para alimentar el modelo, y está el agente que entra ahora mismo, porque alguien ha hecho una pregunta y hay que resolverla en segundos: ChatGPT-User, Claude-User y compañía. El segundo es el que te puede traer una mención con enlace, y el segundo es un cliente HTTP con prisa.
- Contenido en el HTML de la respuesta. Si tu texto aparece después de que el navegador ejecute JavaScript, para ese agente con prisa tu página está en blanco. Renderizado en servidor o contenido estático, y a dormir tranquilo.
- HTML semántico de verdad. Encabezados que describen lo que viene debajo, listas que son listas, tablas que son tablas. Es exactamente el mismo esfuerzo que llevas años haciendo por accesibilidad, y ahora rinde dos veces.
- Un robots.txt coherente. Decide qué quieres. Puedes bloquear el entrenamiento y dejar pasar al agente que responde preguntas, pero hazlo a conciencia y por agente, no copiando una lista de bloqueos de un foro. He visto webs quejándose de que no las citan mientras bloqueaban por completo al único agente que podía citarlas.
- Que no se caiga y que responda rápido. Un agente con prisa no reintenta cinco veces. Y ojo con los soft 404 y con los muros que devuelven 200 con una página de «acepta las cookies».
- URLs estables. Cambiar rutas cada rediseño rompe cualquier cosa que un modelo hubiera aprendido a citar de ti.
Mi llms.txt sigue ahí, por cierto. No lo he quitado. Cuesta veinte minutos, no rompe nada, ocupa dos kilobytes y el día que alguien decida leerlo estaré servido. Lo que no voy a hacer es cobrarlo como una línea de presupuesto ni venderlo como el movimiento estratégico del trimestre, teniendo el robots.txt mal puesto y media web escondida detrás de un componente que solo pinta cuando arranca el JavaScript. Empieza por el log, mira quién viene de verdad, y decide desde ahí.

