diff --git a/app/main.py b/app/main.py index 55a9238..6112d9c 100644 --- a/app/main.py +++ b/app/main.py @@ -20,7 +20,7 @@ from fastapi.security import HTTPBearer from app.config import ConfigError, Settings, load_settings from app.console import setup_logging from app.logbuffer import get as log_buffer -from app.models import missing_models +from app.models import ensure_models, missing_models from app.logbuffer import install as install_log_buffer from app.pipeline import ModelsMissing, Pipeline, to_wav16k from app.security import (check_token, client_address, ip_allowed, @@ -486,10 +486,12 @@ def run() -> None: # Модели проверяются здесь, а не по _state: lifespan отработает уже внутри # uvicorn.run, и к тому моменту сообщение выводить поздно. - for missing in missing_models(settings.models_dir, settings.diarize): - print(f"\n Не хватает модели: {missing}" - "\n Запустите download_models.bat - сервис поднимется, но" - "\n принимать записи не сможет.\n") + # Докачиваем и здесь, а не только в launcher: запуск бывает и напрямую + # через app.main, и тогда установка осталась бы незаконченной. + for missing in ensure_models(settings.models_dir, settings.diarize): + print(f"\n Не хватает модели: {missing.name}" + "\n Скачать не удалось - проверьте доступ в интернет." + "\n Сервис поднимется, но принимать записи не сможет.\n") nets = len(allowlist) access = f"только с {nets} адресов" if nets else "со ВСЕХ адресов" diff --git a/tests/test_models.py b/tests/test_models.py index ad24ccb..b7a3a79 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -57,3 +57,16 @@ class TestEnsure: ensure_models(tmp_path, diarize=False, fetch=half) assert not (tmp_path / "silero_vad.onnx").exists() + + +class TestEntryPoints: + """Запуск бывает и через launcher, и напрямую через app.main.""" + + def test_both_entry_points_provision_models(self): + import inspect + + import app.launcher + import app.main + + for module in (app.launcher, app.main): + assert "ensure_models" in inspect.getsource(module), module.__name__