5.2 KiB
Veille Dr. Nexum : site dedie (veille.bolbol.tn / nyora-veille)
Date : 25-26/07/2026 · Sphere : infra + Nyora · Statut : deploye, en observation du prochain run reel
Contexte
Suite discussion sur la pollution des canaux Telegram et la difficulte de retrouver un sujet dans l'historique Telegram, Nabil a demande la construction d'un site archive pour la veille Dr. Nexum (3x/jour), en reutilisant l'app existante nyora-veille (port 3055) plutot qu'un nouveau build.
Decouverte critique : code mort React
Le dossier frontend/src/routes/ (TanStack Router, createFileRoute) etait du code mort jamais branche -- l'app reellement servie est un index.html monolithe en JS vanilla (variables CSS --bg/--card/--cyan etc., pas de Tailwind). Deux cycles de build perdus avant de le decouvrir (npm run build ne transformait que 2 modules -- signal qui aurait du alerter plus tot). Toute modification de ce site doit passer par frontend/index.html directement, jamais par src/.
Site simplifie -- mono-usage
Nav Transit + Bibliotheque retirees de l'UI (boutons + defaut de page au login/reload -> goP(3) au lieu de loadT()). Les fonctions loadT/drawT/loadB/drawB restent dans le code (dead code inoffensif, plus jamais appelees). Page unique : "Veille Dr. Nexum".
Scraper tunisien arrete
Workflow n8n 9378593adccf42dc ("VEILLE | Ingest Opportunites", scraping Telegram orientini/orientationtn) etait actif et polluait la table opportunites (job_id tg--*, 157 lignes). Desactive + n8n redemarre. 157 lignes purgees de la table. Le contenu Transit/Bibliotheque (194+190 lignes, sujet IA generaliste, source_instance=nyora) est distinct et n'a pas ete touche -- reste alimente en arriere-plan, juste retire de l'UI.
Schema DB (opportunites, additif, aucune perte de donnees)
Colonnes ajoutees : introduction, verification, analyse_etendue (ancien bouton "approfondir", non utilise dans l'UI finale -- remplace par le chat). Nouvelle table opportunite_chat (id, opportunite_id, role, content, date_capture) pour l'historique de chat persiste par article.
Backend (router opportunites.py)
GET /opportunites/?zone=transit&job_id=veille-ia-nexum-4ee61494&tag=X-- liste filtreeGET /opportunites/tags?job_id=...-- tags avec comptage, pour les chips de filtrePOST /opportunites/ingest-- batch, dedup sur (date, titre, job_id)GET/POST /opportunites/{id}/chat-- chat scope a un article, historique persiste, contexte = contenu complet de l'item + historique de conversation, model mimo-v2.5 via Bifrost (BIFROST_VK_NYORA_VEILLE, deja existante, ajoutee au docker-compose + .env local de l'app)
Frontend (index.html)
Carte par opportunite : titre (gras, toujours visible) + introduction (visible, pas grasse) -> clic sur l'en-tete deplie resume/verification/pourquoi/titre suggere/angle/tags/lien. Tags multi-dimensionnels (createur auto-injecte + objet/mot-cle genere par l'agent). Bouton "Discuter avec Dr. Nexum" ouvre un panneau de chat inline par carte (multi-messages, historique charge a l'ouverture). Seuil de couleur du badge score calibre sur l'echelle reelle 0-100 (corrige une premiere erreur de calibration 0-10).
Pipeline (job veille-ia-nexum-4ee61494, hermes-agent-nyora)
- Bloc prompt "Email enrichi" supprime -> remplace par bloc "Ingestion vers le site" : le JSON
/opt/data/veille_enrich.jsoninclut desormaisintroduction(identique mot pour mot a la ligne de contexte Telegram),verification,tags(objet/mot-cle uniquement, le tag createur est ajoute automatiquement par le script, pas par le LLM). - Nouveau script
/opt/data/veille_ingest_send.py(remplaceveille_email_send.py, non supprime mais plus appele) : fusionne raw+enrich, injecte le tag source/createur, POST vershttp://veille-backend:8000/opportunites/ingest. Verifie viaINGEST_OK/INGEST_FAILED(meme pattern que l'ancienEMAIL_SENT_OK), n'a jamais bloque Telegram en cas d'echec. - Template Telegram : ligne "Lien : [url]" ajoutee (absente avant).
- Telegram reste actif en parallele du site (decision explicite Nabil, le temps de valider le nouveau systeme). Email O365 completement retire.
Verifie en direct
Migration DB (0 perte sur 158 puis 28 lignes reelles apres purge tunisienne), ingestion end-to-end, chat end-to-end (reponse mimo-v2.5 coherente), build JS valide (node --check) avant chaque deploiement, contenu du bundle final verifie par grep post-build (le seul moyen fiable d'etre sur qu'un changement est reellement livre avec ce systeme de build).
Trouvaille annexe (sans lien avec la tache)
n8n + n8n-DB etaient Exited (0) depuis 17h au moment ou j'ai voulu interroger la DB pour trouver le scraper tunisien -- decouverte fortuite, redemarres. Cause non investiguee (pas un crash, exit propre -- arret manuel ou fenetre de maintenance ?). A surveiller si ca se reproduit.
Reste a faire / points ouverts
- Backfill des runs Dr. Nexum anterieurs a la mise en place (archives cron limitees a 2-3 jours, non tente).
- Nettoyage du code mort
frontend/src/(routes/, App.tsx, lib/api.ts) -- inoffensif mais source de confusion future, a supprimer une prochaine session. - Prochain run reel du job (prochain creneau 3x/jour) validera la chaine complete avec les nouveaux champs (introduction/verification/tags objet) -- a verifier sur le site apres.