import logging from typing import Protocol, Dict, Any, List, runtime_checkable from .gguf_metadata import fetch_gguf_metadata_from_repo, map_to_metadata logger = logging.getLogger(__name__) @runtime_checkable class ModelFileExtractor(Protocol): def can_extract(self, model_id: str) -> bool: ... def extract_metadata(self, model_id: str) -> Dict[str, Any]: ... class GGUFFileExtractor: def can_extract(self, model_id: str) -> bool: try: from huggingface_hub import list_repo_files return any(f.endswith(".gguf") for f in list_repo_files(model_id)) except Exception: return False def extract_metadata(self, model_id: str) -> Dict[str, Any]: from huggingface_hub import list_repo_files try: files = list_repo_files(model_id) gguf_files = [f for f in files if f.endswith(".gguf")] if not gguf_files: return {} model_info = fetch_gguf_metadata_from_repo(model_id, gguf_files[0]) if model_info is None: return {} return map_to_metadata(model_info) except Exception as e: logger.warning(f"GGUF extraction failed for {model_id}: {e}") return {} def default_extractors() -> List[ModelFileExtractor]: return [GGUFFileExtractor()]