Czym jest llms.txt i do czego służy?
Plik 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 wyselekcjonowanym 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 to dwa zupełnie różne rozwiązania, które mają odmienne cele. Automatyczne crawlery wyszukiwarek systematycznie skanują witryny, wracają w poszukiwaniu aktualizacji i zazwyczaj respektują reguły robots.txt, a pozyskane dane zasilają indeks wykorzystywany do prezentowania wyników. Systemy AI nie działają jednak według jednego schematu: mogą korzystać z wcześniej zbudowanego indeksu, danych treningowych albo pobierać stronę dynamicznie, dopiero po zadaniu pytania przez użytkownika. Tylko ten ostatni przypadek przypomina krótką wizytę agenta działającego w ograniczonym oknie kontekstowym, dlatego nie należy utożsamiać każdego bota AI z dostępem do sieci 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 narzędzia |
| Format | Dyrektywy User-agent i Disallow | Markdown |
| Cel | Zarządzanie dostępem crawlerów | Wyselekcjonowany opis i lista zasobów |
| Egzekwowanie | Dobrowolne, zależne od crawlera | Brak mechanizmu kontroli dostępu |
Najważniejsze ograniczenie trzeba postawić wprost. Stan na październik 2026: główne systemy AI nie dają publicznej gwarancji powszechnej obsługi tego pliku, a Google Search nie wykorzystuje go jako specjalnego sygnału widoczności. Google może odkryć, pobrać i zaindeksować plik jak inny zasób, co nie oznacza obsługi konwencji llms.txt. 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 ugruntowania odpowiedzi w źródłach (ang. grounding), 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, dostępność dla robotów, 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.
- Cytat blokowy (
>) 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
## Optional, zwyczajowo przeznaczona na materiały drugorzędne. W wersji v2 z sierpnia 2026 roku nagłówek ten nie narzuca narzędziom specjalnego sposobu pomijania treści.
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ę wyselekcjonowanego indeksu. Lepsza jest mapa najważniejszych stron zbiorczych niż kompletna inwentaryzacja serwisu.
Jak wdrożyć llms.txt w Astro?
Astro daje tu dwie ścieżki, a wybór między nimi 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 katalogu wynikowego bez przetwarzania. Dla małego serwisu bez automatyzacji wystarczy ręcznie utworzyć public/llms.txt i takie rozwiązanie jest proste, choć wymaga ręcznej aktualizacji.
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 budowania 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żna udostępnić opcjonalny endpoint llms-full.txt. Ten wariant nie należy do podstawowego formatu, więc nie ma gwarancji jego automatycznego wykrycia. W Astro wystarczy utworzyć endpoint src/pages/llms-full.txt.ts, który osadza pełne 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 (opcja dostępna od Astro 5.17). Przykład przerywa budowanie przy braku body, żeby pełny eksport nie zastępował artykułów ich opisami. W takim przypadku zachowaj treść w loaderze lub pobierz ją ze źródła. Funkcja render(post) nie zwraca czystego tekstu. Zwraca komponent Astro, nagłówki i frontmatter zmodyfikowany przez wtyczki. 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 szkicó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:
Filtr porównuje pełny adres wpisu z adresem kanonicznym, więc pomija także kopie wskazujące inną stronę w tej samej domenie. Względny adres kanoniczny rozwiązuje względem adresu wpisu, a fragment po # pomija. Ścieżka i końcowy ukośnik muszą odpowiadać faktycznej konfiguracji routingu; przykład zakłada adresy /blog/{id}/. Brak pola canonicalURL oznacza tu domyślnie własny adres wpisu.
Najlepiej przenieść ten predykat do wspólnego modułu używanego przez listę wpisów, 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 od Next.js 15 domyślnie nie jest cache’owany. Przykłady z tą opcją zakładają wyłączone cacheComponents. Jeśli projekt Next.js 16 ma włączone cacheComponents, usuń konfigurację dynamic i zastosuj model cache odpowiedni dla pobieranych danych. Dyrektywy use cache nie można umieścić bezpośrednio w ciele GET(); cache’owaną operację trzeba wydzielić do funkcji pomocniczej, w której można też ustawić czas ważności przez cacheLife. 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 katalogu głównego domeny.
Generowanie llms-full.txt w Next.js
Analogicznie do głównego indeksu można utworzyć endpoint app/llms-full.txt/route.ts, który zamiast samych odnośników zwraca pełną treść artykułów. Poniższy przykład zakłada, że warstwa danych @/lib/posts dostarcza czysty Markdown w polu content. W przypadku źródeł MDX zawierających importy, elementy JSX lub wyrażenia JavaScript wymagana będzie ich wcześniejsza transformacja do zwykłego tekstu.
Jeśli treść trzymasz w MDX i nie masz jej jeszcze jako surowego tekstu, pomocnik do odczytu wygląda tak:
Ten pomocnik zwraca surowy kod MDX bez nagłówka frontmatter. Należy pamiętać, że biblioteka gray-matter jedynie wyciąga metadane i nie przekształca komponentów ani wyrażeń w tekst widoczny na stronie. Przed przypisaniem wyniku do pola content w powyższym eksporcie należy zatem przetworzyć MDX na czysty Markdown, uwzględniając treść generowaną przez same komponenty – zwykłe usunięcie znaczników HTML/JSX mogłoby bowiem doprowadzić do utraty części artykułu.
Next.js: filtrowanie noindex i szkicó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:
Porównanie obejmuje pełny URL, więc adres kanoniczny wskazujący inną podstronę tej samej domeny również wyklucza wpis. Przykład zakłada adresy bez końcowego ukośnika; dostosuj ich budowę do routingu i używaj jej konsekwentnie w eksporcie oraz metadanych.
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 ugruntowania odpowiedzi w źródłach. 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 nie wykorzystuje llms.txt jako specjalnego sygnału, 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. Miejsce llms.txt w szerszej strategii widoczności w AI pokazuję w przewodniku po GEO.
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 lista wpisów oraz sitemapa.
Spójność. Generator uruchamiany podczas budowania odzwierciedla dane odczytane w tym momencie, jeśli używa tych samych filtrów co strony. Zmiany w CMS po zbudowaniu strony wymagają ponownego generowania i wdrożenia pliku albo skoordynowanej rewalidacji, jeśli korzystasz z cache Next.js.
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.


