Специфікація · друга половина

Markdown-версії сторінок і виявлення файлу

Про llms.txt говорять постійно, а про другу половину тієї самої пропозиції — майже ніколи. Тим часом саме вона відповідає на питання «а як агент узагалі знайде цей файл» і «звідки він візьме чистий текст сторінки». Без неї llms.txt лишається списком посилань на ті самі важкі HTML-сторінки.

Markdown-версії сторінок

Специфікація формулює другу пропозицію так:

«We furthermore propose that pages with information that agents might need provide a clean markdown version of those pages at the same URL as the original page, either with .md appended (page.html.md) or with the extension replaced by .md (page.md).»

«Ми також пропонуємо, щоб сторінки з інформацією, яка може знадобитися агентам, надавали чисту Markdown-версію за тією ж адресою, що й оригінальна сторінка: або з доданим .md (page.html.md), або із заміною розширення на .md (page.md).» llmstxt.org

Для адрес без імені файлу передбачено index.html.md або index.md.

Оригінальна адресаВаріант із доданим .mdВаріант із заміною
/docs/api.html/docs/api.html.md/docs/api.md
/docs/api//docs/api/index.html.md/docs/api/index.md
/blog/post/blog/post.md/blog/post.md

Головна претензія практиків до v1 звучала так: припустімо, агент відкрив сторінку. Як йому дізнатися, що поруч є Markdown-версія, і що десь вище лежить llms.txt, який її описує — не вгадуючи адреси? Відповідь v2 — стандартні відношення посилань.

ВідношенняНа що вказує
rel="alternate" type="text/markdown" Markdown-версія цієї самої сторінки
rel="describedby" Файл llms.txt, який покриває цю сторінку

Це можна оголосити двома способами. Перший — елементи <link> у HTML:

У <head> сторінки
<link rel="alternate" type="text/markdown" href="/docs/page.html.md">
<link rel="describedby" href="/docs/llms.txt">

Другий — HTTP-заголовок Link:. Специфікація наводить його дослівно і пояснює перевагу: заголовок працює й для не-HTML ресурсів (зокрема для самих Markdown-файлів) і додається в конфігурації вебсервера чи CDN без правки сторінок.

Приклад із тексту специфікації
Link: </docs/page.html.md>; rel="alternate"; type="text/markdown", </docs/llms.txt>; rel="describedby"

Як віддати такий заголовок на звичайному PHP-хостингу

Через .htaccess, якщо доступний mod_headers:

.htaccess
<IfModule mod_headers.c>
    <FilesMatch "\.html$">
        Header set Link "</llms.txt>; rel=\"describedby\""
    </FilesMatch>
</IfModule>

Або безпосередньо з PHP, якщо сторінки генеруються скриптом:

До будь-якого виводу
<?php
$md   = '/docs/page.md';
$llms = '/docs/llms.txt';
header('Link: <' . $md . '>; rel="alternate"; type="text/markdown", '
     . '<' . $llms . '>; rel="describedby"');

Content-Type і кодування

Специфікація не встановлює обовʼязкового MIME-типу для самого llms.txt, але практика однозначна: файл має віддаватися як text/plain або text/markdown. Найпоширеніша реальна помилка — сервер віддає text/html, і це майже завжди означає, що файлу насправді немає, а ви бачите шаблон сторінки помилки з кодом 200.

Для Apache MIME-тип для .md додається одним рядком:

.htaccess
AddType text/markdown .md
AddDefaultCharset UTF-8

Як агент має цим користуватися

Версія v2 прямо описує очікуваний сценарій, чого не було у v1:

«Agents are expected to view or search llms.txt to find the information they need, then follow the relevant links. […] The file itself stays small enough to fit in context. The detail lives behind the links, and is fetched only when needed.»

«Очікується, що агенти переглядають або шукають у llms.txt потрібну інформацію, а потім переходять за релевантними посиланнями. […] Сам файл лишається достатньо малим, щоб вміститися в контекст. Деталі живуть за посиланнями й завантажуються лише за потреби.» llmstxt.org

Звідси випливає головна вимога до змісту: посилання мають вести на матеріали, зручні для моделі. Список із двадцяти посилань на важкі HTML-сторінки формально валідний, але суперечить призначенню файлу.