Как создать файл llms.txt

Три шаблона, контрольный список и инструкции по развёртыванию методом копирования и вставки для любого распространённого стека.

Последнее обновление:

1. Спланируйте, что включить

Прежде чем что-либо писать, перечислите от 5 до 20 страниц на вашем сайте, которые LLM потребовалась бы для ответов на вопросы о вашем проекте. Считайте это тщательно отобранным списком для чтения, а не картой сайта.

Полезные стартовые категории:

  • Продукт, обзор, варианты использования, цены.
  • Документация, начало работы, справочник API и основные руководства.
  • Интеграции, партнёров и SDK, по одной строке на каждый элемент.
  • Справочная информация, журнал изменений, страница статуса, политика безопасности.
  • Необязательно, бренд-материалы, пресса, архивы.

Если страница не поможет LLM ответить на реальные вопросы пользователей, не включайте её. Самая большая ошибка — включать всё: это размывает сигнал.

2. Минимальный шаблон

Заголовок H1 — единственный обязательный элемент. Приведённый ниже шаблон добавляет краткое описание и ссылки, чтобы файл был полезен.

llms.txt, minimal
# {Site name}

> {One-sentence description of what your site is about.}

## Pages

- [{Page title}]({absolute URL}): {short note}

Для большинства сайтов этот шаблон — правильная отправная точка: краткое описание в цитате, абзац контекста и от трёх до четырёх разделов.

llms.txt, recommended
# {Site name}

> {One- or two-sentence overview. Factual, no marketing claims.}

{Optional 1–3 sentences of context: what this site covers, who it's for, and how the file below is curated.}

## Product

- [Product overview]({URL}): high-level capabilities.
- [Pricing]({URL}): plans and limits.

## Documentation

- [Getting started]({URL}): install, first call, hello world.
- [API reference]({URL}): full endpoint catalog.
- [Guides]({URL}): tutorials and how-tos.

## Optional

- [Changelog]({URL}): version history.
- [Brand assets]({URL}): logos and color palette.

4. Расширенный шаблон

Более крупной SaaS-платформе или платформе для разработчиков обычно нужна более глубокая структура с отдельным Optional раздел. Используйте это как отправную точку и безжалостно сокращайте.

llms.txt, advanced
# Acme

> Acme is a hosted analytics platform for product teams. The pages below cover product, pricing, the API, and integration guides.

The map here is curated for assistants, it is not exhaustive. Use it to answer questions about product capabilities, pricing tiers, integrations, SDKs, and migration from other tools. For the full corpus, see /llms-full.txt.

## Product

- [Product overview](https://acme.example/product): high-level capabilities.
- [Use cases](https://acme.example/use-cases): scenarios for product, marketing, and support teams.
- [Changelog](https://acme.example/changelog): monthly product updates.

## Pricing

- [Pricing tiers](https://acme.example/pricing): plans, limits, overage rules.
- [Billing FAQ](https://acme.example/billing-faq): invoices, taxes, refunds.

## Developers

- [REST API reference](https://docs.acme.example/api): full endpoint catalog.
- [Webhooks](https://docs.acme.example/webhooks): events, signatures, retries.
- [SDK, JavaScript](https://docs.acme.example/sdk/js): install, init, track events.
- [SDK, Python](https://docs.acme.example/sdk/python): install, init, track events.

## Integrations

- [Segment](https://docs.acme.example/integrations/segment): two-way sync.
- [Snowflake](https://docs.acme.example/integrations/snowflake): nightly export.
- [HubSpot](https://docs.acme.example/integrations/hubspot): contacts and events.

## Optional

- [Brand assets](https://acme.example/brand): logos, color palette.
- [Press releases](https://acme.example/press): historical announcements.
- [Status page](https://status.acme.example): real-time service health.

5. Проверьте

Вставьте файл в валидатор чтобы подтвердить соответствие спецификации. Типичные проблемы, которые он выявляет: отсутствующий H1, неверный синтаксис ссылок (- [name](url)), относительные URL, содержимое вне раздела, случайный второй H1, слишком большие файлы.

6. Развёртывание в вашем стеке

Cloudflare Pages

Cloudflare Pages
# Cloudflare Pages
# Place llms.txt in the public/ root of your project. It will be served at /llms.txt.

# Verify after deploy:
curl -I https://your-domain.com/llms.txt

Полное руководство по Cloudflare Pages

Vercel

Разместите llms.txt в вашем проекте’s public/ каталог. Vercel обслуживает его без изменений по адресу /llms.txt.

Полное руководство по Vercel

Netlify

Тот же подход: поместите файл в статический каталог (public/ для Next.js или Astro, static/ для SvelteKit и Hugo). Netlify отдаёт его по адресу /llms.txt.

Полное руководство по Netlify

Next.js

Next.js
// Next.js (App Router), public/llms.txt is served as-is.
// 1. Place the file at: public/llms.txt
// 2. No code change needed, it's served at https://yoursite.com/llms.txt

// If you prefer to generate it dynamically:
// app/llms.txt/route.ts
import { NextResponse } from 'next/server';

export async function GET() {
  const body = `# Acme

> One-line summary.

## Docs

- [Getting started](https://acme.example/docs/getting-started)
`;

  return new NextResponse(body, {
    headers: { 'Content-Type': 'text/plain; charset=utf-8' },
  });
}

Полное руководство по Next.js

Astro

Astro
// Astro, public/llms.txt is served as-is.
// Drop the file at: public/llms.txt
// Astro will copy it to dist/llms.txt during `astro build`.

// To generate it from your content collections, create:
// src/pages/llms.txt.ts
import type { APIRoute } from 'astro';
import { getCollection } from 'astro:content';

export const GET: APIRoute = async () => {
  const docs = await getCollection('docs');
  const body = [
    '# Acme',
    '',
    '> Hosted analytics for product teams.',
    '',
    '## Documentation',
    '',
    ...docs.map((d) => `- [${d.data.title}](https://acme.example/${d.slug}/): ${d.data.summary}`),
  ].join('\\n');

  return new Response(body, { headers: { 'Content-Type': 'text/plain; charset=utf-8' } });
};

Полное руководство по Astro

SvelteKit

SvelteKit
// SvelteKit, static/llms.txt is served as-is.
// Drop the file at: static/llms.txt
// SvelteKit copies it to build/llms.txt during build.

// To generate it dynamically, create:
// src/routes/llms.txt/+server.ts
import type { RequestHandler } from './$types';

export const GET: RequestHandler = () => {
  const body = `# Acme

> One-line summary.

## Docs

- [Getting started](https://acme.example/docs/getting-started)
`;

  return new Response(body, {
    headers: { 'Content-Type': 'text/plain; charset=utf-8' },
  });
};

Полное руководство по SvelteKit

Hugo

Hugo
# Hugo, place llms.txt in the static/ folder.
# It will be copied to public/llms.txt during hugo build.

# To generate it from content, create a custom output format.
# config.toml:
[outputs]
  home = ["HTML", "RSS", "LLMSTXT"]

[outputFormats.LLMSTXT]
  name = "LLMSTXT"
  mediaType = "text/plain"
  baseName = "llms"
  isPlainText = true
  notAlternative = true

# layouts/index.llmstxt:
# {{ "# " }}{{ .Site.Title }}
#
# > {{ .Site.Params.description }}
#
# ## Pages
#
# {{ range .Site.RegularPages }}- [{{ .Title }}]({{ .Permalink }}): {{ .Params.summary }}
# {{ end }}

Полное руководство по Hugo

WordPress

WordPress
# WordPress, three options
#
# 1. Easiest: upload llms.txt to your hosting (FTP/SFTP) at the web root.
#    Verify: https://yoursite.com/llms.txt
#
# 2. Plugin: any "static file uploader" plugin works. Place file at root.
#
# 3. Programmatic: add a small handler to your theme's functions.php
#    that intercepts the request and returns the file contents.
add_action('init', function () {
  if (\$_SERVER['REQUEST_URI'] === '/llms.txt') {
    header('Content-Type: text/plain; charset=utf-8');
    echo file_get_contents(get_template_directory() . '/llms.txt');
    exit;
  }
});

Полное руководство по WordPress

Express

Express
// Express, serve llms.txt as a static file or dynamic route.

// Option 1: static file in public/
app.use(express.static('public')); // serves public/llms.txt at /llms.txt

// Option 2: dynamic route
app.get('/llms.txt', (req, res) => {
  res.type('text/plain');
  res.send(`# Acme

> One-line summary.

## Docs

- [Getting started](https://acme.example/docs/getting-started)
`);
});

Полное руководство по Express

Laravel

Laravel
<?php
// Laravel, add a route in routes/web.php

Route::get('/llms.txt', function () {
    $content = <<<EOT
# Acme

> One-line summary.

## Docs

- [Getting started](https://acme.example/docs/getting-started)
EOT;

    return response($content, 200)
        ->header('Content-Type', 'text/plain; charset=utf-8');
});

// Or use a controller:
// php artisan make:controller LlmsTxtController
// Then: Route::get('/llms.txt', [LlmsTxtController::class, 'show']);

Полное руководство по Laravel

CMS (Contentful, Sanity, Strapi, Prismic)

CMS build script
# CMS-driven llms.txt (Contentful, Sanity, Strapi, Prismic…)
#
# Pattern: fetch curated entries at build time, write llms.txt.
#
# Node.js example (runs in CI or as a build script):

import { createClient } from 'contentful';
import fs from 'fs/promises';

const client = createClient({
  space: process.env.CONTENTFUL_SPACE_ID,
  accessToken: process.env.CONTENTFUL_ACCESS_TOKEN,
});

const entries = await client.getEntries({ content_type: 'doc', 'fields.featured': true });

const lines = [
  '# Acme',
  '',
  '> Hosted analytics for product teams.',
  '',
  '## Documentation',
  '',
  ...entries.items.map(
    (e) => `- [${e.fields.title}](https://acme.example/${e.fields.slug}/): ${e.fields.summary}`
  ),
];

await fs.writeFile('public/llms.txt', lines.join('\n'));
console.log(`Wrote ${entries.items.length} entries to llms.txt`);

Полное руководство по CMS

Другие руководства по платформам

Пошаговые руководства для других распространённых стеков и конструкторов:

Другие стеки

Для статического nginx, скопируйте файл в корень веб-сайта. Правило универсально: отдавайте файл по каноническому пути /llms.txt с помощью Content-Type: text/plain; charset=utf-8.

7. Автоматическая генерация во время сборки

Вести файл вручную для небольшого сайта вполне можно, но такой подход быстро перестаёт работать. Два распространённых шаблона:

  • Скрипт сборки, переберите коллекцию содержимого (Markdown, MDX, CMS) и запишите llms.txt в dist/. Примеры для Astro и CMS приведены выше.
  • Маршрут сервера, отображайте файл по запросу из базы данных или CMS. Примеры для Next.js, SvelteKit, Express и Laravel приведены выше.

Какой бы вариант вы ни выбрали, запустите валидатор в CI: он обнаружит незаметно сломанные файлы (например, пустой раздел после миграции содержимого).

Проверка перед публикацией

  • Файл отдан по адресу /llms.txt с помощью 200 OK.
  • Content-Type: text/plain; charset=utf-8.
  • Ровно один H1.
  • Краткое описание в виде обычного языка, без маркетинговой шелухи.
  • Все URL имеют абсолютный (https://...).
  • Каждый раздел содержит хотя бы один пункт.
  • В списке нет частного URL или URL, доступного только после авторизации.
  • Валидатор не возвращает ошибок.
  • Если у вас есть корпус для публикации, также отдавайте /llms-full.txt.
  • robots.txt по-прежнему разрешает сканирование файла (не Disallow: /llms.txt).

Далее

Источники