llms.txt para Next.js
Sin convención de primera parte (todavía)
Next.js incluye convenciones de archivos de metadatos para robots.txt y sitemap.xml — exportas una función desde app/robots.ts y el framework sirve el archivo. No existe tal convención para llms.txt (hay una petición abierta, discusión #80692 de vercel/next.js), así que lo cableas tú mismo. Dos patrones, ambos triviales:
Patrón 1: archivo estático
Pon llms.txt en public/. Next.js sirve lo que haya ahí en la raíz, así que public/llms.txt → tusitio.com/llms.txt. Listo.
La opción correcta cuando tus páginas clave cambian poco. El riesgo es la deriva: el archivo dice lo que tu sitio era.
Patrón 2: route handler
Para contenido que se mueve — docs, productos, posts — genera el archivo desde la misma fuente de verdad que tus páginas:
// app/llms.txt/route.ts
import { getDocs } from '@/lib/content';
export async function GET() {
const docs = await getDocs();
const body = [
'# Acme',
'',
'> Acme es una API de widgets para desarrolladores.',
'',
'## Docs',
...docs.map(d => `- [${d.title}](/docs/${d.slug}): ${d.summary}`),
'',
'## Superficies legibles por máquina',
'- [Especificación OpenAPI](/openapi.json): esquema completo de la API',
].join('\n');
return new Response(body, {
headers: { 'Content-Type': 'text/plain; charset=utf-8' },
});
}
Añade export const revalidate = 3600 si tu fuente de contenido es costosa. El mismo patrón sirve llms-full.txt si quieres el compañero de texto completo.
Qué incluir
La curación supera a la exhaustividad: qué es el sitio (un blockquote), la docena de páginas por las que un agente debería empezar con resúmenes de una línea, y referencias cruzadas a tus superficies de máquina — la especificación OpenAPI y cualquier endpoint MCP son las líneas de mayor valor del archivo. Guía completa del formato: la guía de llms.txt.
Valídalo
Ejecuta el validador de llms.txt contra tu despliegue — existencia, parseabilidad, estructura navegable — o escanea el sitio para la imagen completa de preparación para agentes.
Preguntas frecuentes
¿Next.js tiene una convención de metadatos llms.ts como robots.ts?
No. Las convenciones de archivos de metadatos cubren robots.txt, sitemap.xml, iconos e imágenes OG — no llms.txt. Hay una petición abierta; hasta entonces, usa public/llms.txt o un route handler.
¿El route handler debe establecer un Content-Type especial?
Sírvelo como text/plain (o text/markdown) con UTF-8. Los agentes parsean la estructura markdown del cuerpo; lo que importa es que la ruta devuelva 200 con el contenido directamente.
¿Archivo estático o route handler?
Estático si tus páginas clave son estables. Route handler si el archivo lista algo que cambia — es la diferencia entre documentación y una instantánea.