68 lines
5.9 KiB
Markdown
68 lines
5.9 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
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
|