mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-06-23 03:31:17 -03:00
- group_by_model dedup now counts versions per group and attaches version_count; respects update_flag_strategy (same_base) by sub-grouping on base_model - Card footer shows clickable 'x versions' link instead of version name when grouped (hides HIGH/LOW badges); clicking triggers View Local Versions without page reload - Added 'Local Versions' sort option (versions_count), auto-hidden when group_by_model is off - Sort preference is saved/restored separately for normal and grouped modes - VLM flow (triggerVlmView, clearCustomFilter) uses resetAndReload() via API instead of window.location.reload() - Fixed cache mutation bug: version_count is now set on a shallow copy, not the cached dict, preventing stale version_count leaking into VLM responses - i18n: all 9 locale files translated
61 lines
2.8 KiB
Python
61 lines
2.8 KiB
Python
import os
|
|
import logging
|
|
from typing import Dict
|
|
|
|
from .base_model_service import BaseModelService
|
|
from .auto_tag_service import extract_auto_tags
|
|
from ..utils.models import EmbeddingMetadata
|
|
from ..config import config
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class EmbeddingService(BaseModelService):
|
|
"""Embedding-specific service implementation"""
|
|
|
|
def __init__(self, scanner, update_service=None):
|
|
"""Initialize Embedding service
|
|
|
|
Args:
|
|
scanner: Embedding scanner instance
|
|
update_service: Optional service for remote update tracking.
|
|
"""
|
|
super().__init__("embedding", scanner, EmbeddingMetadata, update_service=update_service)
|
|
|
|
async def format_response(self, embedding_data: Dict) -> Dict:
|
|
"""Format Embedding data for API response"""
|
|
# Get sub_type from cache entry (new canonical field)
|
|
sub_type = embedding_data.get("sub_type", "embedding")
|
|
|
|
return {
|
|
"model_name": embedding_data["model_name"],
|
|
"file_name": embedding_data["file_name"],
|
|
"preview_url": config.get_preview_static_url(embedding_data.get("preview_url", "")),
|
|
"preview_nsfw_level": embedding_data.get("preview_nsfw_level", 0),
|
|
"base_model": embedding_data.get("base_model", ""),
|
|
"folder": embedding_data["folder"],
|
|
"sha256": embedding_data.get("sha256", ""),
|
|
"file_path": embedding_data["file_path"].replace(os.sep, "/"),
|
|
"file_size": embedding_data.get("size", 0),
|
|
"modified": embedding_data.get("modified", ""),
|
|
"tags": embedding_data.get("tags", []),
|
|
"from_civitai": embedding_data.get("from_civitai", True),
|
|
# "usage_count": embedding_data.get("usage_count", 0), # TODO: Enable when embedding usage tracking is implemented
|
|
"notes": embedding_data.get("notes", ""),
|
|
"sub_type": sub_type,
|
|
"favorite": embedding_data.get("favorite", False),
|
|
"exclude": bool(embedding_data.get("exclude", False)),
|
|
"update_available": bool(embedding_data.get("update_available", False)),
|
|
"skip_metadata_refresh": bool(embedding_data.get("skip_metadata_refresh", False)),
|
|
"civitai": self.filter_civitai_data(embedding_data.get("civitai", {}), minimal=True),
|
|
"auto_tags": embedding_data.get("auto_tags") or extract_auto_tags(embedding_data),
|
|
"version_count": embedding_data.get("version_count"),
|
|
}
|
|
|
|
def find_duplicate_hashes(self) -> Dict:
|
|
"""Find Embeddings with duplicate SHA256 hashes"""
|
|
return self.scanner._hash_index.get_duplicate_hashes()
|
|
|
|
def find_duplicate_filenames(self) -> Dict:
|
|
"""Find Embeddings with conflicting filenames"""
|
|
return self.scanner._hash_index.get_duplicate_filenames()
|