diff --git a/agent_v0/server_v1/resolve_engine.py b/agent_v0/server_v1/resolve_engine.py index ee2491cf7..a993c13ba 100644 --- a/agent_v0/server_v1/resolve_engine.py +++ b/agent_v0/server_v1/resolve_engine.py @@ -1746,6 +1746,49 @@ def _resolve_target_sync( ) return result + # --------------------------------------------------------------- + # Étape 0.5 : OCR direct (hybrid_text_direct) — chemin rapide + # --------------------------------------------------------------- + # Si on a un texte cible non vide, le localiser par OCR direct + # avant de tomber sur le VLM (~100-300ms vs 2-23s par appel VLM). + # Reconnecté le 2026-05-06 : la fonction _resolve_by_ocr_text + # existait déjà mais n'était appelée QUE depuis le runtime V4 + # (resolve_order pré-compilé), qui n'est pas branché côté frontend + # (cf. audit project-quality-guardian Cas #5). La cascade legacy + # tombait directement sur VLM Quick Find d'où des replays à 23s + # par action visuelle au lieu de <500ms attendus. + # Le method est rebadgé "hybrid_text_direct" (seuil 0.80 dans + # _RESOLUTION_MIN_SCORES, identifiant historique côté client + # Agent V1 et logs Learning). + if by_text_strict: + ocr_result = _resolve_by_ocr_text( + screenshot_path=screenshot_path, + target_text=by_text_strict, + screen_width=screen_width, + screen_height=screen_height, + ) + if ocr_result and ocr_result.get("score", 0) >= 0.80: + ocr_result["method"] = "hybrid_text_direct" + logger.info( + "Strict resolve OCR-DIRECT : OK '%s' → (%.4f, %.4f) score=%.2f", + by_text_strict[:40], + ocr_result.get("x_pct", 0), + ocr_result.get("y_pct", 0), + ocr_result.get("score", 0), + ) + return ocr_result + elif ocr_result: + logger.info( + "Strict resolve OCR-DIRECT : '%s' trouvé score=%.2f < 0.80, passage VLM", + by_text_strict[:40], + ocr_result.get("score", 0), + ) + else: + logger.info( + "Strict resolve OCR-DIRECT : '%s' non trouvé, passage VLM", + by_text_strict[:40], + ) + # --------------------------------------------------------------- # Étape 1 : VLM Quick Find (fallback, multi-image) # ---------------------------------------------------------------