diff --git a/core/execution/input_handler.py b/core/execution/input_handler.py index 66ef6d0f7..b9aab44f3 100644 --- a/core/execution/input_handler.py +++ b/core/execution/input_handler.py @@ -450,6 +450,8 @@ def _grounding_ocr(target_text: str, anchor_bbox: Optional[Dict] = None) -> Opti - Si anchor_bbox fourni → le plus proche de la position originale - Sinon → le plus proche du centre de l'écran (zone contenu) """ + logger.warning(f"[OCR-V2] Entrée _grounding_ocr target='{target_text}' bbox={anchor_bbox}") + import sys; sys.stdout.write(f" [OCR-V2] target='{target_text}' bbox={anchor_bbox}\n"); sys.stdout.flush() if not target_text: return None diff --git a/visual_workflow_builder/backend/app.py b/visual_workflow_builder/backend/app.py index 4f025c764..8284af059 100644 --- a/visual_workflow_builder/backend/app.py +++ b/visual_workflow_builder/backend/app.py @@ -417,6 +417,13 @@ except ImportError as e: except Exception as e: print(f"❌ Erreur lors de l'initialisation des services visuels: {e}") +# Pré-charger les modèles pour éviter la latence au premier appel +try: + from services.ocr_service import preload as ocr_preload + ocr_preload() +except Exception as e: + print(f"⚠️ Pré-chargement OCR échoué: {e}") + if __name__ == '__main__': port = int(os.getenv('PORT', 5002)) # Désactivation du mode debug pour stabiliser le laboratoire diff --git a/visual_workflow_builder/backend/services/ocr_service.py b/visual_workflow_builder/backend/services/ocr_service.py index a6cd397a4..bc1812d8d 100644 --- a/visual_workflow_builder/backend/services/ocr_service.py +++ b/visual_workflow_builder/backend/services/ocr_service.py @@ -9,7 +9,7 @@ from typing import List, Optional import numpy as np from PIL import Image -# Singleton paresseux +# Singleton — chargé une seule fois _predictor = None @@ -28,6 +28,15 @@ def _get_predictor(): return _predictor +def preload(): + """Pré-charge le modèle OCR au démarrage.""" + try: + _get_predictor() + print("✅ [OCR] docTR pré-chargé") + except Exception as e: + print(f"⚠️ [OCR] Pré-chargement échoué: {e}") + + def ocr_extract_text(image: Image.Image) -> str: """Extrait le texte brut d'une image PIL.