File size: 1,728 Bytes
c009d4f
f7edee4
c009d4f
 
f7edee4
 
c009d4f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f7edee4
c009d4f
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import gc
from typing import List
import gradio as gr

from core.settings import ALL_MODEL_MAP
from utils.app_utils import _ensure_model_downloaded

class ModelManager:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(ModelManager, cls).__new__(cls, *args, **kwargs)
        return cls._instance

    def __init__(self):
        if hasattr(self, 'initialized'):
            return
        self.initialized = True
        print("✅ ModelManager initialized.")

    def ensure_models_downloaded(self, required_models: List[str], progress):
        print(f"--- [ModelManager] Ensuring models are downloaded: {required_models} ---")
        
        files_to_download = set()
        for display_name in required_models:
            if display_name in ALL_MODEL_MAP:
                _, components, _, _ = ALL_MODEL_MAP[display_name]
                for component_file in components.values():
                    files_to_download.add(component_file)
        
        files_to_download = list(files_to_download)
        total_files = len(files_to_download)
        
        for i, filename in enumerate(files_to_download):
            if progress and hasattr(progress, '__call__'):
                progress(i / total_files if total_files > 0 else 0, desc=f"Checking file: {filename}")
            try:
                _ensure_model_downloaded(filename, progress)
            except Exception as e:
                raise gr.Error(f"Failed to download model component '{filename}'. Reason: {e}")

        print(f"--- [ModelManager] ✅ All required models are present on disk. ---")

model_manager = ModelManager()