From 65fdb036abe7e261e0b56caafdb33340184a7a0b Mon Sep 17 00:00:00 2001 From: Vladimir Bryzgalov Date: Mon, 17 Aug 2026 15:49:47 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=BA=D0=B0=D1=87=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B5=D0=B9=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20=D0=BF=D1=80=D0=B8=20=D0=BB?= =?UTF-8?q?=D1=8E=D0=B1=D0=BE=D0=BC=20=D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1?= =?UTF-8?q?=D0=B5=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Модель докачивалась только в launcher, но запуск бывает и напрямую через app.main: у кого остался прежний start.bat, установка так и оставалась незаконченной, а сообщение советовало download_models.bat, который тоже устарел. Теперь проверка и докачка есть в обеих точках входа. Co-Authored-By: Claude Opus 5 (1M context) --- app/main.py | 12 +++++++----- tests/test_models.py | 13 +++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) 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__