fix(openvino): исправлены баги compute_type, fallback и help text

- Зачем:
  - compute_type из конфига терялся как implicit, ломая выбор модели OpenVINO.
  - узкий матчинг ошибок пропускал реальные OpenVINO runtime failures.
  - ensure_model_available(device="openvino") падал из-за дефолта float32.
  - ensure_model_available не передавал compute_type_explicit, ломая large-v3 → fp16 override.
  - help по --compute-type не отражал дефолт для OpenVINO.
- Что:
  - ct_explicit учитывает и CLI-флаг, и конфиг-файл.
  - публичный API transcribe() передаёт compute_type_explicit=True.
  - _is_openvino_error() ловит любой RuntimeError.
  - ensure_model_available: дефолт compute_type из DEVICE_DEFAULTS, explicit прокинут в get_backend.
  - --compute-type help обновлён: float16 (CUDA) / int8 (OpenVINO) / float32 (CPU).
- Проверка:
  - uv run pytest -v — 124 passed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-21 23:45:27 +03:00
co-authored by Claude Opus 4.6
parent ee9e017083
commit 262bfd91d1
3 changed files with 50 additions and 7 deletions
+29
View File
@@ -512,3 +512,32 @@ def test_openvino_strict_device_no_fallback(mock_get_backend):
with pytest.raises(RuntimeError, match="OpenVINO"):
load_model("medium", "openvino", "int8", strict_device=True)
@patch("local_transcriber.transcriber.get_backend")
def test_openvino_runtime_error_triggers_fallback(mock_get_backend):
"""Любой RuntimeError от OpenVINO бэкенда → fallback."""
ov_backend = _make_backend(
create_model_error=RuntimeError("Exception from src/inference/..."),
)
cpu_backend = _make_backend(model_path="/mock/cpu/model")
def backend_for_device(device, **kwargs):
return ov_backend if device == "openvino" else cpu_backend
mock_get_backend.side_effect = backend_for_device
with pytest.warns(UserWarning, match="Переключение на CPU"):
_, actual_device, _, _ = load_model("medium", "openvino", "int8")
assert actual_device == "cpu"
def test_ensure_model_available_openvino_default_compute_type():
"""ensure_model_available(device='openvino') без compute_type не падает."""
from local_transcriber.backends.openvino import OpenVINOBackend
backend = OpenVINOBackend(compute_type_explicit=True)
# Проверяем что _resolve_repo работает с дефолтным compute_type для openvino (int8)
repo = backend._resolve_repo("medium", "int8")
assert repo == "OpenVINO/whisper-medium-int8-ov"