Skip to content

theophi/desir

Repository files navigation

🌱 Désir — un esprit mû par l'envie d'apprendre

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.

Le modèle du désir

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.

🌸 Le Jardin des Mots — visualisation "jeu de la vie"

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:5180

Rè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 ».

Installation

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

Usage

# 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 test

Chaque 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.

Architecture

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.

Pistes d'évolution

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).

Multilingue

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 suit WIKI_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.

Licence

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/>.

About

An autonomous mind that explores the web out of pure curiosity — driven by desire and surprise, not goals. Writes a sourced learning journal, and grows a hypnotic "game of life" word garden. Local, free, TypeScript.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors