Files
nas-runbooks/hermes-nyora/veille-nexum-telegram-image-titre-fidelite-20260828.md

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

  1. 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).
  2. 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).
  3. 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 sendPhoto est plafonnée à 1024 caractères par l'API Telegram, contre 4096 pour sendMessage — garder la légende courte (titre + numéro), réserver le détail au message texte qui suit.
  • Le mode --dry-run du 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.json et les scripts sous data/ (dont veille_telegram_send.py) sont dans le .gitignore de hermes-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-veille 1a6c426, hermes-platform 775fc78