Формат файла llms.txt
Формат llms.txt по второй редакции proposal - обязательный заголовок, порядок частей, списки ссылок, файл в подпути, Markdown-версии страниц и что в proposal не входит
- Редакция
- v2, 10 августа 2026
- Автор
- Jeremy Howard, Answer.AI
- Формат
- Markdown
- Обязательная часть
- только заголовок H1
Что изменилось по сравнению с первой редакцией - на странице Изменения в v2.
Как агент пользуется файлом
Заголовок раздела «Как агент пользуется файлом»- Сайтпубликует файл по известному адресу
- GETllms.txt
/llms.txtназвание, описание, списки ссылок - читаетАгентвыбирает ссылки под свой вопрос
- идёт по ссылкеMarkdown-страница
/docs/page.mdчистый текст без оформления - Контексттолько то, что нужно для ответа
Файл не пересказывает сайт. Он показывает, куда идти.
Минимальный файл
Заголовок раздела «Минимальный файл»Чтобы файл соответствовал proposal, достаточно одной строки с заголовком. На практике минимум выглядит так:
# Название проекта
> Одно-два предложения: что это и для кого
## Документация
- [Быстрый старт](https://example.com/quickstart.md): первые шаги за пять минутИз чего состоит файл
Заголовок раздела «Из чего состоит файл»Части идут в строгом порядке. Обязательна только первая.
- # FastHTML
Заголовок H1обязательно
Название проекта или сайта. Без него файл не соответствует proposal. Заголовок один.
- > FastHTML - библиотека на Python для> серверных веб-приложений на основе HTMX.
Описаниепо желанию
Цитата с коротким описанием: то, без чего не понять остальной файл.
- Важно:- синтаксис не совместим с FastAPI- React, Vue и Svelte не поддерживаются
Подробностипо желанию
Любые блоки Markdown, кроме заголовков: абзацы, списки, код.
- ## Документация- [Быстрый старт](https://example.com/quickstart.md): первые шаги- [Справочник API](https://example.com/api.md)
Секция со ссылкамипо желанию
Заголовок H2 и список. В элементе - ссылка и необязательное пояснение после двоеточия.
- ## Optional- [История изменений](https://example.com/changelog.md)
Секция Optionalпо желанию
Соглашение для второстепенных ссылок: агент может их пропустить, когда нужен короткий контекст.
Ссылки должны вести на содержание, удобное модели: в первую очередь на 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
Поэтому участвовать может и тот, кто управляет только частью чужого домена, например проектом на GitHub Pages.
Адрес в /.well-known/ автор proposal отклонил: такие адреса существуют только в корне домена, а llms.txt описывает путь, в котором лежит.
Markdown-версии страниц
Заголовок раздела «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 - alternateMarkdown-версия
/docs/page.html.md
rel="describedby"
- HTML-страница
/docs/page.html - describedbyllms.txt раздела
/docs/llms.txt
Связи можно отдать в разметке страницы или в заголовке ответа. Второй способ работает и для файлов, которые не являются HTML.
<link rel="alternate" type="text/markdown" href="/docs/page.html.md"><link rel="describedby" href="/docs/llms.txt">Link: </docs/page.html.md>; rel="alternate"; type="text/markdown", </docs/llms.txt>; rel="describedby"location = /docs/page.html { add_header Link '</docs/page.html.md>; rel="alternate"; type="text/markdown", </docs/llms.txt>; rel="describedby"';}Чего в proposal нет
Заголовок раздела «Чего в 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 их нет, вопрос обсуждается в репозитории |
Полный пример
Заголовок раздела «Полный пример»# 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)Выделены три места, на которые агент смотрит в первую очередь: название, описание и основные ссылки.
Разбор файла
Заголовок раздела «Разбор файла»Формат рассчитан на простую обработку: хватает регулярных выражений.
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Проверка
Заголовок раздела «Проверка»- Файл открывается по своему адресу с кодом 200 и отдаётся как текст, а не как HTML-страница.
- Первый заголовок - H1, и он один.
- Между описанием и первой секцией нет заголовков.
- Каждая ссылка открывается.
- Ссылки ведут на содержание, удобное модели.
Подробный список и типовые ошибки - в разделе Лучшие практики.