altametris.sara.core.weight_resolver

Résolveur intelligent de chemins pour les poids de modèles.

Ce module fournit un dispatcher/router qui détecte automatiquement le protocole d’un chemin de poids et délègue le téléchargement ou la validation selon le type: - azure://container/path.pt : Télécharge depuis Azure Blob Storage via AzureWeightManager - https://account.blob.core.windows.net/… : Parse URL Azure et télécharge via AzureWeightManager - https://apim.azure.com/… : Télécharge via APIM avec authentification OAuth2 (HTTPWeightDownloader) - local/path.pt : Valide l’existence du fichier local

Le WeightResolver agit comme une interface unifiée pour BaseDetector et BaseModel, simplifiant la gestion des différentes sources de poids.

URL Structure with Prefix:

APIM URLs follow the pattern: {api_base_url}/weights/{prefix}/{filename}

The prefix is configured via DS_WEIGHTS_PREFIX environment variable (default: “yolo-sara”). This allows organizing weights by project in Azure Blob Storage.

Blob Storage structure:

{container}/{prefix}/{filename} Example: weights-dev/yolo-sara/yolo11n.pt

APIM URL structure:

{api_base_url}/weights/{prefix}/{filename} Example: https://am-ds-apiman-dev.azure-api.net/weights/yolo-sara/yolo11n.pt

Use DsAuthConfig helpers to build URLs correctly:
>>> from altametris.sara.core.auth.config import DsAuthConfig
>>> config = DsAuthConfig.from_env()
>>> url = config.get_apim_weight_url("yolo11n.pt")  # Includes prefix
'https://am-ds-apiman-dev.azure-api.net/weights/yolo-sara/yolo11n.pt'

Example

>>> from altametris.sara.core import WeightResolver
>>> from altametris.sara.core.auth import DsCredentials
>>> # Résolution d'un chemin Azure Blob Storage (SDK)
>>> resolver = WeightResolver(enable_azure=True)
>>> local_path = resolver.resolve("azure://models/yolo11x.pt")
>>> print(f"Model at: {local_path}")
>>> # Résolution d'un chemin local
>>> local_path = resolver.resolve("/path/to/model.pt")
>>> # Résolution d'une URL HTTPS Azure Blob Storage
>>> local_path = resolver.resolve("https://myaccount.blob.core.windows.net/models/yolo11x.pt")
>>> # Résolution d'une URL APIM avec OAuth2 (auto-create credentials)
>>> resolver = WeightResolver(enable_azure=True)
>>> local_path = resolver.resolve("https://apim.azure.com/weights/yolo11x.pt")
>>> # Résolution d'une URL APIM avec credentials explicites
>>> creds = DsCredentials()
>>> resolver = WeightResolver(enable_azure=True, credentials=creds)
>>> local_path = resolver.resolve("https://apim.azure.com/weights/yolo11x.pt")

Attributes

Classes

WeightResolver

Résolveur intelligent de chemins de poids avec support multi-protocoles.

Module Contents

altametris.sara.core.weight_resolver.HAS_AZURE = True
altametris.sara.core.weight_resolver.HAS_HTTP_DOWNLOADER = True
altametris.sara.core.weight_resolver.HAS_DS_CREDENTIALS = True
altametris.sara.core.weight_resolver.logger
class altametris.sara.core.weight_resolver.WeightResolver(enable_azure: bool = True, cache_manager: altametris.sara.core.cache_manager.CacheManager | None = None, azure_weight_manager: Any | None = None, credentials: Any | None = None, **azure_kwargs: Any)

Résolveur intelligent de chemins de poids avec support multi-protocoles.

Parameters:
  • enable_azure – Active le support Azure (défaut: True). Si False, les chemins azure:// et les URLs Azure retourneront une erreur.

  • cache_manager – Instance de CacheManager (créée automatiquement si None).

  • azure_weight_manager – Instance de AzureWeightManager (créée automatiquement si None et enable_azure=True).

  • credentials – Instance de DsCredentials pour l’authentification APIM OAuth2 (créée automatiquement si None). Utilisé uniquement pour les URLs APIM (HTTPWeightDownloader).

  • **azure_kwargs – Arguments pour initialiser AzureWeightManager si non fourni (storage_account_name, auth_method, connection_string, etc.)

Raises:
  • ConfigurationError – Si la configuration est invalide.

  • ImportError – Si azure-storage-blob n’est pas installé et enable_azure=True.

Example

>>> # Avec Azure activé (défaut)
>>> resolver = WeightResolver(
...     enable_azure=True,
...     storage_account_name="myaccount",
...     auth_method="managed_identity"
... )
>>> path = resolver.resolve("azure://models/yolo11n.pt")
>>> # Sans Azure (chemins locaux seulement)
>>> resolver = WeightResolver(enable_azure=False)
>>> path = resolver.resolve("/local/path/model.pt")
>>> # Avec credentials APIM explicites
>>> from altametris.sara.core.auth import DsCredentials
>>> creds = DsCredentials()
>>> resolver = WeightResolver(enable_azure=True, credentials=creds)
>>> path = resolver.resolve("https://apim.azure.com/weights/yolo11x.pt")
enable_azure = True
cache = None
azure_manager: Any | None = None
http_downloader: Any | None = None
credentials = None
resolve(model_path: str, force_download: bool = False) pathlib.Path

Résout un chemin de modèle vers un chemin local.

Détecte automatiquement le protocole et applique la stratégie appropriée: - Chemin local existant → Valide existence et retourne (priorité haute) - azure://container/weights → Télécharge via AzureWeightManager (SDK) - https://apim.*/... → Télécharge via HTTPWeightDownloader (OAuth2) - https://*.blob.core.windows.net/... → Parse et télécharge via AzureWeightManager (SDK) - Autres chemins locaux → Valide existence et retourne

Parameters:
  • model_path – Chemin du modèle (azure://, https://, ou chemin local)

  • force_download – Force le téléchargement même si en cache (pour azure:// et APIM)

Returns:

Path absolu du fichier de poids en local

Raises:

Example

>>> resolver = WeightResolver(enable_azure=True)
>>> # Azure protocol (SDK)
>>> path = resolver.resolve("azure://models/yolo11n.pt")
>>> # Azure Blob Storage HTTPS URL (SDK)
>>> path = resolver.resolve("https://myaccount.blob.core.windows.net/models/yolo11n.pt")
>>> # APIM URL with OAuth2 (auto-create credentials)
>>> path = resolver.resolve("https://apim.azure.com/weights/yolo11x.pt")
>>> # APIM URL with explicit credentials
>>> from altametris.sara.core.auth import DsCredentials
>>> resolver = WeightResolver(enable_azure=True, credentials=DsCredentials())
>>> path = resolver.resolve("https://apim.azure.com/weights/yolo11x.pt")
>>> # Local path
>>> path = resolver.resolve("/local/path/model.pt")
>>> # Force re-download
>>> path = resolver.resolve("azure://models/yolo11n.pt", force_download=True)
clear_cache(pattern: str | None = None) int

Vide le cache local des poids téléchargés.

Proxy vers CacheManager.clear_cache() pour faciliter l’utilisation.

Parameters:

pattern – Pattern optionnel (glob style, ex: "models/*.pt") Si None, supprime tout le cache.

Returns:

Nombre de fichiers supprimés

Example

>>> resolver = WeightResolver()
>>> # Supprimer tous les modèles yolo11
>>> removed = resolver.clear_cache(pattern="models/yolo*.pt")
>>> # Vider complètement le cache
>>> removed = resolver.clear_cache()
get_cache_stats() dict[str, Any]

Retourne les statistiques du cache local.

Proxy vers CacheManager.get_cache_stats() pour faciliter l’utilisation.

Returns:

Dictionnaire avec les statistiques du cache

Example

>>> resolver = WeightResolver()
>>> stats = resolver.get_cache_stats()
>>> print(f"Cache: {stats['total_files']} files, {stats['total_size_mb']:.2f} MB")
list_weights(container: str = 'models', prefix: str | None = None) list[dict[str, Any]]

Liste les poids disponibles dans un conteneur Azure.

Proxy vers AzureWeightManager.list_weights() pour faciliter l’utilisation.

Parameters:
  • container – Nom du conteneur (défaut: “models”)

  • prefix – Préfixe optionnel pour filtrer (ex: “yolo11”)

Returns:

Liste de dictionnaires contenant les métadonnées de chaque poid

Raises:

Example

>>> resolver = WeightResolver(enable_azure=True)
>>> weights = resolver.list_weights("models", prefix="yolo11")
>>> for weight in weights:
...     print(f"{weight['name']}: {weight['size_mb']:.2f} MB")