Nuit Blanche
· 5 min de lecture

PYTHIA : un moniteur d'actualité ambiant piloté par un LLM

PYTHIA : un moniteur d'actualité ambiant piloté par un LLM

En bref

PYTHIA est un moniteur d'actualité ambiant : il ingère des flux, demande à un LLM d'en noter la criticité, et déforme une sphère sur un écran dédié quand quelque chose sort de l'ordinaire.

Dans Westworld, Rehoboam est une sphère noire géante qui observe le monde et calcule ses divergences. J’ai toujours trouvé l’objet plus fascinant que l’intrigue. Alors je l’ai construit, dans une forme bien plus modeste. PYTHIA tourne sur un écran dédié, dans un coin de l’appartement : il ingère des flux, demande à un LLM d’en noter la criticité, et déforme une sphère quand quelque chose sort de l’ordinaire. Aucune interaction, aucune authentification, aucun bouton. Un objet qu’on regarde, pas un objet qu’on utilise.

Pourquoi construire un écran qui ne fait rien ?

C’est précisément l’idée. Un dashboard classique vous demande d’aller le consulter, de lire des graphes, d’interpréter. PYTHIA fait l’inverse : il reste silencieux tant que tout est nominal, et n’attire l’œil que lorsqu’un événement mérite l’attention. La sphère tourne lentement, presque immobile. Quand une divergence arrive, elle ralentit, se fige, puis se déforme à l’angle d’émission de l’événement. L’intensité de la déformation suit la criticité. On sent que quelque chose se passe avant même d’avoir lu le texte.

C’est ce que j’appelle un objet ambiant. Il vit en périphérie de l’attention. La plupart du temps il ne dit rien, et c’est exactement ce que j’attends de lui.

Un LLM comme moteur de classification, pas comme chatbot

Le cœur de PYTHIA n’est pas une conversation. Chaque événement (un titre RSS, une transition up/down depuis Uptime Kuma, un webhook) est envoyé à un endpoint compatible OpenAI avec une consigne stricte : retourner du JSON, rien d’autre. Pas d’explication, pas de markdown, juste un objet structuré avec un score de criticité de 1 à 10, une catégorie, un résumé et une localisation.

L’échelle va de NOMINAL (1 à 3) à CRITICAL DIVERGENCE (10), en passant par DIVERGENCE et INTERVENTION IN PROGRESS. L’évaluateur vérifie que la catégorie correspond bien à la plage de criticité, et relance le modèle sinon. Les modèles de raisonnement glissent parfois des blocs de réflexion avant la réponse : une étape de nettoyage les retire, et un fallback regex récupère le JSON quand le parsing direct échoue. Trois tentatives, puis l’événement est abandonné. Mieux vaut une donnée manquante qu’une donnée fausse affichée sur un grand écran.

Le LLM n’est donc qu’un classifieur. Toute la valeur tient dans cette contrainte : je ne lui demande pas d’être malin, je lui demande d’être constant.

N’importe quel LLM fait l’affaire, même hébergé sur un Jetson Orin Nano Super

La première version faisait tourner le modèle en local. J’ai commencé sur un NUC, puis je suis passé à une carte Jetson pour l’inférence GPU. Les commits de cette période racontent la galère : descendre le contexte à 2048 tokens, plafonner les sorties, désactiver le mode raisonnement, basculer en streaming pour éviter les timeouts sur du matériel lent. Beaucoup d’énergie dépensée à faire rentrer un gros modèle dans une enveloppe thermique.

Mais cette galère passait à côté de l’essentiel. La tâche est étroite : lire un texte court, retourner un petit objet JSON avec un score et une catégorie. Ça ne demande pas un modèle de pointe, et ça ne demande pas beaucoup de compute. Presque n’importe quel LLM s’en sort, même un petit modèle tournant en local sur un Jetson Orin Nano Super. Aujourd’hui PYTHIA pointe vers un modèle gratuit d’OpenRouter, surtout par commodité, mais rien n’oblige ce choix.

C’est là le vrai gain de passer par une API compatible OpenAI : le modèle devient une commodité. Passer d’un endpoint cloud gratuit à une carte locale, c’est une variable d’environnement. La leçon que je retiens : quand la tâche est aussi peu exigeante, la portabilité par un contrat d’API compte bien plus que le modèle derrière.

La sphère qui se déforme, sans librairie 3D

Visuellement, c’est une sphère géodésique rendue en Canvas 2D. Pas de Three.js, pas de WebGL. Une distribution des nœuds en spirale de Fibonacci, un maillage de proximité, une projection faite main dans la boucle d’animation, un voile de poussière et un givre sur le bord. L’ensemble réagit à quatre états : repos, analyse, divergence, retour au calme. Un événement critique reste à l’écran 35 s, un mineur 8 s, et la file d’attente est triée par criticité décroissante.

Autour, un HUD discret affiche l’heure, les métriques système (CPU, RAM, disque, plus GPU et températures quand la machine les expose), la santé de chaque source et le modèle LLM utilisé. L’esthétique est monochrome, volontairement froide. C’est un instrument, pas une démo.

Ce qui reste, et ce qui suffit

PYTHIA est en mode maintenance aujourd’hui, et c’est une bonne nouvelle. Le déploiement est entièrement automatisé : un push sur main lance les tests backend et frontend sur un runner self-hosted, reconstruit les containers, attend le health check et exécute des smoke tests. Ajouter une source revient à écrire une classe qui hérite de BaseSource et à l’enregistrer. Rien n’est en dur, tout passe par la config.

Je n’ai jamais cherché à en faire un produit. Pas de base de données (une file en mémoire des 100 derniers événements suffit), pas d’authentification (c’est un outil de réseau local), aucune fonctionnalité que je n’utiliserais pas moi-même. L’objet fait ce que je voulais : transformer un flux d’informations en une présence calme qui ne s’agite que lorsque le monde diverge.

Parfois, le meilleur signe qu’un projet est terminé, c’est qu’on n’a plus envie d’y toucher. On veut juste le regarder tourner.

Le code est open source : github.com/ycnslh/pythia.

Articles liés