Migre les call-sites VLM serveur vers la configuration centrale pour fonctionner sur DGX (tunnel Ollama 11434), où gemma4:* est absent et le port Docker 11435 est mort. - task_planner, replay_verifier, domain_context, ir_builder, resolve_engine (popup): modele -> vlm_config.get_vlm_model(), defaut 11435 -> 11434 (override GEMMA4_PORT legacy conserve) - resolve_engine (grounding bbox x2): nouvel helper vlm_config.get_bbox_grounding_model() (var dediee RPA_BBOX_GROUNDING_MODEL, fallback RPA_GROUNDING_MODEL puis qwen2.5vl:7b-rpa) -> desambiguise le conflit D5-v3b, bbox_2d + num_ctx 4096 preserves - safety_checks_provider: defaut -> get_vlm_model(), override RPA_SAFETY_CHECKS_LLM_MODEL preserve - ui_detector: default_factory + resolution lazy (corrige aussi un gel a l'import), pas d'appel reseau a l'import - field_extractor: property lazy via vlm_config TDD strict (RED->GREEN), 305 tests verts, tests mockes HTTP (zero dependance DGX reel), aucun alias Ollama. Hors perimetre (arbitrage Dom): client Lea agent_v1/executor.py (gele), chemin V4 observe_reason_act (RPA_REASONING_MODEL), core/config.py defaults. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
57 lines
2.1 KiB
Python
57 lines
2.1 KiB
Python
"""Tests unitaires pour UIDetector."""
|
|
import pytest
|
|
import sys
|
|
from pathlib import Path
|
|
from unittest.mock import MagicMock, patch
|
|
from PIL import Image
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent))
|
|
from core.detection.ui_detector import UIDetector, DetectionConfig
|
|
|
|
class TestUIDetector:
|
|
def setup_method(self):
|
|
self.detector = UIDetector()
|
|
|
|
def test_detector_initialization(self):
|
|
assert self.detector is not None
|
|
|
|
|
|
class TestVlmModelDehardcode:
|
|
"""Le modèle VLM ne doit plus être codé en dur (gemma4:e4b) dans la config."""
|
|
|
|
def test_config_no_hardcoded_gemma4(self, monkeypatch):
|
|
"""Sans env, DetectionConfig.vlm_model ne vaut plus le littéral gemma4:e4b."""
|
|
monkeypatch.delenv("RPA_VLM_MODEL", raising=False)
|
|
monkeypatch.delenv("VLM_MODEL", raising=False)
|
|
cfg = DetectionConfig()
|
|
assert cfg.vlm_model != "gemma4:e4b"
|
|
assert not cfg.vlm_model # None ou "" → résolution déléguée à l'init
|
|
|
|
def test_config_respects_env(self, monkeypatch):
|
|
"""RPA_VLM_MODEL est honoré dans la config."""
|
|
monkeypatch.setenv("RPA_VLM_MODEL", "mon-modele:test")
|
|
assert DetectionConfig().vlm_model == "mon-modele:test"
|
|
|
|
def test_initialize_vlm_resolves_lazily(self, monkeypatch):
|
|
"""Sans modèle explicite, _initialize_vlm résout via vlm_config (pas de hardcode)."""
|
|
monkeypatch.delenv("RPA_VLM_MODEL", raising=False)
|
|
monkeypatch.delenv("VLM_MODEL", raising=False)
|
|
|
|
captured = {}
|
|
|
|
class FakeClient:
|
|
def __init__(self, endpoint=None, model=None):
|
|
captured["model"] = model
|
|
|
|
import core.detection.ui_detector as uidet
|
|
with patch.object(uidet, "check_ollama_available", return_value=True), \
|
|
patch.object(uidet, "OllamaClient", FakeClient), \
|
|
patch.object(uidet.vlm_config, "get_vlm_model", return_value="modele-resolu:test"):
|
|
UIDetector()
|
|
|
|
assert captured["model"] == "modele-resolu:test"
|
|
|
|
|
|
if __name__ == '__main__':
|
|
pytest.main([__file__, '-v'])
|