From 668ae5caff3845289b78490dbbff2dfb8e1f57e3 Mon Sep 17 00:00:00 2001 From: Jules Neny Date: Mon, 11 May 2026 15:07:42 +0200 Subject: [PATCH] feat(rag-pe): PRG-5 + PRG-6 frontend pensees ecologiques - server/api/chatbot-pensees.post.ts : endpoint LightRAG VPS (hybrid mode, preface militante, rate limit 20/jour, health guard) - nuxt.config.ts : ragPeUrl runtimeConfig (NUXT_RAG_PE_URL) - public/data/auteurs-pensees.json : 18 auteurs FRACAS, 8 ecoles, theses, livres RAG - components/CartePensees.vue : D3 force-directed (8 ecoles fixes + auteurs gravitants) - components/FicheAuteur.vue : modal auteur (bio + theses + livres RAG + bouton RAG) - components/ChatbotPensees.vue : overlay chatbot bottom-right (sources expansibles) - pages/pensees-ecologiques.vue : page dedicee /pensees-ecologiques (toggle Familiale/Graphe) - pages/agences.vue : 4e onglet "Pensees" (desktop + mobile) -> /pensees-ecologiques Branche : feat/aep-rag-pensees-ecologiques Checkpoint Jules requis avant merge main. Co-Authored-By: Claude Sonnet 4.6 --- components/CartePensees.vue | 135 +++++++++++++ components/ChatbotPensees.vue | 141 ++++++++++++++ components/FicheAuteur.vue | 98 ++++++++++ nuxt.config.ts | 1 + pages/agences.vue | 11 ++ pages/pensees-ecologiques.vue | 119 ++++++++++++ public/data/auteurs-pensees.json | 300 +++++++++++++++++++++++++++++ server/api/chatbot-pensees.post.ts | 85 ++++++++ 8 files changed, 890 insertions(+) create mode 100644 components/CartePensees.vue create mode 100644 components/ChatbotPensees.vue create mode 100644 components/FicheAuteur.vue create mode 100644 pages/pensees-ecologiques.vue create mode 100644 public/data/auteurs-pensees.json create mode 100644 server/api/chatbot-pensees.post.ts diff --git a/components/CartePensees.vue b/components/CartePensees.vue new file mode 100644 index 0000000..50a87de --- /dev/null +++ b/components/CartePensees.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/components/ChatbotPensees.vue b/components/ChatbotPensees.vue new file mode 100644 index 0000000..7cf1004 --- /dev/null +++ b/components/ChatbotPensees.vue @@ -0,0 +1,141 @@ + + + + + \ No newline at end of file diff --git a/components/FicheAuteur.vue b/components/FicheAuteur.vue new file mode 100644 index 0000000..e1b3f9a --- /dev/null +++ b/components/FicheAuteur.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/nuxt.config.ts b/nuxt.config.ts index f84f305..b1b75e9 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -23,6 +23,7 @@ export default defineNuxtConfig({ codevPassword: 'merci', // NUXT_CODEV_PASSWORD - défaut "merci", overridable codevBaseId: '', // NUXT_CODEV_BASE_ID - base NocoDB (ex: pipilvsi7dibo80) codevAdminPassword: 'admin2026', // NUXT_CODEV_ADMIN_PASSWORD + ragPeUrl: process.env.NUXT_RAG_PE_URL || 'http://localhost:9621', }, // Leaflet ne fonctionne pas en SSR — forcer le rendu côté client diff --git a/pages/agences.vue b/pages/agences.vue index c2f1dfb..1d7f556 100644 --- a/pages/agences.vue +++ b/pages/agences.vue @@ -128,6 +128,12 @@ : 'color: var(--nav-text-muted); border-bottom: 2px solid transparent;'" @click="desktopMapView = 'graphe'" >Vue graphique + Pensees @@ -219,6 +225,11 @@ : 'color: var(--nav-text-muted); border-bottom: 2px solid transparent;'" @click="mobileMapView = 'graphe'" >Graphe + Pensees
diff --git a/pages/pensees-ecologiques.vue b/pages/pensees-ecologiques.vue new file mode 100644 index 0000000..82ec1f3 --- /dev/null +++ b/pages/pensees-ecologiques.vue @@ -0,0 +1,119 @@ + + + diff --git a/public/data/auteurs-pensees.json b/public/data/auteurs-pensees.json new file mode 100644 index 0000000..87b4af5 --- /dev/null +++ b/public/data/auteurs-pensees.json @@ -0,0 +1,300 @@ +{ + "meta": { + "version": "1.0", + "source": "FRACAS Bonpote V2 oct 2024 + LightRAG corpus J+2", + "corpus_ingere": 27, + "updated": "2026-05-11" + }, + "ecoles": [ + { + "id": "ecosocialisme", + "label": "Écosocialisme", + "description": "Synthèse du marxisme et de l'écologie. Articule la critique du capitalisme et la crise écologique comme deux faces d'un même système.", + "color": "#c0392b", + "x_hint": 0.55, + "y_hint": 0.28 + }, + { + "id": "eco-anarchisme", + "label": "Éco-anarchisme", + "description": "Écologies libertaires et anti-industrielles. Contre l'État, le capitalisme et la domination de la nature — pour l'autogestion et le municipalisme libertaire.", + "color": "#2d6a4f", + "x_hint": 0.25, + "y_hint": 0.3 + }, + { + "id": "decroissance", + "label": "Décroissance", + "description": "Critique radicale de la croissance économique comme horizon. Pour une réduction volontaire de la production et de la consommation.", + "color": "#e67e22", + "x_hint": 0.38, + "y_hint": 0.42 + }, + { + "id": "ecofeminismes", + "label": "Écoféminismes", + "description": "Connexions entre la domination des femmes et la domination de la nature. Féminisme de la subsistance, critique du développement, commons.", + "color": "#e07a5f", + "x_hint": 0.48, + "y_hint": 0.68 + }, + { + "id": "technocritique", + "label": "Technocritique", + "description": "Critique radicale de la technique comme système autonome. Contre l'illusion de la technologie comme solution aux crises qu'elle engendre.", + "color": "#7f8c8d", + "x_hint": 0.2, + "y_hint": 0.48 + }, + { + "id": "ecologies-decoloniales", + "label": "Écologies décoloniales", + "description": "Articulation des luttes écologiques et des luttes anticoloniales. Critique de l'extractivisme comme continuation du colonialisme.", + "color": "#b5451b", + "x_hint": 0.3, + "y_hint": 0.72 + }, + { + "id": "ethiques-environnementales", + "label": "Éthiques environnementales", + "description": "Philosophies de la nature : deep ecology, écocentrisme, droits des non-humains. Valeur intrinsèque du vivant.", + "color": "#2c7873", + "x_hint": 0.72, + "y_hint": 0.72 + }, + { + "id": "pensees-vivant", + "label": "Pensées du vivant", + "description": "Anthropologie et ontologies de la nature. Dépasser le dualisme nature/culture. Sympoïèse, multi-espèces.", + "color": "#6b8e6e", + "x_hint": 0.62, + "y_hint": 0.58 + } + ], + "auteurs": [ + { + "id": "murray-bookchin", + "nom": "Murray Bookchin", + "dates": "1921-2006", + "ecoles": ["eco-anarchisme"], + "ecole_principale": "eco-anarchisme", + "livres_rag": [ + { "slug": "bookchin-ecology-of-freedom", "titre": "L'Écologie de la liberté", "annee": 1982, "couches": ["fond", "structure"] }, + { "slug": "bookchin-post-scarcity", "titre": "Post-Scarcity Anarchism", "annee": 1971, "couches": ["fond", "structure"] }, + { "slug": "bookchin-urbanization", "titre": "The Rise of Urbanization and the Decline of Citizenship", "annee": 1987, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Municipalisme libertaire", "Écologie sociale", "Hiérarchie comme origine de la domination nature"], + "bio_courte": "Théoricien américain de l'écologie sociale et du municipalisme libertaire. A développé le concept d'\"écologie sociale\" articulant domination sociale et destruction de la nature." + }, + { + "id": "pierre-kropotkine", + "nom": "Pierre Kropotkine", + "dates": "1842-1921", + "ecoles": ["eco-anarchisme"], + "ecole_principale": "eco-anarchisme", + "livres_rag": [ + { "slug": "kropotkine-entraide", "titre": "L'Entraide, un facteur de l'évolution", "annee": 1902, "couches": ["fond", "structure"] }, + { "slug": "kropotkine-pain", "titre": "La Conquête du pain", "annee": 1892, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Entraide vs sélection naturelle darwiniste", "Fédéralisme anarchiste", "Géographie critique"], + "bio_courte": "Géographe et révolutionnaire russe. Son oeuvre centrale démontre que l'entraide, et non la compétition, est le moteur principal de l'évolution." + }, + { + "id": "michael-lowy", + "nom": "Michael Löwy", + "dates": "1938-", + "ecoles": ["ecosocialisme"], + "ecole_principale": "ecosocialisme", + "livres_rag": [ + { "slug": "lowy-ecosocialisme", "titre": "Écosocialisme", "annee": 2011, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Romantisme révolutionnaire", "Anticapitalisme écologique", "Walter Benjamin et l'écologie"], + "bio_courte": "Sociologue franco-brésilien, figure centrale de l'écosocialisme. Articule marxisme hétérodoxe et critique de la modernité industrielle." + }, + { + "id": "andreas-malm", + "nom": "Andreas Malm", + "dates": "1977-", + "ecoles": ["ecosocialisme"], + "ecole_principale": "ecosocialisme", + "livres_rag": [ + { "slug": "malm-fossil-capital", "titre": "Fossil Capital", "annee": 2016, "couches": ["fond", "structure"] }, + { "slug": "malm-comment-saboter", "titre": "Comment saboter un pipeline ?", "annee": 2020, "couches": ["fond", "structure"] }, + { "slug": "malm-corona-climat", "titre": "Corona, Climate, Chronic Emergency", "annee": 2020, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Capitalisme fossile", "Sabotage stratégique", "Urgence climatique et action directe"], + "bio_courte": "Professeur d'écologie humaine à Lund. Théoricien du 'capital fossile' et défenseur d'une écologie de guerre pour répondre à l'urgence climatique." + }, + { + "id": "kohei-saito", + "nom": "Kohei Saito", + "dates": "1987-", + "ecoles": ["ecosocialisme"], + "ecole_principale": "ecosocialisme", + "livres_rag": [ + { "slug": "saito-marx-ecosocialisme", "titre": "Marx dans l'Anthropocène", "annee": 2020, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Marx et l'écologie", "Métabolisme social", "Décroissance communiste"], + "bio_courte": "Philosophe japonais, auteur d'une relecture écologiste des cahiers tardifs de Marx. Défend une 'décroissance communiste' comme horizon." + }, + { + "id": "karl-marx", + "nom": "Karl Marx", + "dates": "1818-1883", + "ecoles": ["ecosocialisme", "eco-anarchisme"], + "ecole_principale": "ecosocialisme", + "livres_rag": [ + { "slug": "marx-manuscrits-1844", "titre": "Manuscrits de 1844", "annee": 1844, "couches": ["fond", "structure"] }, + { "slug": "marx-capital", "titre": "Le Capital", "annee": 1867, "couches": ["fond", "structure"] }, + { "slug": "marx-grundrisse", "titre": "Grundrisse", "annee": 1857, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Métabolisme entre travail humain et nature", "Aliénation naturelle", "Accumulation primitive"], + "bio_courte": "Pensée-racine de l'écosocialisme. Les Grundrisse et le Capital contiennent une critique écologique du capitalisme souvent occultée." + }, + { + "id": "serge-latouche", + "nom": "Serge Latouche", + "dates": "1940-", + "ecoles": ["decroissance"], + "ecole_principale": "decroissance", + "livres_rag": [ + { "slug": "latouche-decroissance", "titre": "Le Pari de la décroissance", "annee": 2006, "couches": ["fond", "structure"] }, + { "slug": "latouche-petit-traite", "titre": "Petit traité de la décroissance sereine", "annee": 2007, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Sereine décroissance", "Critique du développement", "Société frugale abondante"], + "bio_courte": "Économiste hétérodoxe franco-algérien, principal théoricien de la décroissance en France. Critique radical de l'économie du développement." + }, + { + "id": "pablo-servigne", + "nom": "Pablo Servigne", + "dates": "1978-", + "ecoles": ["decroissance", "pensees-vivant"], + "ecole_principale": "decroissance", + "livres_rag": [ + { "slug": "servigne-comment-tout", "titre": "Comment tout peut s'effondrer", "annee": 2015, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Collapsologie", "Entraide comme résilience", "Transition post-collapse"], + "bio_courte": "Ingénieur agronome belge, cofondateur de la collapsologie. Explore les conditions d'un effondrement de la civilisation industrielle et les voies de résilience." + }, + { + "id": "donella-meadows", + "nom": "Dennis et Donella Meadows", + "dates": "1941-2001 / 1942-", + "ecoles": ["decroissance"], + "ecole_principale": "decroissance", + "livres_rag": [ + { "slug": "meadows-limites-croissance", "titre": "Les Limites à la croissance", "annee": 1972, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Limites planétaires", "Modèles systémiques", "Overshoot"], + "bio_courte": "Le rapport Meadows (1972) est le premier modèle systémique démontrant l'impossibilité d'une croissance infinie dans un monde fini." + }, + { + "id": "francoise-deaubonne", + "nom": "Françoise d'Eaubonne", + "dates": "1920-2005", + "ecoles": ["ecofeminismes"], + "ecole_principale": "ecofeminismes", + "livres_rag": [ + { "slug": "eaubonne-feminisme-mort", "titre": "Le Féminisme ou la mort", "annee": 1974, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Écoféminisme (terme inventé)", "Patriarcat et destruction de la nature", "Révolution féministe écologique"], + "bio_courte": "Féministe française, inventrice du terme 'écoféminisme' en 1974. Lie patriarcat et destruction de l'environnement dans une même critique." + }, + { + "id": "silvia-federici", + "nom": "Silvia Federici", + "dates": "1942-", + "ecoles": ["ecofeminismes"], + "ecole_principale": "ecofeminismes", + "livres_rag": [ + { "slug": "federici-caliban", "titre": "Caliban et la sorcière", "annee": 2004, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Accumulation primitive et corps des femmes", "Chasse aux sorcières", "Travail reproductif"], + "bio_courte": "Philosophe italo-américaine, théoricienne du féminisme marxiste. Caliban et la sorcière relit l'accumulation primitive à travers la domination des femmes." + }, + { + "id": "vandana-shiva", + "nom": "Vandana Shiva", + "dates": "1952-", + "ecoles": ["ecofeminismes", "ecologies-decoloniales"], + "ecole_principale": "ecofeminismes", + "livres_rag": [ + { "slug": "shiva-monocultures-esprit", "titre": "Monocultures of the Mind", "annee": 1993, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Biopiraterie", "Souveraineté alimentaire", "Écoféminisme tiers-mondiste"], + "bio_courte": "Physicienne et militante indienne, figure mondiale de l'écoféminisme et de la souveraineté alimentaire. Cofondatrice de Navdanya." + }, + { + "id": "malcolm-ferdinand", + "nom": "Malcom Ferdinand", + "dates": "1985-", + "ecoles": ["ecologies-decoloniales"], + "ecole_principale": "ecologies-decoloniales", + "livres_rag": [ + { "slug": "ferdinand-ecologie-decoloniale", "titre": "Une écologie décoloniale", "annee": 2019, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Double fracture coloniale et écologique", "Habiter le monde", "Antillanité et écologie"], + "bio_courte": "Ingénieur et philosophe martiniquais. Son oeuvre articule colonialisme et destruction de l'environnement autour de la 'double fracture' historique." + }, + { + "id": "jacques-ellul", + "nom": "Jacques Ellul", + "dates": "1912-1994", + "ecoles": ["technocritique"], + "ecole_principale": "technocritique", + "livres_rag": [ + { "slug": "ellul-technique-enjeu", "titre": "La Technique ou l'Enjeu du siècle", "annee": 1954, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Technique comme système autonome", "Efficacité comme valeur unique", "Propagande et technosystème"], + "bio_courte": "Juriste, sociologue et théologien bordelais. Son oeuvre fondatrice analyse la Technique comme système autonome qui échappe à tout contrôle humain." + }, + { + "id": "david-graeber", + "nom": "David Graeber", + "dates": "1961-2020", + "ecoles": ["eco-anarchisme"], + "ecole_principale": "eco-anarchisme", + "livres_rag": [ + { "slug": "graeber-dette", "titre": "Dette : 5000 ans d'histoire", "annee": 2011, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Dette comme instrument de domination", "Anthropologie anarchiste", "Bullshit jobs"], + "bio_courte": "Anthropologue américain, figure du mouvement Occupy. Ses travaux anthropologiques déconstruisent les mythes fondateurs du capitalisme (troc, dette, marché)." + }, + { + "id": "philippe-descola", + "nom": "Philippe Descola", + "dates": "1949-", + "ecoles": ["pensees-vivant"], + "ecole_principale": "pensees-vivant", + "livres_rag": [ + { "slug": "descola-par-dela-nature", "titre": "Par-delà nature et culture", "annee": 2005, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Dualisme nature/culture comme exception occidentale", "4 ontologies (animisme, totémisme, analogisme, naturalisme)", "Cosmopolitiques"], + "bio_courte": "Anthropologue et ethnologue français, successeur de Lévi-Strauss au Collège de France. Démontre que le dualisme nature/culture est une anomalie culturelle." + }, + { + "id": "rachel-carson", + "nom": "Rachel Carson", + "dates": "1907-1964", + "ecoles": ["ethiques-environnementales"], + "ecole_principale": "ethiques-environnementales", + "livres_rag": [ + { "slug": "carson-printemps-silencieux", "titre": "Printemps silencieux", "annee": 1962, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Impact des pesticides sur les écosystèmes", "Naissance du mouvement environnementaliste moderne", "Responsabilité scientifique"], + "bio_courte": "Marine biologist and author américaine. Son livre Printemps silencieux (1962) a lancé le mouvement environnementaliste moderne en dénonçant les pesticides." + }, + { + "id": "arne-naess", + "nom": "Arne Næss", + "dates": "1912-2009", + "ecoles": ["ethiques-environnementales"], + "ecole_principale": "ethiques-environnementales", + "livres_rag": [ + { "slug": "naess-ecologie-profonde", "titre": "Écologie, communauté et style de vie", "annee": 1989, "couches": ["fond", "structure"] } + ], + "theses_cles": ["Deep ecology vs écologie superficielle", "Égalité biosphérique", "Réalisation de Soi élargie"], + "bio_courte": "Philosophe norvégien, fondateur de la 'deep ecology'. Défend une valeur intrinsèque de tous les êtres vivants, indépendamment de leur utilité pour les humains." + } + ] +} diff --git a/server/api/chatbot-pensees.post.ts b/server/api/chatbot-pensees.post.ts new file mode 100644 index 0000000..31f6b37 --- /dev/null +++ b/server/api/chatbot-pensees.post.ts @@ -0,0 +1,85 @@ +import type { H3Event } from 'h3' +import { checkRateLimitJson } from '~/server/utils/rateLimitJson' + +interface ChatbotPenseesRequest { + query: string + mode?: 'hybrid' | 'local' | 'global' | 'naive' | 'mix' + filter_couche?: 'fond' | 'forme' | 'structure' | null + filter_ecole?: string | null + history?: Array<{ role: 'user' | 'assistant'; content: string }> +} + +interface LightRAGQueryResponse { + response: string +} + +const SYSTEM_PREFACE = `Tu es un agent du RAG Pensées Écologiques, infrastructure militante du collectif trans-former.fr. +Tu réponds en t'appuyant STRICTEMENT sur le corpus ingéré (auteurs FRACAS Bonpote : écosocialisme, éco-anarchisme, écoféminismes, écologies décoloniales, technocritique, pensées du vivant, décroissance...). + +Règles : +- Cite les sources (auteur, livre) à chaque assertion importante. +- Si la question dépasse le corpus, dis-le clairement. Pas d'hallucination. +- Ton politique direct, pas de neutralité fade. +- Réponse en français, dense, sans délayage. +- Distingue les positions selon les écoles quand elles divergent.` + +export default defineEventHandler(async (event: H3Event) => { + const config = useRuntimeConfig(event) + + // 1. Rate limit (20 req/jour/IP, IP hashée RGPD) + const ip = + getHeader(event, 'x-forwarded-for')?.split(',')[0].trim() || + event.node.req.socket?.remoteAddress || + '0.0.0.0' + + const allowed = checkRateLimitJson(ip, 'chatbot-pensees', 20) + if (!allowed) { + throw createError({ statusCode: 429, message: 'Limite de 20 questions par jour atteinte.' }) + } + + // 2. Body parse + validation + const body = await readBody(event) + if (!body?.query || body.query.trim().length < 3 || body.query.trim().length > 500) { + throw createError({ statusCode: 400, message: 'Query invalide (3-500 caractères).' }) + } + + const query = body.query.trim() + const mode = body.mode || 'hybrid' + const ragUrl = (config.ragPeUrl as string) || 'http://localhost:9621' + + // 3. Health guard — LightRAG down = erreur claire, pas de fallback hallucinatoire + try { + await $fetch(`${ragUrl}/health`, { timeout: 5000 }) + } catch { + throw createError({ + statusCode: 503, + message: 'RAG indisponible pour l\'instant — réessaie dans quelques minutes.', + }) + } + + // 4. Call LightRAG VPS — préface système injectée dans la query + const ragQuery = `${SYSTEM_PREFACE}\n\nQuestion : ${query}` + + let ragResponse: LightRAGQueryResponse + try { + ragResponse = await $fetch(`${ragUrl}/query`, { + method: 'POST', + body: { query: ragQuery, mode }, + timeout: 90000, + }) + } catch (e: any) { + const status = e?.response?.status + if (status === 429) { + throw createError({ statusCode: 429, message: 'RAG saturé — réessaie dans quelques instants.' }) + } + throw createError({ statusCode: 504, message: 'RAG en cours de processing — réessaie dans quelques secondes.' }) + } + + // 5. Retour formaté + return { + response: ragResponse.response ?? '', + mode, + filter: { couche: body.filter_couche ?? null, ecole: body.filter_ecole ?? null }, + timestamp: new Date().toISOString(), + } +})