Architecture grounding complète :
- core/grounding/server.py : serveur FastAPI (port 8200) avec UI-TARS-1.5-7B en 4-bit NF4
Process séparé avec son propre contexte CUDA (résout le crash Flask/CUDA)
- core/grounding/pipeline.py : orchestrateur cascade template→OCR→UI-TARS→static
- core/grounding/template_matcher.py : TemplateMatcher centralisé (remplace 5 copies)
- core/grounding/ui_tars_grounder.py : client HTTP vers le serveur de grounding
- core/grounding/target.py : GroundingTarget + GroundingResult
ORA modifié :
- _act_click() : capture unique de l'écran envoyée au serveur de grounding
- Pre-check VLM skippé pour ui_tars (redondant, et Ollama n'a plus de VRAM)
- verify_level='none' par défaut (vérification titre OCR prévue en Phase 2)
- Détection réponses négatives UI-TARS ("I don't see it" → fallback OCR)
Nettoyage :
- 9 fichiers morts archivés dans _archive/ (~6300 lignes supprimées)
- 21 tests ajoutés pour TemplateMatcher
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
"""
|
||
core/grounding/target.py — Types partagés pour le grounding visuel
|
||
|
||
Dataclasses décrivant une cible à localiser (GroundingTarget) et
|
||
le résultat d'une localisation (GroundingResult).
|
||
|
||
Ces types sont la brique commune pour tous les modules de grounding :
|
||
template matching, OCR, VLM, CLIP, etc.
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from dataclasses import dataclass, field
|
||
from typing import Dict, Optional
|
||
|
||
|
||
@dataclass
|
||
class GroundingTarget:
|
||
"""Description d'un élément UI à localiser sur l'écran.
|
||
|
||
Attributs :
|
||
text : texte visible de l'élément (bouton, label, etc.)
|
||
description : description sémantique libre (ex: "le bouton Valider en bas à droite")
|
||
template_b64 : capture visuelle de l'élément, encodée en base64 PNG/JPEG
|
||
original_bbox : position d'origine lors de la capture {x, y, width, height}
|
||
"""
|
||
text: str = ""
|
||
description: str = ""
|
||
template_b64: str = ""
|
||
original_bbox: Optional[Dict[str, int]] = field(default=None)
|
||
|
||
|
||
@dataclass
|
||
class GroundingResult:
|
||
"""Résultat d'une localisation d'élément UI.
|
||
|
||
Attributs :
|
||
x : coordonnée X du centre de l'élément trouvé (pixels écran)
|
||
y : coordonnée Y du centre de l'élément trouvé (pixels écran)
|
||
method : méthode ayant produit le résultat ('template', 'ocr', 'vlm', 'clip', etc.)
|
||
confidence : score de confiance [0.0 – 1.0]
|
||
time_ms : temps de recherche en millisecondes
|
||
"""
|
||
x: int
|
||
y: int
|
||
method: str
|
||
confidence: float
|
||
time_ms: float
|