diff --git a/.specstory/history/2025-04-14_07-03-analyse-des-fichiers-inutiles-dans-le-programme.md b/.specstory/history/2025-04-14_07-03-analyse-des-fichiers-inutiles-dans-le-programme.md new file mode 100644 index 0000000..890a572 --- /dev/null +++ b/.specstory/history/2025-04-14_07-03-analyse-des-fichiers-inutiles-dans-le-programme.md @@ -0,0 +1,453 @@ + + +# 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. + +--- + +
+ Listed current directory ‱ **34** results + +| 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` | + +
+ +--- + +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. + +--- + +
+ Listed directory tmp ‱ **0** results + +No results found +
+ +--- + +Read file: retrieve_ticket.py + +--- + +
+ Listed directory __pycache__ ‱ **1** results + +| Name | +|-------| +| 📄 `orchestrator.cpython-312.pyc` | + +
+ +--- + +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. + +--- + +
+ Searched codebase "llm_mock.py" ‱ **1** results + +| File | +|------| +| `undefined` | + +
+ +--- + +Read file: llm_interface/llm_mock.py + +--- + +
+ Searched codebase "report_formatter.py" ‱ **2** results + +| File | +|------| +| `undefined` | +| `undefined` | + +
+ +--- + +Read file: formatters/report_formatter.py + +--- + +Read file: agents/utils/report_formatter.py + +--- + +
+ Searched codebase "generate_csv.py" ‱ **1** results + +| File | +|------| +| `undefined` | + +
+ +--- + +Read file: generate_csv.py + +--- + +
+ Grep search for "from llm_interface.llm_mock" ‱ **1** files + +| 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` | + +
+ +--- + +
+ Grep search for "from agents.utils.report_formatter import" ‱ **2** files + +| 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)"` |` | + +
+ +--- + +
+ Grep search for "import.*?report_formatter" ‱ **3** files + +| 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',` | + +
+ +--- + +
+ Grep search for "generate_csv" ‱ **9** files + +| 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 [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 | `Searched codebase "generate_csv.py" ‱ **1** results` | +| `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 [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)` | + +
+ +--- + +
+ Grep search for "llm_mock" ‱ **3** files + +| 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 | `Searched codebase "llm_mock.py" ‱ **1** results` | +| `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 |` | + +
+ +--- + +
+ Grep search for "import.*?llm_mock" ‱ **0** files + +No results found +
+ +--- + +
+ Listed directory agents/utils ‱ **6** results + +| Name | +|-------| +| 📁 `__pycache__` | +| 📄 `report_utils.py` | +| 📄 `agent_info_collector.py` | +| 📄 `report_formatter.py` | +| 📄 `csv_exporter.py` | +| 📄 `__init__.py` | + +
+ +--- + +Read file: agents/utils/csv_exporter.py + +--- + +
+ Grep search for "import.*?formatters.report_formatter" ‱ **2** files + +| 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',` | + +
+ +--- + +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Ă©. + +--- + + + +--- + diff --git a/formatters/report_formatter.py b/formatters/report_formatter.py deleted file mode 100644 index 879c36b..0000000 --- a/formatters/report_formatter.py +++ /dev/null @@ -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 += "
\nAnalyse détaillée de l'image\n\n" - markdown += "```\n" + analyse_detail + "\n```\n\n" - markdown += "
\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 += "
\nVoir le résultat de l'analyse de ticket\n\n" - markdown += "```\n" + str(rapport_data["ticket_analyse"]) + "\n```\n\n" - markdown += "
\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"
\nPrompt de {agent_name}\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 += "
\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""" - - - - - Rapport d'analyse de ticket - - - - {html_content} - -""" - - # É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'

\1

', html, flags=re.MULTILINE) - html = re.sub(r'^## (.*?)$', r'

\1

', html, flags=re.MULTILINE) - html = re.sub(r'^### (.*?)$', r'

\1

', html, flags=re.MULTILINE) - html = re.sub(r'^#### (.*?)$', r'

\1

', html, flags=re.MULTILINE) - - # Emphase - html = re.sub(r'\*\*(.*?)\*\*', r'\1', html) - html = re.sub(r'\*(.*?)\*', r'\1', html) - - # Lists - html = re.sub(r'^- (.*?)$', r'
  • \1
  • ', html, flags=re.MULTILINE) - - # Paragraphes - html = re.sub(r'([^\n])\n([^\n])', r'\1
    \2', html) - html = re.sub(r'\n\n', r'

    ', html) - - # Tables simplifiées (sans analyser la structure) - html = re.sub(r'\| (.*?) \|', r'\1', html) - - # Code blocks - html = re.sub(r'```(.*?)```', r'

    \1
    ', html, flags=re.DOTALL) - - # Details/Summary - html = re.sub(r'
    (.*?)(.*?)(.*?)
    ', - r'
    \1\2\3
    ', - html, flags=re.DOTALL) - - # Envelopper dans des balises paragraphe - html = f"

    {html}

    " - - 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}") \ No newline at end of file diff --git a/generate_csv.py b/generate_csv.py deleted file mode 100755 index 486a52b..0000000 --- a/generate_csv.py +++ /dev/null @@ -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 [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 ❌") \ No newline at end of file diff --git a/llm_interface/__init__.py b/llm_interface/__init__.py deleted file mode 100644 index d462a78..0000000 --- a/llm_interface/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -""" -Package llm_interface: Interface avec les modĂšles LLM. -""" \ No newline at end of file diff --git a/llm_interface/llm_mock.py b/llm_interface/llm_mock.py deleted file mode 100644 index 0c5df73..0000000 --- a/llm_interface/llm_mock.py +++ /dev/null @@ -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 \ No newline at end of file