"""Entrypoint do Hugging Face Space (SDK Gradio + ZeroGPU). Regra do ZeroGPU: modelos só podem ir para 'cuda' no startup do módulo (a emulação CUDA não intercepta cargas em runtime). Por isso todos os modelos do seletor são carregados aqui, no boot. O conjunto é configurável pela variável ESPELHO_SPACE_MODELS (lista separada por vírgula) nas Settings do Space — orçamento: ~50 GB de disco e a RAM do contêiner. """ import os import sys from pathlib import Path import spaces # noqa: F401 (importar antes do torch; requisito ZeroGPU) sys.path.insert(0, str(Path(__file__).parent / "src")) from espelho.model import load_model # noqa: E402 from espelho.ui import CSS, TEMA, build_app # noqa: E402 PADRAO = "google/gemma-2-2b-it,google/gemma-3-4b-it,google/gemma-2-9b-it" MODELOS = [ m.strip() for m in os.environ.get("ESPELHO_SPACE_MODELS", PADRAO).split(",") if m.strip() ] bundles = {} for model_id in MODELOS: print(f"[boot] carregando {model_id} ...", flush=True) tokenizer, model = load_model(model_id) bundles[model_id] = [tokenizer, model, None] demo = build_app(bundles, ativo_id=MODELOS[0]) demo.launch(css=CSS, theme=TEMA)