Перейти к содержимому
Выберите тему

Формат файла llms.txt

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

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

Что изменилось по сравнению с первой редакцией - на странице Изменения в v2.

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

Файл не пересказывает сайт. Он показывает, куда идти.

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

llms.txt
# Название проекта
> Одно-два предложения: что это и для кого
## Документация
- [Быстрый старт](https://example.com/quickstart.md): первые шаги за пять минут

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

llms.txtпять частей по порядку
  1. # FastHTML

    Заголовок H1обязательно

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

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

    Описаниепо желанию

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

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

    Подробностипо желанию

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

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

    Секция со ссылкамипо желанию

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

  5. ## 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

  1. Подходят три файлакорневой, /docs/ и /docs/api/
  2. Берётся самый специфичный/docs/api/llms.txt

Страница/blog/post.html

  1. Подходит один файлв /blog/ своего файла нет
  2. Берётся корневой/llms.txt

Поэтому участвовать может и тот, кто управляет только частью чужого домена, например проектом на GitHub Pages.

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

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

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

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

Две связи для обнаружения

rel="alternate"тип text/markdown

  1. HTML-страница/docs/page.html
  2. alternateMarkdown-версия/docs/page.html.md

rel="describedby"

  1. HTML-страница/docs/page.html
  2. describedbyllms.txt раздела/docs/llms.txt

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

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

Файлы 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 их нет, вопрос обсуждается в репозитории
llms.txt
# 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)

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

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

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. Ссылки ведут на содержание, удобное модели.

Подробный список и типовые ошибки - в разделе Лучшие практики.