mirror of
https://github.com/Ladebeze66/llm_ticket3.git
synced 2025-12-13 15:46:52 +01:00
1404-9:13
This commit is contained in:
parent
d86e0f0fbc
commit
b97d930dff
@ -0,0 +1,453 @@
|
||||
<!-- Generated by SpecStory -->
|
||||
|
||||
# Analyse des fichiers inutiles dans le programme (2025-04-14 09:03:12)
|
||||
|
||||
_**User**_
|
||||
|
||||
je voudrai nettoyer mon programme peux tu analalyser le dossier et me dire quesl fichiers te semblent inutiles en justifiant tes choix
|
||||
|
||||
---
|
||||
|
||||
_**Assistant**_
|
||||
|
||||
Je vais explorer la structure du dossier pour identifier les fichiers potentiellement inutiles.
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>Listed current directory • **34** results</summary>
|
||||
|
||||
| Name |
|
||||
|-------|
|
||||
| 📁 `.git` |
|
||||
| 📁 `tmp` |
|
||||
| 📄 `.cursorindexingignore` |
|
||||
| 📄 `orchestrator.log` |
|
||||
| 📁 `output` |
|
||||
| 📄 `test_orchestrator_llama_vision.py` |
|
||||
| 📁 `agents` |
|
||||
| 📁 `llm_classes` |
|
||||
| 📄 `test_orchestrator_deepseek.py` |
|
||||
| 📄 `test_orchestrator_qwen_specialized.py` |
|
||||
| 📁 `utils` |
|
||||
| 📄 `README.md` |
|
||||
| 📄 `generate_csv.py` |
|
||||
| 📄 `test_orchestrator_large.py` |
|
||||
| 📁 `__pycache__` |
|
||||
| 📄 `test_orchestrator.py` |
|
||||
| 📄 `orchestrator.py` |
|
||||
| 📄 `retrieve_ticket.log` |
|
||||
| 📄 `retrieve_tickets_batch.log` |
|
||||
| 📄 `retrieve_ticket.py` |
|
||||
| 📁 `reports` |
|
||||
| 📁 `docs` |
|
||||
| 📁 `odoo` |
|
||||
| 📁 `llm_interface` |
|
||||
| 📁 `loaders` |
|
||||
| 📁 `formatters` |
|
||||
| 📁 `core` |
|
||||
| 📄 `.gitignore` |
|
||||
| 📄 `README_TICKET_ANALYSER.md` |
|
||||
| 📄 `requirements.txt` |
|
||||
| 📁 `venv` |
|
||||
| 📁 `.specstory` |
|
||||
| 📄 `config.json` |
|
||||
| 📄 `config.template.json` |
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
Examinons quelques-uns des fichiers de test qui pourraient être redondants.
|
||||
|
||||
---
|
||||
|
||||
Read file: test_orchestrator.py
|
||||
|
||||
---
|
||||
|
||||
Read file: test_orchestrator_large.py
|
||||
|
||||
---
|
||||
|
||||
Read file: test_orchestrator_deepseek.py
|
||||
|
||||
---
|
||||
|
||||
Examinons les fichiers de logs et les dossiers temporaires qui pourraient être nettoyés.
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>Listed directory tmp • **0** results</summary>
|
||||
|
||||
No results found
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
Read file: retrieve_ticket.py
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>Listed directory __pycache__ • **1** results</summary>
|
||||
|
||||
| Name |
|
||||
|-------|
|
||||
| 📄 `orchestrator.cpython-312.pyc` |
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
Read file: config.template.json
|
||||
|
||||
---
|
||||
|
||||
Read file: config.json
|
||||
|
||||
---
|
||||
|
||||
Read file: test_orchestrator_qwen_specialized.py
|
||||
|
||||
---
|
||||
|
||||
Could not resolve URI: Error: Unable to resolve nonexistent file 'vscode-remote://wsl+ubuntu-24.04/home/fgras-ca/llm-ticket3/logs'
|
||||
|
||||
---
|
||||
|
||||
Read file: orchestrator.log
|
||||
|
||||
---
|
||||
|
||||
Read file: retrieve_ticket.log
|
||||
|
||||
---
|
||||
|
||||
Voici mon analyse des fichiers pouvant être supprimés de votre projet :
|
||||
|
||||
1. **Fichiers de test d'orchestrateur redondants** :
|
||||
- `test_orchestrator.py`, `test_orchestrator_large.py`, `test_orchestrator_deepseek.py`, `test_orchestrator_qwen_specialized.py` - Ces fichiers sont quasiment identiques dans leur structure, ne différant que par les modèles LLM utilisés. Vous pourriez conserver celui que vous utilisez le plus fréquemment et supprimer les autres, ou les refactoriser en un seul fichier avec des options pour choisir le modèle à utiliser.
|
||||
|
||||
2. **Fichiers de logs** :
|
||||
- `orchestrator.log`, `retrieve_ticket.log`, `retrieve_tickets_batch.log` - Ces fichiers contiennent des journaux d'exécution passés et ne sont généralement pas nécessaires au fonctionnement du programme. Ils peuvent être supprimés sans affecter le code.
|
||||
|
||||
3. **Dossier temporaire** :
|
||||
- Le dossier `tmp/` est vide et peut être supprimé.
|
||||
|
||||
4. **Fichiers compilés Python** :
|
||||
- Le dossier `__pycache__/` et son contenu (`orchestrator.cpython-312.pyc`) sont des fichiers compilés générés automatiquement par Python. Vous pouvez les supprimer car ils seront recréés automatiquement.
|
||||
|
||||
5. **Configuration sensible** :
|
||||
- `config.json` contient des identifiants et mots de passe en clair, ce qui constitue un risque de sécurité. Vous devriez utiliser un fichier comme `.env` ou des variables d'environnement pour stocker ces informations sensibles. Vous pouvez garder `config.template.json` comme exemple.
|
||||
|
||||
6. **Environnement virtuel** :
|
||||
- Si vous n'utilisez plus ce projet ou si vous l'avez migré vers un autre environnement, le dossier `venv/` peut être supprimé.
|
||||
|
||||
7. **Dossier .git** :
|
||||
- Si vous ne gérez pas la version de ce projet avec Git, le dossier `.git/` peut être supprimé.
|
||||
|
||||
Ces nettoyages vous permettront de réduire la taille du projet et de le rendre plus organisé, tout en conservant ses fonctionnalités essentielles.
|
||||
|
||||
---
|
||||
|
||||
_**User**_
|
||||
|
||||
a quoi sert llm_mock.py, j'ai deux fichiers report_formatter.py dans utils et dans agents/utils j'ai un fichier generate_csv.py peux tu vérifier où sont utilisés ces fichiers
|
||||
|
||||
---
|
||||
|
||||
_**Assistant**_
|
||||
|
||||
Je vais analyser à quoi servent ces fichiers et vérifier où ils sont utilisés.
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>Searched codebase "llm_mock.py" • **1** results</summary>
|
||||
|
||||
| File |
|
||||
|------|
|
||||
| `undefined` |
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
Read file: llm_interface/llm_mock.py
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>Searched codebase "report_formatter.py" • **2** results</summary>
|
||||
|
||||
| File |
|
||||
|------|
|
||||
| `undefined` |
|
||||
| `undefined` |
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
Read file: formatters/report_formatter.py
|
||||
|
||||
---
|
||||
|
||||
Read file: agents/utils/report_formatter.py
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>Searched codebase "generate_csv.py" • **1** results</summary>
|
||||
|
||||
| File |
|
||||
|------|
|
||||
| `undefined` |
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
Read file: generate_csv.py
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>Grep search for "from llm_interface.llm_mock" • **1** files</summary>
|
||||
|
||||
| File | Line | Match |
|
||||
|------|------|-------|
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_09-04-probl%C3%A8me-d%27extraction-de-ticket-odoo.md` | L1396 | `+ from llm_interface.llm_mock import LLMMock` |
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>Grep search for "from agents.utils.report_formatter import" • **2** files</summary>
|
||||
|
||||
| File | Line | Match |
|
||||
|------|------|-------|
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L2196 | `cd /home/fgras-ca/llm-ticket3 && python3 -c "from agents.utils.report_formatter import generer_rapport_markdown; generer_rapport_markdown('output/ticket_T9656/T9656_20250410_115715/T9656_rapports/T9656/T9656_rapport_final.json', True)"` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-11_06-44-impact-des-prompts-sur-les-performances-de-l%27agent.md` | L1353 | `⟪ 156 characters skipped ⟫ome/fgras-ca/llm-ticket3 && python3 -c "from agents.utils.report_formatter import generer_rapport_markdown; generer_rapport_markdown('output/ticket_T9656/T9656_20250410_115715/T9656_rapports/T9656/T9656_rapport_final.json', True)"` |` |
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>Grep search for "import.*?report_formatter" • **3** files</summary>
|
||||
|
||||
| File | Line | Match |
|
||||
|------|------|-------|
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_08-33-analyse-et-simplification-de-agent-report-generator-py.md` | L2388 | `python3 -c "import sys; sys.path.append('.'); from agents.utils import report_formatter; print('Module report_formatter importé avec succès')"` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_08-33-analyse-et-simplification-de-agent-report-generator-py.md` | L2520 | `python3 -c "import sys; sys.path.append('.'); from agents.utils import report_formatter; print('Module report_formatter modifié avec succès')"` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_08-33-analyse-et-simplification-de-agent-report-generator-py.md` | L3071 | `python3 -c "import sys; sys.path.append('.'); from agents.utils import report_formatter; print('Module report_formatter modifié avec succès')"` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_08-33-analyse-et-simplification-de-agent-report-generator-py.md` | L3082 | `Parfait ! J'ai effectué plusieurs modifications importantes pour améliorer votre `agent_report_generator.py` et le module `report_formatter.py`. Ces modifications visent à mieux gérer l'intégration des analyses d'images dans le tableau Question/Rép` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L1901 | `+ 'from utils.report_formatter import': 'from formatters.report_formatter import',` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L1912 | `+ 'import utils.report_formatter': 'import formatters.report_formatter',` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L1921 | `+ 'from report_formatter import': 'from formatters.report_formatter import',` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L1924 | `+ 'import report_formatter': 'import formatters.report_formatter',` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L2469 | `| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L29 | `'import formatters.report_formatter': 'import formatters.report_formatter',` |` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L2471 | `| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L41 | `'import formatters.report_formatter': 'import formatters.report_formatter',` |` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L2475 | `| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L29 | `'import formatters.report_formatter': 'import formatters.report_formatter',` |` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L2477 | `| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L41 | `'import formatters.report_formatter': 'import formatters.report_formatter',` |` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L18 | `'from formatters.report_formatter import': 'from formatters.report_formatter import',` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L29 | `'import formatters.report_formatter': 'import formatters.report_formatter',` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L38 | `'from formatters.report_formatter import': 'from formatters.report_formatter import',` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L41 | `'import formatters.report_formatter': 'import formatters.report_formatter',` |
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>Grep search for "generate_csv" • **9** files</summary>
|
||||
|
||||
| File | Line | Match |
|
||||
|------|------|-------|
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/README.md` | L112 | `2. **Script `generate_csv.py`**` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/README.md` | L142 | `./generate_csv.py output/ticket_T0101/T0101_rapports/T0101/T0101_rapport_final.json qwen` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_14-24-probl%C3%A8mes-d%27api-et-g%C3%A9n%C3%A9ration-de-rapports.md` | L1860 | `+ def generate_csv_from_json(json_path, model_name=None):` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_14-24-probl%C3%A8mes-d%27api-et-g%C3%A9n%C3%A9ration-de-rapports.md` | L1925 | `+ print("Usage: python generate_csv.py <path_to_json> [model_name]")` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_14-24-probl%C3%A8mes-d%27api-et-g%C3%A9n%C3%A9ration-de-rapports.md` | L1931 | `+ csv_path = generate_csv_from_json(json_path, model_name)` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_14-24-probl%C3%A8mes-d%27api-et-g%C3%A9n%C3%A9ration-de-rapports.md` | L1942 | `chmod +x generate_csv.py && python generate_csv.py output_qwen_bis_20250410_163849/ticket_T9656/T9656_20250410_162915/T9656_rapports/T9656/T9656_rapport_final_corrige.json qwen` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_14-24-probl%C3%A8mes-d%27api-et-g%C3%A9n%C3%A9ration-de-rapports.md` | L2000 | `- **`generate_csv.py`** : Pour générer manuellement les fichiers CSV à partir des rapports JSON` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_14-24-probl%C3%A8mes-d%27api-et-g%C3%A9n%C3%A9ration-de-rapports.md` | L2012 | `3. Si un rapport n'a pas de CSV, utiliser generate_csv.py pour le générer` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_14-24-probl%C3%A8mes-d%27api-et-g%C3%A9n%C3%A9ration-de-rapports.md` | L2473 | `+ def generate_csv_from_json(json_path, model_name=None):` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_14-24-probl%C3%A8mes-d%27api-et-g%C3%A9n%C3%A9ration-de-rapports.md` | L2567 | `+ def fix_json_and_generate_csv(json_path):` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_14-24-probl%C3%A8mes-d%27api-et-g%C3%A9n%C3%A9ration-de-rapports.md` | L2608 | `+ csv_path = generate_csv_from_json(corrected_json_path, model_name)` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_14-24-probl%C3%A8mes-d%27api-et-g%C3%A9n%C3%A9ration-de-rapports.md` | L2758 | `+ success = fix_json_and_generate_csv(json_path)` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_14-24-probl%C3%A8mes-d%27api-et-g%C3%A9n%C3%A9ration-de-rapports.md` | L2886 | `+ 2. **Script `generate_csv.py`**` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_14-24-probl%C3%A8mes-d%27api-et-g%C3%A9n%C3%A9ration-de-rapports.md` | L2916 | `+ ./generate_csv.py output/ticket_T0101/T0101_rapports/T0101/T0101_rapport_final.json qwen` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_14-24-probl%C3%A8mes-d%27api-et-g%C3%A9n%C3%A9ration-de-rapports.md` | L3011 | `- `generate_csv.py` pour générer des fichiers CSV à partir de rapports JSON` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-14_07-03-analyse-des-fichiers-inutiles-dans-le-programme.md` | L33 | `| 📄 `generate_csv.py` |` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-14_07-03-analyse-des-fichiers-inutiles-dans-le-programme.md` | L156 | `a quoi sert llm_mock.py, j'ai deux fichiers report_formatter.py dans utils et dans agents/utils j'ai un fichier generate_csv.py peux tu vérifier où sont utilisés ces fichiers` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-14_07-03-analyse-des-fichiers-inutiles-dans-le-programme.md` | L202 | `<summary>Searched codebase "generate_csv.py" • **1** results</summary>` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-14_07-03-analyse-des-fichiers-inutiles-dans-le-programme.md` | L212 | `Read file: generate_csv.py` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_15-33-%C3%A9l%C3%A9ments-manquants-avec-deepseek.md` | L32 | `| `generate_csv.py` | L51-74 |` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_15-33-%C3%A9l%C3%A9ments-manquants-avec-deepseek.md` | L33 | `| `generate_csv.py` | L1-51 |` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_15-33-%C3%A9l%C3%A9ments-manquants-avec-deepseek.md` | L47 | `| `generate_csv.py` | L74-114 |` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L1041 | `+ def generate_csv_from_json(json_file, model_name=None):` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L1133 | `+ generate_csv_from_json(json_file, model_name)` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L1569 | `+ from .csv_exporter import generate_csv_from_json` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L1570 | `+ csv_path = generate_csv_from_json(json_path)` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L1981 | `+ from .utils.csv_exporter import generate_csv_from_json` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L1983 | `+ csv_path = generate_csv_from_json(json_path, model_name)` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L2007 | `cd output/ticket_T9656/T9656_20250410_115715/T9656_rapports/T9656 && python3 -c "from agents.utils.csv_exporter import generate_csv_from_json; generate_csv_from_json('T9656_rapport_final.json', 'mistral-large-latest')"` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L2035 | `cd /home/fgras-ca/llm-ticket3 && python3 -c "import sys; sys.path.append('.'); from agents.utils.csv_exporter import generate_csv_from_json; generate_csv_from_json('output/ticket_T9656/T9656_20250410_115715/T9656_rapports/T9656/T9656_rapport_final.json', 'mistral-large-latest')"` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L2113 | `- from .utils.csv_exporter import generate_csv_from_json` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L2115 | `- csv_path = generate_csv_from_json(json_path, model_name)` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L2154 | `from .csv_exporter import generate_csv_from_json` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L2155 | `- csv_path = generate_csv_from_json(json_path)` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L2162 | `+ csv_path = generate_csv_from_json(json_path, model_name)` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-11_06-44-impact-des-prompts-sur-les-performances-de-l%27agent.md` | L1953 | `| 📄 `generate_csv.py` |` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-11_06-44-impact-des-prompts-sur-les-performances-de-l%27agent.md` | L2918 | `generate_csv.py retrieve_tickets_batch.log utils` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/generate_csv.py` | L17 | `def generate_csv_from_json(json_path, model_name=None):` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/generate_csv.py` | L123 | `print("Usage: python generate_csv.py <path_to_json> [model_name]")` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/generate_csv.py` | L129 | `csv_path = generate_csv_from_json(json_path, model_name)` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/agents/utils/csv_exporter.py` | L8 | `def generate_csv_from_json(json_file, model_name=None):` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/agents/utils/csv_exporter.py` | L100 | `generate_csv_from_json(json_file, model_name)` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/agents/utils/report_formatter.py` | L552 | `from .csv_exporter import generate_csv_from_json` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/agents/utils/report_formatter.py` | L558 | `csv_path = generate_csv_from_json(json_path, model_name)` |
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>Grep search for "llm_mock" • **3** files</summary>
|
||||
|
||||
| File | Line | Match |
|
||||
|------|------|-------|
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_09-04-probl%C3%A8me-d%27extraction-de-ticket-odoo.md` | L1396 | `+ from llm_interface.llm_mock import LLMMock` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_09-04-probl%C3%A8me-d%27extraction-de-ticket-odoo.md` | L1536 | `+ llm_mock = LLMMock(generer_reponse_llm)` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_09-04-probl%C3%A8me-d%27extraction-de-ticket-odoo.md` | L1539 | `+ agent = AgentReportGenerator(llm_mock)` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-14_07-03-analyse-des-fichiers-inutiles-dans-le-programme.md` | L156 | `a quoi sert llm_mock.py, j'ai deux fichiers report_formatter.py dans utils et dans agents/utils j'ai un fichier generate_csv.py peux tu vérifier où sont utilisés ces fichiers` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-14_07-03-analyse-des-fichiers-inutiles-dans-le-programme.md` | L167 | `<summary>Searched codebase "llm_mock.py" • **1** results</summary>` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-14_07-03-analyse-des-fichiers-inutiles-dans-le-programme.md` | L177 | `Read file: llm_interface/llm_mock.py` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-10_11-45-affinement-de-l%27analyse-d%27image.md` | L2751 | `| `llm_interface/llm_mock.py` | L1-60 |` |
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>Grep search for "import.*?llm_mock" • **0** files</summary>
|
||||
|
||||
No results found
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>Listed directory agents/utils • **6** results</summary>
|
||||
|
||||
| Name |
|
||||
|-------|
|
||||
| 📁 `__pycache__` |
|
||||
| 📄 `report_utils.py` |
|
||||
| 📄 `agent_info_collector.py` |
|
||||
| 📄 `report_formatter.py` |
|
||||
| 📄 `csv_exporter.py` |
|
||||
| 📄 `__init__.py` |
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
Read file: agents/utils/csv_exporter.py
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>Grep search for "import.*?formatters.report_formatter" • **2** files</summary>
|
||||
|
||||
| File | Line | Match |
|
||||
|------|------|-------|
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L1901 | `+ 'from utils.report_formatter import': 'from formatters.report_formatter import',` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L1912 | `+ 'import utils.report_formatter': 'import formatters.report_formatter',` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L1921 | `+ 'from report_formatter import': 'from formatters.report_formatter import',` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L1924 | `+ 'import report_formatter': 'import formatters.report_formatter',` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L2469 | `| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L29 | `'import formatters.report_formatter': 'import formatters.report_formatter',` |` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L2471 | `| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L41 | `'import formatters.report_formatter': 'import formatters.report_formatter',` |` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L2475 | `| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L29 | `'import formatters.report_formatter': 'import formatters.report_formatter',` |` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/.specstory/history/2025-04-09_08-34-r%C3%A9vision-de-la-structure-du-projet-odoo.md` | L2477 | `| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L41 | `'import formatters.report_formatter': 'import formatters.report_formatter',` |` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L18 | `'from formatters.report_formatter import': 'from formatters.report_formatter import',` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L29 | `'import formatters.report_formatter': 'import formatters.report_formatter',` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L38 | `'from formatters.report_formatter import': 'from formatters.report_formatter import',` |
|
||||
| `vscode-remote://wsl%2Bubuntu-24.04/home/fgras-ca/llm-ticket3/docs/migration_imports.py` | L41 | `'import formatters.report_formatter': 'import formatters.report_formatter',` |
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
Voici mon analyse des fichiers que vous avez mentionnés :
|
||||
|
||||
1. **llm_mock.py**
|
||||
- **Fonction** : C'est un module pour simuler un modèle LLM pendant le développement et les tests, sans avoir besoin d'appeler de véritables API LLM.
|
||||
- **Utilisation** : Ce fichier n'est pas importé directement dans votre code de production. Il n'apparaît que dans l'historique (fichier .specstory), ce qui suggère qu'il a été utilisé pendant le développement pour des tests.
|
||||
- **Verdict** : Vous pouvez le conserver pour les tests futurs, mais il n'est pas essentiel pour le fonctionnement du programme.
|
||||
|
||||
2. **Fichiers report_formatter.py**
|
||||
- **Deux versions** :
|
||||
- **formatters/report_formatter.py** : Module original pour générer des rapports à partir de fichiers JSON (Markdown, HTML).
|
||||
- **agents/utils/report_formatter.py** : Version plus récente avec des fonctionnalités spécifiques aux agents, notamment des fonctions pour extraire des sections de texte des rapports LLM et générer des rapports Markdown.
|
||||
- **Utilisation** :
|
||||
- Le fichier dans `formatters/` n'est apparemment pas directement importé dans le code actuel.
|
||||
- Le fichier dans `agents/utils/` est utilisé par l'agent de rapport et importe lui-même `csv_exporter.py`.
|
||||
- **Verdict** : Il semble y avoir une duplication de fonctionnalités. Le fichier dans `formatters/` pourrait être supprimé ou fusionné avec celui dans `agents/utils/`.
|
||||
|
||||
3. **generate_csv.py et agents/utils/csv_exporter.py**
|
||||
- **Fonction** : Les deux fichiers génèrent des fichiers CSV à partir de rapports JSON.
|
||||
- **Différences** :
|
||||
- `generate_csv.py` est un script autonome qui peut être exécuté directement.
|
||||
- `agents/utils/csv_exporter.py` est un module importé par `agents/utils/report_formatter.py`.
|
||||
- **Utilisation** :
|
||||
- `generate_csv.py` est mentionné dans le README comme utilitaire.
|
||||
- `csv_exporter.py` est utilisé programmatiquement par le module `report_formatter.py`.
|
||||
- **Verdict** : Il y a duplication de code. Vous pourriez conserver `generate_csv.py` comme point d'entrée et le faire importer la fonction depuis `csv_exporter.py` pour éviter la duplication.
|
||||
|
||||
**Recommandations de nettoyage** :
|
||||
|
||||
1. **llm_mock.py** : Conserver pour les tests, mais déplacer vers un dossier `tests/` s'il n'existe pas.
|
||||
|
||||
2. **report_formatter.py** :
|
||||
- Conserver uniquement la version dans `agents/utils/`.
|
||||
- Supprimer la version dans `formatters/` si elle n'est plus utilisée.
|
||||
- OU fusionner les fonctionnalités uniques des deux versions.
|
||||
|
||||
3. **generate_csv.py vs csv_exporter.py** :
|
||||
- Option 1: Modifier `generate_csv.py` pour qu'il importe et utilise la fonction de `csv_exporter.py`.
|
||||
- Option 2: Supprimer `generate_csv.py` et ajouter un script d'entrée dans `csv_exporter.py`.
|
||||
|
||||
Ces modifications permettraient de simplifier la structure du projet tout en conservant ses fonctionnalités.
|
||||
|
||||
---
|
||||
|
||||
_**User**_
|
||||
|
||||
generate_csv.py peut etre supprimé il n'a pas d'importance dans mon programme?
|
||||
|
||||
---
|
||||
|
||||
_**Assistant**_
|
||||
|
||||
Oui, vous pouvez supprimer `generate_csv.py` sans affecter le fonctionnement de votre programme. Ce fichier est redondant car:
|
||||
|
||||
1. Sa fonctionnalité principale est déjà présente dans `agents/utils/csv_exporter.py` qui est intégré au système et appelé automatiquement par `agents/utils/report_formatter.py` lors de la génération de rapports.
|
||||
|
||||
2. Les recherches dans le code montrent que `generate_csv.py` n'est pas importé ou utilisé par d'autres parties du programme, il est seulement mentionné dans le README comme utilitaire.
|
||||
|
||||
3. Si vous avez besoin de générer manuellement des CSV à partir de rapports JSON, vous pouvez toujours utiliser directement `csv_exporter.py` qui offre la même fonctionnalité.
|
||||
|
||||
La suppression de ce fichier aidera à nettoyer votre base de code en éliminant la duplication sans perdre de fonctionnalité.
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
@ -1,431 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Module pour formater les rapports à partir des fichiers JSON générés par l'AgentReportGenerator.
|
||||
|
||||
Ce module prend en entrée un fichier JSON contenant les analyses et génère différents
|
||||
formats de sortie (Markdown, HTML, etc.) sans utiliser de LLM.
|
||||
"""
|
||||
|
||||
import os
|
||||
import json
|
||||
import argparse
|
||||
import sys
|
||||
import re
|
||||
from datetime import datetime
|
||||
from typing import Dict, List, Any, Optional, Tuple
|
||||
|
||||
def generate_markdown_report(json_path: str, output_path: Optional[str] = None) -> Tuple[bool, str]:
|
||||
"""
|
||||
Génère un rapport au format Markdown à partir d'un fichier JSON.
|
||||
|
||||
Args:
|
||||
json_path: Chemin vers le fichier JSON contenant les données du rapport
|
||||
output_path: Chemin de sortie pour le fichier Markdown (facultatif)
|
||||
|
||||
Returns:
|
||||
Tuple (succès, chemin du fichier généré ou message d'erreur)
|
||||
"""
|
||||
try:
|
||||
# Lire le fichier JSON
|
||||
with open(json_path, "r", encoding="utf-8") as f:
|
||||
rapport_data = json.load(f)
|
||||
|
||||
# Si le chemin de sortie n'est pas spécifié, le créer à partir du chemin d'entrée
|
||||
if not output_path:
|
||||
# Remplacer l'extension JSON par MD
|
||||
output_path = os.path.splitext(json_path)[0] + ".md"
|
||||
|
||||
# Générer le contenu Markdown
|
||||
markdown_content = _generate_markdown_content(rapport_data)
|
||||
|
||||
# Écrire le contenu dans le fichier de sortie
|
||||
with open(output_path, "w", encoding="utf-8") as f:
|
||||
f.write(markdown_content)
|
||||
|
||||
print(f"Rapport Markdown généré avec succès: {output_path}")
|
||||
return True, output_path
|
||||
|
||||
except Exception as e:
|
||||
error_message = f"Erreur lors de la génération du rapport Markdown: {str(e)}"
|
||||
print(error_message)
|
||||
return False, error_message
|
||||
|
||||
def _generate_markdown_content(rapport_data: Dict) -> str:
|
||||
"""
|
||||
Génère le contenu Markdown à partir des données du rapport.
|
||||
|
||||
Args:
|
||||
rapport_data: Dictionnaire contenant les données du rapport
|
||||
|
||||
Returns:
|
||||
Contenu Markdown
|
||||
"""
|
||||
ticket_id = rapport_data.get("ticket_id", "")
|
||||
timestamp = rapport_data.get("metadata", {}).get("timestamp", "")
|
||||
generation_date = rapport_data.get("metadata", {}).get("generation_date", datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
|
||||
|
||||
# Récupérer les infos sur le workflow et les agents
|
||||
workflow = rapport_data.get("workflow", {}).get("etapes", [])
|
||||
agents_info = rapport_data.get("metadata", {}).get("agents", {})
|
||||
|
||||
# Entête du document
|
||||
markdown = f"# Rapport d'analyse du ticket #{ticket_id}\n\n"
|
||||
markdown += f"*Généré le: {generation_date}*\n\n"
|
||||
|
||||
# 1. Résumé exécutif
|
||||
if "resume" in rapport_data and rapport_data["resume"]:
|
||||
markdown += "## Résumé du problème\n\n"
|
||||
markdown += rapport_data["resume"] + "\n\n"
|
||||
|
||||
# 2. Chronologie des échanges (tableau)
|
||||
markdown += "## Chronologie des échanges client/support\n\n"
|
||||
markdown += "_Agent utilisé: AgentTicketAnalyser_\n\n"
|
||||
|
||||
if "chronologie_echanges" in rapport_data and rapport_data["chronologie_echanges"]:
|
||||
# Créer un tableau pour les échanges
|
||||
markdown += "| Date | Émetteur | Type | Contenu | Statut |\n"
|
||||
markdown += "|------|---------|------|---------|--------|\n"
|
||||
|
||||
# Prétraitement pour détecter les questions sans réponse
|
||||
questions_sans_reponse = {}
|
||||
echanges = rapport_data["chronologie_echanges"]
|
||||
|
||||
for i, echange in enumerate(echanges):
|
||||
if echange.get("type", "").lower() == "question" and echange.get("emetteur", "").lower() == "client":
|
||||
has_response = False
|
||||
# Vérifier si la question a une réponse
|
||||
for j in range(i+1, len(echanges)):
|
||||
next_echange = echanges[j]
|
||||
if next_echange.get("type", "").lower() == "réponse" and next_echange.get("emetteur", "").lower() == "support":
|
||||
has_response = True
|
||||
break
|
||||
questions_sans_reponse[i] = not has_response
|
||||
|
||||
# Générer les lignes du tableau
|
||||
for i, echange in enumerate(echanges):
|
||||
date = echange.get("date", "-")
|
||||
emetteur = echange.get("emetteur", "-")
|
||||
type_msg = echange.get("type", "-")
|
||||
contenu = echange.get("contenu", "-")
|
||||
|
||||
# Ajouter un statut pour les questions sans réponse
|
||||
statut = ""
|
||||
if emetteur.lower() == "client" and type_msg.lower() == "question" and questions_sans_reponse.get(i, False):
|
||||
statut = "**Sans réponse**"
|
||||
|
||||
markdown += f"| {date} | {emetteur} | {type_msg} | {contenu} | {statut} |\n"
|
||||
|
||||
# Ajouter une note si aucune réponse du support n'a été trouvée
|
||||
if not any(echange.get("emetteur", "").lower() == "support" for echange in echanges):
|
||||
markdown += "\n**Note: Aucune réponse du support n'a été trouvée dans ce ticket.**\n\n"
|
||||
else:
|
||||
markdown += "*Aucun échange détecté dans le ticket.*\n\n"
|
||||
|
||||
# 3. Récapitulatif des questions et réponses
|
||||
if "tableau_questions_reponses" in rapport_data and rapport_data["tableau_questions_reponses"]:
|
||||
markdown += "## Résumé des questions et réponses\n\n"
|
||||
markdown += rapport_data["tableau_questions_reponses"] + "\n\n"
|
||||
|
||||
# 4. Analyse des images
|
||||
markdown += "## Analyse des images\n\n"
|
||||
markdown += "_Agent utilisé: AgentImageAnalyser_\n\n"
|
||||
|
||||
if "images_analyses" in rapport_data and rapport_data["images_analyses"]:
|
||||
images_list = rapport_data["images_analyses"]
|
||||
|
||||
if not images_list:
|
||||
markdown += "*Aucune image pertinente n'a été identifiée.*\n\n"
|
||||
else:
|
||||
for i, img_data in enumerate(images_list, 1):
|
||||
image_name = img_data.get("image_name", f"Image {i}")
|
||||
sorting_info = img_data.get("sorting_info", {})
|
||||
reason = sorting_info.get("reason", "Non spécifiée")
|
||||
|
||||
markdown += f"### Image {i}: {image_name}\n\n"
|
||||
|
||||
# Raison de la pertinence
|
||||
if reason:
|
||||
markdown += f"**Raison de la pertinence**: {reason}\n\n"
|
||||
|
||||
# Ajouter l'analyse détaillée dans une section dépliable
|
||||
analyse_detail = img_data.get("analyse", "Aucune analyse disponible")
|
||||
if analyse_detail:
|
||||
markdown += "<details>\n<summary>Analyse détaillée de l'image</summary>\n\n"
|
||||
markdown += "```\n" + analyse_detail + "\n```\n\n"
|
||||
markdown += "</details>\n\n"
|
||||
else:
|
||||
markdown += "*Aucune image pertinente n'a été analysée.*\n\n"
|
||||
|
||||
# 5. Diagnostic technique
|
||||
if "diagnostic" in rapport_data and rapport_data["diagnostic"]:
|
||||
markdown += "## Diagnostic technique\n\n"
|
||||
markdown += "_Agent utilisé: AgentReportGenerator_\n\n"
|
||||
markdown += rapport_data["diagnostic"] + "\n\n"
|
||||
|
||||
# Séparateur pour la section technique
|
||||
markdown += "---\n\n"
|
||||
|
||||
# Flux de traitement (workflow)
|
||||
markdown += "# Flux de traitement du ticket\n\n"
|
||||
|
||||
if workflow:
|
||||
markdown += "Le traitement de ce ticket a suivi les étapes suivantes :\n\n"
|
||||
|
||||
for etape in workflow:
|
||||
numero = etape.get("numero", "")
|
||||
nom = etape.get("nom", "")
|
||||
agent = etape.get("agent", "")
|
||||
description = etape.get("description", "")
|
||||
|
||||
markdown += f"### Étape {numero}: {nom}\n\n"
|
||||
markdown += f"**Agent**: {agent}\n\n"
|
||||
markdown += f"{description}\n\n"
|
||||
|
||||
# Ajouter des détails sur l'agent selon son type
|
||||
if agent == "AgentTicketAnalyser" and "ticket_analyse" in rapport_data:
|
||||
markdown += "<details>\n<summary>Voir le résultat de l'analyse de ticket</summary>\n\n"
|
||||
markdown += "```\n" + str(rapport_data["ticket_analyse"]) + "\n```\n\n"
|
||||
markdown += "</details>\n\n"
|
||||
elif agent == "AgentImageSorter":
|
||||
markdown += f"Images analysées: {rapport_data.get('statistiques', {}).get('total_images', 0)}\n"
|
||||
markdown += f"Images pertinentes identifiées: {rapport_data.get('statistiques', {}).get('images_pertinentes', 0)}\n\n"
|
||||
else:
|
||||
markdown += "Informations sur le flux de traitement non disponibles.\n\n"
|
||||
|
||||
# Informations techniques et métadonnées
|
||||
markdown += "# Informations techniques\n\n"
|
||||
|
||||
# Statistiques
|
||||
statistiques = rapport_data.get("statistiques", {})
|
||||
metadata = rapport_data.get("metadata", {})
|
||||
|
||||
markdown += "## Statistiques de traitement\n\n"
|
||||
markdown += f"- **Images analysées**: {statistiques.get('total_images', 0)}\n"
|
||||
markdown += f"- **Images pertinentes**: {statistiques.get('images_pertinentes', 0)}\n"
|
||||
|
||||
if "generation_time" in statistiques:
|
||||
markdown += f"- **Temps de génération**: {statistiques['generation_time']:.2f} secondes\n"
|
||||
|
||||
# Information sur les agents et les modèles utilisés
|
||||
markdown += "\n## Agents et modèles utilisés\n\n"
|
||||
|
||||
# Agent Report Generator
|
||||
if "report_generator" in agents_info:
|
||||
report_generator = agents_info["report_generator"]
|
||||
markdown += "### Agent de génération de rapport\n\n"
|
||||
markdown += f"- **Modèle**: {report_generator.get('model', 'Non spécifié')}\n"
|
||||
markdown += f"- **Version du prompt**: {report_generator.get('prompt_version', 'Non spécifiée')}\n"
|
||||
markdown += f"- **Température**: {report_generator.get('temperature', 'Non spécifiée')}\n"
|
||||
markdown += f"- **Top_p**: {report_generator.get('top_p', 'Non spécifié')}\n\n"
|
||||
|
||||
# Agent Ticket Analyser
|
||||
if "ticket_analyser" in agents_info:
|
||||
ticket_analyser = agents_info["ticket_analyser"]
|
||||
markdown += "### Agent d'analyse de ticket\n\n"
|
||||
if "model_info" in ticket_analyser:
|
||||
markdown += f"- **Modèle**: {ticket_analyser['model_info'].get('name', 'Non spécifié')}\n\n"
|
||||
elif "model" in ticket_analyser:
|
||||
markdown += f"- **Modèle**: {ticket_analyser.get('model', 'Non spécifié')}\n\n"
|
||||
|
||||
# Agent Image Sorter
|
||||
if "image_sorter" in agents_info:
|
||||
image_sorter = agents_info["image_sorter"]
|
||||
markdown += "### Agent de tri d'images\n\n"
|
||||
if "model_info" in image_sorter:
|
||||
markdown += f"- **Modèle**: {image_sorter['model_info'].get('name', 'Non spécifié')}\n\n"
|
||||
elif "model" in image_sorter:
|
||||
markdown += f"- **Modèle**: {image_sorter.get('model', 'Non spécifié')}\n\n"
|
||||
|
||||
# Agent Image Analyser
|
||||
if "image_analyser" in agents_info:
|
||||
image_analyser = agents_info["image_analyser"]
|
||||
markdown += "### Agent d'analyse d'images\n\n"
|
||||
if "model_info" in image_analyser:
|
||||
markdown += f"- **Modèle**: {image_analyser['model_info'].get('name', 'Non spécifié')}\n\n"
|
||||
elif "model" in image_analyser:
|
||||
markdown += f"- **Modèle**: {image_analyser.get('model', 'Non spécifié')}\n\n"
|
||||
|
||||
# Prompts utilisés par les agents
|
||||
if "prompts_utilisés" in rapport_data and rapport_data["prompts_utilisés"]:
|
||||
markdown += "\n## Prompts utilisés par les agents\n\n"
|
||||
prompts = rapport_data["prompts_utilisés"]
|
||||
|
||||
for agent, prompt in prompts.items():
|
||||
agent_name = {
|
||||
"rapport_generator": "Agent de génération de rapport",
|
||||
"ticket_analyser": "Agent d'analyse de ticket",
|
||||
"image_sorter": "Agent de tri d'images",
|
||||
"image_analyser": "Agent d'analyse d'images"
|
||||
}.get(agent, agent)
|
||||
|
||||
markdown += f"<details>\n<summary>Prompt de {agent_name}</summary>\n\n"
|
||||
|
||||
# Si le prompt est trop long, le tronquer pour éviter des rapports trop volumineux
|
||||
if len(prompt) > 2000:
|
||||
debut = prompt[:1000].strip()
|
||||
fin = prompt[-1000:].strip()
|
||||
prompt_tronque = f"{debut}\n\n[...]\n\n{fin}"
|
||||
markdown += f"```\n{prompt_tronque}\n```\n\n"
|
||||
else:
|
||||
markdown += f"```\n{prompt}\n```\n\n"
|
||||
|
||||
markdown += "</details>\n\n"
|
||||
|
||||
return markdown
|
||||
|
||||
def generate_html_report(json_path: str, output_path: Optional[str] = None) -> Tuple[bool, str]:
|
||||
"""
|
||||
Génère un rapport au format HTML à partir d'un fichier JSON.
|
||||
|
||||
Args:
|
||||
json_path: Chemin vers le fichier JSON contenant les données du rapport
|
||||
output_path: Chemin de sortie pour le fichier HTML (facultatif)
|
||||
|
||||
Returns:
|
||||
Tuple (succès, chemin du fichier généré ou message d'erreur)
|
||||
"""
|
||||
try:
|
||||
# Générer d'abord le Markdown
|
||||
success, md_path_or_error = generate_markdown_report(json_path, None)
|
||||
|
||||
if not success:
|
||||
return False, md_path_or_error
|
||||
|
||||
# Lire le contenu Markdown
|
||||
with open(md_path_or_error, "r", encoding="utf-8") as f:
|
||||
markdown_content = f.read()
|
||||
|
||||
# Si le chemin de sortie n'est pas spécifié, le créer à partir du chemin d'entrée
|
||||
if not output_path:
|
||||
# Remplacer l'extension JSON par HTML
|
||||
output_path = os.path.splitext(json_path)[0] + ".html"
|
||||
|
||||
# Conversion Markdown → HTML (avec gestion de l'absence de mistune)
|
||||
html_content = _simple_markdown_to_html(markdown_content)
|
||||
|
||||
# Essayer d'utiliser mistune pour une meilleure conversion si disponible
|
||||
try:
|
||||
import mistune
|
||||
markdown = mistune.create_markdown(escape=False)
|
||||
html_content = markdown(markdown_content)
|
||||
print("Conversion HTML effectuée avec mistune")
|
||||
except ImportError:
|
||||
print("Module mistune non disponible, utilisation de la conversion HTML simplifiée")
|
||||
|
||||
# Créer un HTML complet avec un peu de style
|
||||
html_page = f"""<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Rapport d'analyse de ticket</title>
|
||||
<style>
|
||||
body {{ font-family: Arial, sans-serif; line-height: 1.6; margin: 0; padding: 20px; color: #333; max-width: 1200px; margin: 0 auto; }}
|
||||
h1 {{ color: #2c3e50; border-bottom: 2px solid #eee; padding-bottom: 10px; }}
|
||||
h2 {{ color: #3498db; margin-top: 30px; }}
|
||||
h3 {{ color: #2980b9; }}
|
||||
h4 {{ color: #16a085; }}
|
||||
table {{ border-collapse: collapse; width: 100%; margin: 20px 0; }}
|
||||
th, td {{ padding: 12px 15px; text-align: left; border-bottom: 1px solid #ddd; }}
|
||||
th {{ background-color: #f2f2f2; }}
|
||||
tr:hover {{ background-color: #f5f5f5; }}
|
||||
code, pre {{ background: #f8f8f8; border: 1px solid #ddd; border-radius: 3px; padding: 10px; overflow-x: auto; }}
|
||||
details {{ margin: 15px 0; }}
|
||||
summary {{ cursor: pointer; font-weight: bold; color: #2980b9; }}
|
||||
.status {{ color: #e74c3c; font-weight: bold; }}
|
||||
hr {{ border: 0; height: 1px; background: #eee; margin: 30px 0; }}
|
||||
em {{ color: #7f8c8d; }}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
{html_content}
|
||||
</body>
|
||||
</html>"""
|
||||
|
||||
# Écrire le contenu dans le fichier de sortie
|
||||
with open(output_path, "w", encoding="utf-8") as f:
|
||||
f.write(html_page)
|
||||
|
||||
print(f"Rapport HTML généré avec succès: {output_path}")
|
||||
return True, output_path
|
||||
|
||||
except Exception as e:
|
||||
error_message = f"Erreur lors de la génération du rapport HTML: {str(e)}"
|
||||
print(error_message)
|
||||
return False, error_message
|
||||
|
||||
def _simple_markdown_to_html(markdown_content: str) -> str:
|
||||
"""
|
||||
Convertit un contenu Markdown en HTML de façon simplifiée.
|
||||
|
||||
Args:
|
||||
markdown_content: Contenu Markdown à convertir
|
||||
|
||||
Returns:
|
||||
Contenu HTML
|
||||
"""
|
||||
html = markdown_content
|
||||
|
||||
# Titres
|
||||
html = re.sub(r'^# (.*?)$', r'<h1>\1</h1>', html, flags=re.MULTILINE)
|
||||
html = re.sub(r'^## (.*?)$', r'<h2>\1</h2>', html, flags=re.MULTILINE)
|
||||
html = re.sub(r'^### (.*?)$', r'<h3>\1</h3>', html, flags=re.MULTILINE)
|
||||
html = re.sub(r'^#### (.*?)$', r'<h4>\1</h4>', html, flags=re.MULTILINE)
|
||||
|
||||
# Emphase
|
||||
html = re.sub(r'\*\*(.*?)\*\*', r'<strong>\1</strong>', html)
|
||||
html = re.sub(r'\*(.*?)\*', r'<em>\1</em>', html)
|
||||
|
||||
# Lists
|
||||
html = re.sub(r'^- (.*?)$', r'<li>\1</li>', html, flags=re.MULTILINE)
|
||||
|
||||
# Paragraphes
|
||||
html = re.sub(r'([^\n])\n([^\n])', r'\1<br>\2', html)
|
||||
html = re.sub(r'\n\n', r'</p><p>', html)
|
||||
|
||||
# Tables simplifiées (sans analyser la structure)
|
||||
html = re.sub(r'\| (.*?) \|', r'<td>\1</td>', html)
|
||||
|
||||
# Code blocks
|
||||
html = re.sub(r'```(.*?)```', r'<pre><code>\1</code></pre>', html, flags=re.DOTALL)
|
||||
|
||||
# Details/Summary
|
||||
html = re.sub(r'<details>(.*?)<summary>(.*?)</summary>(.*?)</details>',
|
||||
r'<details>\1<summary>\2</summary>\3</details>',
|
||||
html, flags=re.DOTALL)
|
||||
|
||||
# Envelopper dans des balises paragraphe
|
||||
html = f"<p>{html}</p>"
|
||||
|
||||
return html
|
||||
|
||||
def process_report(json_path: str, output_format: str = "markdown") -> None:
|
||||
"""
|
||||
Traite un rapport dans le format spécifié.
|
||||
|
||||
Args:
|
||||
json_path: Chemin vers le fichier JSON contenant les données du rapport
|
||||
output_format: Format de sortie (markdown ou html)
|
||||
"""
|
||||
if output_format.lower() == "markdown":
|
||||
generate_markdown_report(json_path)
|
||||
elif output_format.lower() == "html":
|
||||
generate_html_report(json_path)
|
||||
else:
|
||||
print(f"Format non supporté: {output_format}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Formateur de rapports à partir de fichiers JSON")
|
||||
parser.add_argument("json_path", help="Chemin vers le fichier JSON contenant les données du rapport")
|
||||
parser.add_argument("--format", "-f", choices=["markdown", "html"], default="markdown",
|
||||
help="Format de sortie (markdown par défaut)")
|
||||
parser.add_argument("--output", "-o", help="Chemin de sortie pour le rapport (facultatif)")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.format == "markdown":
|
||||
generate_markdown_report(args.json_path, args.output)
|
||||
elif args.format == "html":
|
||||
generate_html_report(args.json_path, args.output)
|
||||
else:
|
||||
print(f"Format non supporté: {args.format}")
|
||||
136
generate_csv.py
136
generate_csv.py
@ -1,136 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Script pour générer un fichier CSV à partir d'un rapport JSON
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import csv
|
||||
import logging
|
||||
|
||||
# Configuration du logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
logger = logging.getLogger("GenerateCSV")
|
||||
|
||||
def generate_csv_from_json(json_path, model_name=None):
|
||||
"""
|
||||
Génère un fichier CSV à partir du rapport JSON
|
||||
|
||||
Args:
|
||||
json_path: Chemin vers le fichier JSON
|
||||
model_name: Nom du modèle pour le nom du fichier CSV (facultatif)
|
||||
"""
|
||||
if not os.path.exists(json_path):
|
||||
logger.error(f"Le fichier {json_path} n'existe pas")
|
||||
return False
|
||||
|
||||
try:
|
||||
# Charger le rapport JSON
|
||||
with open(json_path, 'r', encoding='utf-8') as f:
|
||||
rapport_data = json.load(f)
|
||||
|
||||
# Extraire l'ID du ticket
|
||||
ticket_id = rapport_data.get("ticket_id", os.path.basename(json_path).split("_")[0])
|
||||
|
||||
# Extraire les échanges
|
||||
chronologie_echanges = rapport_data.get("chronologie_echanges", [])
|
||||
if not chronologie_echanges:
|
||||
logger.error("Aucun échange trouvé dans le fichier JSON")
|
||||
return False
|
||||
|
||||
# Déterminer le nom du modèle
|
||||
if not model_name:
|
||||
# Essayer de l'extraire des métadonnées
|
||||
metadata = rapport_data.get("metadata", {})
|
||||
model_name = metadata.get("model", "default").split(":")[0].lower()
|
||||
|
||||
# Créer le nom du fichier CSV
|
||||
csv_path = os.path.join(os.path.dirname(json_path), f"{ticket_id}_{model_name}.csv")
|
||||
|
||||
# Générer le CSV complet avec toutes les colonnes
|
||||
with open(csv_path, 'w', encoding='utf-8', newline='') as csvfile:
|
||||
# Définir les en-têtes
|
||||
fieldnames = ['Date', 'Émetteur', 'Type', 'Contenu']
|
||||
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
|
||||
|
||||
# Écrire l'en-tête
|
||||
writer.writeheader()
|
||||
|
||||
# Écrire les échanges
|
||||
for echange in chronologie_echanges:
|
||||
writer.writerow({
|
||||
'Date': echange.get('date', ''),
|
||||
'Émetteur': echange.get('emetteur', ''),
|
||||
'Type': echange.get('type', ''),
|
||||
'Contenu': echange.get('contenu', '')
|
||||
})
|
||||
|
||||
logger.info(f"Fichier CSV complet généré: {csv_path}")
|
||||
|
||||
# Générer également une version simplifiée Q&R pour la compatibilité
|
||||
qr_csv_path = os.path.join(os.path.dirname(json_path), f"{ticket_id}_{model_name}_qr.csv")
|
||||
|
||||
with open(qr_csv_path, 'w', encoding='utf-8', newline='') as csvfile:
|
||||
# Définir les en-têtes simplifiés
|
||||
qr_writer = csv.writer(csvfile)
|
||||
qr_writer.writerow(['Question', 'Réponse'])
|
||||
|
||||
# Variables pour suivre les questions et réponses
|
||||
current_question = None
|
||||
|
||||
# Parcourir les échanges et extraire les paires Q&R
|
||||
for echange in chronologie_echanges:
|
||||
emetteur = echange.get('emetteur', '').upper()
|
||||
type_msg = echange.get('type', '').lower()
|
||||
contenu = echange.get('contenu', '')
|
||||
|
||||
# Si c'est une question du client
|
||||
if emetteur == 'CLIENT' and (type_msg == 'question' or '?' in contenu):
|
||||
# Si une question précédente existe sans réponse, l'écrire avec une réponse vide
|
||||
if current_question:
|
||||
qr_writer.writerow([current_question, ''])
|
||||
|
||||
# Enregistrer la nouvelle question
|
||||
current_question = contenu
|
||||
|
||||
# Si c'est une réponse ou un complément et qu'il y a une question en attente
|
||||
elif emetteur == 'SUPPORT' and current_question:
|
||||
# Préfixer la réponse pour la clarté
|
||||
formatted_response = f"[{type_msg.upper()}] {contenu}"
|
||||
|
||||
# Écrire la paire question/réponse
|
||||
qr_writer.writerow([current_question, formatted_response])
|
||||
current_question = None
|
||||
|
||||
# Si une question reste sans réponse à la fin
|
||||
if current_question:
|
||||
qr_writer.writerow([current_question, ''])
|
||||
|
||||
logger.info(f"Fichier CSV Q&R simplifié généré: {qr_csv_path}")
|
||||
|
||||
return csv_path
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Erreur lors de la génération du CSV: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) < 2:
|
||||
print("Usage: python generate_csv.py <path_to_json> [model_name]")
|
||||
sys.exit(1)
|
||||
|
||||
json_path = sys.argv[1]
|
||||
model_name = sys.argv[2] if len(sys.argv) > 2 else None
|
||||
|
||||
csv_path = generate_csv_from_json(json_path, model_name)
|
||||
|
||||
if csv_path:
|
||||
print(f"\nFichier CSV généré avec succès: {csv_path} ✅")
|
||||
print(f"Une version simplifiée Q&R a également été générée")
|
||||
else:
|
||||
print("\nÉchec de la génération du CSV ❌")
|
||||
@ -1,3 +0,0 @@
|
||||
"""
|
||||
Package llm_interface: Interface avec les modèles LLM.
|
||||
"""
|
||||
@ -1,60 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Module pour simuler un LLM lors des tests.
|
||||
"""
|
||||
|
||||
from typing import Callable
|
||||
|
||||
class LLMMock:
|
||||
"""
|
||||
Classe simulant un modèle LLM pour les tests.
|
||||
"""
|
||||
|
||||
def __init__(self, response_generator: Callable[[str], str]):
|
||||
"""
|
||||
Initialise le modèle simulé avec un générateur de réponses.
|
||||
|
||||
Args:
|
||||
response_generator: Fonction qui génère une réponse à partir d'un prompt
|
||||
"""
|
||||
self.response_generator = response_generator
|
||||
self.prompt_system = ""
|
||||
self.modele = "LLMMock"
|
||||
self.version = "1.0"
|
||||
self.dureeTraitement = "0s"
|
||||
|
||||
def interroger(self, prompt: str) -> str:
|
||||
"""
|
||||
Simule l'interrogation d'un modèle LLM.
|
||||
|
||||
Args:
|
||||
prompt: Prompt à envoyer au modèle
|
||||
|
||||
Returns:
|
||||
Réponse simulée
|
||||
"""
|
||||
return self.response_generator(prompt)
|
||||
|
||||
def interroger_avec_image(self, image_path: str, prompt: str) -> str:
|
||||
"""
|
||||
Simule l'interrogation d'un modèle LLM avec une image.
|
||||
|
||||
Args:
|
||||
image_path: Chemin vers l'image
|
||||
prompt: Prompt à envoyer au modèle
|
||||
|
||||
Returns:
|
||||
Réponse simulée
|
||||
"""
|
||||
return self.response_generator(f"[IMAGE: {image_path}]\n{prompt}")
|
||||
|
||||
def configurer(self, **kwargs):
|
||||
"""
|
||||
Simule la configuration du modèle.
|
||||
|
||||
Args:
|
||||
**kwargs: Paramètres de configuration
|
||||
"""
|
||||
for key, value in kwargs.items():
|
||||
setattr(self, key, value)
|
||||
return self
|
||||
Loading…
x
Reference in New Issue
Block a user