Aller au contenu principal

Stack Python - Plan d'Évolution

Date : 2026-01-26
Statut : ✅ Migration 100% complète | Plus de fallback Node.js
Dernière mise à jour : 2026-01-26

🎯 Architecture 100% Python

La génération de documents est désormais entièrement gérée par les services Python. Les fallbacks Node.js ont été supprimés.

Changements Majeurs (2026-01-26)

  • pdfkit, docx, xlsx-style : Dépendances npm supprimées
  • USE_PYTHON_PDF : Variable d'environnement supprimée (Python toujours actif)
  • EXPORTS_V2EXPORTS : Queue simplifiée
  • Code mort supprimé : GmailService, db.query(), markTokenAsUsed()

Services Python

  • PDF Generation : WeasyPrint pour qualité CSS3
  • Word Generation : python-docx pour formatage avancé
  • Excel Generation : openpyxl pour formatage avancé
  • OCR : Vision APIs (GPT-4o) + Tesseract.js fallback
  • Embeddings : sentence-transformers (local)
  • Intent Detection : transformers (local)

📊 Architecture Actuelle

flowchart TB
subgraph frontend [Frontend React]
UI[User Interface]
end

subgraph backend [NestJS Backend]
API[API Controllers]
Workers[BullMQ Workers]
VisionOCR[Vision OCR Service]
Tesseract[Tesseract.js Fallback]
end

subgraph python [Python Services]
Embeddings[Embeddings Service]
Qdrant[Qdrant Service]
PDF[PDF Generation - WeasyPrint]
Word[Word Generation - python-docx]
Excel[Excel Generation - openpyxl]
Intent[Intent Detection - Transformers]
end

subgraph external [APIs Externes]
GPT4V[GPT-4o Vision - Clé utilisateur]
OpenAI[OpenAI LLM]
end

subgraph storage [Storage]
PostgreSQL[(PostgreSQL)]
Redis[(Redis)]
QdrantDB[(Qdrant Vector DB)]
end

UI --> API
API --> VisionOCR
VisionOCR --> GPT4V
VisionOCR -.-> Tesseract

API --> python
Workers --> python
python --> QdrantDB
API --> OpenAI

✅ Phases Complétées

Phase 1 : OCR via Vision APIs ✅

Remplacé EasyOCR (bugs preds_str) par Vision APIs + Tesseract fallback.

StratégieDescription
Vision APIGPT-4o via clé utilisateur - Haute qualité
Tesseract.jsFallback local - Toujours disponible

Phase 2 : PDF Generation en Python ✅

Migré vers WeasyPrint pour meilleur rendu CSS3.

ServiceBackend
FacturesPOST /api/pdf/invoice
DevisPOST /api/pdf/quote
ContratsPOST /api/pdf/html-to-pdf
Exports tablesPOST /api/pdf/table-export (paysage)

Phase 3 : Intent Detection en Python ✅

Classification locale avec facebook/bart-large-mnli.

EndpointDescription
POST /api/intent/classifyClassifier une requête
POST /api/intent/filtersExtraire filtres de recherche

Phase 4 : OpenRouter ❌ Annulé

Décision de garder simple : clé OpenAI utilisateur + Tesseract fallback.

Phase 5 : Word & Excel Generation ✅

Migré vers python-docx et openpyxl pour meilleur formatage.

FormatEndpointLibrairie
Word (table)POST /api/word/table-exportpython-docx
Word (conversation)POST /api/word/conversationpython-docx
Excel (single)POST /api/excel/single-sheetopenpyxl
Excel (multi)POST /api/excel/multi-sheetopenpyxl
Excel (conversation)POST /api/excel/conversationopenpyxl

📋 État des Services

Génération de Documents

FormatService NestJSService PythonStatus
PDF - FacturesQuotesInvoicesPdfServicePOST /api/pdf/invoice✅ Python uniquement
PDF - DevisQuotesInvoicesPdfServicePOST /api/pdf/quote✅ Python uniquement
PDF - ContratsContractsPdfServicePOST /api/pdf/html-to-pdf✅ Python uniquement
PDF - TablesExportPdfServicePOST /api/pdf/table-export✅ Python uniquement
Word - TablesExportWordServicePOST /api/word/table-export✅ Python uniquement
Excel - SimpleExportExcelSingleServicePOST /api/excel/single-sheet✅ Python uniquement
Excel - MultipleExportExcelMultipleServicePOST /api/excel/multi-sheet✅ Python uniquement
Excel - BookingsBookingsControllerPOST /api/excel/single-sheet✅ Python uniquement
CSVExportCsvService-⏸️ Node.js (simple)

🏷️ Renommage Effectué

Le service a été renommé de python-ml-service à python-services pour refléter ses capacités étendues.

AspectAncienNouveau
Nom du servicepython-ml-servicepython-services
Docker Composepython-ml-servicepython-services
URL internehttp://python-ml-service:8000http://python-services:8000
Variable envPYTHON_ML_SERVICE_URLPYTHON_ML_SERVICE_URL (rétrocompatible)
Image CI/CDpython-ml-service:*python-services:*

💰 Économies et Bénéfices

AspectAvantAprèsBénéfice
OCREasyOCR (bugs)GPT-4o + TesseractFiabilité
PDFpdfkit (CSS limité)WeasyPrint (CSS3)Qualité
Worddocx (Node.js)python-docxFormatage
Excelxlsx-style (Node.js)openpyxlFormatage
IntentOpenAI APIModèles locaux~$50-100/mois

🔑 Configuration

# .env
PYTHON_SERVICE_URL=http://python-services:8000

# OCR - Vision API avec Tesseract.js fallback
USE_VISION_OCR=true

# Note: Les variables USE_PYTHON_* ont été supprimées
# Les services PDF, Word, Excel et Intent utilisent toujours Python

🚀 Déploiement

Reconstruire les services

# Développement
docker-compose -f infra/docker-compose.dev.yml up -d --build python-services api worker

# Production
docker-compose -f infra/docker-compose.prod.yml up -d --build python-services api worker

Vérifier les services

# Health check Python
curl http://localhost:8000/health

# Liste des fonctionnalités
curl http://localhost:8000/

# Health Word
curl http://localhost:8000/api/word/health

# Health Excel
curl http://localhost:8000/api/excel/health

📋 Prochaines Étapes

Phase 6 : Vérification & Stabilisation ✅

Priorité : Haute | Effort : Faible

Tests de connectivité et validation de la migration :

TâcheDescriptionStatus
Tests DockerConnectivité backend ↔ Python en Docker✅ Validé
Logs & MonitoringLogs clairs et exploitables✅ Validé
Variables d'envSimplifiées (suppression USE_PYTHON_*)✅ Validé
Tests E2ETester chaque endpoint avec des données réelles⏳ À faire

Phase 7 : Nettoyage du Code Legacy ✅

Priorité : Moyenne | Effort : Moyen

Suppression des anciennes implémentations Node.js :

TâcheDescriptionStatus
Supprimer fallback PDFRetirer quotes-invoices-pdf-direct.service.ts, contracts-pdf-direct.service.ts✅ Fait
Supprimer fallback ExcelRetirer export-excel-helpers.service.ts (xlsx-style)✅ Fait
Simplifier servicesRetirer la logique conditionnelle usePythonPdf/Word/Excel✅ Fait
Variables d'environnementRetirer USE_PYTHON_PDF, USE_PYTHON_WORD, USE_PYTHON_EXCEL, USE_PYTHON_INTENT✅ Fait

Note: Les dépendances npm pdfkit, docx et xlsx-style sont conservées pour d'autres fonctionnalités (session roadmap Word, extraction DOCX, agent Excel export).

Phase 8 : Améliorations Avancées ⏳

Priorité : Moyenne | Effort : Moyen

Optimisations pour la performance et la maintenabilité :

TâcheDescriptionStatus
Cache RedisAjouter du caching côté Python pour documents récurrents⏳ À faire
Métriques PrometheusExposer des métriques pour monitoring⏳ À faire
Rate LimitingLimiter les requêtes pour éviter surcharge⏳ À faire
Health Checks avancésVérifier dépendances (Qdrant, Redis) dans health⏳ À faire
Templates personnalisablesPermettre templates PDF/Word custom par tenant⏳ À faire

Phase 9 : Nouvelles Fonctionnalités ⏳

Priorité : Basse | Effort : Élevé

Fonctionnalités additionnelles possibles :

TâcheDescriptionStatus
Rapports analytiquesGénération de rapports avec graphiques⏳ À planifier
Conversion DOCX → PDFConvertir documents Word en PDF⏳ À planifier
Compression fichiersOptimiser la taille des exports⏳ À planifier
WatermarksAjouter filigranes aux PDF⏳ À planifier
Signatures numériquesSupport des signatures électroniques⏳ À planifier
Merge PDFFusionner plusieurs PDF en un⏳ À planifier

🚀 CI/CD Optimisé

Pipeline GitLab CI

Le pipeline a été optimisé avec des builds parallèles :

Stage 1: lint
Stage 2: test
Stage 3: build:api | build:web | build:python-services | build:liquibase (parallèle)
Stage 4: deploy:prod (uniquement sur main)

Optimisations appliquées

OptimisationImpact
Jobs parallèles4 builds simultanés → temps réduit ~50%
Cache npmRéutilisation node_modules/ entre jobs
Docker BuildKitMeilleur cache des layers Docker
PyTorch CPU-onlyImage Python ~5x plus petite (~2GB vs ~10GB)
Suppression EasyOCRNon utilisé depuis migration Vision OCR

Image Python optimisée

# PyTorch CPU-only (200MB vs 6GB avec CUDA)
RUN pip install torch --index-url https://download.pytorch.org/whl/cpu

# Dépendances essentielles uniquement
# - sentence-transformers (embeddings)
# - weasyprint (PDF)
# - python-docx (Word)
# - openpyxl (Excel)
# - qdrant-client (vector DB)

🔗 Documentation Associée