Petit système autonome dont le seul moteur est le désir de connaissance. On lui donne une thématique ; il explore le web, guidé non par un objectif, mais par sa curiosité — qui grandit avec la surprise et s'éteint avec l'ennui.
Inspiré des travaux sur la motivation intrinsèque (Oudeyer & Kaplan, hypothèse du learning progress) : un agent reste curieux de ce qui le surprend, et se lasse de ce qui ne lui apprend plus rien.
┌──────────────────────────────────────┐
│ ÉVEIL │
│ le thème fait naître 5 questions │
└──────────────────┬───────────────────┘
▼
┌───────────────────────────────────────────────────┐
│ CYCLE D'EXPLORATION │
│ │
│ 1. choisir la question la plus DÉSIRÉE │
│ (avec 20% de vagabondage — sérendipité) │
│ 2. lire le web (Wikipédia + 9 sources) │
│ 3. digérer : résumé, faits, SURPRISE (0-10) │
│ │
│ la surprise fait naître de nouveaux désirs ──┐ │
│ la répétition nourrit la SATIÉTÉ du sous-thème│ │
│ trois lectures ternes font monter l'ENNUI │ │
└────────────────────────────────────────────────┼──┘
│ │
curiosité < seuil vital ? │
▼ (sinon, on recommence)
┌──────────────────────────────────────┐
│ MORT PAISIBLE DU DÉSIR 🌙 │
│ rapport final : ce que j'ai compris │
│ + ce que je désire encore savoir │
└──────────────────────────────────────┘
Quatre grandeurs en interaction (voir src/desire.ts) :
| Grandeur | Portée | Dynamique |
|---|---|---|
| Désir | par question | hérité de la surprise qui l'a fait naître × nouveauté |
| Satiété | par sous-thème | monte à chaque visite, surtout si la lecture était terne |
| Surprise | par lecture | notée 0-10 par le LLM ; engendre les nouvelles questions |
| Ennui | global | monte quand les 3 dernières surprises sont faibles |
L'esprit persiste entre les sessions : son état complet (questions
ouvertes, satiétés, faits appris) est sauvegardé dans state/. Relancer le
même thème réveille le désir là où il s'était endormi.
Une seconde incarnation du désir, visuelle et sans clé API : vous semez un mot, il devient une cellule vivante qui fleurit en mots voisins (les liens de son article Wikipédia). À regarder pousser dans le navigateur.
npm run garden # → http://localhost:5180Règles de vie (esprit Conway, voir src/garden.ts) :
| Règle | Effet |
|---|---|
| Naissance | une floraison engendre jusqu'à 3 mots voisins inédits ; l'énergie se transmet (×0.75 + étincelle) |
| Satiété | fleurir coûte la moitié de son énergie |
| Vieillissement | toute cellule décline ; plus vite si le jardin est bondé (mortalité densité-dépendante) |
| Surpopulation | au-delà de 70 cellules, les plus faibles meurent |
| Mort | énergie < 0.05 → la cellule s'éteint en fondu |
Interactions : semer un mot (champ en haut), cliquer une cellule pour raviver son désir (+0.5 d'énergie), resemer un mot vivant le fait refleurir.
Chaque mot porte un génome graphique (hash de ses lettres) : pétales, nuance, police, courbure de filament. Les formes disent le stade de vie : ★ graine semée · ● bouton · ✿ fleur (a engendré) · ○ floraison stérile. La teinte encode la génération, la taille et la lumière encodent l'énergie.
Chaque session écrit un herbier (journal/jardin-<date>.md) où toutes
les floraisons sont consignées avec leur lignée complète — la mémoire
permanente des associations, lisible même après la mort du jardin.
Le serveur respecte le rythme de Wikipédia : en cas de rate-limit (HTTP 429), le jardin marque une pause au lieu de croire le monde stérile.
Plongée profonde (fusion avec l'esprit explorateur) : un ⌥ Alt-clic sur une cellule réveille l'esprit explorateur sur ce mot (clé Groq requise) ; il lit plusieurs sources et en rapporte des faits qui raniment la cellule. Le résultat s'ouvre dans un carnet de plongée — rapport, faits, et surtout les liens cliquables vers tout ce qu'il a lu. Dans le carnet, chaque « désir restant » est cliquable et relance une plongée : le désir devient un arbre navigable. Un menu discret ⚙ règle le nombre de cycles et l'option « Wikipédia seulement ».
git clone https://github.com/theophi/desir.git
cd desir
npm install
cp .env.example .env
# → collez votre clé Groq (gratuite) dans .env : https://console.groq.com/keys# Exploration de 6 cycles (défaut)
npm run explore -- "les trous noirs supermassifs"
# Plus de cycles
npm run explore -- "l'histoire de la K-pop" --cycles 10
# Oublier tout et repartir de zéro sur ce thème
npm run explore -- "les trous noirs supermassifs" --fresh
# Se contenter de Wikipédia (sans recherche web large : plus rapide, reproductible)
npm run explore -- "les trous noirs supermassifs" --wiki-only
# En anglais (sources ET narration) — voir la section « Multilingue »
WIKI_LANG=en npm run explore -- "supermassive black holes"
# Diagnostiquer les sources · lancer les tests
npm run probe -- "trou noir"
npm testChaque exploration produit :
- 📓
journal/<thème>.md— le journal d'apprentissage, écrit à la première personne : ce qu'il a compris, ses surprises, les désirs nés en chemin, et son rapport final. - 🧠
state/<thème>.json— l'esprit lui-même, rechargé au prochain réveil.
src/
index.ts → boucle de vie : éveil → cycles → mort paisible (+ exploreTheme réutilisable)
desire.ts → ❤️ moteur de désir (frontière, satiété, ennui, nouveauté) — pur, testé
sources.ts → 📡 registre de sources (adaptateurs uniformes, keyless, soft-fail)
web.ts → fetchers bas niveau (Wikipédia, OpenAlex, références d'article…)
llm.ts → la pensée : Groq llama-3.3-70b (éveil, digestion, rapport)
journal.ts → la mémoire : journal markdown + état JSON persistant
garden.ts → 🌸 serveur du Jardin + plongée /explore + carnet /explored (SSE)
probe-sources.ts → diagnostic des sources (npm run probe)
types.ts → types partagés (MindState, Question, SourceHit…)
public/
garden.html → visualisation canvas + menu ⚙ + halo de plongée + désirs cliquables
tests/
desire.test.ts → tests unitaires du moteur de désir (vitest)
Coût : ~1 requête Groq par cycle (+ éveil + rapport), soit ~8 requêtes pour une session par défaut — très loin des 1 000 req/jour du free tier.
Déjà là : registre multi-sources (Wikipédia, OpenAlex, HAL, arXiv, Crossref, Europe PMC, Wikidata, OpenLibrary, Gallica/BnF) · fusion jardin ↔ explorateur (⌥-clic → plongée) · carnet de plongée à désirs cliquables · narration multilingue.
À venir :
- Nouveauté/pertinence par embeddings (VoyageAI) au lieu du filtre lexical, pour détecter les vraies redites sémantiques et les titres en langue étrangère.
- Prédire puis lire : la surprise comme écart prédiction/réalité (learning progress).
- Rêves : un mode hors-ligne où l'esprit relit ses faits et engendre des hypothèses à vérifier au prochain réveil.
- Couleurs & son : teinte et timbre des mots selon leur charge émotionnelle (VAD).
Par défaut, l'esprit lit et écrit en français. Tout bascule via deux variables
d'environnement (dans .env ou en ligne de commande) :
WIKI_LANG— l'édition Wikipédia / Wikidata interrogée (fr,en,es,de,it,pt…).MIND_LANG— la langue dans laquelle l'esprit pense et écrit (questions, journal, rapport). S'il n'est pas défini, il suitWIKI_LANG.
# Tout en anglais (sources + narration) :
WIKI_LANG=en npm run explore -- "supermassive black holes"
# Sources anglaises, mais narration française :
WIKI_LANG=en MIND_LANG=fr npm run explore -- "supermassive black holes"Les sources savantes (OpenAlex, arXiv, Crossref…) sont multilingues ou anglophones par nature : elles restent disponibles quelle que soit la langue choisie.
Désir est un logiciel libre, distribué sous GNU General Public License v3
(ou ultérieure) — voir le fichier LICENSE.
Désir — a small system driven by the desire to learn
Copyright (C) 2026 Théo
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.