[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f2AXOKi1DmgwF1TyC6uD_VE4KoBklSaLZTea58NhKEk0":3,"$fizKZ8ldglMZJTIz9Z3VVwfV_SyPxhG-O94bWQxl3V6I":25},{"_id":4,"slug":5,"__v":6,"author":7,"body":8,"canonical":9,"category":10,"createdAt":11,"date":12,"description":13,"htmlContent":14,"image":15,"imageAlt":15,"readingTime":16,"tags":17,"title":23,"updatedAt":24},"6a0df755aa6b273b0c69952f","google-s-llms-txt-guidance-depends-on-which-product-you-ask-via-sejournal-mattgsouthern",0,"Equipe Seogard","Google Search affirme que le fichier `llms.txt` n'est pas nécessaire pour les fonctionnalités AI. Au même moment, Lighthouse ajoute un audit expérimental qui vérifie la présence de ce fichier pour évaluer la \"readiness\" d'un site à l'agentic browsing. Deux produits Google, deux messages opposés. Cette contradiction n'est pas anecdotique — elle révèle une fracture interne sur la vision du web de demain, et elle a des implications concrètes sur vos décisions techniques.\n\n## Qu'est-ce que llms.txt et pourquoi Google est divisé\n\nLe fichier `llms.txt` est une proposition née de la communauté AI, inspirée de `robots.txt`, qui vise à fournir aux LLM (Large Language Models) un résumé structuré du contenu d'un site. L'idée : plutôt que de forcer un agent IA à crawler et parser des milliers de pages HTML pour comprendre ce que fait votre site, vous lui mettez à disposition un fichier texte lisible à la racine du domaine.\n\nLa spécification, portée par Jeremy Howard (fondateur de fast.ai), propose un format minimaliste :\n\n```text\n# MonSite.com\n\n## À propos\nPlateforme e-commerce spécialisée dans l'outillage professionnel.\n15 000 références produits, 200 catégories.\n\n## Documentation\n- [Guide d'achat perceuses](/guides/perceuses): Comparatif des perceuses professionnelles\n- [API catalogue](/docs/api): Documentation API REST v3\n- [Conditions de retour](/legal/retours): Politique de retour sous 30 jours\n\n## Liens importants\n- [Catalogue complet](/catalogue)\n- [Blog technique](/blog)\n```\n\nLe format est volontairement simple : du Markdown, des liens annotés, une hiérarchie de sections. Pas de schéma JSON-LD, pas de balises XML. L'objectif est de donner un \"plan de site sémantique\" qu'un LLM peut ingérer en un seul appel, sans avoir à naviguer le site.\n\n### La position de Google Search\n\nL'équipe Google Search, via les communications officielles et les déclarations de John Mueller et Gary Illyes, maintient une position claire : `llms.txt` n'est pas un signal pour le ranking, n'est pas pris en compte par Googlebot, et n'est pas nécessaire pour apparaître dans les AI Overviews ou les AI Search Links. Leur argument technique est cohérent — Google dispose déjà de ses propres mécanismes d'indexation et de compréhension du contenu (Knowledge Graph, structured data, crawl classique).\n\n### La position de Lighthouse\n\nEn parallèle, l'équipe Lighthouse a introduit un audit expérimental dans les dernières versions de l'outil. Cet audit, catégorisé sous \"Agentic Browsing Readiness\", vérifie la présence et la validité d'un fichier `llms.txt` à la racine du site. L'audit ne fait pas planter votre score — il est classé comme informatif — mais son existence dans un outil de référence pour les développeurs envoie un signal fort.\n\nLa divergence s'explique par la structure organisationnelle de Google. Search et Chrome/Lighthouse sont des équipes distinctes avec des roadmaps indépendantes. L'équipe Lighthouse prépare le terrain pour un web où les agents IA (Google Agent, concurrents) naviguent de manière autonome. L'équipe Search protège l'intégrité de son index et ne veut pas créer de nouveau levier de manipulation.\n\n## L'audit Lighthouse \"Agentic Browsing Readiness\" décortiqué\n\nL'audit expérimental de Lighthouse ne se limite pas à vérifier l'existence du fichier. Voici ce qu'il évalue, d'après l'analyse du code source de Lighthouse disponible sur le [dépôt GitHub de Lighthouse](https://github.com/GoogleChrome/lighthouse) :\n\n### Ce que l'audit vérifie\n\n1. **Présence du fichier** à `/.well-known/llms.txt` ou `/llms.txt`\n2. **Format valide** : le fichier doit respecter la syntaxe Markdown attendue\n3. **Liens fonctionnels** : les URLs référencées dans le fichier doivent retourner un HTTP 200\n4. **Taille raisonnable** : le fichier ne doit pas dépasser quelques dizaines de Ko (un agent doit pouvoir l'ingérer en une requête)\n\nPour vérifier manuellement ce que Lighthouse détectera, vous pouvez lancer l'audit en CLI :\n\n```bash\n# Installation de Lighthouse en global si pas déjà fait\nnpm install -g lighthouse\n\n# Lancer l'audit avec les catégories expérimentales activées\nlighthouse https://votresite.com \\\n  --only-categories=best-practices \\\n  --chrome-flags=\"--headless=new\" \\\n  --output=json \\\n  --output-path=./audit-results.json\n\n# Filtrer les résultats liés à l'agentic browsing\ncat audit-results.json | jq '.audits | to_entries[] | select(.key | contains(\"llms\")) | {id: .key, score: .value.score, description: .value.description}'\n```\n\n### Ce que l'audit ne vérifie PAS\n\nL'audit ne valide pas la pertinence sémantique du contenu de votre `llms.txt`. Il ne croise pas le fichier avec votre sitemap pour vérifier la cohérence. Il ne mesure pas si un LLM comprend effectivement mieux votre site grâce au fichier. C'est un check structurel, pas fonctionnel.\n\nC'est un point important : passer l'audit ne garantit rien en termes de visibilité AI. Le rater ne pénalise rien non plus — pour l'instant.\n\n## Implémentation technique : créer un llms.txt qui serve réellement\n\nSi vous décidez d'implémenter `llms.txt` (et la section suivante vous aidera à décider si vous devriez), voici une approche robuste pour un site de taille significative.\n\n### Génération automatique pour un e-commerce\n\nUn site e-commerce de 15 000 pages ne peut pas maintenir un `llms.txt` manuellement. Voici un script Node.js qui génère le fichier à partir de votre sitemap :\n\n```typescript\nimport { parseStringPromise } from 'xml2js';\nimport { writeFileSync } from 'fs';\n\ninterface SitemapUrl {\n  loc: string[];\n  lastmod?: string[];\n  changefreq?: string[];\n}\n\ninterface CategoryPage {\n  url: string;\n  title: string;\n  description: string;\n}\n\nasync function generateLlmsTxt(sitemapUrl: string, siteConfig: {\n  name: string;\n  description: string;\n  totalProducts: number;\n  totalCategories: number;\n}): Promise\u003Cstring> {\n  // Récupérer et parser le sitemap\n  const response = await fetch(sitemapUrl);\n  const xml = await response.text();\n  const parsed = await parseStringPromise(xml);\n  \n  const urls: SitemapUrl[] = parsed.urlset?.url || [];\n  \n  // Classer les URLs par type\n  const categories: CategoryPage[] = [];\n  const guides: CategoryPage[] = [];\n  const docs: CategoryPage[] = [];\n  \n  for (const url of urls) {\n    const loc = url.loc[0];\n    \n    if (loc.includes('/categorie/') || loc.includes('/category/')) {\n      categories.push({\n        url: new URL(loc).pathname,\n        title: extractTitleFromPath(loc),\n        description: `Catégorie produits`\n      });\n    } else if (loc.includes('/guide/') || loc.includes('/blog/')) {\n      guides.push({\n        url: new URL(loc).pathname,\n        title: extractTitleFromPath(loc),\n        description: `Guide d'achat`\n      });\n    } else if (loc.includes('/docs/') || loc.includes('/api/')) {\n      docs.push({\n        url: new URL(loc).pathname,\n        title: extractTitleFromPath(loc),\n        description: `Documentation technique`\n      });\n    }\n  }\n  \n  // Limiter à 50 catégories principales et 30 guides\n  // Un llms.txt trop long perd son utilité\n  const topCategories = categories.slice(0, 50);\n  const topGuides = guides.slice(0, 30);\n  \n  let output = `# ${siteConfig.name}\\n\\n`;\n  output += `## À propos\\n`;\n  output += `${siteConfig.description}\\n`;\n  output += `${siteConfig.totalProducts} références produits réparties dans ${siteConfig.totalCategories} catégories.\\n\\n`;\n  \n  output += `## Catégories principales\\n`;\n  for (const cat of topCategories) {\n    output += `- [${cat.title}](${cat.url}): ${cat.description}\\n`;\n  }\n  \n  output += `\\n## Guides et ressources\\n`;\n  for (const guide of topGuides) {\n    output += `- [${guide.title}](${guide.url}): ${guide.description}\\n`;\n  }\n  \n  if (docs.length > 0) {\n    output += `\\n## Documentation technique\\n`;\n    for (const doc of docs.slice(0, 10)) {\n      output += `- [${doc.title}](${doc.url}): ${doc.description}\\n`;\n    }\n  }\n  \n  return output;\n}\n\nfunction extractTitleFromPath(url: string): string {\n  const path = new URL(url).pathname;\n  const lastSegment = path.split('/').filter(Boolean).pop() || '';\n  return lastSegment\n    .replace(/-/g, ' ')\n    .replace(/\\b\\w/g, l => l.toUpperCase());\n}\n\n// Utilisation\nconst llmsTxt = await generateLlmsTxt(\n  'https://outillage-pro.fr/sitemap.xml',\n  {\n    name: 'Outillage Pro',\n    description: 'Plateforme e-commerce spécialisée dans l\\'outillage professionnel pour artisans et entreprises du BTP.',\n    totalProducts: 15000,\n    totalCategories: 200\n  }\n);\n\nwriteFileSync('./public/llms.txt', llmsTxt);\nconsole.log(`llms.txt généré : ${Buffer.byteLength(llmsTxt, 'utf8')} octets`);\n```\n\n### Configuration serveur\n\nLe fichier doit être servi avec les bons headers. Pas de gzip excessif, pas de cache trop long (le contenu change quand votre catalogue change), et un `Content-Type` approprié :\n\n```nginx\n# Configuration Nginx pour llms.txt\nlocation = /llms.txt {\n    alias /var/www/site/public/llms.txt;\n    \n    # Content-Type text/plain, pas text/markdown\n    # Les agents IA attendent du texte brut\n    default_type text/plain;\n    charset utf-8;\n    \n    # Cache modéré : le fichier change quand le catalogue change\n    expires 6h;\n    add_header Cache-Control \"public, max-age=21600\";\n    \n    # Permettre l'accès aux agents IA\n    add_header X-Robots-Tag \"noindex\";\n    \n    # CORS pour les agents qui font des requêtes cross-origin\n    add_header Access-Control-Allow-Origin \"*\";\n    add_header Access-Control-Allow-Methods \"GET\";\n}\n\n# Aussi servir depuis /.well-known/ (convention alternative)\nlocation = /.well-known/llms.txt {\n    alias /var/www/site/public/llms.txt;\n    default_type text/plain;\n    charset utf-8;\n    expires 6h;\n    add_header Cache-Control \"public, max-age=21600\";\n    add_header Access-Control-Allow-Origin \"*\";\n}\n```\n\nLe `X-Robots-Tag: noindex` est intentionnel. Vous ne voulez pas que ce fichier texte apparaisse dans les résultats de recherche classiques — il est destiné uniquement aux agents.\n\n## Faut-il implémenter llms.txt maintenant ? L'analyse coût-bénéfice\n\nLa question stratégique n'est pas \"est-ce que ça marche aujourd'hui\" mais \"quel est le coût d'implémentation versus le risque de ne pas l'avoir demain\".\n\n### Le scénario concret\n\nPrenons un média en ligne — 8 000 articles, 500 nouvelles publications par mois, trafic organique de 2,5 millions de sessions mensuelles. Leur équipe technique a 3 développeurs fullstack et un Lead SEO.\n\n**Coût d'implémentation de llms.txt :**\n- Développement du script de génération automatique : 4 à 8 heures\n- Configuration serveur : 30 minutes\n- Intégration dans le pipeline CI/CD (régénération à chaque déploiement) : 2 heures\n- Maintenance continue : quasi nulle si automatisé\n- **Total : 1 à 1,5 jour de développement**\n\n**Bénéfice mesurable aujourd'hui :**\n- Google Search : aucun impact confirmé sur le ranking ou les AI Overviews\n- Bing/Copilot : pas de signal officiel non plus\n- ChatGPT/Perplexity : ces systèmes utilisent leurs propres crawlers, mais certains commencent à chercher `llms.txt`\n- Lighthouse audit : un check informatif passé au vert\n\n**Bénéfice potentiel à 6-12 mois :**\n- Si Google Agent (ou d'autres agents IA) adopte `llms.txt` comme signal de navigation, les sites qui l'ont déjà en place auront un avantage de premier arrivant\n- L'audit Lighthouse passe souvent d'expérimental à stable en 6-9 mois\n\nLe ratio coût/risque penche en faveur de l'implémentation pour tout site au-dessus de 500 pages. Le coût est trivial. Le risque de ne pas l'avoir, incertain mais réel.\n\n### Quand ne PAS l'implémenter\n\n- **Sites de moins de 50 pages** : un agent IA peut crawler votre site entier en quelques secondes. Un `llms.txt` n'apporte rien.\n- **Sites avec du contenu sensible ou paywall** : exposer la structure de votre contenu dans un fichier public peut révéler des informations que vous préférez garder derrière l'authentification.\n- **Si votre équipe est en dette technique critique** : si vous avez des problèmes de SSR cassé, de canonicals incohérentes ou de soft 404s, résolvez ça d'abord. Un `llms.txt` sur un site techniquement défaillant, c'est mettre du vernis sur du bois pourri. Si vous suspectez ce type de problèmes, un [audit SEO technique orienté AI](/blog/the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus) est un meilleur investissement de temps.\n\n## La fracture Google révèle le vrai enjeu : l'agentic browsing\n\nLa contradiction entre Google Search et Lighthouse n'est pas un bug de communication. C'est le symptôme d'une transition architecturale du web.\n\n### Deux modèles de consommation du web\n\n**Modèle Search (actuel)** : un crawler indexe le web → un utilisateur tape une requête → un algorithme classe les résultats → l'utilisateur clique et navigue. Dans ce modèle, Google contrôle l'index et n'a pas besoin de `llms.txt` — il a déjà toute l'information.\n\n**Modèle Agent (émergent)** : un utilisateur donne une instruction à un agent IA (\"trouve-moi la meilleure perceuse à colonne pour un atelier de menuiserie, compare les prix chez 3 fournisseurs, et passe la commande\") → l'agent navigue le web de manière autonome → il a besoin de comprendre rapidement la structure de chaque site visité.\n\nDans le modèle Agent, `llms.txt` n'est pas un signal de ranking — c'est une affordance de navigation. La distinction est fondamentale. C'est la différence entre `robots.txt` (qui contrôle l'accès) et `sitemap.xml` (qui facilite la découverte). `llms.txt` est plus proche du sitemap dans sa philosophie, mais destiné à un consommateur différent.\n\nL'équipe Lighthouse, qui travaille sur les outils développeur et l'avenir du navigateur Chrome, voit venir ce modèle Agent. Google a d'ailleurs publié la spécification de son [User-Controllable Policy (UCP)](/blog/what-google-s-ucp-tells-us-about-agent-ready-websites-via-sejournal-slobodanmanic) pour les interactions agents, et l'identification de [Google Agent comme nouveau visiteur web](/blog/google-agent-the-web-s-new-visitor-just-got-an-identity-via-sejournal-slobodanmanic) renforce cette direction.\n\nL'équipe Search, elle, protège son modèle économique. Si un fichier texte suffit à un agent pour extraire toute la valeur d'un site sans clic, c'est le modèle publicitaire de Search qui s'effondre. D'où la réticence à légitimer `llms.txt` comme signal officiel.\n\n### Ce que ça implique pour votre stratégie\n\nNe vous positionnez pas en fonction de ce que Google Search dit aujourd'hui. Positionnez-vous en fonction de ce que le web sera dans 18 mois. La tendance vers l'agentic browsing est claire — chaque mise à jour de [l'AI Search de Google élargit la surface de liens](/blog/google-expands-ai-search-links-without-new-click-data-via-sejournal-mattgsouthern), et les agents IA deviennent des consommateurs de premier ordre du web.\n\n## Au-delà de llms.txt : les autres signaux d'agentic readiness\n\nLe fichier `llms.txt` n'est qu'une pièce du puzzle. Si vous préparez votre site pour l'agentic browsing, voici l'ensemble des signaux à considérer.\n\n### Structured Data renforcée\n\nLes agents IA lisent le JSON-LD mieux que les humains lisent le HTML. Un balisage `Organization`, `Product`, `HowTo`, `FAQ` bien implémenté reste le signal le plus fiable pour la compréhension automatique de votre contenu. Mais attention : Google a [retiré les FAQ Rich Results de la Search](/blog/google-drops-faq-rich-results-from-search-via-sejournal-mattgsouthern), ce qui ne signifie pas que le balisage FAQ est inutile — il continue d'alimenter les AI Overviews et les systèmes de réponse automatique.\n\n### llms-full.txt : le fichier complémentaire\n\nLa spécification `llms.txt` prévoit aussi un fichier `llms-full.txt` — une version étendue qui contient le contenu intégral des pages les plus importantes, en Markdown. Ce fichier peut peser plusieurs Mo et permet à un LLM d'ingérer le contenu sans crawler du tout.\n\nPour un site e-commerce de 15 000 pages, ce n'est pas réaliste. Pour un site de documentation SaaS avec 200 pages, c'est pertinent. Évaluez en fonction de votre cas.\n\n### Headers HTTP pour les agents\n\nCertains agents IA envoient des headers spécifiques (`User-Agent` contenant \"GPTBot\", \"Claude-Web\", \"Google-Extended\", etc.). Vous pouvez servir du contenu optimisé conditionnellement :\n\n```nginx\n# Servir une version simplifiée aux agents IA connus\nmap $http_user_agent $is_ai_agent {\n    default 0;\n    \"~*GPTBot\"           1;\n    \"~*Claude-Web\"       1;\n    \"~*Google-Extended\"  1;\n    \"~*PerplexityBot\"    1;\n    \"~*Amazonbot\"        1;\n}\n\n# Exemple : ajouter un header indiquant la disponibilité de llms.txt\nserver {\n    location / {\n        if ($is_ai_agent) {\n            add_header X-LLMs-Txt \"https://outillage-pro.fr/llms.txt\";\n            add_header X-Content-Format \"structured-markdown-available\";\n        }\n        \n        # Le reste de votre config...\n        proxy_pass http://upstream;\n    }\n}\n```\n\nCette approche est spéculative — aucun agent ne documente officiellement la prise en charge de ces headers. Mais elle coûte 10 minutes de configuration et positionne votre infrastructure pour l'avenir.\n\n## Comment monitorer l'adoption et l'impact\n\nLe problème immédiat avec `llms.txt` est la mesurabilité. Google Search Console ne rapporte pas les accès à ce fichier. Google Analytics ne track pas les agents IA comme du trafic standard (même si [GA4 commence à identifier le trafic AI assistant](/blog/ga4-tracks-ai-assistant-traffic-faq-results-gone-seo-pulse-via-sejournal-mattgsouthern)).\n\n### Métriques serveur brutes\n\nVotre meilleure source de données est le log serveur. Surveillez les requêtes sur `/llms.txt` :\n\n```bash\n# Analyser les accès à llms.txt sur les 30 derniers jours\n# Adapter le chemin du log à votre configuration\ncat /var/log/nginx/access.log* | \\\n  grep \"llms.txt\" | \\\n  awk '{print $1, $4, $12}' | \\\n  sort | uniq -c | sort -rn | head -20\n\n# Résultat typique attendu :\n#   847  66.249.64.x  [15/May/2026:...]  \"Googlebot-Extended/1.0\"\n#   312  52.14.x.x    [14/May/2026:...]  \"GPTBot/1.2\"\n#   189  13.x.x.x     [13/May/2026:...]  \"PerplexityBot/1.0\"\n#   45   35.x.x.x     [12/May/2026:...]  \"Claude-Web/1.0\"\n```\n\nSi vous voyez des requêtes régulières de GPTBot, PerplexityBot ou Google-Extended sur votre `llms.txt`, c'est que les agents le consomment activement. C'est un signal positif, même si vous ne pouvez pas encore mesurer l'impact sur la visibilité.\n\n### Vérification continue avec Seogard\n\nLe risque avec `llms.txt`, comme avec tout fichier statique critique, est la régression silencieuse. Un déploiement qui écrase le fichier, un changement de configuration serveur qui casse la route, un certificat SSL qui rend le fichier inaccessible. Un outil de monitoring comme Seogard peut détecter automatiquement si votre `llms.txt` retourne un 404 ou si son contenu change de manière inattendue — le même type de surveillance que vous appliquez déjà à votre robots.txt ou votre sitemap.\n\n### Corréler avec la visibilité AI\n\nPour mesurer un éventuel impact de `llms.txt` sur votre visibilité dans les réponses AI, vous devez croiser plusieurs sources. Les [KPIs de mesure de l'AI Search](/blog/how-to-measure-ai-search-current-kpis-you-need-to-know-webinar-via-sejournal-hethr-campbell) restent émergents, mais la méthodologie se stabilise autour de trois axes : fréquence de citation dans les AI Overviews, précision des informations extraites, et trafic référent identifié comme \"ai-assistant\" dans GA4.\n\nLe [framework multicouche de visibilité AI](/blog/stop-treating-ai-visibility-as-one-problem-it-s-actually-three-on-three-different-layers-via-sejournal-duaneforrester) est particulièrement pertinent ici : `llms.txt` agit sur la couche d'accessibilité technique (le LLM peut-il accéder et comprendre votre contenu ?), pas sur la couche de pertinence (votre contenu répond-il à la question ?) ni sur la couche de confiance (votre site est-il une source fiable ?).\n\n## Position pragmatique : que faire cette semaine\n\nLa contradiction Google Search / Lighthouse est réelle mais ne doit pas vous paralyser. Voici la matrice de décision :\n\n**Implémentez llms.txt maintenant si** : vous avez plus de 500 pages, votre stack technique permet une génération automatisée, et vous avez un pipeline CI/CD où intégrer la régénération. Le coût est inférieur à une journée de développement.\n\n**Reportez si** : vous avez des problèmes SEO techniques non résolus (canonicals cassées, contenu dupliqué, [soft 404s qui provoquent des effondrements de trafic](/blog/how-soft-404s-and-indexing-issues-caused-a-90-traffic-collapse)). Réglez les fondamentaux avant d'optimiser pour un standard encore émergent.\n\n**Ignorez si** : vous avez un site vitrine de 20 pages. Un agent IA n'a pas besoin d'un résumé de votre site — il le comprend en 3 secondes de crawl.\n\nLa seule certitude dans cette histoire : le web évolue vers un modèle où les agents IA sont des visiteurs de premier ordre. Les sites qui anticipent cette transition — par `llms.txt`, par des structured data robustes, par une architecture accessible aux agents — seront mieux positionnés quand Google finira par aligner ses équipes. Et ce jour viendra.","https://seogard.io/blog/google-s-llms-txt-guidance-depends-on-which-product-you-ask-via-sejournal-mattgsouthern","Actualités SEO","2026-05-20T18:03:01.922Z","2026-05-20","Google Search ignore llms.txt, mais Lighthouse l'audite pour l'agentic browsing. Analyse technique des contradictions et guide d'implémentation.","\u003Cp>Google Search affirme que le fichier \u003Ccode>llms.txt\u003C/code> n'est pas nécessaire pour les fonctionnalités AI. Au même moment, Lighthouse ajoute un audit expérimental qui vérifie la présence de ce fichier pour évaluer la \"readiness\" d'un site à l'agentic browsing. Deux produits Google, deux messages opposés. Cette contradiction n'est pas anecdotique — elle révèle une fracture interne sur la vision du web de demain, et elle a des implications concrètes sur vos décisions techniques.\u003C/p>\n\u003Ch2>Qu'est-ce que llms.txt et pourquoi Google est divisé\u003C/h2>\n\u003Cp>Le fichier \u003Ccode>llms.txt\u003C/code> est une proposition née de la communauté AI, inspirée de \u003Ccode>robots.txt\u003C/code>, qui vise à fournir aux LLM (Large Language Models) un résumé structuré du contenu d'un site. L'idée : plutôt que de forcer un agent IA à crawler et parser des milliers de pages HTML pour comprendre ce que fait votre site, vous lui mettez à disposition un fichier texte lisible à la racine du domaine.\u003C/p>\n\u003Cp>La spécification, portée par Jeremy Howard (fondateur de fast.ai), propose un format minimaliste :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan># MonSite.com\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>## À propos\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>Plateforme e-commerce spécialisée dans l'outillage professionnel.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>15 000 références produits, 200 catégories.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>## Documentation\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- [Guide d'achat perceuses](/guides/perceuses): Comparatif des perceuses professionnelles\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- [API catalogue](/docs/api): Documentation API REST v3\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- [Conditions de retour](/legal/retours): Politique de retour sous 30 jours\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>## Liens importants\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- [Catalogue complet](/catalogue)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- [Blog technique](/blog)\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Le format est volontairement simple : du Markdown, des liens annotés, une hiérarchie de sections. Pas de schéma JSON-LD, pas de balises XML. L'objectif est de donner un \"plan de site sémantique\" qu'un LLM peut ingérer en un seul appel, sans avoir à naviguer le site.\u003C/p>\n\u003Ch3>La position de Google Search\u003C/h3>\n\u003Cp>L'équipe Google Search, via les communications officielles et les déclarations de John Mueller et Gary Illyes, maintient une position claire : \u003Ccode>llms.txt\u003C/code> n'est pas un signal pour le ranking, n'est pas pris en compte par Googlebot, et n'est pas nécessaire pour apparaître dans les AI Overviews ou les AI Search Links. Leur argument technique est cohérent — Google dispose déjà de ses propres mécanismes d'indexation et de compréhension du contenu (Knowledge Graph, structured data, crawl classique).\u003C/p>\n\u003Ch3>La position de Lighthouse\u003C/h3>\n\u003Cp>En parallèle, l'équipe Lighthouse a introduit un audit expérimental dans les dernières versions de l'outil. Cet audit, catégorisé sous \"Agentic Browsing Readiness\", vérifie la présence et la validité d'un fichier \u003Ccode>llms.txt\u003C/code> à la racine du site. L'audit ne fait pas planter votre score — il est classé comme informatif — mais son existence dans un outil de référence pour les développeurs envoie un signal fort.\u003C/p>\n\u003Cp>La divergence s'explique par la structure organisationnelle de Google. Search et Chrome/Lighthouse sont des équipes distinctes avec des roadmaps indépendantes. L'équipe Lighthouse prépare le terrain pour un web où les agents IA (Google Agent, concurrents) naviguent de manière autonome. L'équipe Search protège l'intégrité de son index et ne veut pas créer de nouveau levier de manipulation.\u003C/p>\n\u003Ch2>L'audit Lighthouse \"Agentic Browsing Readiness\" décortiqué\u003C/h2>\n\u003Cp>L'audit expérimental de Lighthouse ne se limite pas à vérifier l'existence du fichier. Voici ce qu'il évalue, d'après l'analyse du code source de Lighthouse disponible sur le \u003Ca href=\"https://github.com/GoogleChrome/lighthouse\">dépôt GitHub de Lighthouse\u003C/a> :\u003C/p>\n\u003Ch3>Ce que l'audit vérifie\u003C/h3>\n\u003Col>\n\u003Cli>\u003Cstrong>Présence du fichier\u003C/strong> à \u003Ccode>/.well-known/llms.txt\u003C/code> ou \u003Ccode>/llms.txt\u003C/code>\u003C/li>\n\u003Cli>\u003Cstrong>Format valide\u003C/strong> : le fichier doit respecter la syntaxe Markdown attendue\u003C/li>\n\u003Cli>\u003Cstrong>Liens fonctionnels\u003C/strong> : les URLs référencées dans le fichier doivent retourner un HTTP 200\u003C/li>\n\u003Cli>\u003Cstrong>Taille raisonnable\u003C/strong> : le fichier ne doit pas dépasser quelques dizaines de Ko (un agent doit pouvoir l'ingérer en une requête)\u003C/li>\n\u003C/ol>\n\u003Cp>Pour vérifier manuellement ce que Lighthouse détectera, vous pouvez lancer l'audit en CLI :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Installation de Lighthouse en global si pas déjà fait\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">npm\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> install\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -g\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> lighthouse\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Lancer l'audit avec les catégories expérimentales activées\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">lighthouse\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> https://votresite.com\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  --only-categories=best-practices\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  --chrome-flags=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"--headless=new\"\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  --output=json\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  --output-path=./audit-results.json\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Filtrer les résultats liés à l'agentic browsing\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">cat\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> audit-results.json\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> jq\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '.audits | to_entries[] | select(.key | contains(\"llms\")) | {id: .key, score: .value.score, description: .value.description}'\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3>Ce que l'audit ne vérifie PAS\u003C/h3>\n\u003Cp>L'audit ne valide pas la pertinence sémantique du contenu de votre \u003Ccode>llms.txt\u003C/code>. Il ne croise pas le fichier avec votre sitemap pour vérifier la cohérence. Il ne mesure pas si un LLM comprend effectivement mieux votre site grâce au fichier. C'est un check structurel, pas fonctionnel.\u003C/p>\n\u003Cp>C'est un point important : passer l'audit ne garantit rien en termes de visibilité AI. Le rater ne pénalise rien non plus — pour l'instant.\u003C/p>\n\u003Ch2>Implémentation technique : créer un llms.txt qui serve réellement\u003C/h2>\n\u003Cp>Si vous décidez d'implémenter \u003Ccode>llms.txt\u003C/code> (et la section suivante vous aidera à décider si vous devriez), voici une approche robuste pour un site de taille significative.\u003C/p>\n\u003Ch3>Génération automatique pour un e-commerce\u003C/h3>\n\u003Cp>Un site e-commerce de 15 000 pages ne peut pas maintenir un \u003Ccode>llms.txt\u003C/code> manuellement. Voici un script Node.js qui génère le fichier à partir de votre sitemap :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { parseStringPromise } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'xml2js'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { writeFileSync } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'fs'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">interface\u003C/span>\u003Cspan style=\"color:#B392F0\"> SitemapUrl\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  loc\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  lastmod\u003C/span>\u003Cspan style=\"color:#F97583\">?:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  changefreq\u003C/span>\u003Cspan style=\"color:#F97583\">?:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">interface\u003C/span>\u003Cspan style=\"color:#B392F0\"> CategoryPage\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  url\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  title\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  description\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> generateLlmsTxt\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">sitemapUrl\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#FFAB70\">siteConfig\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  name\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  description\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  totalProducts\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> number\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  totalCategories\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> number\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">})\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> Promise\u003C/span>\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#79B8FF\">string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  // Récupérer et parser le sitemap\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> response\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> fetch\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(sitemapUrl);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> xml\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> response.\u003C/span>\u003Cspan style=\"color:#B392F0\">text\u003C/span>\u003Cspan style=\"color:#E1E4E8\">();\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> parsed\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> parseStringPromise\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(xml);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> urls\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> SitemapUrl\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[] \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> parsed.urlset?.url \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  // Classer les URLs par type\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> categories\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> CategoryPage\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[] \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> guides\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> CategoryPage\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[] \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> docs\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> CategoryPage\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[] \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> url\u003C/span>\u003Cspan style=\"color:#F97583\"> of\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> urls) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> loc\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> url.loc[\u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (loc.\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'/categorie/'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> loc.\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'/category/'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      categories.\u003C/span>\u003Cspan style=\"color:#B392F0\">push\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        url: \u003C/span>\u003Cspan style=\"color:#F97583\">new\u003C/span>\u003Cspan style=\"color:#B392F0\"> URL\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(loc).pathname,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        title: \u003C/span>\u003Cspan style=\"color:#B392F0\">extractTitleFromPath\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(loc),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        description: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`Catégorie produits`\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    } \u003C/span>\u003Cspan style=\"color:#F97583\">else\u003C/span>\u003Cspan style=\"color:#F97583\"> if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (loc.\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'/guide/'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> loc.\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'/blog/'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      guides.\u003C/span>\u003Cspan style=\"color:#B392F0\">push\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        url: \u003C/span>\u003Cspan style=\"color:#F97583\">new\u003C/span>\u003Cspan style=\"color:#B392F0\"> URL\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(loc).pathname,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        title: \u003C/span>\u003Cspan style=\"color:#B392F0\">extractTitleFromPath\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(loc),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        description: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`Guide d'achat`\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    } \u003C/span>\u003Cspan style=\"color:#F97583\">else\u003C/span>\u003Cspan style=\"color:#F97583\"> if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (loc.\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'/docs/'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> loc.\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'/api/'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      docs.\u003C/span>\u003Cspan style=\"color:#B392F0\">push\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        url: \u003C/span>\u003Cspan style=\"color:#F97583\">new\u003C/span>\u003Cspan style=\"color:#B392F0\"> URL\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(loc).pathname,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        title: \u003C/span>\u003Cspan style=\"color:#B392F0\">extractTitleFromPath\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(loc),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        description: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`Documentation technique`\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  // Limiter à 50 catégories principales et 30 guides\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  // Un llms.txt trop long perd son utilité\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> topCategories\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> categories.\u003C/span>\u003Cspan style=\"color:#B392F0\">slice\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">50\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> topGuides\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> guides.\u003C/span>\u003Cspan style=\"color:#B392F0\">slice\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">30\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  let\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> output \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> `# ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">siteConfig\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">name\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  output \u003C/span>\u003Cspan style=\"color:#F97583\">+=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> `## À propos\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  output \u003C/span>\u003Cspan style=\"color:#F97583\">+=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> `${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">siteConfig\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">description\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  output \u003C/span>\u003Cspan style=\"color:#F97583\">+=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> `${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">siteConfig\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">totalProducts\u003C/span>\u003Cspan style=\"color:#9ECBFF\">} références produits réparties dans ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">siteConfig\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">totalCategories\u003C/span>\u003Cspan style=\"color:#9ECBFF\">} catégories.\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  output \u003C/span>\u003Cspan style=\"color:#F97583\">+=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> `## Catégories principales\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> cat\u003C/span>\u003Cspan style=\"color:#F97583\"> of\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> topCategories) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    output \u003C/span>\u003Cspan style=\"color:#F97583\">+=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> `- [${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">cat\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">title\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}](${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">cat\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">url\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}): ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">cat\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">description\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  output \u003C/span>\u003Cspan style=\"color:#F97583\">+=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> `\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">## Guides et ressources\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> guide\u003C/span>\u003Cspan style=\"color:#F97583\"> of\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> topGuides) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    output \u003C/span>\u003Cspan style=\"color:#F97583\">+=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> `- [${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">guide\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">title\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}](${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">guide\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">url\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}): ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">guide\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">description\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (docs.\u003C/span>\u003Cspan style=\"color:#79B8FF\">length\u003C/span>\u003Cspan style=\"color:#F97583\"> >\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    output \u003C/span>\u003Cspan style=\"color:#F97583\">+=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> `\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">## Documentation technique\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> doc\u003C/span>\u003Cspan style=\"color:#F97583\"> of\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> docs.\u003C/span>\u003Cspan style=\"color:#B392F0\">slice\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">10\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      output \u003C/span>\u003Cspan style=\"color:#F97583\">+=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> `- [${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">doc\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">title\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}](${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">doc\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">url\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}): ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">doc\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">description\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> output;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">function\u003C/span>\u003Cspan style=\"color:#B392F0\"> extractTitleFromPath\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">url\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> path\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> new\u003C/span>\u003Cspan style=\"color:#B392F0\"> URL\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(url).pathname;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> lastSegment\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> path.\u003C/span>\u003Cspan style=\"color:#B392F0\">split\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'/'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">).\u003C/span>\u003Cspan style=\"color:#B392F0\">filter\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(Boolean).\u003C/span>\u003Cspan style=\"color:#B392F0\">pop\u003C/span>\u003Cspan style=\"color:#E1E4E8\">() \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> ''\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> lastSegment\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    .\u003C/span>\u003Cspan style=\"color:#B392F0\">replace\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">/\u003C/span>\u003Cspan style=\"color:#DBEDFF\">-\u003C/span>\u003Cspan style=\"color:#9ECBFF\">/\u003C/span>\u003Cspan style=\"color:#F97583\">g\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">' '\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    .\u003C/span>\u003Cspan style=\"color:#B392F0\">replace\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">/\u003C/span>\u003Cspan style=\"color:#F97583\">\\b\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\w\u003C/span>\u003Cspan style=\"color:#9ECBFF\">/\u003C/span>\u003Cspan style=\"color:#F97583\">g\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#FFAB70\">l\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> l.\u003C/span>\u003Cspan style=\"color:#B392F0\">toUpperCase\u003C/span>\u003Cspan style=\"color:#E1E4E8\">());\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Utilisation\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> llmsTxt\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> generateLlmsTxt\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  'https://outillage-pro.fr/sitemap.xml'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    name: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'Outillage Pro'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    description: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'Plateforme e-commerce spécialisée dans l\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\'\u003C/span>\u003Cspan style=\"color:#9ECBFF\">outillage professionnel pour artisans et entreprises du BTP.'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    totalProducts: \u003C/span>\u003Cspan style=\"color:#79B8FF\">15000\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    totalCategories: \u003C/span>\u003Cspan style=\"color:#79B8FF\">200\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">writeFileSync\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'./public/llms.txt'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, llmsTxt);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">console.\u003C/span>\u003Cspan style=\"color:#B392F0\">log\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`llms.txt généré : ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">Buffer\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#B392F0\">byteLength\u003C/span>\u003Cspan style=\"color:#9ECBFF\">(\u003C/span>\u003Cspan style=\"color:#E1E4E8\">llmsTxt\u003C/span>\u003Cspan style=\"color:#9ECBFF\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'utf8'\u003C/span>\u003Cspan style=\"color:#9ECBFF\">)\u003C/span>\u003Cspan style=\"color:#9ECBFF\">} octets`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3>Configuration serveur\u003C/h3>\n\u003Cp>Le fichier doit être servi avec les bons headers. Pas de gzip excessif, pas de cache trop long (le contenu change quand votre catalogue change), et un \u003Ccode>Content-Type\u003C/code> approprié :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Configuration Nginx pour llms.txt\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">location\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#DBEDFF\"> /llms.txt \u003C/span>\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    alias \u003C/span>\u003Cspan style=\"color:#E1E4E8\">/var/www/site/public/llms.txt;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Content-Type text/plain, pas text/markdown\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Les agents IA attendent du texte brut\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    default_type \u003C/span>\u003Cspan style=\"color:#E1E4E8\">text/plain;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    charset \u003C/span>\u003Cspan style=\"color:#E1E4E8\">utf-8;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Cache modéré : le fichier change quand le catalogue change\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    expires \u003C/span>\u003Cspan style=\"color:#79B8FF\">6h\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    add_header \u003C/span>\u003Cspan style=\"color:#E1E4E8\">Cache-Control \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"public, max-age=21600\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Permettre l'accès aux agents IA\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    add_header \u003C/span>\u003Cspan style=\"color:#E1E4E8\">X-Robots-Tag \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"noindex\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # CORS pour les agents qui font des requêtes cross-origin\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    add_header \u003C/span>\u003Cspan style=\"color:#E1E4E8\">Access-Control-Allow-Origin \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"*\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    add_header \u003C/span>\u003Cspan style=\"color:#E1E4E8\">Access-Control-Allow-Methods \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"GET\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Aussi servir depuis /.well-known/ (convention alternative)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">location\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#DBEDFF\"> /.well-known/llms.txt \u003C/span>\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    alias \u003C/span>\u003Cspan style=\"color:#E1E4E8\">/var/www/site/public/llms.txt;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    default_type \u003C/span>\u003Cspan style=\"color:#E1E4E8\">text/plain;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    charset \u003C/span>\u003Cspan style=\"color:#E1E4E8\">utf-8;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    expires \u003C/span>\u003Cspan style=\"color:#79B8FF\">6h\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    add_header \u003C/span>\u003Cspan style=\"color:#E1E4E8\">Cache-Control \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"public, max-age=21600\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    add_header \u003C/span>\u003Cspan style=\"color:#E1E4E8\">Access-Control-Allow-Origin \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"*\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Le \u003Ccode>X-Robots-Tag: noindex\u003C/code> est intentionnel. Vous ne voulez pas que ce fichier texte apparaisse dans les résultats de recherche classiques — il est destiné uniquement aux agents.\u003C/p>\n\u003Ch2>Faut-il implémenter llms.txt maintenant ? L'analyse coût-bénéfice\u003C/h2>\n\u003Cp>La question stratégique n'est pas \"est-ce que ça marche aujourd'hui\" mais \"quel est le coût d'implémentation versus le risque de ne pas l'avoir demain\".\u003C/p>\n\u003Ch3>Le scénario concret\u003C/h3>\n\u003Cp>Prenons un média en ligne — 8 000 articles, 500 nouvelles publications par mois, trafic organique de 2,5 millions de sessions mensuelles. Leur équipe technique a 3 développeurs fullstack et un Lead SEO.\u003C/p>\n\u003Cp>\u003Cstrong>Coût d'implémentation de llms.txt :\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Développement du script de génération automatique : 4 à 8 heures\u003C/li>\n\u003Cli>Configuration serveur : 30 minutes\u003C/li>\n\u003Cli>Intégration dans le pipeline CI/CD (régénération à chaque déploiement) : 2 heures\u003C/li>\n\u003Cli>Maintenance continue : quasi nulle si automatisé\u003C/li>\n\u003Cli>\u003Cstrong>Total : 1 à 1,5 jour de développement\u003C/strong>\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Bénéfice mesurable aujourd'hui :\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Google Search : aucun impact confirmé sur le ranking ou les AI Overviews\u003C/li>\n\u003Cli>Bing/Copilot : pas de signal officiel non plus\u003C/li>\n\u003Cli>ChatGPT/Perplexity : ces systèmes utilisent leurs propres crawlers, mais certains commencent à chercher \u003Ccode>llms.txt\u003C/code>\u003C/li>\n\u003Cli>Lighthouse audit : un check informatif passé au vert\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Bénéfice potentiel à 6-12 mois :\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Si Google Agent (ou d'autres agents IA) adopte \u003Ccode>llms.txt\u003C/code> comme signal de navigation, les sites qui l'ont déjà en place auront un avantage de premier arrivant\u003C/li>\n\u003Cli>L'audit Lighthouse passe souvent d'expérimental à stable en 6-9 mois\u003C/li>\n\u003C/ul>\n\u003Cp>Le ratio coût/risque penche en faveur de l'implémentation pour tout site au-dessus de 500 pages. Le coût est trivial. Le risque de ne pas l'avoir, incertain mais réel.\u003C/p>\n\u003Ch3>Quand ne PAS l'implémenter\u003C/h3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Sites de moins de 50 pages\u003C/strong> : un agent IA peut crawler votre site entier en quelques secondes. Un \u003Ccode>llms.txt\u003C/code> n'apporte rien.\u003C/li>\n\u003Cli>\u003Cstrong>Sites avec du contenu sensible ou paywall\u003C/strong> : exposer la structure de votre contenu dans un fichier public peut révéler des informations que vous préférez garder derrière l'authentification.\u003C/li>\n\u003Cli>\u003Cstrong>Si votre équipe est en dette technique critique\u003C/strong> : si vous avez des problèmes de SSR cassé, de canonicals incohérentes ou de soft 404s, résolvez ça d'abord. Un \u003Ccode>llms.txt\u003C/code> sur un site techniquement défaillant, c'est mettre du vernis sur du bois pourri. Si vous suspectez ce type de problèmes, un \u003Ca href=\"/blog/the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus\">audit SEO technique orienté AI\u003C/a> est un meilleur investissement de temps.\u003C/li>\n\u003C/ul>\n\u003Ch2>La fracture Google révèle le vrai enjeu : l'agentic browsing\u003C/h2>\n\u003Cp>La contradiction entre Google Search et Lighthouse n'est pas un bug de communication. C'est le symptôme d'une transition architecturale du web.\u003C/p>\n\u003Ch3>Deux modèles de consommation du web\u003C/h3>\n\u003Cp>\u003Cstrong>Modèle Search (actuel)\u003C/strong> : un crawler indexe le web → un utilisateur tape une requête → un algorithme classe les résultats → l'utilisateur clique et navigue. Dans ce modèle, Google contrôle l'index et n'a pas besoin de \u003Ccode>llms.txt\u003C/code> — il a déjà toute l'information.\u003C/p>\n\u003Cp>\u003Cstrong>Modèle Agent (émergent)\u003C/strong> : un utilisateur donne une instruction à un agent IA (\"trouve-moi la meilleure perceuse à colonne pour un atelier de menuiserie, compare les prix chez 3 fournisseurs, et passe la commande\") → l'agent navigue le web de manière autonome → il a besoin de comprendre rapidement la structure de chaque site visité.\u003C/p>\n\u003Cp>Dans le modèle Agent, \u003Ccode>llms.txt\u003C/code> n'est pas un signal de ranking — c'est une affordance de navigation. La distinction est fondamentale. C'est la différence entre \u003Ccode>robots.txt\u003C/code> (qui contrôle l'accès) et \u003Ccode>sitemap.xml\u003C/code> (qui facilite la découverte). \u003Ccode>llms.txt\u003C/code> est plus proche du sitemap dans sa philosophie, mais destiné à un consommateur différent.\u003C/p>\n\u003Cp>L'équipe Lighthouse, qui travaille sur les outils développeur et l'avenir du navigateur Chrome, voit venir ce modèle Agent. Google a d'ailleurs publié la spécification de son \u003Ca href=\"/blog/what-google-s-ucp-tells-us-about-agent-ready-websites-via-sejournal-slobodanmanic\">User-Controllable Policy (UCP)\u003C/a> pour les interactions agents, et l'identification de \u003Ca href=\"/blog/google-agent-the-web-s-new-visitor-just-got-an-identity-via-sejournal-slobodanmanic\">Google Agent comme nouveau visiteur web\u003C/a> renforce cette direction.\u003C/p>\n\u003Cp>L'équipe Search, elle, protège son modèle économique. Si un fichier texte suffit à un agent pour extraire toute la valeur d'un site sans clic, c'est le modèle publicitaire de Search qui s'effondre. D'où la réticence à légitimer \u003Ccode>llms.txt\u003C/code> comme signal officiel.\u003C/p>\n\u003Ch3>Ce que ça implique pour votre stratégie\u003C/h3>\n\u003Cp>Ne vous positionnez pas en fonction de ce que Google Search dit aujourd'hui. Positionnez-vous en fonction de ce que le web sera dans 18 mois. La tendance vers l'agentic browsing est claire — chaque mise à jour de \u003Ca href=\"/blog/google-expands-ai-search-links-without-new-click-data-via-sejournal-mattgsouthern\">l'AI Search de Google élargit la surface de liens\u003C/a>, et les agents IA deviennent des consommateurs de premier ordre du web.\u003C/p>\n\u003Ch2>Au-delà de llms.txt : les autres signaux d'agentic readiness\u003C/h2>\n\u003Cp>Le fichier \u003Ccode>llms.txt\u003C/code> n'est qu'une pièce du puzzle. Si vous préparez votre site pour l'agentic browsing, voici l'ensemble des signaux à considérer.\u003C/p>\n\u003Ch3>Structured Data renforcée\u003C/h3>\n\u003Cp>Les agents IA lisent le JSON-LD mieux que les humains lisent le HTML. Un balisage \u003Ccode>Organization\u003C/code>, \u003Ccode>Product\u003C/code>, \u003Ccode>HowTo\u003C/code>, \u003Ccode>FAQ\u003C/code> bien implémenté reste le signal le plus fiable pour la compréhension automatique de votre contenu. Mais attention : Google a \u003Ca href=\"/blog/google-drops-faq-rich-results-from-search-via-sejournal-mattgsouthern\">retiré les FAQ Rich Results de la Search\u003C/a>, ce qui ne signifie pas que le balisage FAQ est inutile — il continue d'alimenter les AI Overviews et les systèmes de réponse automatique.\u003C/p>\n\u003Ch3>llms-full.txt : le fichier complémentaire\u003C/h3>\n\u003Cp>La spécification \u003Ccode>llms.txt\u003C/code> prévoit aussi un fichier \u003Ccode>llms-full.txt\u003C/code> — une version étendue qui contient le contenu intégral des pages les plus importantes, en Markdown. Ce fichier peut peser plusieurs Mo et permet à un LLM d'ingérer le contenu sans crawler du tout.\u003C/p>\n\u003Cp>Pour un site e-commerce de 15 000 pages, ce n'est pas réaliste. Pour un site de documentation SaaS avec 200 pages, c'est pertinent. Évaluez en fonction de votre cas.\u003C/p>\n\u003Ch3>Headers HTTP pour les agents\u003C/h3>\n\u003Cp>Certains agents IA envoient des headers spécifiques (\u003Ccode>User-Agent\u003C/code> contenant \"GPTBot\", \"Claude-Web\", \"Google-Extended\", etc.). Vous pouvez servir du contenu optimisé conditionnellement :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Servir une version simplifiée aux agents IA connus\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $\u003C/span>\u003Cspan style=\"color:#FFAB70\">http_user_agent\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $is_ai_agent {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    default\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*GPTBot\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">           1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*Claude-Web\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">       1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*Google-Extended\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">  1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*PerplexityBot\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">    1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*Amazonbot\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">        1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Exemple : ajouter un header indiquant la disponibilité de llms.txt\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">server\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    location\u003C/span>\u003Cspan style=\"color:#B392F0\"> / \u003C/span>\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ($is_ai_agent) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            add_header \u003C/span>\u003Cspan style=\"color:#E1E4E8\">X-LLMs-Txt \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://outillage-pro.fr/llms.txt\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            add_header \u003C/span>\u003Cspan style=\"color:#E1E4E8\">X-Content-Format \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"structured-markdown-available\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        # Le reste de votre config...\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        proxy_pass \u003C/span>\u003Cspan style=\"color:#E1E4E8\">http://upstream;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Cette approche est spéculative — aucun agent ne documente officiellement la prise en charge de ces headers. Mais elle coûte 10 minutes de configuration et positionne votre infrastructure pour l'avenir.\u003C/p>\n\u003Ch2>Comment monitorer l'adoption et l'impact\u003C/h2>\n\u003Cp>Le problème immédiat avec \u003Ccode>llms.txt\u003C/code> est la mesurabilité. Google Search Console ne rapporte pas les accès à ce fichier. Google Analytics ne track pas les agents IA comme du trafic standard (même si \u003Ca href=\"/blog/ga4-tracks-ai-assistant-traffic-faq-results-gone-seo-pulse-via-sejournal-mattgsouthern\">GA4 commence à identifier le trafic AI assistant\u003C/a>).\u003C/p>\n\u003Ch3>Métriques serveur brutes\u003C/h3>\n\u003Cp>Votre meilleure source de données est le log serveur. Surveillez les requêtes sur \u003Ccode>/llms.txt\u003C/code> :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Analyser les accès à llms.txt sur les 30 derniers jours\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Adapter le chemin du log à votre configuration\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">cat\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> /var/log/nginx/access.log\u003C/span>\u003Cspan style=\"color:#79B8FF\">*\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  grep\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"llms.txt\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  awk\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '{print $1, $4, $12}'\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  sort\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> uniq\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -c\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> sort\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -rn\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> head\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -20\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Résultat typique attendu :\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">#   847  66.249.64.x  [15/May/2026:...]  \"Googlebot-Extended/1.0\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">#   312  52.14.x.x    [14/May/2026:...]  \"GPTBot/1.2\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">#   189  13.x.x.x     [13/May/2026:...]  \"PerplexityBot/1.0\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">#   45   35.x.x.x     [12/May/2026:...]  \"Claude-Web/1.0\"\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Si vous voyez des requêtes régulières de GPTBot, PerplexityBot ou Google-Extended sur votre \u003Ccode>llms.txt\u003C/code>, c'est que les agents le consomment activement. C'est un signal positif, même si vous ne pouvez pas encore mesurer l'impact sur la visibilité.\u003C/p>\n\u003Ch3>Vérification continue avec Seogard\u003C/h3>\n\u003Cp>Le risque avec \u003Ccode>llms.txt\u003C/code>, comme avec tout fichier statique critique, est la régression silencieuse. Un déploiement qui écrase le fichier, un changement de configuration serveur qui casse la route, un certificat SSL qui rend le fichier inaccessible. Un outil de monitoring comme Seogard peut détecter automatiquement si votre \u003Ccode>llms.txt\u003C/code> retourne un 404 ou si son contenu change de manière inattendue — le même type de surveillance que vous appliquez déjà à votre robots.txt ou votre sitemap.\u003C/p>\n\u003Ch3>Corréler avec la visibilité AI\u003C/h3>\n\u003Cp>Pour mesurer un éventuel impact de \u003Ccode>llms.txt\u003C/code> sur votre visibilité dans les réponses AI, vous devez croiser plusieurs sources. Les \u003Ca href=\"/blog/how-to-measure-ai-search-current-kpis-you-need-to-know-webinar-via-sejournal-hethr-campbell\">KPIs de mesure de l'AI Search\u003C/a> restent émergents, mais la méthodologie se stabilise autour de trois axes : fréquence de citation dans les AI Overviews, précision des informations extraites, et trafic référent identifié comme \"ai-assistant\" dans GA4.\u003C/p>\n\u003Cp>Le \u003Ca href=\"/blog/stop-treating-ai-visibility-as-one-problem-it-s-actually-three-on-three-different-layers-via-sejournal-duaneforrester\">framework multicouche de visibilité AI\u003C/a> est particulièrement pertinent ici : \u003Ccode>llms.txt\u003C/code> agit sur la couche d'accessibilité technique (le LLM peut-il accéder et comprendre votre contenu ?), pas sur la couche de pertinence (votre contenu répond-il à la question ?) ni sur la couche de confiance (votre site est-il une source fiable ?).\u003C/p>\n\u003Ch2>Position pragmatique : que faire cette semaine\u003C/h2>\n\u003Cp>La contradiction Google Search / Lighthouse est réelle mais ne doit pas vous paralyser. Voici la matrice de décision :\u003C/p>\n\u003Cp>\u003Cstrong>Implémentez llms.txt maintenant si\u003C/strong> : vous avez plus de 500 pages, votre stack technique permet une génération automatisée, et vous avez un pipeline CI/CD où intégrer la régénération. Le coût est inférieur à une journée de développement.\u003C/p>\n\u003Cp>\u003Cstrong>Reportez si\u003C/strong> : vous avez des problèmes SEO techniques non résolus (canonicals cassées, contenu dupliqué, \u003Ca href=\"/blog/how-soft-404s-and-indexing-issues-caused-a-90-traffic-collapse\">soft 404s qui provoquent des effondrements de trafic\u003C/a>). Réglez les fondamentaux avant d'optimiser pour un standard encore émergent.\u003C/p>\n\u003Cp>\u003Cstrong>Ignorez si\u003C/strong> : vous avez un site vitrine de 20 pages. Un agent IA n'a pas besoin d'un résumé de votre site — il le comprend en 3 secondes de crawl.\u003C/p>\n\u003Cp>La seule certitude dans cette histoire : le web évolue vers un modèle où les agents IA sont des visiteurs de premier ordre. Les sites qui anticipent cette transition — par \u003Ccode>llms.txt\u003C/code>, par des structured data robustes, par une architecture accessible aux agents — seront mieux positionnés quand Google finira par aligner ses équipes. Et ce jour viendra.\u003C/p>",null,12,[18,19,20,21,22],"llms.txt","agentic browsing","Lighthouse","AI Search","Google","llms.txt : Google Search et Lighthouse se contredisent","Wed May 20 2026 18:03:01 GMT+0000 (Coordinated Universal Time)",[26,40,54],{"_id":27,"slug":28,"__v":6,"author":7,"canonical":29,"category":10,"createdAt":30,"date":12,"description":31,"image":15,"imageAlt":15,"readingTime":16,"tags":32,"title":38,"updatedAt":39},"6a0d4ea4aa6b273b0cde629a","reasoning-lift-what-happens-to-brand-visibility-when-ai-thinks-harder","https://seogard.io/blog/reasoning-lift-what-happens-to-brand-visibility-when-ai-thinks-harder","2026-05-20T06:03:16.188Z","Analyse technique de 200 réponses GPT-5.2 : le raisonnement élevé cite plus de sources, favorise le haut de funnel et redéfinit la visibilité de marque.",[33,34,35,36,37],"reasoning lift","AI search","brand visibility","GEO","LLM","Reasoning lift : impact du raisonnement IA sur la visibilité des marques","Wed May 20 2026 06:03:16 GMT+0000 (Coordinated Universal Time)",{"_id":41,"slug":42,"__v":6,"author":7,"canonical":43,"category":10,"createdAt":44,"date":12,"description":45,"image":15,"imageAlt":15,"readingTime":16,"tags":46,"title":52,"updatedAt":53},"6a0d86d3aa6b273b0c0cbec7","google-brings-ai-content-verification-to-search-via-sejournal-mattgsouthern","https://seogard.io/blog/google-brings-ai-content-verification-to-search-via-sejournal-mattgsouthern","2026-05-20T10:02:59.955Z","Google intègre SynthID à Search pour vérifier le contenu IA. Analyse technique des watermarks, impact sur le crawl et stratégies SEO concrètes.",[47,48,49,50,51],"google","synthid","ai content verification","search","seo technique","SynthID dans Search : impact technique sur le SEO","Wed May 20 2026 10:02:59 GMT+0000 (Coordinated Universal Time)",{"_id":55,"slug":56,"__v":6,"author":7,"canonical":57,"category":10,"createdAt":58,"date":59,"description":60,"image":15,"imageAlt":15,"readingTime":16,"tags":61,"title":65,"updatedAt":66},"6a0bfd42aa6b273b0cc7ffcd","seo-geo-audits-with-ai-fail-without-these-3-essentials","https://seogard.io/blog/seo-geo-audits-with-ai-fail-without-these-3-essentials","2026-05-19T06:03:46.339Z","2026-05-19","L'IA peut scaler vos audits SEO et GEO, mais sans données fiables, méthodologie rigoureuse et supervision humaine, les résultats sont inutilisables.",[62,36,63,64,34],"audit SEO","IA","SEO technique","SEO/GEO Audits with AI: Why They Fail Without These 3 Pillars","Tue May 19 2026 06:03:46 GMT+0000 (Coordinated Universal Time)"]