From 11afea2afc9d6f32cf5698f901032fcbf729a06c Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Wed, 30 Apr 2025 17:20:20 +0200 Subject: [PATCH] =?UTF-8?q?Mise=20=C3=A0=20jour=20rapide?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 81 ++---- command_list/Git commands.md | 43 +-- inbox/Gestion des langues.md | 274 +++++++++++++++++++ inbox/Guide Complet des Paramètres LLM.md | 317 ++++++++++++++++++++++ inbox/Notes brutes.md | 3 + inbox/diagrammellamavision.drawio | 71 ++--- inbox/main_llama.py.md | 238 +++++++++++++++- 7 files changed, 911 insertions(+), 116 deletions(-) create mode 100644 inbox/Gestion des langues.md create mode 100644 inbox/Guide Complet des Paramètres LLM.md create mode 100644 inbox/Notes brutes.md diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index d8165a6..463f25f 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -8,63 +8,20 @@ "type": "tabs", "children": [ { - "id": "f1f108f7404a3683", + "id": "f53d68a91dcd39e9", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "inbox/Pipeline de mon programme.md", - "mode": "source", + "file": "inbox/Guide Complet des Paramètres LLM.md", + "mode": "preview", "source": false }, "icon": "lucide-file", - "title": "Pipeline de mon programme" - } - }, - { - "id": "72e00615d75c2be6", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "inbox/Mise en place process (llmticket) avec Llama-vision3.2-90b.md", - "mode": "source", - "source": false - }, - "icon": "lucide-file", - "title": "Mise en place process (llmticket) avec Llama-vision3.2-90b" - } - }, - { - "id": "13482c622bd19d29", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "inbox/main_llama.py.md", - "mode": "source", - "source": false - }, - "icon": "lucide-file", - "title": "main_llama.py" - } - }, - { - "id": "1fc4cfbca2f618d7", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "inbox/Modules OCR et Traduction.md", - "mode": "source", - "source": false - }, - "icon": "lucide-file", - "title": "Modules OCR et Traduction" + "title": "Guide Complet des Paramètres LLM" } } - ], - "currentTab": 3 + ] } ], "direction": "vertical" @@ -415,11 +372,23 @@ "obsidian-excalidraw-plugin:New drawing": false } }, - "active": "1fc4cfbca2f618d7", + "active": "f53d68a91dcd39e9", "lastOpenFiles": [ - "inbox/main_llama.py.md", "inbox/Modules OCR et Traduction.md", + "inbox/main_llama.py.md", + "inbox/Guide Complet des Paramètres LLM.md", + "inbox/Gestion des langues.md", + "command_list/Ollama commands.md", + "inbox/diagrammellamavision.drawio.crswap", + "command_list/Git commands.md", + "inbox/Notes brutes.md", "inbox/Mise en place process (llmticket) avec Llama-vision3.2-90b.md", + "inbox/wild.md", + "inbox/StreamDeck config.md", + "inbox/Script suivi JSON résultats.md", + "inbox/Questions pour Karim.md", + "inbox/Prompt recherches approfondis LLM (Pixtral-Large).md", + "inbox/Pipeline de mon programme.md", "inbox/llama3.2-vision_ticket_support.md", "inbox/Non confirmé 758543.crdownload", "ollama/Plan d'apprentissage détaillé sur Ollama.md", @@ -433,19 +402,7 @@ "LLM/Test Cline.md", "LLM/Résumé LLM-lab.md", "LLM/Recherches LLama Vision 3.2 90b.md", - "LLM/Récapiltulatif optimisation de mes agents.md", - "LLM/Plan_Ragflow_Ollama_LLM_Vision.md", - "LLM/Gestion_Multi_Ollama_Ports_avec_Serveur_Remote.md", - "LLM/Multi_Ollama_Config_Docker_Memo.md", - "command_list/Git commands.md", - "inbox/Pipeline de mon programme.md", - "inbox/Orchestrteur.md", - "inbox/diagrammellamavision.drawio.crswap", - "inbox/Script suivi JSON résultats.md", "inbox/diagrammellamavision.drawio", - "inbox/Prompt recherches approfondis LLM (Pixtral-Large).md", - "inbox/Questions pour Karim.md", - "inbox/Prompt readme.md", "inbox/jsonmessages.png", "inbox/agentanalyseimage.png", "inbox/agentanalysetexte.png", diff --git a/command_list/Git commands.md b/command_list/Git commands.md index 3a9fba0..12c3e3d 100644 --- a/command_list/Git commands.md +++ b/command_list/Git commands.md @@ -4,24 +4,29 @@ --- ## 🧠 Tableau récapitulatif des commandes Git utiles -| Commande Git | Utilité | -| -------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- | -| `git status` | Affiche les fichiers modifiés | -| `git add .` | Ajoute tous les fichiers à l’index | -| `git commit -m "message"` | Enregistre les changements avec un message | -| `git push` | Envoie les changements sur GitHub | -| `git pull` | Récupère les derniers changements | -| `git branch` | Liste les branches locales | -| `git switch ` | Change de branche | -| `git checkout -b ` | Crée et bascule sur une nouvelle branche | -| `git log --oneline` | Historique rapide des commits | -| `git stash` / `pop` | Sauvegarde temporaire de changements | -| git fetch origin
git reset --hard origin/nom_de_la_branche_distante` | Ecrase ta branche locale avec le contenu de la branche distante | -| git checkout -b nouvelle_branche
git fetch origin
git reset --hard origin/stable-version
| nouvelle_branche identique à origin/stable-version | -| git remote -v | URL du dépôt distant | -| git fetch origin
git merge origin/nom_de_la_branche | Mettre à jour une branche locale depuis un dépôt distant | -| git fetch origin
git reset --hard origin/nom_de_la_branche
| Mettre à jour en écrasant les modifications locales | -| git fetch --prune | Nettoie les fichiers obsolètes | -| git status -sb | connaître à quelle branche distante est rattâchée la locale | +| Commande Git | Utilité | +| -------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | +| `git status` | Affiche les fichiers modifiés | +| `git add .` | Ajoute tous les fichiers à l’index | +| `git commit -m "message"` | Enregistre les changements avec un message | +| `git push` | Envoie les changements sur GitHub | +| `git pull` | Récupère les derniers changements | +| `git branch` | Liste les branches locales | +| `git switch ` | Change de branche | +| `git checkout -b ` | Crée et bascule sur une nouvelle branche | +| `git log --oneline` | Historique rapide des commits | +| `git stash` / `pop` | Sauvegarde temporaire de changements | +| git fetch origin
git reset --hard origin/nom_de_la_branche_distante` | Ecrase ta branche locale avec le contenu de la branche distante | +| git checkout -b nouvelle_branche
git fetch origin
git reset --hard origin/stable-version
| nouvelle_branche identique à origin/stable-version | +| git remote -v | URL du dépôt distant | +| git fetch origin
git merge origin/nom_de_la_branche | Mettre à jour une branche locale depuis un dépôt distant | +| git fetch origin
git reset --hard origin/nom_de_la_branche
| Mettre à jour en écrasant les modifications locales | +| git fetch --prune | Nettoie les fichiers obsolètes | +| git status -sb | connaître à quelle branche distante est rattâchée la locale | +| git branch -d nom_del_la_branche | Supprime une branche locale | +| git branch -D origin --delete nom_de_la_branche | Supprime branche distante | +| git remote prune origin | supprime les références à des branches distantes déjà supprimées | +| git push origin --delete nom_de_la_branche | Supprimer branche distante | +| git reset --hard
git clean -fd
| **pour tout remettre propre** comme si tu n’avais jamais touché | --- diff --git a/inbox/Gestion des langues.md b/inbox/Gestion des langues.md new file mode 100644 index 0000000..fdb5b6b --- /dev/null +++ b/inbox/Gestion des langues.md @@ -0,0 +1,274 @@ +Je vais analyser le flux de traduction anglais-français dans le pipeline. Examinons chaque étape clé : + +Read orchestrator_llama.py + +L80-279 + +D'après l'analyse du code, voici les points clés concernant la gestion anglais-français dans le pipeline : + +1. Chargement et Traduction du Ticket : + +- Le contenu original du ticket est préservé dans ticket_data["content_original"] + +- Une détection automatique de la langue est effectuée + +- La traduction en anglais est stockée dans ticket_data["content_en"] + +- Le contenu original n'est pas perdu, il est simplement stocké séparément + +1. Traitement OCR des Images : + +- Le texte est extrait en français (ocr_fr) + +- Une traduction en anglais est effectuée (ocr_en) + +- Les résultats sont stockés dans ocr_results avec : + + python + + Apply to rapport_fina... + +   { + +       "texte_fr": ocr_fr, + +       "texte_en": ocr_en, + +       "langue_detectee": langue + +   } + + +Vérifions maintenant comment les agents utilisent ces informations : + +Read agent_ticket_analyser.py + +L1-200 + +Je vois plusieurs points à améliorer dans la gestion des langues : + +1. Dans AgentTicketAnalyser : + +- Le code gère déjà bien la traduction avec content_en + +- Il faut s'assurer que l'analyse est faite en anglais mais que les résultats sont stockés dans les deux langues + +Vérifions maintenant le générateur de rapports : + +Read agent_report_generator.py + +L1-200 + +Je vois que le générateur de rapports gère déjà bien la traduction avec : + +1. Détection du modèle utilisé (LlamaVision ou autre) + +2. Traduction du prompt en anglais si nécessaire + +3. Traduction de la réponse en français si nécessaire + +4. Stockage des deux versions (FR/EN) dans les résultats + +Vérifions maintenant comment l'OCR gère les langues : + +Read agent_image_analyser.py + +L200-399 + +Je vois que l'analyseur d'images gère déjà bien les langues avec : + +1. Un prompt explicitement en anglais : [ENGLISH RESPONSE REQUESTED] + +2. Une gestion du texte OCR en anglais via ocr_info.get("texte_en", "") + +3. Une traduction conditionnelle basée sur mode_anglais_uniquement + +4. Un stockage des résultats dans les deux langues dans le dictionnaire de résultats + +Vérifions maintenant l'analyseur de tickets : + +Read agent_ticket_analyser.py + +L1-200 + +Je vois que l'analyseur de tickets gère aussi bien les langues avec : + +1. Un prompt système explicitement en anglais : IMPORTANT: All responses should be in English. Translation to French will be handled separately. + +2. Une gestion du contenu bilingue : + +- Utilisation de content_en s'il existe + +- Vérification de is_english pour le contenu + +- Support de la traduction via fr_to_en et en_to_fr + +Vérifions maintenant comment l'OCR est géré dans le code : + +Grepped codebase for "ocr" + +Je vois que l'OCR est géré dans utils/ocr_utils.py. Vérifions ce fichier : + +Read ocr_utils.py + +L1-200 + +Je vois que l'OCR est implémenté avec plusieurs fonctionnalités sophistiquées : + +1. Prétraitement d'image (pretraiter_image) : + +- Optimisation pour le texte avec binarisation adaptative + +- Débruitage intelligent (différent pour images couleur et noir/blanc) + +- Amélioration du contraste et de la netteté + +- Redimensionnement si nécessaire + +1. Détection de langue (detecter_langue_texte) : + +- Utilise langdetect pour identifier la langue du texte + +- Retourne 'fr', 'en' ou 'unknown' + +1. Complétion de mots (completer_mots_tronques) : + +- Corrige les mots coupés ou tronqués + +- Utilise un dictionnaire de termes techniques spécifiques + +- Gère les coupures de ligne intelligemment + +1. Extraction de texte (extraire_texte) : + +- Supporte la détection automatique de langue + +- Utilise pytesseract pour l'OCR + +Vérifions comment l'OCR est utilisé dans l'analyseur d'images : + +Grepped codebase for "extraire_texte" + +Je vois que l'OCR est principalement utilisé dans orchestrator_llama.py. Vérifions son implémentation : + +Read orchestrator_llama.py + +L165-364 + +Je vois que l'OCR est bien intégré dans l'orchestrateur avec les caractéristiques suivantes : + +1. L'OCR est activé par défaut (ocr_enabled dans la config) + +2. Il est exécuté sur toutes les images avant le tri + +3. Les résultats sont stockés dans ocr_results avec : + +- Le texte en français (texte_fr) + +- Le texte traduit en anglais (texte_en) + +- La langue détectée (langue_detectee) + +1. Les résultats OCR sont utilisés pour : + +- Enrichir le contexte pour l'agent de tri d'images + +- Sauvegarder les résultats dans le répertoire pipeline + +- Fournir du contexte à l'agent d'analyse d'images + +Le problème de rapport avec "unknown_model" pourrait être lié à la façon dont les métadonnées sont gérées dans l'agent d'analyse d'images. Vérifions l'implémentation de l'agent d'analyse d'images : + +Read agent_image_analyser.py + +L1-200 + +Je vois que l'agent d'analyse d'images utilise le modèle LLM passé en paramètre, mais il faut vérifier comment le nom du modèle est géré dans la méthode executer. Regardons cette partie : + +Read agent_image_analyser.py + +L232-431 + +Je vois le problème. Dans la méthode executer, nous utilisons getattr(self.llm, "pipeline_normalized_name", None) pour obtenir le nom du modèle normalisé, mais il faut s'assurer que cette valeur est correctement définie dans la classe LlamaVision. Vérifions son implémentation : + +Read llama_vision.py + +L1-200 + +Je vois que dans la classe LlamaVision, la méthode _normalize_model_name définit correctement self.pipeline_normalized_name. Cependant, il y a un problème dans la façon dont nous l'utilisons dans AgentImageAnalyser. Modifions la méthode executer pour garantir que nous utilisons le bon nom de modèle : + +Read agent_image_analyser.py + +L232-431 + +Je vois le problème. Dans la classe LlamaVision, l'attribut pipeline_normalized_name est défini, mais nous devons nous assurer qu'il est correctement initialisé avant d'être utilisé. Modifions la méthode executer de AgentImageAnalyser pour gérer cela de manière plus robuste : + +agent_image_analyser.py + +Apply to agent_image_... + +// ... existing code ... + +            # Obtenir le nom du modèle de manière plus robuste + +            model_name = None + +            if hasattr(self.llm, "pipeline_normalized_name"): + +                model_name = self.llm.pipeline_normalized_name + +            if model_name is None and hasattr(self.llm, "modele"): + +                model_name = self.llm.modele + +            if model_name is None: + +                model_name = "llama3-vision-90b-instruct" + +            resultat = { + +                "timestamp": self._get_timestamp(), + +                "image": nom_image, + +                "ticket_id": ticket_id, + +                "analyse": { + +                    "en": reponse_en, + +                    "fr": reponse_fr if reponse_fr else reponse_en + +                }, + +                "metadata": { + +                    "model_info": { + +                        "name": model_name, + +                        "type": "vision", + +                        "parameters": self.llm.params if hasattr(self.llm, "params") else {} + +                    }, + +                    "image_path": image_path, + +                    "success": True + +                } + +            } + +// ... existing code ... + +Cette modification apporte plusieurs améliorations : + +1. Vérification plus robuste de l'existence des attributs avec hasattr() + +2. Cascade de vérifications pour obtenir le nom du modèle + +3. Gestion plus sûre des paramètres du modèle avec une vérification de l'existence de params + +Ces changements devraient résoudre le problème d'accès à pipeline_normalized_name et assurer que le nom du modèle est toujours correctement défini dans les métadonnées. \ No newline at end of file diff --git a/inbox/Guide Complet des Paramètres LLM.md b/inbox/Guide Complet des Paramètres LLM.md new file mode 100644 index 0000000..5aa6a0f --- /dev/null +++ b/inbox/Guide Complet des Paramètres LLM.md @@ -0,0 +1,317 @@ + + +# 📘 Paramètres Avancés LLM – Open WebUI & Ollama + + + +Ce document présente une explication claire et complète des paramètres de génération d’un modèle LLM via Open WebUI, compatible avec un usage dans **Obsidian**. + + + +--- + + + +## ⚙️ Paramètres Généraux + + + +- **Streamer la réponse de la conversation** + +  - Active le mode de génération mot par mot, visible en temps réel. + +  - ✅ Recommandé pour le chat interactif. + +  - ❌ Peut réduire les performances sur des machines lentes. + + + +- **Function Calling** + +  - Permet au modèle de déclencher des fonctions (si la fonction est supportée par le modèle, comme GPT-4). + + + +- **Seed** + +  - Graine aléatoire pour rendre les générations reproductibles. + +  - Exemple : `seed = 42` -> toujours la même sortie pour le même prompt. + +  - Par défaut : valeur aléatoire. + + + +- **Séquence d'arrêt (`stop`)** + +  - Liste de chaînes qui, si rencontrées, interrompent immédiatement la génération. + +  - Exemple : `["\nUser:", "###"]` + + + +--- + + + +## 🔥 Paramètres de Style et de Créativité + + + +- **Température (`temperature`)** + +  - Contrôle la créativité du modèle. + +  - Borne typique : `0.0` (très déterministe) à `1.5` (très créatif). + +  - ✅ Valeurs recommandées : `0.7` (équilibré), `1.0+` pour brainstorm. + +  - 🧊 `0.0` = réponse toujours identique. + + + +- **Top K** + +  - Ne garde que les `K` tokens les plus probables à chaque étape. + +  - Borne : `0` (désactivé) à `100+`. + +  - Exemple : `Top K = 40` -> le modèle choisit parmi les 40 tokens les plus probables. + + + +- **Top P (`top_p`)** + +  - Filtrage probabiliste : garde les tokens jusqu'à atteindre une somme de probabilité donnée. + +  - Borne : `0.0` à `1.0`. + +  - Exemple : `0.9` = conserve les tokens représentant 90% de probabilité cumulée. + + + +- **P min** + +  - Probabilité minimale absolue pour inclure un token dans le choix. + +  - Borne : `0.0` à `1.0`. + + + +--- + + + +## 🧠 Paramètres de Contrôle de la Répétition + + + +- **Pénalité de fréquence** + +  - Pénalise les tokens répétés selon leur fréquence d’apparition. + +  - Valeurs typiques : `0.0` (pas de pénalité) à `2.0`. + + + +- **Pénalité de présence** + +  - Pénalise les tokens qui ont déjà été générés une fois. + +  - Utile pour éviter la redondance. + + + +- **Pénalité de répétition (Ollama)** + +  - Directement appliquée au moteur Ollama. + +  - Valeurs typiques : `1.0` (neutre), `>1.0` pour plus de diversité (ex. `1.2`), `<1.0` = plus conservateur. + + + +- **Répéter les N derniers** + +  - Longueur de la fenêtre contextuelle analysée pour la détection de répétitions. + + + +--- + + + +## 🧪 Algorithmes Avancés + + + +- **Effort de raisonnement** + +  - Ajuste la profondeur logique du modèle. + +  - Plus la valeur est haute, plus le modèle essaiera de construire une réponse "logique" (si supporté). + + + +- **Logit Bias** + +  - Permet de favoriser ou de bloquer certains tokens. + +  - Format : dictionnaire `{token_id: bias_value}` + +  - Exemple : `{1234: -100}` empêche un token d'apparaître. + + + +- **Mirostat** + +  - Algorithme pour maintenir une perplexité constante. + +  - `0` = désactivé, `1` = activé. + +  - Utilisé pour une génération plus stable. + + + +- **Mirostat Eta** + +  - Taux d’ajustement dans l’algorithme Mirostat. + +  - Valeur typique : `0.1` à `1.0`. + + + +- **Mirostat Tau** + +  - Cible de perplexité à maintenir. + +  - Valeur typique : `2.0` à `5.0`. + + + +- **Tfs Z** + +  - Top Free Sampling : alternative à Top P avec une approche basée sur la surprise du token. + +  - Moins courant, expérimental. + + + +--- + + + +## 🧩 Contexte et Tokenisation + + + +- **Tokens à conserver (`num_keep`)** + +  - Nombre de tokens à préserver lors du rafraîchissement du contexte. + +  - Utile pour les instructions système ou les préambules. + + + +- **Nb max de tokens (`num_predict`)** + +  - Limite maximale de tokens générés en réponse. + +  - Typiquement : `128` à `4096` voire `32k` selon les modèles. + + + +- **Longueur du contexte (Ollama)** + +  - Taille mémoire maximale disponible pour prompt + génération. + +  - Varie selon le modèle : `4096`, `8192`, `32768`, `128000`, etc. + + + +--- + + + +## 🧵 Exécution & Performance (spécifique à Ollama) + + + +- **Batch Size (`num_batch`)** + +  - Nombre de tokens traités simultanément. + +  - Peut accélérer l’inférence mais consomme plus de RAM/VRAM. + + + +- **Utiliser mmap** + +  - Active le chargement du modèle en mémoire mappée (plus rapide, nécessite moins de RAM). + + + +- **Utiliser mlock** + +  - Empêche le modèle d’être swapé sur le disque (nécessite des droits root). + + + +- **Threads (`num_thread`)** + +  - Nombre de threads CPU utilisés pour l’inférence. + +  - Exemple : `8`, `16`, selon ton CPU. + + + +- **GPU (`num_gpu`)** + +  - Nombre de GPU à utiliser. + +  - `0` = désactive le GPU, `1` = un seul GPU, `auto` = automatique. + + + +--- + + + +## 📤 Exemple d'appel API Ollama + + + +```json + +{ + +  "model": "llama3.2-vision:90b-instruct-q8_0", + +  "prompt": "Explique la gravité quantique", + +  "temperature": 0.7, + +  "top_p": 0.9, + +  "repeat_penalty": 1.1, + +  "num_predict": 512, + +  "stream": false + +} + +``` + + + +--- + + + +## 🔗 Liens utiles + + + +- [🔗 Docs OpenWebUI](https://docs.openwebui.com) + +- [🔗 Ollama Modelfile Reference](https://github.com/ollama/ollama/blob/main/docs/modelfile.md) \ No newline at end of file diff --git a/inbox/Notes brutes.md b/inbox/Notes brutes.md new file mode 100644 index 0000000..bf185da --- /dev/null +++ b/inbox/Notes brutes.md @@ -0,0 +1,3 @@ +- Peut on simplifier la gestion des langues + - pendant le process uniquement traduire en fr pour les rapports dans mon pipeline + - \ No newline at end of file diff --git a/inbox/diagrammellamavision.drawio b/inbox/diagrammellamavision.drawio index 1bd4f2a..4002ccf 100644 --- a/inbox/diagrammellamavision.drawio +++ b/inbox/diagrammellamavision.drawio @@ -1,69 +1,72 @@ - + - + + + + + + - + - + - - + + - + - - + + - + - + - + - - + + + + + - + - - - - + - - + + + + + + + + - + - + - - + + - - - - - - - - - + diff --git a/inbox/main_llama.py.md b/inbox/main_llama.py.md index 4f1f6da..60ac296 100644 --- a/inbox/main_llama.py.md +++ b/inbox/main_llama.py.md @@ -1,2 +1,238 @@ #### Phase de test tri image -python main_llama.py --skip-ticket-analysis --skip-image-analysis --skip-report \ No newline at end of file +python main_llama.py --skip-ticket-analysis --skip-image-analysis --skip-report + +### 🧩 1. Préparation initiale (via `main_llama.py`) + +#### 🔹 Entrées : + +- ID du ticket (`T11143`) + +- Arguments éventuels : `--skip-*` + + +#### 🔹 Appels internes : + +- `OrchestratorLlama.executer(ticket_id, config)` + + +--- + +## 🧠 Pipeline complet orchestré + +### ▶️ Étape 1 : **Chargement des données** + +📁 Fichier : `ticket_data_loader.py` + +- Charge : + + - Données du ticket (`ticket.json`) + + - Captures d’écran (`*.png`, `*.jpg`, `*.gif`) + +- Transmet : + + - `ticket` (dict) + + - `images` (list[str]) ← chemins absolus + + +--- + +### ▶️ Étape 2 : **Dédoublonnage** + +📁 Fichier : `image_dedup.py` + +- Entrée : `images` + +- Méthode : distance de Hamming + +- Sortie : `images_uniques` (filtrées) + + +✅ À partir d’ici, on ne traite plus que les images utiles + +--- + +### ▶️ Étape 3 : **OCR + Traduction** + +📁 Fichiers : `ocr_utils.py` + `translate_utils.py` + +#### Pour chaque image : + +1. `ocr_utils.extraire_texte_fr(image_path)` + + - → texte brut FR + +2. `translate_utils.fr_to_en()` + + - → traduction EN + +3. `translate_utils.en_to_fr()` (optionnel) + + - → re-traduction EN→FR + +4. `translate_utils.sauvegarder_ocr_traduction()` + + - 🔽 Sauvegarde : + + - `ocr_traduction/.json` + + - `ocr_traduction.txt` (append) + + +--- + +## 🤖 CHAÎNE D’AGENTS + +--- + +### ▶️ Étape 4 : `AgentImageSorter` + +📁 Fichier : `agent_image_sorter.py` + +#### Reçoit : + +- 1 image à la fois + +- OCR_FR + EN injecté dans prompt + + +#### Fonction : + +- Génère un prompt en anglais + +- Analyse via `llama_vision.interroger_avec_image()` + + +#### Rend : + +- JSON avec : + + - `is_relevant: bool` + + - `reason` + + - `raw_response` + + - `ocr_fr`, `ocr_en` + +- 🔽 Sauvegarde : + + - `tri_image_llama_*.json` + + - `tri_image_llama_*.txt` + + +--- + +### ▶️ Étape 5 : `AgentImageAnalyser` + +📁 Fichier : `agent_image_analyser.py` + +#### Reçoit : + +- Liste des **images pertinentes** + +- (via `image_sorter`) + + +#### Fonction : + +- Prompt visuel spécifique par image + +- Analyse ce que montre l’image + +- Peut enrichir le contenu visuel à inclure dans le rapport + + +#### Rend : + +- Pour chaque image : + + - Résumé structuré + + - Mots-clés, erreurs détectées, éléments visuels + +- 🔽 Sauvegarde : + + - `analyse_image_llama_*.json` + + - `analyse_image_llama_*.txt` + + +--- + +### ▶️ Étape 6 : `AgentTicketAnalyser` + +📁 Fichier : `agent_ticket_analyser.py` + +#### Reçoit : + +- Texte du ticket + +- Analyse des images pertinentes + + +#### Fonction : + +- Génère des Q&R contextuelles + +- Résume le besoin utilisateur ou les problèmes détectés + + +#### Rend : + +- Liste de Q/R + +- Résumé en texte libre + +- 🔽 Sauvegarde : + + - `analyse_ticket_llama_*.json` + + - `analyse_ticket_llama_*.txt` + + +--- + +### ▶️ Étape 7 : `AgentReportGenerator` + +📁 Fichier : `agent_report_generator.py` + +#### Reçoit : + +- Analyse du ticket + +- Analyse des images + + +#### Fonction : + +- Génère un **rapport final** structuré + +- Peut créer des tableaux CSV/Q&A + + +#### Rend : + +- `rapport_final_llama_*.json` + +- `rapport_final_llama_*.txt` + +- CSV généré si demandé + + +--- + +### 🧾 Étapes transverses + +Tous les agents : + +- Appellent `sauvegarder_donnees()` de `pipeline_logger.py` + +- Le chemin est déterminé par `ticket_id`, `timestamp`, `base_dir="reports"` → `output/ticket_TXXXX/TXXXX_YYYYMMDD_HHMMSS/TXXXX_rapports/pipeline/` + + +--- + +## ✅ Résumé des attentes par agent \ No newline at end of file