Sans env RPA_VLM_MODEL/VLM_MODEL, get_vlm_model() tombait sur le default gemma4:latest, qui peut etre absent du tunnel DGX (depull) -> 404 Ollama et echec de tout le pipeline VLM avant un test Lea humain. - core/detection/vlm_config.py : DEFAULT_VLM_MODEL gemma4:latest -> qwen2.5vl:7b-rpa (confirme present DGX, deja default reasoning + fallback bbox grounding). + DGX_SAFE_VLM_MODELS allow-list documentee. - tests/unit/test_vlm_default_dgx_safe.py : 5 tests (default != gemma4:latest, default in allow-list, no-env -> DGX-safe, env garde priorite). Logique de resolution inchangee, pas d'appel reseau a l'import. gemma4:latest reste accessible via env explicite. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
62 lines
2.4 KiB
Python
62 lines
2.4 KiB
Python
"""Tests P1.w — default `get_vlm_model()` DGX-safe.
|
|
|
|
Sur le DGX, `gemma4:latest` peut être absent (dépull) ; si aucune env
|
|
`RPA_VLM_MODEL` / `VLM_MODEL` n'est posée, le fallback central ne doit plus
|
|
tomber sur `gemma4:latest` (risque 404 Ollama → tout le pipeline VLM échoue).
|
|
Le default doit appartenir à une allow-list de modèles confirmés présents sur DGX.
|
|
"""
|
|
|
|
import pytest
|
|
|
|
from core.detection import vlm_config
|
|
|
|
|
|
# Le default historique non-DGX-safe (absent du DGX si dépull).
|
|
NON_DGX_SAFE_DEFAULT = "gemma4:latest"
|
|
|
|
_VLM_ENVS = ("RPA_VLM_MODEL", "VLM_MODEL")
|
|
|
|
|
|
@pytest.fixture
|
|
def clean_vlm_env(monkeypatch):
|
|
"""Neutralise les env VLM et réinitialise le cache de résolution."""
|
|
for var in _VLM_ENVS:
|
|
monkeypatch.delenv(var, raising=False)
|
|
vlm_config.reset_vlm_model_cache()
|
|
yield monkeypatch
|
|
vlm_config.reset_vlm_model_cache()
|
|
|
|
|
|
def test_default_vlm_model_is_dgx_safe():
|
|
"""Le default n'est plus `gemma4:latest` et appartient à l'allow-list DGX-safe."""
|
|
assert vlm_config.DEFAULT_VLM_MODEL != NON_DGX_SAFE_DEFAULT
|
|
assert vlm_config.DEFAULT_VLM_MODEL in vlm_config.DGX_SAFE_VLM_MODELS
|
|
|
|
|
|
def test_allow_list_excludes_non_dgx_safe_default():
|
|
"""L'allow-list DGX-safe ne contient pas le default historique risqué."""
|
|
assert NON_DGX_SAFE_DEFAULT not in vlm_config.DGX_SAFE_VLM_MODELS
|
|
|
|
|
|
def test_get_vlm_model_no_env_returns_dgx_safe(clean_vlm_env):
|
|
"""Sans env, même Ollama injoignable, on retourne le default DGX-safe."""
|
|
# Simule Ollama injoignable → get_vlm_model utilise le modèle configuré.
|
|
clean_vlm_env.setattr(vlm_config, "_list_ollama_models", lambda endpoint: None)
|
|
model = vlm_config.get_vlm_model()
|
|
assert model != NON_DGX_SAFE_DEFAULT
|
|
assert model == vlm_config.DEFAULT_VLM_MODEL
|
|
|
|
|
|
def test_get_vlm_model_env_override_keeps_priority(clean_vlm_env):
|
|
"""RPA_VLM_MODEL garde la priorité, même vers un modèle non-DGX-safe explicite."""
|
|
clean_vlm_env.setattr(vlm_config, "_list_ollama_models", lambda endpoint: None)
|
|
clean_vlm_env.setenv("RPA_VLM_MODEL", "gemma4:latest")
|
|
assert vlm_config.get_vlm_model() == "gemma4:latest"
|
|
|
|
|
|
def test_get_vlm_model_legacy_vlm_model_alias(clean_vlm_env):
|
|
"""L'alias de compat VLM_MODEL est honoré avant le default."""
|
|
clean_vlm_env.setattr(vlm_config, "_list_ollama_models", lambda endpoint: None)
|
|
clean_vlm_env.setenv("VLM_MODEL", "mon-modele:custom")
|
|
assert vlm_config.get_vlm_model() == "mon-modele:custom"
|