Czym jest llms.txt i do czego służy?
llms.txt to propozycja standardu opisana na llmstxt.org, która zakłada umieszczenie w głównej ścieżce witryny pliku /llms.txt. Jego zadaniem jest dostarczenie modelom językowym pomocnej informacji w momencie wnioskowania ().
Twórcy propozycji wyszli z konkretnej obserwacji. Modele coraz częściej korzystają z treści internetowych, ale ich nie mieszczą całych, rozbudowanych serwisów. Konwersja HTML-a z nawigacją, reklamami i JavaScriptem na czysty tekst może być trudna i nieprecyzyjna. Zwięzły indeks pomaga narzędziu szybko znaleźć najważniejsze materiały, o ile dane narzędzie obsługuje tę konwencję.
Plik celowo używa Markdowna zamiast XML-a. Markdown to dzisiaj najszerzej i najłatwiej rozumiany format, a jednocześnie wystarczająco rygorystyczny, by parsowały go standardowe narzędzia programistyczne.
Warto też rozróżnić format bazowy od konwencji tworzonych przez integracje. llms.txt jest kuratorowanym indeksem z linkami do najważniejszych materiałów. Część narzędzi generuje również llms-full.txt z pełną treścią oraz llms-small.txt z wersją skróconą. Te dwie nazwy nie należą do podstawowej propozycji i ich dokładna zawartość zależy od użytego generatora. Sama propozycja rekomenduje także udostępnianie czystych wersji Markdown poszczególnych stron.
llms.txt a robots.txt: czym się różnią?
robots.txt i llms.txt nie są wersjami tego samego rozwiązania. Mają inne cele i inną dojrzałość.
Automatyczne crawlery wyszukiwarek systematycznie skanują witryny, wracają w poszukiwaniu zmian i zwykle respektują reguły robots.txt. Pozyskane informacje mogą zasilać indeks używany później do prezentowania wyników.
Systemy AI nie działają według jednego modelu. Mogą korzystać z wcześniej zbudowanego indeksu, danych treningowych albo pobrać stronę po pytaniu użytkownika. Dopiero ostatni wariant przypomina krótką wizytę agenta pracującego w ograniczonym oknie kontekstowym. Z tego powodu nie należy utożsamiać wszystkich botów AI z dostępem w czasie inferencji.
Zestawienie pokazuje to najlepiej:
| Aspekt | robots.txt | llms.txt |
|---|---|---|
| Adresat | Crawlery, które respektują Robots Exclusion | Narzędzia obsługujące konwencję llms.txt |
| Moment użycia | Przed automatycznym lub ręcznym pobraniem | Zależny od implementacji konkretnego toola |
| Format | Dyrektywy User-agent i Disallow | Markdown |
| Cel | Zarządzanie dostępem crawlerów | Kuratorowany opis i lista zasobów |
| Egzekwowanie | Dobrowolne, zależne od crawlera | Brak mechanizmu kontroli dostępu |
Najważniejsze ograniczenie trzeba postawić wprost. Stan na lipiec 2026: główne systemy AI nie dają publicznej gwarancji powszechnej obsługi tego pliku, a Google Search wyraźnie informuje, że go ignoruje. Lighthouse sprawdza /llms.txt w eksperymentalnej kategorii Przeglądanie Agentowe. Audyt nie wymaga jednak utworzenia pliku. Odpowiedź 404 daje wynik N/A, a problem jest zgłaszany wtedy, gdy próba pobrania kończy się błędem serwera.
robots.txt pozwala deklarować reguły dla botów, które zdecydowały się je respektować. Trzeba jednak rozróżnić ich cele. OAI-SearchBot odpowiada za ChatGPT Search, a GPTBot za dane, które mogą zostać wykorzystane do treningu. Anthropic analogicznie rozdziela Claude-SearchBot, Claude-User i treningowy ClaudeBot. Google-Extended jest tokenem kontrolnym dotyczącym treningu Gemini i groundingu, a nie osobnym crawlerem widocznym w logach. Pobrania inicjowane przez użytkownika mogą mieć inne zasady. OpenAI zaznacza na przykład, że w przypadku ChatGPT-User reguły robots.txt mogą nie mieć zastosowania.
Dlaczego mimo to warto rozważyć wdrożenie? W serwisie z uporządkowaną warstwą treści koszt może być niewielki, a plik może pełnić funkcję eksportu dla narzędzi, które świadomie go obsługują. Nie jest to jednak obowiązkowy element każdej witryny. Najpierw zadbaj o publiczny HTML, crawlability, sitemapę, poprawne metadane i zasady dostępu. llms.txt traktuj jako eksperyment lub wygodny indeks, a nie jako substytut tych fundamentów.
llms.txtmoże wskazać narzędziu, co warto przeczytać.robots.txtdeklaruje zasady dostępu dla crawlerów, które go respektują.
Format llms.txt: poprawna struktura pliku
Propozycja określa kolejność elementów, jeśli zdecydujesz się ich użyć. Jedynym wymaganym elementem jest H1 z nazwą projektu lub witryny. Najbardziej rozpoznawalna lokalizacja to /llms.txt w katalogu głównym domeny, chociaż propozycja dopuszcza także podścieżkę. Plik powinien być zapisany w UTF-8. Nazwa llm.txt nie odpowiada przyjętej konwencji.
Propozycja przewiduje następującą strukturę i kolejność:
- H1 z nazwą projektu lub witryny. To jedyny obowiązkowy element.
- Blockquote (
>) z krótkim podsumowaniem, zawierającym kluczowe informacje potrzebne do zrozumienia reszty pliku. - Zero lub więcej sekcji Markdown zawierających dodatkowy kontekst, ale bez nagłówków.
- Sekcje z linkami oznaczone nagłówkami H2, gdzie każdy link ma format
[Tytuł strony](URL): krótki opis. - Opcjonalna sekcja
## Optionaldla treści drugorzędnych, które model może pominąć przy ograniczonym kontekście.
Elementy od drugiego do piątego są opcjonalne. Dwukropek i opis po linku również nie są wymagane.
Minimalny, poprawny przykład wygląda tak:
Tylko treści przeznaczone do publicznego eksportu. Zawsze odfiltruj szkice i materiały prywatne. Jeśli indeks ma odpowiadać sitemapie, pomiń także
noindexi duplikaty.Tylko adresy kanoniczne. Każdy link powinien prowadzić do głównej wersji strony, bez duplikatów.
Świadomy dobór zamiast pełnego eksportu. Bardzo długa lista utrudnia wykorzystanie pliku w ograniczonym oknie kontekstowym i osłabia jego funkcję kuratorowanego indeksu. Lepsza jest mapa najważniejszych hubów niż kompletna inwentaryzacja serwisu.
Jak wdrożyć llms.txt w Astro?
Astro daje tu dwie ścieżki, a jej wybór zależy od tego, czy chcesz plik statyczny, czy generowany dynamicznie z kolekcji treści.
Astro: statyczny llms.txt w katalogu public/
Zawartość katalogu public/ jest kopiowana do outputu builda bez przetwarzania. Dla małego serwisu bez automatyzacji wystarczy ręcznie utworzyć public/llms.txt. Rozwiązanie jest proste, ale wymaga ręcznej aktualizacji i z czasem może rozjechać się z treścią.
Astro: endpoint llms.txt generowany z Content Collections
Dla bloga czy dokumentacji generuj plik dynamicznie z Content Collections. Tworzysz plik src/pages/llms.txt.ts:
export const prerender = true gwarantuje utworzenie pliku podczas buildu także wtedy, gdy projekt używa adaptera i trybu server. Dzięki temu endpoint nie wykonuje zapytań przy każdym żądaniu. Obiekt site z konfiguracji służy do budowy bezwzględnych URL-i. Funkcja markdownInline() usuwa nowe linie i zabezpiecza znaki, które mogłyby uszkodzić generowaną listę.
Nie dodawaj /llms.txt ręcznie do customPages w @astrojs/sitemap. Google Search ignoruje ten format jako specjalny sygnał, a sitemapę warto ograniczyć do kanonicznych treści przeznaczonych do indeksowania.
Astro: gotowa integracja do llms.txt
Jeśli nie chcesz pisać generatora od zera, możesz sprawdzić integracje astro-llms-generate albo @4hse/astro-llms-txt. Ich zakres i nazwy generowanych plików różnią się między wersjami, dlatego przed wdrożeniem sprawdź dokumentację oraz aktywność projektu. Dla witryn opartych na Starlight dostępny jest aktywnie rozwijany starlight-llms-txt. Pliki llms-small.txt i llms-full.txt są konwencjami tych narzędzi, a nie obowiązkowymi elementami bazowej propozycji.
Generowanie llms-full.txt w Astro
Jeśli wybrane narzędzie oczekuje jednego pliku z pełną treścią, możesz udostępnić umowny llms-full.txt. Nie jest to część podstawowego formatu i nie ma gwarancji automatycznego wykrycia. W Astro utwórz endpoint src/pages/llms-full.txt.ts, który wstawia body każdego wpisu:
W Astro 5 i 6 wpis zwracany przez getCollection() ma pole body typu string | undefined. Dla wbudowanego glob loadera zawiera ono surowy Markdown lub MDX, chyba że ustawisz retainBody: false. Funkcja render(post) nie zwraca czystego tekstu. Zwraca komponent Astro, nagłówki i frontmatter zmodyfikowany przez pluginy. Jeśli wpisy MDX zawierają importy, JSX albo niestandardowe komponenty, surowe body nadal wymaga transformacji przed udostępnieniem jako zwykły Markdown. Przy dużych blogach kontroluj rozmiar odpowiedzi i rozważ podział eksportu według sekcji.
Astro: filtrowanie noindex i draftów w llms.txt
Propozycja llms.txt nie wymaga filtrowania noindex. Jest to jednak rozsądna polityka, jeśli plik ma odzwierciedlać publiczną i indeksowalną część serwisu. Szkice i treści prywatne należy odfiltrować zawsze. W Astro możesz wykorzystać pola draft, noindex i unlisted ze schematu kolekcji:
Najlepiej przenieść ten predykat do wspólnego modułu używanego przez listing, sitemapę i generator llms.txt. Pamiętaj jednak, że noindex i reguły robots.txt nie chronią poufnych danych. Plik dostępny publicznie może zostać pobrany przez użytkownika lub bota, który nie respektuje tych deklaracji.
Jak wdrożyć llms.txt w Next.js App Router?
W Next.js (App Router) najczystszym podejściem jest . Tworzysz plik app/llms.txt/route.ts:
W klasycznym modelu cache Next.js opcja włącza prerenderowanie i cache dla Route Handlera GET, który domyślnie nie jest cache’owany. Jeśli projekt Next.js 16 ma włączone cacheComponents, konfiguracje segmentu takie jak dynamic są zastępowane przez dyrektywę use cache i powiązane API. Sprawdź ustawienia projektu przed skopiowaniem przykładu.
Jeśli wolisz statyczny plik bez logiki, w Next.js wystarczy umieścić llms.txt w katalogu public/. Tak jak w Astro będzie serwowany z roota.
Generowanie llms-full.txt w Next.js
Analogicznie do indeksu możesz utworzyć umowny endpoint app/llms-full.txt/route.ts. Zamiast samego linku wstawia pełną treść wpisu. Poniższy przykład zakłada, że warstwa danych @/lib/posts zwraca surowy Markdown w polu content. Jeśli trzymasz treść w plikach MDX, możesz odczytać ją funkcją pomocniczą:
Jeśli treść trzymasz w MDX i nie masz jej jeszcze jako surowego stringa, pomocnik do odczytu wygląda tak:
Next.js: filtrowanie noindex i draftów w llms.txt
W Next.js flagi sterujące indeksacją żyją zwykle we frontmatterze MDX (draft, noindex) i są mapowane na metadata.robots w funkcji generateMetadata poszczególnych stron. Żeby llms.txt nie rozjechał się z tym, co faktycznie pozwalasz indeksować, zastosuj ten sam filtr na liście wpisów:
llms.txt i robots.txt w Next.js
Filtrowanie eksportu i reguły dostępu to dwa osobne tematy. W Next.js generujesz robots.txt przez app/robots.ts:
Reguły powinny odpowiadać celowi. Dla widoczności w ChatGPT Search znaczenie ma OAI-SearchBot, natomiast GPTBot dotyczy potencjalnego wykorzystania treści do treningu. Anthropic rozdziela Claude-SearchBot, Claude-User i treningowy ClaudeBot. Google-Extended jest tokenem kontrolnym dotyczącym treningu Gemini i groundingu. Nie jest osobnym crawlerem i nie wpływa na Google Search. Pamiętaj też, że robots.txt jest deklaracją respektowaną dobrowolnie przez boty, a nie techniczną blokadą dostępu.
Warto odróżnić dwie rozmowy, które często są wrzucane do jednego worka. Google Search ignoruje llms.txt także w AI Overviews i AI Mode. Lighthouse ma natomiast opcjonalny, eksperymentalny test dostępności tego pliku. Brak pliku nie jest błędem. Jeśli chcesz zrozumieć tę różnicę bez marketingowego szumu, omawiam ją osobno w tekście o Przeglądaniu Agentowym w PageSpeed Insights.
Dlaczego Next.js i Astro dobrze nadają się do llms.txt?
Oba frameworki pozwalają wykorzystać istniejącą warstwę treści. Astro ma Content Collections i endpointy, a Next.js oferuje Route Handlers oraz prostą obsługę plików w public/. Dzięki temu generator może korzystać z tych samych danych i filtrów co listing oraz sitemap.
Spójność. Plik aktualizuje się automatycznie przy każdym buildzie, więc nigdy nie rozjedzie się z faktyczną treścią.
Higiena architektury. Sam proces tworzenia
llms.txtzmusza do przemyślenia, które treści naprawdę się liczą. Ta wartość istnieje nawet gdyby żaden model nigdy pliku nie przeczytał.Gotowość operacyjna. Plik możesz od razu wykorzystać wewnętrznie, wgrać do projektu w Claude albo umieścić w katalogu Cursora jako kontekst, gdy pracujesz z asystentem AI nad audytem czy strategią treści.
