Sari la conținut
Căutare AI (AEO/GEO)publicat 17 iun. 2026actualizat 31 oct. 2026·14 min citire

Ghid llms.txt, robots.txt pentru AI

Dragoș-Adrian BuhoiuFondator · Inginer web & SEO
Copertă Verdant Mindset: Ghid llms.txt, robots.txt pentru AI
FEATURED.IMG
Copertă Verdant Mindset: Ghid llms.txt, robots.txt pentru AI

Ce este llms.txt, cum îl configurezi și adevărul verificat la sursă: Google Search îl ignoră, agenții de cod îl folosesc. Fără mituri.

Ghid llms.txt:Ce este, cum funcționează și cine îl folosește de fapt

llms.txt este un fișier text în format Markdown, plasat la rădăcina domeniului (https://domeniu.ro/llms.txt), gândit ca hartă curată a site-ului pentru crawlerele AI — deși niciunul dintre marile motoare (Google, OpenAI, Anthropic, Perplexity) nu a confirmat public că îl citește: linkurile esențiale plus descrieri semantice scurte, fără HTML, scripturi sau balast vizual. Practic, echivalentul lui robots.txt pentru modele lingvistice, orientat însă spre ghidare, nu spre blocare.

Cât contează, de fapt: ideea fișierului e că asistenții conversaționali și motoarele de căutare generative (AEO & GEO) ar înțelege mai ușor un rezumat curat, în Markdown, decât paginile HTML. E o ipoteză, nu o regulă dovedită. Fără llms.txt, site-ul tău nu devine invizibil: crawlerele motoarelor AI îți citesc paginile HTML, iar Google Search nu folosește deloc fișierul.

Acest ghid acoperă strict execuția: specificațiile tehnice, implementarea pe WordPress, Shopify, Webflow și Next.js, plus regulile de validare pentru noii crawleri AI. Pentru dimensiunea strategică, ce poate și ce nu poate face fișierul pentru felul în care apare brandul tău în răspunsurile AI, citește ghidul AEO și GEO.

Ce este llms.txt și specificația sa tehnică

Fișierul llms.txt e o propunere a lui Jeremy Howard, publicată pe 3 septembrie 2024 și ajunsă acum la a doua versiune (v2): un document text în format Markdown, pus la rădăcina site-ului (https://domeniu.ro/llms.txt) sau într-un subfolder, caz în care descrie doar paginile de sub el.

Acest fișier funcționează ca o „hartă a site-ului” adaptată pentru LLM-uri: fără machete grele, scripturi și cod HTML inutil, doar un rezumat scurt și linkuri curate, fiecare cu o notă opțională despre pagină.

Regulile de structurare sintactică

Formatul propus pe llmstxt.org e Markdown simplu, cu secțiunile în ordinea de mai jos; doar H1-ul cu numele site-ului e obligatoriu, restul e opțional:

  • H1 (# Titlu): numele proiectului sau al site-ului; e singura parte obligatorie.
  • Bloc de citat (> …): un rezumat scurt, cu informațiile de care e nevoie ca să înțelegi restul fișierului.
  • Paragrafe sau liste fără titluri: detalii despre proiect și despre cum se citesc fișierele indicate.
  • Secțiuni cu titluri ##: liste de linkuri, fiecare element un link Markdown [Titlu pagină](URL), urmat opțional de două puncte și de note despre pagină.
  • ## Optional: prin convenție, linkurile secundare, pe care un agent le poate sări când are nevoie de un context mai scurt.

Mai vei vedea și /llms-full.txt, un singur fișier cu textul integral al paginilor importante, gândit ca un asistent AI să citească totul dintr-o cerere. Textul versiunii actuale (v2) a propunerii nu-l menționează.

Ce spune Google (și ceilalți), de fapt — verificat la sursă

Aici e secțiunea pe care alte ghiduri nu ți-o dau, pentru că le strică pitch-ul. Înainte să investești un minut în llms.txt, trebuie să știi cine îl folosește cu adevărat. Am verificat la sursă, nu din memorie:

SistemCe face cu llms.txt (2026)
Google Search / AI OverviewsÎl ignoră: după ghidul Google pentru funcțiile AI, fișierul nu te ajută și nu te dezavantajează în Search.
ChatGPT (OpenAI)Zero angajament. Trimite oficial la robots.txt.
Claude (Anthropic)Zero angajament pentru produsele de chat. Trimite tot la robots.txt.
PerplexityPagina lui despre crawlere nu spune ce face cu llms.txt-ul altor site-uri: numește PerplexityBot și Perplexity-User și trimite la robots.txt; fișierul apare acolo doar ca index al propriei documentații.
Agenți de cod (Cursor, Claude Code)Aici chiar se folosește — pentru ingestia documentației de librării de către dezvoltatori, nu ca semnal de citare în răspunsuri.

Două măsurători: Limy.AI↗ scrie că, din peste 500 de milioane de accesări de boți AI monitorizate în 90 de zile la brandurile pe care le urmărește, doar 408 au țintit direct llms.txt — iar Ahrefs↗, pe 137.210 domenii, a găsit că 97% dintre fișiere n-au primit nicio cerere în mai 2026. Fișierul e publicat des: 28% dintre domeniile din același studiu îl aveau, cifră pe care Ahrefs o dă drept limită superioară, pentru că eșantionul lui e mai tehnic și mai atent la SEO decât webul în ansamblu. Cererile pentru el sunt însă rare, iar marile platforme AI nu s-au angajat oficial să-l citească.

Cele trei lumi pe care nimeni nu le separă

  1. Produsele de chat și căutare (ChatGPT answers, Perplexity, AI Overviews). Aici llms.txt e simbolic: Google scrie că Search îl ignoră, iar paginile OpenAI și Perplexity despre crawlere nu spun că îl citesc. Ce te aduce în răspunsuri: să fii sursa cea mai clară și mai credibilă, indexabilă, curată.
  2. Agenții de cod (Cursor, Claude Code). Aici llms.txt e util real — un dezvoltator îndreaptă agentul spre documentația unei librării, iar fișierul ajută ingestia. Dar n-are legătură cu „AI-ul care îți citează brandul”.
  3. Agentic browsing (Gemini Agent, agenții care navighează live). Agentul nu caută un fișier ascuns — deschide browserul și parcurge pagina randată în timp real, exact ca un om. Levierul erei agentice e pagina ta reală și curată, nu llms.txt.

Deci merită sau nu?

Da, dar pentru motivul corect. llms.txt e ieftin de generat și îl merită ca poliță pentru cazul agenților de cod și ca pregătire dacă adoptarea crește. Beneficiile POSIBILE, pentru sistemele care ar ajunge să-l citească, sunt că tu scrii descrierile paginilor și o eventuală eficiență de crawl (un fișier Markdown se consumă într-un pas, fără DOM de construit sau scripturi de executat).

Ce NU e: nu e trucul pentru locul 1 în Google AI, nu te urcă în AI Overviews, iar cererile de la sistemele AI pentru el sunt rare. Dacă o agenție ți-l vinde ca mecanism principal, acum ai tabelul cu care s-o contrazici — cu surse.

Cine are voie să te antreneze și să te citească se stabilește în robots.txt, nu în llms.txt, cu două precizări. Prima: robots.txt e o cerere, nu o barieră; Google scrie că regulile lui nu pot impune nimic unui crawler, OpenAI scrie că pot să nu se aplice lui ChatGPT-User, iar Perplexity, că Perplexity-User le ignoră în general. A doua: Google-Extended nu are user agent propriu, e doar un token de control în robots.txt; dacă îl blochezi, oprești folosirea conținutului la antrenarea Gemini și la grounding, nu apariția în AI Overviews sau AI Mode. Pentru acestea există, în Search Console, setarea „Search generative AI control”, plus controalele de fragment nosnippet, data-nosnippet și max-snippet.

Nu ne crede pe cuvânt:Măsoară singur

Focalizarea pe eficiența codului nu este un simplu trend de marketing, ci o decizie inginerească pe care o poți verifica direct, fără să te bazezi pe cifrele publicate de vreo agenție (inclusiv de noi):

  • Testul de viteză: Rulează verdantmindset.com în PageSpeed Insights (pagespeed.web.dev). Apoi rulează, cu exact același instrument, site-ul agenției care îți promite viteză. Compară rezultatele una lângă alta — instrumentul e al Google, nu al nostru.
  • Testul llms.txt: Deschide https://verdantmindset.com/llms.txt direct în browser. Vezi cu ochii tăi cum arată o hartă semantică servită ca text brut: linkuri curate, descrieri scurte, zero balast. Apoi încearcă același URL pe site-ul tău sau pe al furnizorului tău actual.

Acesta este standardul la care ar trebui să ții orice partener tehnic: afirmațiile de performanță se verifică cu instrumente publice, nu se acceptă din prezentări.

Ghid tehnic de implementare pe platforme CMS și Frameworks

Ca fișierul llms.txt să fie util, trebuie să reflecte starea reală a site-ului: generat automat sau actualizat la fiecare schimbare importantă. Iată exemple de implementare pentru cele mai comune medii tehnice:

WordPress:Generare dinamică prin PHP (fără plugin-uri)

Dacă vrei să eviți instalarea unui plugin SEO greu și vrei control total asupra output-ului, poți adăuga următorul script în fișierul functions.php al temei tale child (sau într-un plugin custom de funcționalități):

<?php
// Activează o regulă custom de rescriere URL pentru llms.txt
add_action('init', 'vm_register_llms_rewrite');
function vm_register_llms_rewrite() {
    add_rewrite_rule('^llms\.txt$', 'index.php?vm_llms_trigger=1', 'top');
}

// Înregistrează variabila de query pentru declanșarea fișierului
add_filter('query_vars', 'vm_register_llms_query_vars');
function vm_register_llms_query_vars($vars) {
    $vars[] = 'vm_llms_trigger';
    return $vars;
}

// Interceptează cererea și livrează fișierul llms.txt în mod dinamic
add_action('template_redirect', 'vm_serve_llms_txt');
function vm_serve_llms_txt() {
    if (get_query_var('vm_llms_trigger')) {
        header('Content-Type: text/plain; charset=utf-8');
        header('Cache-Control: public, max-age=3600');
        
        echo "# " . get_bloginfo('name') . "\n\n";
        echo get_bloginfo('description') . "\n\n";
        
        echo "## Sitemaps\n";
        echo "- [" . __('Sitemap Principal', 'vm') . "](" . home_url('/sitemap_index.xml') . ")\n\n";
        
        // Preluare Pagini Importante
        $pages = get_pages(array('meta_key' => '_vm_include_llms', 'meta_value' => 'yes'));
        if (!empty($pages)) {
            echo "## Pagini Cheie\n";
            foreach ($pages as $page) {
                $desc = get_post_meta($page->ID, '_yoast_wpseo_metadesc', true);
                if (empty($desc)) {
                    $desc = wp_strip_all_tags(wp_trim_words($page->post_content, 20));
                }
                echo "- [" . $page->post_title . "](" . get_permalink($page->ID) . "): " . esc_html($desc) . "\n";
            }
            echo "\n";
        }
        
        // Preluare Ultimele Articole din Blog
        $posts = get_posts(array('numberposts' => 100, 'post_status' => 'publish'));
        if (!empty($posts)) {
            echo "## Articole și Resurse\n";
            foreach ($posts as $post) {
                $desc = get_post_meta($post->ID, '_yoast_wpseo_metadesc', true);
                if (empty($desc)) {
                    $desc = wp_strip_all_tags(wp_trim_words($post->post_content, 20));
                }
                echo "- [" . $post->post_title . "](" . get_permalink($post->ID) . "): " . esc_html($desc) . "\n";
            }
        }
        exit;
    }
}

Notă: După adăugarea acestui cod, accesează în panoul de administrare secțiunea Settings > Permalinks și apasă butonul Save Changes pentru a reseta regulile de rescriere ale WordPress.

Shopify:Fișierul generat de platformă

Shopify servește deja /llms.txt implicit: dacă magazinul nu le suprascrie, adresa, ca și /llms-full.txt, oglindește fișierul /agents.md, pe care platforma îl generează singură. Pentru cele mai multe magazine, scrie Shopify, fișierul gestionat e tot ce trebuie, așa că nu ai nevoie de vechea metodă, cu un șablon de pagină și o redirecționare de la /llms.txt.

Dacă ai cerințe pe care fișierul gestionat nu le acoperă:

  1. Adaugă în folderul templates al temei un llms.txt.liquid, folosit doar pentru /llms.txt, sau un agents.md.liquid, folosit pentru toate cele trei adrese; acesta din urmă nu poate fi un șablon JSON.
  2. Scrie în el Markdown. agents.md.liquid se randează într-un context Liquid restrâns, doar cu obiectele request și agents; obiectele globale obișnuite, ca shop, collections sau pages, apar goale, așa că datele magazinului le iei prin agents sau le scrii de mână.
  3. Din clipa în care adaugi șablonul, tu răspunzi de actualizarea lui.

Next.js:Route Handler dinamic (app/llms.txt/route.ts)

În Next.js (App Router), implementarea unui dynamic API handler care să deservească conținut text pe o rută specifică este extrem de simplă și eficientă din punct de vedere computațional:

import { NextResponse } from 'next/server';
import { getActiveBlogPosts, getCoreServices } from '@/lib/api';

export const revalidate = 3600; // Cachează rezultatul timp de o oră

export async function GET() {
  try {
    const posts = await getActiveBlogPosts();
    const services = await getCoreServices();
    
    let markdown = `# Verdant Mindset\n\n`;
    markdown += `Atelier de inginerie digitală, SEO tehnic și optimizare web sustenabilă.\n\n`;
    
    markdown += `## Sitemaps\n`;
    markdown += `- [Sitemap General](https://verdantmindset.com/sitemap.xml)\n\n`;
    
    markdown += `## Servicii Tehnice\n`;
    services.forEach((service) => {
      markdown += `- [${service.title}](https://verdantmindset.com/servicii/${service.slug}): ${service.summary}\n`;
    });
    
    markdown += `\n## Articole și Ghiduri\n`;
    posts.forEach((post) => {
      markdown += `- [${post.title}](https://verdantmindset.com/resurse/${post.slug}): ${post.description}\n`;
    });
    
    return new NextResponse(markdown, {
      status: 200,
      headers: {
        'Content-Type': 'text/plain; charset=utf-8',
        'Cache-Control': 'public, max-age=3600, s-maxage=3600',
      },
    });
  } catch (error) {
    return new NextResponse('Error generating llms.txt data', { status: 500 });
  }
}

Webflow:Setarea LLMs.txt sau un Cloudflare Worker

Webflow are acum o setare proprie: în Site settings > SEO > LLMs.txt încarci fișierul (codat UTF-8, sub 100 KB), iar după publicare el e servit la https://domeniu.ro/llms.txt, pe domeniul tău propriu, nu și pe domeniul de test Webflow. Fișierul servit e cel încărcat de tine. Varianta mai veche, cu un proxy Cloudflare Workers în fața site-ului, are sens doar dacă vrei să servești fișierul din cod:

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const url = new URL(request.url)
  
  // Interceptează doar ruta /llms.txt
  if (url.pathname === '/llms.txt') {
    const llmsContent = `# Nume Proiect Webflow\n\n` +
      `Descriere tehnică a serviciilor companiei tale.\n\n` +
      `## Sitemaps\n` +
      `- [Sitemap](https://domeniu.ro/sitemap.xml)\n\n` +
      `## Servicii Cheie\n` +
      `- [Serviciu 1](https://domeniu.ro/serviciu-1): Descriere detaliată.\n` +
      `- [Serviciu 2](https://domeniu.ro/serviciu-2): Descriere detaliată.\n`;

    return new Response(llmsContent, {
      headers: { 
        'content-type': 'text/plain; charset=utf-8',
        'cache-control': 'public, max-age=86400'
      },
    })
  }
  
  // Permite ca toate celelalte cereri să meargă direct către serverele Webflow
  return fetch(request)
}

Cum se validează și se testează fișierul llms.txt

După implementare, este esențial să te asiguri că fișierul este configurat corect și poate fi consumat fără erori de crawlerele AI. Urmează acești pași de diagnosticare:

  1. Verificarea antetului HTTP: Deschide terminalul și rulează o comandă curl -I https://domeniu.ro/llms.txt. Răspunsul trebuie să conțină neapărat Content-Type: text/plain; charset=utf-8. Dacă antetul spune text/html, corectează-l: fișierul e text simplu, așa că îl servești ca text.
  2. Validarea codării Markdown: Asigură-te că linkurile sunt scrise corect ([Titlu](URL)) și că nu există cod HTML rezidual injectat în interiorul descrierilor (de exemplu tags precum <p> sau &).
  3. Testul de accesibilitate publică: Verifică dacă fișierul nu este blocat accidental prin reguli din robots.txt sau printr-un sistem de securitate de tip firewall / Cloudflare Challenge care cere interacțiune umană (JS challenge). Crawlerele AI trebuie să poată citi fișierul printr-o simplă cerere GET directă.

FAQ.PROTOCOL

Întrebări frecvente

Nu. E o propunere comunitară, fără angajament oficial de la marile platforme AI, iar Google scrie explicit că Search o ignoră. Unele platforme, Shopify printre ele, generează deja fișierul automat, dar nici asta, nici cifrele de adoptare de mai sus nu-l fac un standard.
Nu. Fișierul `llms.txt` doar îți descrie site-ul; nu poate bloca nimic. Ca să le ceri roboților să nu-ți acceseze paginile, folosești fișierul clasic `robots.txt`, cu `Disallow: /` sub `User-agent`-ul fiecărui crawler; e o cerere, nu o barieră.
Poate reduce puțin încărcarea serverului, dar doar când un instrument citește fișierul în locul paginilor. Core Web Vitals nu se schimbă din cauza lui: măsoară încărcarea (LCP), reacția la interacțiuni (INP) și stabilitatea vizuală (CLS) în vizitele oamenilor reali, iar TTFB nu e unul dintre ele.
Ideal, generarea ar trebui să fie complet dinamică (așa cum am arătat în exemplele de cod pentru WordPress și Next.js). Pe un magazin online cu sute de produse care își schimbă frecvent stocurile și prețurile, un fișier static rămâne în urmă de la prima schimbare de preț sau de stoc, iar orice instrument care îl citește primește date vechi.
Sitemap-ul XML e conceput pentru motoarele de căutare (Google, Bing) și conține doar o listă brută de URL-uri, data ultimei modificări (`<lastmod>`, pe care Google o folosește doar dacă e corectă în mod constant și verificabil) și uneori priorități și frecvențe, pe care Google le ignoră. `llms.txt` oferă structură semantică, titluri și rezumate în limbaj natural (Markdown), fiind special conceput pentru a fi procesat de LLM-uri în contextul generării de răspunsuri directe.

Istoricul modificărilor

  • 31 octombrie 2026. Comparat cu documentația Google, cu propunerea de pe llmstxt.org (v2), cu paginile OpenAI și Perplexity despre crawlere, cu ajutorul Shopify și Webflow și cu studiile Ahrefs și Limy.AI. Corectat: formatul fișierului, după a doua versiune a propunerii, în care doar H1-ul e obligatoriu, iar nota de după link vine după două puncte, și în exemplele de cod; /llms-full.txt, pe care textul versiunii actuale nu-l menționează; adoptarea „sub 11%”, înlocuită cu cele 28% din studiul Ahrefs, pe care Ahrefs le dă drept limită superioară, și cu cele 97% dintre fișiere fără nicio cerere în mai 2026; cifra Limy.AI, cu fereastra ei de 90 de zile și cu brandurile pe care le urmărește; Shopify, cu fișierul generat de platformă și cu șabloanele llms.txt.liquid și agents.md.liquid, în locul paginii cu redirecționare; Webflow, cu setarea lui pentru llms.txt; fraza după care un site fără llms.txt devine invizibil pentru AI; predicția că fișierul va deveni standardul implicit; exemplele de cod, prezentate acum ca exemple, nu ca implementări testate; ce faci când fișierul e servit ca text/html; răspunsurile despre blocarea crawlerelor, cu robots.txt ca cerere, despre Core Web Vitals, pe care fișierul nu le schimbă, și despre actualizare, cu trimitere la exemplele WordPress și Next.js. Tot atunci: robots.txt nu mai e prezentat ca respectat de toți boții AI, pentru că e o cerere, nu o barieră, iar boții care deschid o pagină la cererea unui utilizator pot să nu-l urmeze; Google-Extended, descris ca token pentru antrenarea Gemini și grounding, nu pentru AI Overviews; la Perplexity am scos declarația că ar citi fișierul cu prioritate și „mica excepție” sprijinită pe ea, pentru că n-am găsit-o pe pagina lui despre crawlere; rândul Google, cu ghidul Google în locul unei comparații fără sursă; sitemap-ul, cu ce face Google cu <lastmod>, <priority> și <changefreq>; trimiterea spre ghidul AEO și GEO, cu numele lui.
WhatsApp direct