Формат файла
Полная спецификация формата llms.txt
Файл llms.txt использует формат Markdown с определённой структурой. Он размещается в корне сайта по адресу /llms.txt.
Структура файла
Заголовок раздела «Структура файла»# Заголовок H1 (обязательно)
> Блок-цитата с кратким описанием (рекомендуется)
Дополнительный текст описания (опционально)
## Секция H2 (опционально)
- [Название ссылки](URL): Описание ресурса- [Другая ссылка](URL): Что содержит этот ресурс
## Optional
- [Дополнительный ресурс](URL): Можно пропустить при нехватке контекстаОбязательные элементы
Заголовок раздела «Обязательные элементы»Заголовок H1
Заголовок раздела «Заголовок H1»Единственный обязательный элемент — заголовок первого уровня с названием проекта:
# FastHTMLили
# Документация API v2Рекомендуемые элементы
Заголовок раздела «Рекомендуемые элементы»Блок-цитата (blockquote)
Заголовок раздела «Блок-цитата (blockquote)»Краткое описание проекта в 1-2 предложения:
> FastHTML — это Python-библиотека для создания быстрых веб-приложений> с использованием HTMX и современных веб-стандартов.Описательный текст
Заголовок раздела «Описательный текст»Дополнительная информация после блок-цитаты:
Важные особенности:- Не требует JavaScript-фреймворков- Поддержка Server-Side Rendering- Интеграция с FastAPIСекции со ссылками
Заголовок раздела «Секции со ссылками»Формат H2 секций
Заголовок раздела «Формат H2 секций»Каждая секция начинается с заголовка H2:
## Документация
- [Быстрый старт](https://example.com/quickstart): Начните здесь- [Установка](https://example.com/install): Системные требования и установкаФормат ссылок
Заголовок раздела «Формат ссылок»Каждая ссылка состоит из:
- [Название](URL): Описание| Элемент | Обязательность | Пример |
|---|---|---|
| Название | Обязательно | [API Reference] |
| URL | Обязательно | (https://docs.example.com/api) |
| Описание | Рекомендуется | : Полное описание эндпоинтов |
Примеры ссылок
Заголовок раздела «Примеры ссылок»- [Getting Started](https://docs.example.com/start): Быстрый старт за 5 минут- [API Reference](https://docs.example.com/api): REST API документация- [Examples](https://github.com/example/repo/examples): Примеры кода на GitHubСпециальная секция Optional
Заголовок раздела «Специальная секция Optional»Секция ## Optional имеет особое значение:
## Optional
- [Changelog](https://example.com/changelog): История изменений- [Contributing](https://example.com/contributing): Гайд для контрибьюторов- [Advanced Topics](https://example.com/advanced): Углублённые темыРасположение файла
Заголовок раздела «Расположение файла»Основное расположение
Заголовок раздела «Основное расположение»https://example.com/llms.txtАльтернативные пути
Заголовок раздела «Альтернативные пути»Для подразделов сайта можно создавать отдельные файлы:
https://example.com/docs/llms.txthttps://example.com/api/llms.txtСвязанные файлы
Заголовок раздела «Связанные файлы»Markdown-версии страниц
Заголовок раздела «Markdown-версии страниц»Рекомендуется предоставлять .md версии HTML-страниц:
https://example.com/page.html → https://example.com/page.html.mdhttps://example.com/docs/ → https://example.com/docs/index.html.mdРасширенные форматы
Заголовок раздела «Расширенные форматы»Некоторые проекты генерируют дополнительные файлы:
| Файл | Назначение |
|---|---|
llms.txt | Базовый файл со ссылками |
llms-full.txt | Полный контент всех страниц |
llms-small.txt | Минимальная версия |
llms-ctx.txt | Контекст без URL (для вставки в промпт) |
Парсинг
Заголовок раздела «Парсинг»Файл можно распарсить простым regex (~20 строк кода):
import re
def parse_llms_txt(content: str) -> dict: result = {'title': '', 'description': '', 'sections': {}}
# Извлечь H1 h1_match = re.search(r'^# (.+)$', content, re.MULTILINE) if h1_match: result['title'] = h1_match.group(1)
# Извлечь blockquote bq_match = re.search(r'^> (.+)$', content, re.MULTILINE) if bq_match: result['description'] = bq_match.group(1)
# Извлечь секции и ссылки current_section = 'default' for line in content.split('\n'): if line.startswith('## '): current_section = line[3:].strip() result['sections'][current_section] = [] elif line.startswith('- ['): match = re.match(r'- \[(.+?)\]\((.+?)\)(?:: (.+))?', line) if match: result['sections'].setdefault(current_section, []).append({ 'title': match.group(1), 'url': match.group(2), 'description': match.group(3) or '' })
return resultВалидация
Заголовок раздела «Валидация»Проверьте ваш llms.txt:
- Есть заголовок H1
- Все ссылки рабочие
- Описания информативны для LLM
- Нет дублирующихся ссылок
- Секция Optional содержит только второстепенные ресурсы