feat(agent): add learn action flow and grounding guards

This commit is contained in:
Dom
2026-06-02 16:24:10 +02:00
parent 86b3c8f7e7
commit d38f0b0f2f
39 changed files with 5901 additions and 212 deletions

View File

@@ -171,13 +171,17 @@ def handle_detected_pattern(pattern: Dict[str, Any]) -> bool:
screenshot = sct.grab(monitor)
screen = Image.frombytes('RGB', screenshot.size, screenshot.bgra, 'raw', 'BGRX')
# EasyOCR (rapide, bonne qualité GUI) avec fallback docTR.
# gpu=True : harmonisé avec dialog_handler.py et title_verifier.py.
# Coût VRAM ~0.5 GB, sous le budget RTX 5070 (cf. deploy/VRAM_BUDGET.md).
# EasyOCR (bonne qualité GUI) avec fallback docTR. Par défaut CPU :
# le replay server réserve la VRAM à Ollama.
words = []
try:
import easyocr
_reader = easyocr.Reader(['fr', 'en'], gpu=True, verbose=False)
from core.llm.ocr_extractor import easyocr_gpu_enabled
_reader = easyocr.Reader(
['fr', 'en'],
gpu=easyocr_gpu_enabled(default=False),
verbose=False,
)
results = _reader.readtext(np.array(screen))
for (bbox_pts, text, conf) in results:
if not text or len(text.strip()) < 1:

View File

@@ -248,8 +248,10 @@ class DialogHandler:
try:
import easyocr
from core.llm.ocr_extractor import easyocr_gpu_enabled
gpu = easyocr_gpu_enabled(default=False)
self._easyocr_reader = easyocr.Reader(
['fr', 'en'], gpu=True, verbose=False
['fr', 'en'], gpu=gpu, verbose=False
)
return self._easyocr_reader
except ImportError:

View File

@@ -144,19 +144,21 @@ class FastDetector:
_easyocr_reader = None # Singleton EasyOCR (chargé une fois)
def _ocr_extract(self, image) -> List[Dict[str, Any]]:
"""Extrait les mots visibles via EasyOCR (GPU, ~500ms).
"""Extrait les mots visibles via EasyOCR.
Fallback sur docTR si EasyOCR non disponible.
"""
try:
import numpy as np
import easyocr
from core.llm.ocr_extractor import easyocr_gpu_enabled
# Singleton : charger le reader une seule fois
if FastDetector._easyocr_reader is None:
print(f"🔍 [FAST/ocr] Chargement EasyOCR (GPU)...")
gpu = easyocr_gpu_enabled(default=False)
print(f"🔍 [FAST/ocr] Chargement EasyOCR ({'GPU' if gpu else 'CPU'})...")
FastDetector._easyocr_reader = easyocr.Reader(
['fr', 'en'], gpu=True, verbose=False
['fr', 'en'], gpu=gpu, verbose=False
)
results = FastDetector._easyocr_reader.readtext(np.array(image))

View File

@@ -148,10 +148,16 @@ class TitleVerifier:
try:
import easyocr
import numpy as np
from core.llm.ocr_extractor import easyocr_gpu_enabled
if TitleVerifier._easyocr_reader is None:
gpu = easyocr_gpu_enabled(default=False)
TitleVerifier._easyocr_reader = easyocr.Reader(
['fr', 'en'], gpu=True, verbose=False
['fr', 'en'], gpu=gpu, verbose=False
)
logger.info(
"TitleVerifier EasyOCR initialisé (fr+en, %s)",
"GPU" if gpu else "CPU",
)
def _easyocr_extract_text(img):