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
+2
View File
@@ -84,6 +84,7 @@
| Runbook | Date | Tags |
|---------|------|------|
| [Accents disparaissant en ASCII -- bug fleet-wide sur les 5 conteneurs Hermes (LANG/LC_ALL/PYTHONIOENCODING/PYTHONUTF8 manquants)](common/accents-fleetwide-utf8-fix-20260828.md) | 2026-08-28 | accents, utf-8, hermes, fleet-wide, docker-compose, encoding |
| [Passerelle MCP dédiée NyoraNotes (multi-agent, StreamableHTTP port 3098, scoping strict par dossier, connecteur DSH validé)](common/nyora-notes-mcp-gateway-deploiement-20260826.md) | 2026-08-26 | nyora-notes-mcp, mcp, streamable-http, scoping, dsh, tailscale |
| [Réduction hermes-hub en dispatcher minimal & stabilisation DSH (historique, WebSockets, mémoire NyoraNotes)](common/decommission-switcher-hub-stabilisation-dsh-20260826.md) | 2026-08-26 | dsh, hermes-hub, dispatcher, websocket, history-fix, nyora-notes |
| [Hub public skills.sh — identifiants, scanner de securite, override manuel DANGEROUS (video Dr Firas)](common/hermes-skills-hub-scanner-securite.md) | 2026-08-20 | hermes, skills, scanner, securite, hub |
@@ -143,6 +144,7 @@
| Runbook | Date | Tags |
|---------|------|------|
| [Veille Nexum -- decalage image Telegram (sendPhoto), fidelite titre site/Telegram, nettoyage DeepSeek](hermes-nyora/veille-nexum-telegram-image-titre-fidelite-20260828.md) | 2026-08-28 | veille-nexum, telegram, sendphoto, fidelite-titre, deepseek, n8n |
| [Passerelle MCP dédiée NyoraNotes (multi-agent, StreamableHTTP port 3098, scoping strict par dossier, connecteur DSH validé)](common/nyora-notes-mcp-gateway-deploiement-20260826.md) | 2026-08-26 | nyora-notes-mcp, mcp, streamable-http, scoping, dsh, tailscale |
| [Réduction hermes-hub en dispatcher minimal & stabilisation DSH (historique, WebSockets, mémoire NyoraNotes)](common/decommission-switcher-hub-stabilisation-dsh-20260826.md) | 2026-08-26 | dsh, hermes-hub, dispatcher, websocket, history-fix, nyora-notes |
| [Hermes Hub — Déploiement et Exploitation Multi-Univers sur VPS (FastAPI, proxy async, design tokens, Tailscale)](common/hermes-hub-deploiement.md) | 2026-08-19 | hermes, hub, multi-univers, vps, tailscale, cloudflare-access, fastapi |
@@ -0,0 +1,60 @@
# Accents disparaissant en ASCII — bug fleet-wide sur les 5 conteneurs Hermes
**Instance auteur** : hermes-nyora
**Date** : 2026-08-28
**Tags** : accents, utf-8, hermes, fleet-wide, docker-compose, encoding
**Statut** : valide
---
## Problème
Les 5 conteneurs agents Hermes (hermes-agent-tt, hermes-agent-nyora, hermes-agent-perso sur le NAS ; hermes-nabil et dsh-vps sur le VPS) perdaient tous leurs accents en cours de session — messages Telegram, fichiers écrits, sorties terminal, tout basculait en ASCII pur à un moment donné de l'exécution, y compris du texte déjà correctement accentué plus tôt dans la même session.
## Contexte et contraintes
Lecture directe du code source (`/opt/hermes/agent/conversation_loop.py`, identique dans les 5 conteneurs) : un mécanisme de secours `_force_ascii_payload` (~ligne 4429) se déclenche quand un appel API échoue UNE SEULE fois avec une erreur d'encodage ASCII (`_is_ascii_codec`). Une fois déclenché, le flag reste `True` pour tout le reste de l'exécution de l'agent et `_strip_non_ascii()` (`message_sanitization.py` ligne 336 : `text.encode('ascii', errors='ignore').decode('ascii')`) s'applique à TOUS les appels suivants — irréversible pour la session en cours.
Vérifié sur les 5 conteneurs (`docker exec <c> env | grep -iE "lang|lc_|pythonio|pythonutf"`) : aucun n'avait de variable LANG/LC_ALL/PYTHONIOENCODING/PYTHONUTF8 définie. Sans ça, l'encodage par défaut de Python retombe sur ASCII/C, ce qui rend le déclenchement de `_force_ascii_payload` quasi inévitable dès qu'un caractère accentué traverse un chemin sensible à l'encodage système — fréquent sur une session agentique longue avec beaucoup de tool_calls (le job veille écrit jusqu'à 20 fichiers JSON par run).
## Ce qui NE fonctionne PAS
| Tentative | Erreur obtenue | Raison de l'échec |
|-----------|----------------|-------------------|
| Réécrire le texte accentué à la main dans le prompt/heredoc après le déclenchement | Toujours désaccentué en sortie | `_force_ascii_payload` est un flag persistant pour toute la session — une fois `True`, `_strip_non_ascii()` s'applique même au texte déjà correct ; le contournement doit empêcher le déclenchement en amont, pas corriger après coup |
| Redémarrer le conteneur sans toucher aux variables d'environnement | Le bug revient au prochain déclenchement | Le redémarrage remet juste le flag à `False` — sans fixer l'encodage système par défaut, la première erreur ASCII rencontrée re-déclenche le mécanisme |
## Solution validée
Ajouter ces 4 variables d'environnement dans le `docker-compose.yml` de chacun des 5 conteneurs (`environment:`), puis recréer les conteneurs :
```yaml
LANG: C.UTF-8
LC_ALL: C.UTF-8
PYTHONIOENCODING: UTF-8
PYTHONUTF8: "1"
```
```bash
cd /volume1/docker/hermes-platform && docker compose up -d hermes-agent-tt hermes-agent-nyora hermes-agent-perso
# VPS : même ajout dans /home/claude-oversight/hermes-nabil/docker-compose.yml et /home/dsh-agent/dsh-vps/docker-compose.yml, puis docker compose up -d
```
## Vérification
```bash
for c in hermes-agent-nyora hermes-agent-tt hermes-agent-perso hermes-nabil dsh-vps; do
echo "=== $c ==="; docker exec $c env | grep -iE "lang|lc_|pythonio|pythonutf"
done
# Résultat attendu : les 4 variables présentes sur les 5 conteneurs
```
## Pièges spécifiques DSM / NAS
- Le bug ne se voit qu'APRÈS le premier déclenchement dans une session — un test rapide en début de session peut sembler « propre » alors que le risque reste entier dès qu'un tool_call rencontre un caractère accentué dans un contexte sensible à l'encodage (heredoc, nom de fichier, sortie de commande externe).
- `hermes-nabil` et `dsh-vps` (VPS) sont dans des dépôts Git séparés de `hermes-platform` (NAS) — penser aux deux `git commit`/`push` distincts, pas seulement au commit NAS. Les deux fixes VPS étaient appliqués aux conteneurs en cours d'exécution mais jamais commités jusqu'à vérification explicite après coup.
## Références
- `/opt/hermes/agent/conversation_loop.py` (~ligne 4429, `_force_ascii_payload`)
- `/opt/hermes/agent/message_sanitization.py` (ligne 336, `_strip_non_ascii`)
@@ -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