docs: runbooks accents fleet-wide UTF-8 + veille nexum (image telegram, fidelite titre, deepseek)
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user