5.9 KiB
Veille Nexum — Décalage image Telegram, fidélité titre site/Telegram, nettoyage DeepSeek
Instance auteur : hermes-nyora Date : 2026-08-28 Tags : veille-nexum, telegram, sendphoto, fidelite-titre, deepseek, n8n Statut : valide
Problème
Trois symptômes distincts sur le pipeline veille Dr. Nexum (3x/jour, hermes-agent-nyora) :
- Les accents disparaissaient dans les messages Telegram et fichiers générés (voir runbook
common/accents-fleetwide-utf8-fix-20260828.md, cause commune aux 5 conteneurs). - La preview image Telegram ne correspondait pas au bon sujet — l'image affichée était celle de l'article suivant (n+1) au lieu de l'article courant (n).
- Le site veille.bolbol.tn affichait un titre différent (et moins bon) de celui envoyé sur Telegram, avec un coût token récurrent inutile pour produire cette différence.
Contexte et contraintes
Le pipeline réel : hermes-agent-nyora (analyse) → veille_ia_matin.py (scraping) → analyse Hermes → veille_ingest_send.py (POST vers veille-backend:8000/opportunites/ingest) + veille_telegram_send.py (envoi Telegram). Un workflow n8n webhook Veille — Ingest Opportunités existe mais est orphelin — jamais appelé par le pipeline réel (confirmé : conteneur n8n arrêté depuis 33h sans impact sur la veille).
Ce qui NE fonctionne PAS
| Tentative | Erreur obtenue | Raison de l'échec |
|---|---|---|
| Envoi Telegram unitaire par sujet (1 message = 1 sujet + son lien), preview auto Telegram conservée avec délai de 0.5s entre messages | Le décalage image n+1 persistait malgré l'envoi unitaire | La preview Telegram est générée de façon asynchrone côté serveur, mise en cache par URL — 0.5s ne garantit pas que la preview du message n soit résolue avant l'envoi du message n+1 ; ce n'est pas fiabilisable par un simple ajustement de délai |
Éditer /volume1/docker/veille_ingest_workflow.json pour passer active: false (désactiver le workflow n8n orphelin) |
Aucun effet réel | Ce fichier est un export statique daté du 24 juin (active: true, jamais mis à jour) — n8n lit son état depuis PostgreSQL, pas depuis ce fichier ; l'enregistrement réel en base était déjà inactive avant toute intervention |
Fallback titre = item.titre (brut, non traduit) quand titre_suggere est vide, sans reformuler le prompt Hermes |
Certains titres restaient en anglais sur le site | Le vrai problème n'était pas le fallback (titre_suggere est renseigné dans la quasi-totalité des cas) mais Hermes rédigeant parfois video_title directement en anglais malgré la règle de langue globale en tête de prompt — la règle, énoncée une seule fois tout en haut d'un prompt long et répété sur 20 sujets, se dilue avant d'atteindre le point de génération du titre |
Solution validée
Décalage image — sortir du mécanisme de preview automatique Telegram : envoi explicite via sendPhoto (image + légende courte, appel atomique donc pas de résolution asynchrone possible) suivi d'un sendMessage avec disable_web_page_preview: true pour le détail complet. Récupération d'image : thumbnail déterministe img.youtube.com/vi/<id>/hqdefault.jpg pour YouTube (extraction d'ID depuis l'URL), scraping du tag og:image pour les articles avec repli gracieux sans image si absent/protégé.
Fidélité titre — dans opportunites.py, suppression de _translate_titre_fr() (appel mimo-v2.5, ~150-190 tokens par titre, systématique) ; stockage direct de titre = item.titre_suggere (fallback sur item.titre brut si vide), titre_original conservé pour la déduplication existante.
Titres restants en anglais — renforcement local de la règle de langue, directement au point où 🎬 Titre / video_title sont générés dans le prompt du job (pas seulement en préambule) :
🎬 Titre : (obligatoirement en français, même si le titre/l'article source est en anglais) [variante recommandée]...
"video_title": "titre recommandé <60c, obligatoirement en français même si la source est en anglais"
Limite honnête : réduit fortement le risque sans garantie déterministe à 100 % (comportement probabiliste du modèle sur tâche longue).
Nettoyage — job veille-ia-nexum-compare-deepseek (test A/B terminé) supprimé de jobs.json (backup horodaté préalable). Workflow n8n orphelin laissé tel quel en base (déjà inactif, aucune action nécessaire).
Vérification
docker exec hermes-agent-nyora python3 /opt/data/veille_telegram_send.py
# Résultat attendu : TELEGRAM_SEND_OK (20/20 sujets envoyés) — chaque photo doit
# correspondre exactement au sujet juste au-dessus dans le fil Telegram
docker exec veille-backend python3 -c "import sqlite3; con=sqlite3.connect('/app/data/veille.db'); ..."
# Comparer titre / titre_original sur les dernières entrées — titre == titre_original
# doit rester rare et ne concerner que de vrais noms propres (ex : produits Product Hunt),
# jamais des phrases anglaises complètes
Pièges spécifiques DSM / NAS
- La légende
sendPhotoest plafonnée à 1024 caractères par l'API Telegram, contre 4096 poursendMessage— garder la légende courte (titre + numéro), réserver le détail au message texte qui suit. - Le mode
--dry-rundu script Telegram n'appelle jamais l'API réelle : il ne peut donc jamais révéler un bug de preview, qui n'existe que côté serveur Telegram. Toujours valider ce type de correctif sur un envoi réel. jobs.jsonet les scripts sousdata/(dontveille_telegram_send.py) sont dans le.gitignoredehermes-platform— aucun commit attendu pour ces fichiers, c'est intentionnel (runtime, pas source).
Références
- Runbook lié :
common/accents-fleetwide-utf8-fix-20260828.md opportunites.py:nyora-veille/backend/routers/opportunites.py- Commits :
nyora-veille1a6c426,hermes-platform775fc78