diff --git a/py/routes/base_model_routes.py b/py/routes/base_model_routes.py index 35415331..84b9f43f 100644 --- a/py/routes/base_model_routes.py +++ b/py/routes/base_model_routes.py @@ -31,7 +31,6 @@ from ..services.websocket_progress_callback import ( ) from ..utils.exif_utils import ExifUtils from ..utils.metadata_manager import MetadataManager -from ..utils.routes_common import ModelRouteUtils from .model_route_registrar import COMMON_ROUTE_DEFINITIONS, ModelRouteRegistrar from .handlers.model_handlers import ( ModelAutoOrganizeHandler, @@ -236,10 +235,6 @@ class BaseModelRoutes(ABC): """Expose handlers for subclasses or tests.""" return self._ensure_handler_mapping()[name] - @property - def utils(self) -> ModelRouteUtils: # pragma: no cover - compatibility shim - return ModelRouteUtils - def _ensure_service(self): if self.service is None: raise RuntimeError("Model service has not been attached") diff --git a/py/services/base_model_service.py b/py/services/base_model_service.py index 0b4aaf99..2c2c0ad8 100644 --- a/py/services/base_model_service.py +++ b/py/services/base_model_service.py @@ -4,7 +4,6 @@ import logging import os from ..utils.models import BaseModelMetadata -from ..utils.routes_common import ModelRouteUtils from .model_query import FilterCriteria, ModelCacheRepository, ModelFilterSet, SearchStrategy, SettingsProvider from .settings_manager import settings as default_settings @@ -197,6 +196,18 @@ class BaseModelService(ABC): """Get model root directories""" return self.scanner.get_model_roots() + def filter_civitai_data(self, data: Dict, minimal: bool = False) -> Dict: + """Filter relevant fields from CivitAI data""" + if not data: + return {} + + fields = ["id", "modelId", "name", "trainedWords"] if minimal else [ + "id", "modelId", "name", "createdAt", "updatedAt", + "publishedAt", "trainedWords", "baseModel", "description", + "model", "images", "customImages", "creator" + ] + return {k: data[k] for k in fields if k in data} + async def get_folder_tree(self, model_root: str) -> Dict: """Get hierarchical folder tree for a specific model root""" cache = await self.scanner.get_cached_data() @@ -307,7 +318,7 @@ class BaseModelService(ABC): for model in cache.raw_data: if model.get('file_path') == file_path: - return ModelRouteUtils.filter_civitai_data(model.get("civitai", {})) + return self.filter_civitai_data(model.get("civitai", {})) return None diff --git a/py/services/checkpoint_service.py b/py/services/checkpoint_service.py index ef3dc4a8..2f7b8a96 100644 --- a/py/services/checkpoint_service.py +++ b/py/services/checkpoint_service.py @@ -1,11 +1,10 @@ import os import logging -from typing import Dict, List, Optional +from typing import Dict from .base_model_service import BaseModelService from ..utils.models import CheckpointMetadata from ..config import config -from ..utils.routes_common import ModelRouteUtils logger = logging.getLogger(__name__) @@ -38,7 +37,7 @@ class CheckpointService(BaseModelService): "notes": checkpoint_data.get("notes", ""), "model_type": checkpoint_data.get("model_type", "checkpoint"), "favorite": checkpoint_data.get("favorite", False), - "civitai": ModelRouteUtils.filter_civitai_data(checkpoint_data.get("civitai", {}), minimal=True) + "civitai": self.filter_civitai_data(checkpoint_data.get("civitai", {}), minimal=True) } def find_duplicate_hashes(self) -> Dict: diff --git a/py/services/embedding_service.py b/py/services/embedding_service.py index bab067d9..46396fc5 100644 --- a/py/services/embedding_service.py +++ b/py/services/embedding_service.py @@ -1,11 +1,10 @@ import os import logging -from typing import Dict, List, Optional +from typing import Dict from .base_model_service import BaseModelService from ..utils.models import EmbeddingMetadata from ..config import config -from ..utils.routes_common import ModelRouteUtils logger = logging.getLogger(__name__) @@ -38,7 +37,7 @@ class EmbeddingService(BaseModelService): "notes": embedding_data.get("notes", ""), "model_type": embedding_data.get("model_type", "embedding"), "favorite": embedding_data.get("favorite", False), - "civitai": ModelRouteUtils.filter_civitai_data(embedding_data.get("civitai", {}), minimal=True) + "civitai": self.filter_civitai_data(embedding_data.get("civitai", {}), minimal=True) } def find_duplicate_hashes(self) -> Dict: diff --git a/py/services/lora_service.py b/py/services/lora_service.py index d1e522a3..551c4d3c 100644 --- a/py/services/lora_service.py +++ b/py/services/lora_service.py @@ -5,7 +5,6 @@ from typing import Dict, List, Optional from .base_model_service import BaseModelService from ..utils.models import LoraMetadata from ..config import config -from ..utils.routes_common import ModelRouteUtils logger = logging.getLogger(__name__) @@ -38,7 +37,7 @@ class LoraService(BaseModelService): "usage_tips": lora_data.get("usage_tips", ""), "notes": lora_data.get("notes", ""), "favorite": lora_data.get("favorite", False), - "civitai": ModelRouteUtils.filter_civitai_data(lora_data.get("civitai", {}), minimal=True) + "civitai": self.filter_civitai_data(lora_data.get("civitai", {}), minimal=True) } async def _apply_specific_filters(self, data: List[Dict], **kwargs) -> List[Dict]: diff --git a/py/utils/example_images_metadata.py b/py/utils/example_images_metadata.py index 66db05a3..8820b49b 100644 --- a/py/utils/example_images_metadata.py +++ b/py/utils/example_images_metadata.py @@ -69,7 +69,6 @@ class MetadataUpdater: # Track that we're refreshing this model download_progress['refreshed_models'].add(model_hash) - # Use ModelRouteUtils to refresh metadata async def update_cache_func(old_path, new_path, metadata): return await scanner.update_single_model_cache(old_path, new_path, metadata) diff --git a/py/utils/routes_common.py b/py/utils/routes_common.py index 84e2fc9d..642bfcad 100644 --- a/py/utils/routes_common.py +++ b/py/utils/routes_common.py @@ -18,7 +18,7 @@ from ..services.settings_manager import settings logger = logging.getLogger(__name__) - +# TODO: retire this class class ModelRouteUtils: """Shared utilities for model routes (LoRAs, Checkpoints, etc.)""" diff --git a/tests/conftest.py b/tests/conftest.py index 006a1adc..58263c8a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -81,7 +81,7 @@ class MockHashIndex: class MockCache: - """Cache object with the attributes consumed by ``ModelRouteUtils``.""" + """Cache object with the attributes.""" def __init__(self, items: Optional[Sequence[Dict[str, Any]]] = None): self.raw_data: List[Dict[str, Any]] = list(items or []) @@ -89,7 +89,7 @@ class MockCache: async def resort(self) -> None: self.resort_calls += 1 - # ``ModelRouteUtils`` expects the coroutine interface but does not + # expects the coroutine interface but does not # rely on the return value.