# Формат файла llms.txt: синтаксис и правила

> Формат llms.txt по второй редакции proposal - обязательный заголовок, порядок частей, списки ссылок, файл в подпути, Markdown-версии страниц и что в proposal не входит

Страница: https://llms-full-txt.ru/specification/format/
Указатель сайта: https://llms-full-txt.ru/llms.txt

`llms.txt` - файл в формате Markdown, который лежит на сайте и помогает агентам и языковым моделям найти нужное содержание. Агент просматривает файл, выбирает подходящие ссылки и идёт по ним. Сам файл остаётся небольшим, подробности лежат за ссылками.

Это proposal одного автора, а не стандарт IETF или W3C. Доступом файл не управляет: для этого служит `robots.txt`.

- Редакция: v2, 10 августа 2026
- Автор: Jeremy Howard, Answer.AI
- Формат: Markdown
- Обязательная часть: только заголовок H1

Что изменилось по сравнению с первой редакцией - на странице [Изменения в v2](https://llms-full-txt.ru/specification/changes/).

## Как агент пользуется файлом

- От вопроса до нужной страницы
- Сайт
- публикует файл по известному адресу
- llms.txt
- /llms.txt
- название, описание, списки ссылок
- Агент
- выбирает ссылки под свой вопрос
- Markdown-страница
- /docs/page.md
- чистый текст без оформления
- Контекст
- только то, что нужно для ответа

## Минимальный файл

Чтобы файл соответствовал proposal, достаточно одной строки с заголовком. На практике минимум выглядит так:

```markdown title="llms.txt"
# Название проекта

> Одно-два предложения: что это и для кого

## Документация

- [Быстрый старт](https://example.com/quickstart.md): первые шаги за пять минут
```

## Из чего состоит файл

Части идут в строгом порядке. Обязательна только первая.

- llms.txt
- пять частей по порядку
- Заголовок H1

```
# FastHTML
```

- Название проекта или сайта. Без него файл не соответствует proposal. Заголовок один.
- Описание

```
> FastHTML - библиотека на Python для
> серверных веб-приложений на основе HTMX.
```

- Цитата с коротким описанием: то, без чего не понять остальной файл.
- Подробности

```
Важно:
- синтаксис не совместим с FastAPI
- React, Vue и Svelte не поддерживаются
```

- Любые блоки Markdown, кроме заголовков: абзацы, списки, код.
- Секция со ссылками

```
## Документация
- [Быстрый старт](https://example.com/quickstart.md): первые шаги
- [Справочник API](https://example.com/api.md)
```

- Заголовок H2 и список. В элементе - ссылка и необязательное пояснение после двоеточия.
- Секция Optional

```
## Optional
- [История изменений](https://example.com/changelog.md)
```

- Соглашение для второстепенных ссылок: агент может их пропустить, когда нужен короткий контекст.

:::note
Между описанием и первой секцией H2 заголовков быть не должно. Особого механического смысла у секции `Optional` во [второй редакции](https://llmstxt.org/) нет. Подробнее - в разделе [Секции и структура](https://llms-full-txt.ru/specification/sections/).
:::

Ссылки должны вести на содержание, удобное модели: в первую очередь на Markdown-версии страниц. Допустимы и внешние адреса, если они помогают понять материал.

## Где лежит файл

Файл можно положить в корень сайта или в любой подпуть. Вторая редакция определяет, что это значит.

- llms.txt покрывает весь сайт
- docs/
  - **llms.txt** покрывает всё в /docs/
  - guide.html
  - api/
    - **llms.txt** покрывает всё в /docs/api/
    - users.html
- blog/
  - post.html

- Какой файл возьмёт агент
- Страница
- /docs/api/users.html
- Подходят три файла
- корневой, /docs/ и /docs/api/
- Берётся самый специфичный
- /docs/api/llms.txt
- Страница
- /blog/post.html
- Подходит один файл
- в /blog/ своего файла нет
- Берётся корневой
- /llms.txt

Адрес в `/.well-known/` автор proposal отклонил: такие адреса существуют только в корне домена, а `llms.txt` описывает путь, в котором лежит.

## Markdown-версии страниц

Proposal предлагает отдавать чистую Markdown-версию страницы рядом с обычной. Допустимы две формы адреса.

| Страница | Первая форма | Вторая форма |
|---|---|---|
| `/page.html` | `/page.html.md` | `/page.md` |
| `/docs/` | `/docs/index.html.md` | `/docs/index.md` |

## Как агент находит файлы

Вторая редакция рекомендует две стандартные связи. Первая ведёт от страницы к её Markdown-версии, вторая - к файлу `llms.txt`, который эту страницу покрывает.

- Две связи для обнаружения
- rel="alternate"
- тип text/markdown
- HTML-страница
- /docs/page.html
- Markdown-версия
- /docs/page.html.md
- rel="describedby"
- HTML-страница
- /docs/page.html
- llms.txt раздела
- /docs/llms.txt

Связи можно отдать в разметке страницы или в заголовке ответа. Второй способ работает и для файлов, которые не являются HTML.

**HTML**

```html title="page.html"
<link rel="alternate" type="text/markdown" href="/docs/page.html.md">
<link rel="describedby" href="/docs/llms.txt">
```

**Заголовок HTTP**

```http title="Ответ сервера"
Link: </docs/page.html.md>; rel="alternate"; type="text/markdown", </docs/llms.txt>; rel="describedby"
```

**nginx**

```nginx title="nginx.conf"
location = /docs/page.html {
    add_header Link '</docs/page.html.md>; rel="alternate"; type="text/markdown", </docs/llms.txt>; rel="describedby"';
}
```

## Чего в proposal нет

Файлы `llms-full.txt` и `llms-small.txt` публикуют многие сайты, и это полезная практика. Но ссылаться на proposal как на её источник нельзя.

- Индекс и полный текст
- llms.txt
- карта: куда идти
- название -> описание -> ссылки
- Описан в proposal
- Небольшой: помещается в контекст целиком
- Содержание лежит за ссылками
- llms-full.txt
- корпус: всё одним файлом
- страница -> страница -> страница
- В proposal не входит: практика платформ документации
- Бывает очень большим: у Cloudflare 67 МБ
- Удобен, когда нужен весь текст без переходов

| Что | Статус |
|---|---|
| `llms-small.txt` | в proposal не входит; сокращённая версия полного текста |
| `llms-ctx.txt`, `llms-ctx-full.txt` | были связаны с инструментом `llms_txt2ctx`; из второй редакции убраны |
| Управление доступом | файл ничего не запрещает; для этого служит `robots.txt` |
| Правила безопасности | в тексте proposal их нет, вопрос обсуждается в репозитории |

## Полный пример

```markdown title="llms.txt" {1} {3-4} {13-15}
# FastHTML

> FastHTML - библиотека на Python для серверных веб-приложений
> на основе HTMX.

Важно:

- синтаксис не совместим с FastAPI
- React, Vue и Svelte не поддерживаются

## Документация

- [Быстрый старт](https://example.com/quickstart.md): первые шаги за пять минут
- [Справочник API](https://example.com/api.md): все методы и параметры

## Optional

- [История изменений](https://example.com/changelog.md)
- [Как участвовать](https://example.com/contributing.md)
```

Выделены три места, на которые агент смотрит в первую очередь: название, описание и основные ссылки.

## Разбор файла

Формат рассчитан на простую обработку: хватает регулярных выражений.

```python title="parse_llms_txt.py"
import re

def parse_llms_txt(content: str) -> dict:
    result = {'title': '', 'description': '', 'sections': {}}

    h1 = re.search(r'^# (.+)$', content, re.MULTILINE)
    if h1:
        result['title'] = h1.group(1)

    quote = re.search(r'^> (.+)$', content, re.MULTILINE)
    if quote:
        result['description'] = quote.group(1)

    section = None
    for line in content.split('\n'):
        if line.startswith('## '):
            section = line[3:].strip()
            result['sections'][section] = []
        elif line.startswith('- [') and section:
            link = re.match(r'- \[(.+?)\]\((.+?)\)(?:: (.+))?', line)
            if link:
                result['sections'][section].append({
                    'title': link.group(1),
                    'url': link.group(2),
                    'notes': link.group(3) or '',
                })

    return result
```

## Проверка

1. Файл открывается по своему адресу с кодом 200 и отдаётся как текст, а не как HTML-страница.
2. Первый заголовок - H1, и он один.
3. Между описанием и первой секцией нет заголовков.
4. Каждая ссылка открывается.
5. Ссылки ведут на содержание, удобное модели.

Подробный список и типовые ошибки - в разделе [Лучшие практики](https://llms-full-txt.ru/guides/best-practices/).
