docs: runbooks accents fleet-wide UTF-8 + veille nexum (image telegram, fidelite titre, deepseek)

This commit is contained in:
hermes-nyora
2026-08-29 08:45:39 +01:00
parent 66db7f678b
commit f8b750fe85
3 changed files with 129 additions and 0 deletions
@@ -0,0 +1,67 @@
# 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