Mise à jour rapide

This commit is contained in:
Ladebeze66 2025-04-30 17:20:20 +02:00
parent b0474ba052
commit 11afea2afc
7 changed files with 911 additions and 116 deletions

View File

@ -8,63 +8,20 @@
"type": "tabs", "type": "tabs",
"children": [ "children": [
{ {
"id": "f1f108f7404a3683", "id": "f53d68a91dcd39e9",
"type": "leaf", "type": "leaf",
"state": { "state": {
"type": "markdown", "type": "markdown",
"state": { "state": {
"file": "inbox/Pipeline de mon programme.md", "file": "inbox/Guide Complet des Paramètres LLM.md",
"mode": "source", "mode": "preview",
"source": false "source": false
}, },
"icon": "lucide-file", "icon": "lucide-file",
"title": "Pipeline de mon programme" "title": "Guide Complet des Paramètres LLM"
}
},
{
"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"
} }
} }
], ]
"currentTab": 3
} }
], ],
"direction": "vertical" "direction": "vertical"
@ -415,11 +372,23 @@
"obsidian-excalidraw-plugin:New drawing": false "obsidian-excalidraw-plugin:New drawing": false
} }
}, },
"active": "1fc4cfbca2f618d7", "active": "f53d68a91dcd39e9",
"lastOpenFiles": [ "lastOpenFiles": [
"inbox/main_llama.py.md",
"inbox/Modules OCR et Traduction.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/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/llama3.2-vision_ticket_support.md",
"inbox/Non confirmé 758543.crdownload", "inbox/Non confirmé 758543.crdownload",
"ollama/Plan d'apprentissage détaillé sur Ollama.md", "ollama/Plan d'apprentissage détaillé sur Ollama.md",
@ -433,19 +402,7 @@
"LLM/Test Cline.md", "LLM/Test Cline.md",
"LLM/Résumé LLM-lab.md", "LLM/Résumé LLM-lab.md",
"LLM/Recherches LLama Vision 3.2 90b.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/diagrammellamavision.drawio",
"inbox/Prompt recherches approfondis LLM (Pixtral-Large).md",
"inbox/Questions pour Karim.md",
"inbox/Prompt readme.md",
"inbox/jsonmessages.png", "inbox/jsonmessages.png",
"inbox/agentanalyseimage.png", "inbox/agentanalyseimage.png",
"inbox/agentanalysetexte.png", "inbox/agentanalysetexte.png",

View File

@ -4,24 +4,29 @@
--- ---
## 🧠 Tableau récapitulatif des commandes Git utiles ## 🧠 Tableau récapitulatif des commandes Git utiles
| Commande Git | Utilité | | Commande Git | Utilité |
| -------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- | | -------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
| `git status` | Affiche les fichiers modifiés | | `git status` | Affiche les fichiers modifiés |
| `git add .` | Ajoute tous les fichiers à lindex | | `git add .` | Ajoute tous les fichiers à lindex |
| `git commit -m "message"` | Enregistre les changements avec un message | | `git commit -m "message"` | Enregistre les changements avec un message |
| `git push` | Envoie les changements sur GitHub | | `git push` | Envoie les changements sur GitHub |
| `git pull` | Récupère les derniers changements | | `git pull` | Récupère les derniers changements |
| `git branch` | Liste les branches locales | | `git branch` | Liste les branches locales |
| `git switch <branche>` | Change de branche | | `git switch <branche>` | Change de branche |
| `git checkout -b <branche>` | Crée et bascule sur une nouvelle branche | | `git checkout -b <branche>` | Crée et bascule sur une nouvelle branche |
| `git log --oneline` | Historique rapide des commits | | `git log --oneline` | Historique rapide des commits |
| `git stash` / `pop` | Sauvegarde temporaire de changements | | `git stash` / `pop` | Sauvegarde temporaire de changements |
| git fetch origin<br>git reset --hard origin/nom_de_la_branche_distante` | Ecrase ta branche locale avec le contenu de la branche distante | | git fetch origin<br>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<br>git fetch origin<br>git reset --hard origin/stable-version<br> | nouvelle_branche identique à origin/stable-version | | git checkout -b nouvelle_branche<br>git fetch origin<br>git reset --hard origin/stable-version<br> | nouvelle_branche identique à origin/stable-version |
| git remote -v | URL du dépôt distant | | git remote -v | URL du dépôt distant |
| git fetch origin<br>git merge origin/nom_de_la_branche | Mettre à jour une branche locale depuis un dépôt distant | | git fetch origin<br>git merge origin/nom_de_la_branche | Mettre à jour une branche locale depuis un dépôt distant |
| git fetch origin<br>git reset --hard origin/nom_de_la_branche<br> | Mettre à jour en écrasant les modifications locales | | git fetch origin<br>git reset --hard origin/nom_de_la_branche<br> | Mettre à jour en écrasant les modifications locales |
| git fetch --prune | Nettoie les fichiers obsolètes | | git fetch --prune | Nettoie les fichiers obsolètes |
| git status -sb | connaître à quelle branche distante est rattâchée la locale | | 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 <commit_id><br>git clean -fd<br> | **pour tout remettre propre** comme si tu navais jamais touché |
--- ---

View File

@ -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.

View File

@ -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 dun 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 dapparition.
  - 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 dajustement dans lalgorithme 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 linfé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 linfé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)

3
inbox/Notes brutes.md Normal file
View File

@ -0,0 +1,3 @@
- Peut on simplifier la gestion des langues
- pendant le process uniquement traduire en fr pour les rapports dans mon pipeline
-

View File

@ -1,69 +1,72 @@
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36" version="26.2.13"> <mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36" version="26.2.13">
<diagram name="Page-1" id="LQTFNXrpgvSxlSF6fcml"> <diagram name="Page-1" id="LQTFNXrpgvSxlSF6fcml">
<mxGraphModel dx="1428" dy="743" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <mxGraphModel dx="1008" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root> <root>
<mxCell id="0" /> <mxCell id="0" />
<mxCell id="1" parent="0" /> <mxCell id="1" parent="0" />
<mxCell id="WuFkDS3ftwopUGT5gUNe-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="WuFkDS3ftwopUGT5gUNe-1" target="WuFkDS3ftwopUGT5gUNe-2" edge="1"> <mxCell id="mHvfnxcB_8BXhUwDknts-12" style="edgeStyle=none;curved=1;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.462;entryY=0;entryDx=0;entryDy=0;fontSize=12;startSize=8;endSize=8;entryPerimeter=0;" edge="1" parent="1" source="WuFkDS3ftwopUGT5gUNe-1" target="WuFkDS3ftwopUGT5gUNe-2">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry" />
</mxCell> </mxCell>
<mxCell id="mHvfnxcB_8BXhUwDknts-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fontSize=12;startSize=8;endSize=8;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="WuFkDS3ftwopUGT5gUNe-1" target="WuFkDS3ftwopUGT5gUNe-5">
<mxGeometry relative="1" as="geometry">
<mxPoint x="570" y="105" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-1" value="Demande/ticket&lt;div&gt;Images + JSON&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxCell id="WuFkDS3ftwopUGT5gUNe-1" value="Demande/ticket&lt;div&gt;Images + JSON&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="330" y="20" width="120" height="70" as="geometry" /> <mxGeometry x="260" y="70" width="210" height="70" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="WuFkDS3ftwopUGT5gUNe-2" target="WuFkDS3ftwopUGT5gUNe-3" edge="1"> <mxCell id="mHvfnxcB_8BXhUwDknts-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="WuFkDS3ftwopUGT5gUNe-2" target="WuFkDS3ftwopUGT5gUNe-3">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-2" value="Pré_traitement OCR&lt;div&gt;images (script)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxCell id="WuFkDS3ftwopUGT5gUNe-2" value="Pré_traitement OCR&lt;div&gt;images (script)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;direction=south;" parent="1" vertex="1">
<mxGeometry x="330" y="120" width="120" height="50" as="geometry" /> <mxGeometry x="95" y="75" width="125" height="65" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="WuFkDS3ftwopUGT5gUNe-3" target="WuFkDS3ftwopUGT5gUNe-4" edge="1"> <mxCell id="mHvfnxcB_8BXhUwDknts-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="WuFkDS3ftwopUGT5gUNe-3" target="WuFkDS3ftwopUGT5gUNe-4">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-3" value="Tradaction FR -&amp;gt; EN&lt;div&gt;(Script pour traduction texte image + ticket)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxCell id="WuFkDS3ftwopUGT5gUNe-3" value="Tradaction FR -&amp;gt; EN&lt;div&gt;(Script pour traduction texte image)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="320" y="210" width="140" height="100" as="geometry" /> <mxGeometry x="10" y="170" width="157.5" height="60" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="WuFkDS3ftwopUGT5gUNe-4" target="WuFkDS3ftwopUGT5gUNe-8" edge="1"> <mxCell id="mHvfnxcB_8BXhUwDknts-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="WuFkDS3ftwopUGT5gUNe-4" target="mHvfnxcB_8BXhUwDknts-1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-4" value="Agent tri images pertinentes&lt;div&gt;Prompt (EN)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxCell id="WuFkDS3ftwopUGT5gUNe-4" value="Agent tri images pertinentes&lt;div&gt;Prompt (EN)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="175" y="420" width="120" height="60" as="geometry" /> <mxGeometry x="28.75" y="275" width="120" height="60" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="WuFkDS3ftwopUGT5gUNe-5" target="WuFkDS3ftwopUGT5gUNe-10" edge="1"> <mxCell id="mHvfnxcB_8BXhUwDknts-19" style="edgeStyle=none;curved=1;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="WuFkDS3ftwopUGT5gUNe-5" target="WuFkDS3ftwopUGT5gUNe-8">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-5" value="&lt;div&gt;&lt;br&gt;&lt;/div&gt;Agent analyse ticket&lt;div&gt;(texte uniquement)&lt;/div&gt;&lt;div&gt;Prompt (EN)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxCell id="mHvfnxcB_8BXhUwDknts-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="WuFkDS3ftwopUGT5gUNe-5" target="WuFkDS3ftwopUGT5gUNe-10">
<mxGeometry x="460" y="410" width="120" height="70" as="geometry" /> <mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-5" value="&lt;div&gt;&lt;br&gt;&lt;/div&gt;Agent analyse ticket en FR et EN&lt;div&gt;(texte uniquement)&lt;/div&gt;&lt;div&gt;Prompt (EN/FR)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="480" y="160" width="150" height="85" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-6" value="LLama-Vision 3.2:90b" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxCell id="WuFkDS3ftwopUGT5gUNe-6" value="LLama-Vision 3.2:90b" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="40" width="180" height="110" as="geometry" /> <mxGeometry x="630" y="20" width="180" height="110" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-8" value="Agent analyse image + contexte&lt;div&gt;(images pertinentes + résultat analyse ticket)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxCell id="mHvfnxcB_8BXhUwDknts-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;fontSize=12;startSize=8;endSize=8;entryX=0.941;entryY=0.018;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="WuFkDS3ftwopUGT5gUNe-8" target="WuFkDS3ftwopUGT5gUNe-10">
<mxGeometry x="160" y="560" width="150" height="90" as="geometry" />
</mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="WuFkDS3ftwopUGT5gUNe-10" target="WuFkDS3ftwopUGT5gUNe-12" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-10" value="Agent rapport final&lt;div&gt;Prompt (EN&lt;br&gt;&lt;div&gt;(Analyse transversale des résultats images + analyse ticket)&lt;/div&gt;&lt;div&gt;Génération tableau Q/R&lt;/div&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxCell id="WuFkDS3ftwopUGT5gUNe-8" value="Agent analyse image + contexte&lt;div&gt;prompt EN&lt;br&gt;&lt;div&gt;(images pertinentes+ OCR EN + résultat analyse ticket EN)&lt;/div&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="435" y="540" width="170" height="110" as="geometry" /> <mxGeometry x="480" y="290" width="150" height="90" as="geometry" />
</mxCell>
<mxCell id="mHvfnxcB_8BXhUwDknts-26" style="edgeStyle=none;curved=1;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="WuFkDS3ftwopUGT5gUNe-10" target="WuFkDS3ftwopUGT5gUNe-11">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-10" value="Agent rapport final&lt;div&gt;Prompt (EN/FR&lt;br&gt;&lt;div&gt;(Analyse transversale des résultats images + analyse ticket) Pour le moment EN/FR&lt;/div&gt;&lt;div&gt;Génération tableau Q/R&lt;/div&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="272" y="440" width="170" height="110" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-11" value="Génération tableau CSV&lt;div&gt;(script)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxCell id="WuFkDS3ftwopUGT5gUNe-11" value="Génération tableau CSV&lt;div&gt;(script)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="460" y="810" width="120" height="60" as="geometry" /> <mxGeometry x="297" y="590" width="120" height="60" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="WuFkDS3ftwopUGT5gUNe-12" target="WuFkDS3ftwopUGT5gUNe-11" edge="1"> <mxCell id="mHvfnxcB_8BXhUwDknts-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="mHvfnxcB_8BXhUwDknts-1" target="WuFkDS3ftwopUGT5gUNe-8">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-12" value="Traduction résultats EN -&amp;gt;FR" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxCell id="mHvfnxcB_8BXhUwDknts-1" value="Agent Llama-vision&lt;div&gt;OCR avancé/ Prompt EN&lt;/div&gt;&lt;div&gt;Conservation EN/FR&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="460" y="700" width="120" height="60" as="geometry" /> <mxGeometry x="200" y="215" width="174" height="120" as="geometry" />
</mxCell> </mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.658;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="WuFkDS3ftwopUGT5gUNe-3" target="WuFkDS3ftwopUGT5gUNe-5" edge="1"> <mxCell id="mHvfnxcB_8BXhUwDknts-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.54;entryY=0.008;entryDx=0;entryDy=0;entryPerimeter=0;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="WuFkDS3ftwopUGT5gUNe-1" target="mHvfnxcB_8BXhUwDknts-1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="540" y="400" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.993;entryY=0.167;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="WuFkDS3ftwopUGT5gUNe-5" target="WuFkDS3ftwopUGT5gUNe-8" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="WuFkDS3ftwopUGT5gUNe-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.006;entryY=0.591;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="WuFkDS3ftwopUGT5gUNe-8" target="WuFkDS3ftwopUGT5gUNe-10" edge="1">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry" />
</mxCell> </mxCell>
</root> </root>

View File

@ -1,2 +1,238 @@
#### Phase de test tri image #### Phase de test tri image
python main_llama.py <ticket_id> --skip-ticket-analysis --skip-image-analysis --skip-report python main_llama.py <ticket_id> --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 dici, 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/<image>.json`
- `ocr_traduction.txt` (append)
---
## 🤖 CHAÎNE DAGENTS
---
### ▶️ É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 limage
- 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