Feature #80
closedCorriger la génération de descriptions via IA depuis un PDF dans l'onglet Communications
100%
## Bug — Génération IA de descriptions depuis un PDF (onglet Communications)
### Cause racine probable
Le `LlmPort` (server/src/domain/ports/llm.port.ts) n'expose qu'un champ `file_urls`, et l'adaptateur OpenAI (server/src/infrastructure/llm/openai.adapter.ts) transforme chaque URL en `{ type: 'image_url' }`. Un PDF passé ainsi à gpt-4o n'est pas lu comme du texte → réponse vide ou non conforme au schéma JSON, et la fonction renvoie des descriptions vides sans remonter d'erreur. Il manque une étape d'EXTRACTION du texte du PDF en amont de l'appel LLM, et la gestion d'erreur ne distingue pas échec vs succès vide.
### Approche
1. Extraire le texte du PDF (non scanné) en amont de l'appel LLM ; passer le texte dans le prompt plutôt que le PDF brut dans file_urls.
2. Corriger la fonction backend (server/src/application/functions/) : extraction → prompt (courte 2-3 phrases = résumé artiste+style ; longue 4-5 phrases = parcours, influences, éléments spécifiques si présents) → LLM JSON mode → validation → erreur EXPLICITE si texte insuffisant.
3. UI Communications : afficher les descriptions (corriger le mapping/état qui laisse les champs vides) ; message d'erreur clair en cas d'échec.
### Critères d'acceptation
- Génération courte+longue pour tout PDF texte+images non scanné ; zones non vides en cas de succès ; aucun message d'erreur quand ça réussit ; courte 2-3 ph, longue 4-5 ph avec détails si dispo ; validé avec ≥3 PDF ; message d'erreur clair si texte insuffisant ; tests backend (LlmPort fake) + lint/typecheck verts.
### Portée : un seul lot (extraction PDF → LLM → UI). Pas de découpage.
Description
### Problème
Dans l’onglet *Communications* de Scobby, la fonctionnalité de génération automatique de descriptions (courte et longue) à partir d’un PDF de présentation d’artiste **ne fonctionne pas**.
### Contexte
- **Comportement actuel** : Lorsqu’un utilisateur télécharge un PDF (contenant du texte et des images, non scanné), **aucune description n’est générée** :
- Les zones de texte pour les descriptions courte et longue restent vides.
- Aucun message d’erreur ne s’affiche.
- Ce problème se produit **à chaque tentative**, quel que soit le PDF utilisé.
- **Impact** : Cette fonctionnalité est **bloquante** pour le travail quotidien des utilisateurs, qui dépendent de ces descriptions pour les communications (réseaux sociaux, communiqués de presse, etc.).
### Comportement attendu
- **Description courte** (2-3 phrases) : Résumer l’artiste et son style, avec des exemples concrets (exemple : *« DJ électro minimaliste, connu pour ses sets hypnotiques et son approche épurée des basses. Son univers sonore mêle influences techno berlinoises et ambiances planantes. »*).
- **Description longue** (4-5 phrases) : Inclure le parcours, les influences, et des **éléments spécifiques si disponibles** dans le PDF (exemples : festivals, collaborations, nombre de sorties).
- Exemple : *« Artiste incontournable de la scène électro européenne, [Nom] a marqué les festivals par ses performances immersives. Formé aux platines dans les clubs underground de Berlin, il développe un style unique, entre minimalisme rythmé et textures atmosphériques. Ses sets, souvent improvisés, s’adaptent à l’énergie du public. Ses dernières productions explorent des sonorités organiques, intégrant des samples de field recordings. Une signature sonore qui lui vaut une reconnaissance internationale, des scènes comme [Festival X] aux labels indépendants comme [Label Y]. »*.
## Acceptance criteria
['- [ ] La génération de descriptions (courte et longue) fonctionne à nouveau pour **tous les PDF** contenant du texte et des images (non scannés).', '- [ ] Les zones de texte affichent bien les descriptions générées, sans rester vides.', '- [ ] Aucun message d’erreur n’apparaît lors de la génération.', '- [ ] La description courte résume l’artiste et son style en **2-3 phrases**, comme spécifié dans les exemples.', '- [ ] La description longue inclut **4-5 phrases** avec des détails sur le parcours, les influences, et des éléments spécifiques (festivals, collaborations, etc.) **si disponibles dans le PDF**.', '- [ ] Un test est effectué avec **au moins 3 PDF différents** pour valider la robustesse de la solution.', '- [ ] Un message d’erreur clair s’affiche si le PDF ne contient pas suffisamment de texte pour générer une description (exemple : *« Le PDF ne contient pas assez de texte pour générer une description. Veuillez utiliser un fichier plus détaillé. »*).']
## Classification
- bug
## Complexity
- 7/10 — Le bug nécessite une investigation approfondie du pipeline de traitement des PDF et de l’intégration avec l’IA, ainsi qu’un ajustement des prompts pour répondre aux attentes des utilisateurs.
RA Updated by Redmine Admin about 2 months ago
- Status changed from Submitted to Spec
Spec en cours (factory). Transition Submitted → Spec.
RA Updated by Redmine Admin about 2 months ago
- % Done changed from 0 to 100
- spec_ref updated (diff)
**Spec terminée** — pas de découpage. Cause racine : pas d'extraction de texte PDF avant l'appel LLM (LlmPort envoie le PDF comme image). `spec_ref` renseigné, `done_ratio=100`. Reste à **Spec** (prêt pour le dev, bug → pas de design).
RA Updated by Redmine Admin about 2 months ago
- Status changed from Spec to In development
- branch set to fix/80-ai-pdf-desc
Dev démarré (worktree isolé, branche `fix/80-ai-pdf-desc` sur `origin/dev`). Spec → In development.
RA Updated by Redmine Admin about 2 months ago
- Status changed from In development to QA
- pr_url set to https://github.com/Scobby-organisation/scobby/pull/3
PR #3 mergée dans `dev` (squash), CI Jenkins verte. In development → QA. Gates : server test:unit 37/37, typecheck, lint, build verts. Génération réelle (vrais PDF + clé OpenAI) à valider en préprod.
RA Updated by Redmine Admin about 2 months ago
- Status changed from QA to Preprod
Déployé en préprod (https://preprod-scobby.omdev.tech). Passage QA → Preprod.
RA Updated by Redmine Admin about 1 month ago
- Status changed from Preprod to Ready to ship
Livré sur master (dev = preprod = master). Commit `dae0b7f1` (PR #3) — fix(communications): génération IA des descriptions depuis un PDF. Passage en **Ready to ship** — *Shipped* après confirmation du gate prod manuel (Jenkins) sur scobby.fr.
RA Updated by Redmine Admin about 1 month ago
- Status changed from Ready to ship to Shipped
- deploy_status set to deployed
- deployed_at set to 06/23/2026
Déploiement PROD confirmé live sur scobby.fr (gate manuel Jenkins approuvé le 2026-06-23). Passage en **Shipped**.