discourse-to-markdown est un nouveau plugin qui renvoie le contenu du forum au format Markdown lorsque le client envoie Accept: text/markdown ou ajoute .md à la fin de n’importe quelle URL de contenu.
Nous l’utilisons sur notre propre forum à l’adresse https://discourse.roots.io :
curl -H "Accept: text/markdown" https://discourse.roots.io/latest
curl https://discourse.roots.io/t/serve-your-wordpress-posts-as-markdown/30321.md
Le HTML est coûteux à fournir à un LLM, et servir du Markdown ne contenant que le contenu réduit souvent l’utilisation des tokens de 3 à 5 fois. Cela signifie des appels API moins chers, des réponses plus rapides et plus de place dans la fenêtre de contexte pour que le modèle puisse raisonner. Consultez https://acceptmarkdown.com pour une présentation plus détaillée et une vérification de compatibilité pour n’importe quel site.
Comment les clients demandent du Markdown
Trois points d’entrée :
- En-tête
Accept: text/markdown(idéal pour les LLM) - Suffixe d’URL
.md - Découverte (chaque réponse HTML annonce son équivalent Markdown via
Link: <...>; rel="alternate"; type="text/markdown"et une balise<link rel="alternate">dans<head>, les flux RSS contiennent un<atom:link>pointant vers l’équivalent Markdown)
Routes prises en charge
| Route | HTML | Markdown |
|---|---|---|
| Sujet | /t/:slug/:id |
/t/:slug/:id.md |
| Post unique | /t/:slug/:id/:post_number |
/t/:slug/:id/:post_number.md |
| Catégorie | /c/:slug/:id |
/c/:slug/:id.md |
| Balise | /tag/:tag |
/tag/:tag.md |
| Derniers | /latest |
/latest.md |
| Top | /top |
/top.md |
| Populaires | /hot |
/hot.md |
| Activité utilisateur | /u/:username/activity |
/u/:username/activity.md |
Installation
Ajoutez le plugin à votre fichier app.yml :
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/roots/discourse-to-markdown.git
Reconstruisez le conteneur :
cd /var/discourse
./launcher rebuild app
Ensuite, activez-le dans Admin → Paramètres → Plugins → Sortie Markdown.
Notes sur la conversion
Le plugin convertit le HTML cooked de Discourse — la représentation rendue que les lecteurs voient, avec les oneboxes développées, les mentions liées et les citations attribuées — et non le raw. Cela préserve ce que les lecteurs voient réellement et rend le résultat portable sur n’importe quel rendu compatible GFM. Les éléments spécifiques à Discourse (citations, oneboxes, détails, mentions, hashtags, emojis, lightboxes, sondages) sont réécrits de manière cohérente avant la conversion.
Le Markdown converti est mis en cache dans Redis par post, en utilisant une clé basée sur post.id + post.updated_at, et les modifications invalident automatiquement le cache.
Paramètres
| Paramètre | Valeur par défaut | Objectif |
|---|---|---|
discourse_to_markdown_enabled |
false |
Interrupteur principal pour le plugin |
discourse_to_markdown_md_urls_enabled |
true |
Accepter les suffixes d’URL .md comme équivalent de la route HTML |
discourse_to_markdown_strict_accept |
false |
Retourner 406 Not Acceptable lorsque l’en-tête Accept du client exclut à la fois text/html et text/markdown |
discourse_to_markdown_emit_vary |
true |
Émettre Vary: Accept sur les réponses Markdown et 406 pour éviter que les caches ne servent des représentations croisées |
discourse_to_markdown_include_post_metadata |
true |
Inclure l’URL, la catégorie, les balises, l’auteur et les horodatages dans la représentation Markdown |
Ressources
- Source/problèmes : GitHub - roots/discourse-to-markdown: Serve Discourse content as Markdown via Accept: text/markdown or .md URLs — content negotiation for LLMs and agents. · GitHub
- acceptmarkdown.com — service de Markdown aux agents via la négociation de contenu, plus une vérification de compatibilité pour votre site
- RFC 9110 §12.5.1 — Négociation proactive — la spécification implémentée par ce plugin
- RFC 7763 — enregistrement du type de média
text/markdown - MDN — Négociation de contenu — introduction accessible au concept
- Consultez acceptmarkdown.com/reference pour la spécification complète et la liste de la documentation pour les développeurs