Как создать файл llms.txt
Три шаблона, контрольный список и инструкции по развёртыванию методом копирования и вставки для любого распространённого стека.
Последнее обновление:
1. Спланируйте, что включить
Прежде чем что-либо писать, перечислите от 5 до 20 страниц на вашем сайте, которые LLM потребовалась бы для ответов на вопросы о вашем проекте. Считайте это тщательно отобранным списком для чтения, а не картой сайта.
Полезные стартовые категории:
- Продукт, обзор, варианты использования, цены.
- Документация, начало работы, справочник API и основные руководства.
- Интеграции, партнёров и SDK, по одной строке на каждый элемент.
- Справочная информация, журнал изменений, страница статуса, политика безопасности.
- Необязательно, бренд-материалы, пресса, архивы.
Если страница не поможет LLM ответить на реальные вопросы пользователей, не включайте её. Самая большая ошибка — включать всё: это размывает сигнал.
2. Минимальный шаблон
Заголовок H1 — единственный обязательный элемент. Приведённый ниже шаблон добавляет краткое описание и ссылки, чтобы файл был полезен.
# {Site name}
> {One-sentence description of what your site is about.}
## Pages
- [{Page title}]({absolute URL}): {short note}
3. Рекомендуемый шаблон
Для большинства сайтов этот шаблон — правильная отправная точка: краткое описание в цитате, абзац контекста и от трёх до четырёх разделов.
# {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 раздел. Используйте это как отправную точку и безжалостно
сокращайте.
# 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
# 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 (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, 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' } });
};
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, 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 }}
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, 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
<?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-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`);
Другие руководства по платформам
Пошаговые руководства для других распространённых стеков и конструкторов:
- Angular, Vue (Vite), Nuxt, Remix, Gatsby
- Docusaurus, MkDocs, Jekyll, Eleventy, GitHub Pages
- Ruby on Rails, Django, Laravel, Express
- Без кода: Framer, Webflow, Wix, Squarespace, Ghost, Shopify
Другие стеки
Для статического 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).
Далее
- Лучшие практики, что продолжать делать и чего избегать.
- llms.txt и SEO, цитаты ИИ, сигналы GEO, позиция в рейтинге.
- llms-full.txt, раскройте весь корпус содержимого.
- Примеры из реального мира, скопируйте то, что работает.
- Валидатор · Генератор.