Module выполненияTranscriber(ExecutionRequest) в transcriber.py: разрешает auto и device-aware умолчания, загружает модель один раз на запуск, держит модель, adapter и фактическое исполнение, fallback GPU→CPU (при загрузке и mid-stream) остаётся внутри. Caller получает TranscribeResult и ExecutionInfo (запрошенное/выбранное исполнение, движок, модель, квантизация, потоки, runtime_info() adapter'а).
CLI строит один запрос, создаёт module после prescan, не переносит состояние между файлами. --verbose печатает движок, запрошенные потоки и версии runtime/providers. Строка устройства для шапки транскрипта берётся из данных module.
ONNX: --threads задаёт intra_op_num_threads сессиям ASR и VAD через SessionOptions; 0 оставляет настройки onnxruntime. Providers по-прежнему только CPU; в диагностике доступные providers отделены от заданных сессиям.
Удалено: load_model, _transcribe_file, TranscribeFileResult, apply_device_defaults, _format_device_info, тесты переноса полей и недостижимые из CLI сообщения о fallback.
Документация: ADR-002 (решения 2 и 4 пересмотрены), ADR-003, README «Диагностика исполнения», AGENTS.md, CONTRIBUTING.md, статус спеки.
Изменения публичного API transcribe(): model_name/compute_type по умолчанию None (умолчания устройства), device="auto" = ONNX CPU, как в CLI; strict_device=False сохранён — единственный путь к fallback.
Проверка
uv run pytest -q — 535 passed, 2 skipped; реальные модели в тестах не загружаются.
Живой прогон на 20-секундном клипе: --verbose --threads 4 показывает движок, потоки, onnxruntime/onnx-asr, providers ASR и VAD, intra_op_threads: 4; транскрипт с «ONNX (CPU)» записан.
Строка AGENTS.md, docstring execution, незащищённый runtime_info() OpenVINO, устаревшие имена в тестах
Исправлены; сбой диагностики теперь попадает в сведения строкой, не роняя запуск
non-gating
_is_openvino_error считает любой RuntimeError ошибкой движка
Вне задачи: поведение существовало до рефакторинга, достижимо только через Python API с strict_device=False
Вне задачи, замечено по ходу: тесты test_cli_windows_cuda_diagnostic / test_cli_linux_cuda_error_no_windows_hint (из #2) проверяют отсутствие строк, которых в коде уже нет — их негативные проверки формальны.
Закрывает #56. Спецификация: `docs/specs/2026-09-21-transcription-execution.md`.
## Что сделано
- **Module выполнения** `Transcriber(ExecutionRequest)` в `transcriber.py`: разрешает `auto` и device-aware умолчания, загружает модель один раз на запуск, держит модель, adapter и фактическое исполнение, fallback GPU→CPU (при загрузке и mid-stream) остаётся внутри. Caller получает `TranscribeResult` и `ExecutionInfo` (запрошенное/выбранное исполнение, движок, модель, квантизация, потоки, `runtime_info()` adapter'а).
- **CLI** строит один запрос, создаёт module после prescan, не переносит состояние между файлами. `--verbose` печатает движок, запрошенные потоки и версии runtime/providers. Строка устройства для шапки транскрипта берётся из данных module.
- **ONNX**: `--threads` задаёт `intra_op_num_threads` сессиям ASR и VAD через `SessionOptions`; 0 оставляет настройки onnxruntime. Providers по-прежнему только CPU; в диагностике доступные providers отделены от заданных сессиям.
- **Удалено**: `load_model`, `_transcribe_file`, `TranscribeFileResult`, `apply_device_defaults`, `_format_device_info`, тесты переноса полей и недостижимые из CLI сообщения о fallback.
- **Документация**: ADR-002 (решения 2 и 4 пересмотрены), ADR-003, README «Диагностика исполнения», AGENTS.md, CONTRIBUTING.md, статус спеки.
Изменения публичного API `transcribe()`: `model_name`/`compute_type` по умолчанию `None` (умолчания устройства), `device="auto"` = ONNX CPU, как в CLI; `strict_device=False` сохранён — единственный путь к fallback.
## Проверка
- `uv run pytest -q` — 535 passed, 2 skipped; реальные модели в тестах не загружаются.
- Живой прогон на 20-секундном клипе: `--verbose --threads 4` показывает движок, потоки, `onnxruntime`/`onnx-asr`, providers ASR и VAD, `intra_op_threads: 4`; транскрипт с «ONNX (CPU)» записан.
- Критерии приёмки из #56 отмечены в задаче.
## Ревью (два слепых, свежие сессии)
**Astra (gpt-6-astra, high)** — дефекты, регрессии, уместность решений, тексты. 5 находок, все подтверждены мной и закрыты; recheck: ALL_CLOSED, правки соразмерны.
| ID | Суть | Решение |
|---|---|---|
| CODE-1 MAJOR | При fallback CUDA→CPU неявный `float16` уезжал на CPU, где CTranslate2 его не поддерживает | Неявные model/compute_type переразрешаются по умолчаниям целевого устройства при каждой загрузке |
| CODE-2 MAJOR | После отказа по пословному контракту `prepare()` считал module готовым | `_info` присваивается только после проверки |
| CODE-3 MINOR | «Потоки: N» для OpenVINO, который `--threads` не применяет | В `--verbose` потоки помечены «запрошено», adapters сообщают применённые |
| CODE-4 MINOR | Тест обычной ошибки шёл strict-запуском и не различал классификацию | `strict_device=False` в тесте |
| CODE-5 NIT | README неточно описывал условие строки «Запрошено …, используется …» | Формулировка исправлена |
**Opus (свежая сессия)** — соответствие задаче, форма решения, запахи. 11 находок + 1 non-gating; 11 закрыты, recheck принёс TASK-12 (устаревший абзац ADR-003), закрыт отдельным коммитом.
| ID | Суть | Решение |
|---|---|---|
| TASK-1 MAJOR | С удалением `apply_device_defaults` пропало покрытие умолчаний для cpu/cuda/openvino и TOML-переопределений (мутанты выживали) | Параметризованный тест module по устройствам, тесты явных значений и TOML `compute_type` |
| TASK-2 MINOR | Сообщения о mid-stream fallback в CLI недостижимы | Удалены; сообщение об уточнении OpenVINO оставлено (достижимо, покрыто) |
| TASK-3 MINOR | Каскад конфига разрезан: `resolve_defaults` отдавал значения, которые CLI выбрасывал и пересчитывал | `resolve_defaults` оставляет `model`/`compute_type` пустыми, CLI передаёт их в module |
| TASK-4 MINOR | Таблица `_ENGINES` дублировала диспетчеризацию `get_backend` | Удалена; adapter объявляет `engine` |
| TASK-5 / TASK-6 | Совпадают с CODE-3 / CODE-4 | См. выше |
| TASK-7 MINOR | CONTRIBUTING.md с устаревшими именами | Обновлён |
| TASK-8…11 NIT | Строка AGENTS.md, docstring `execution`, незащищённый `runtime_info()` OpenVINO, устаревшие имена в тестах | Исправлены; сбой диагностики теперь попадает в сведения строкой, не роняя запуск |
| non-gating | `_is_openvino_error` считает любой RuntimeError ошибкой движка | Вне задачи: поведение существовало до рефакторинга, достижимо только через Python API с `strict_device=False` |
Вне задачи, замечено по ходу: тесты `test_cli_windows_cuda_diagnostic` / `test_cli_linux_cuda_error_no_windows_hint` (из #2) проверяют отсутствие строк, которых в коде уже нет — их негативные проверки формальны.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Transcriber принимает ExecutionRequest, разрешает auto и device-aware
умолчания, загружает модель один раз на запуск и держит fallback внутри.
Caller получает TranscribeResult и ExecutionInfo вместо model/backend/path.
Публичный transcribe() идёт через тот же module. Adapters отдают
runtime_info() для диагностики; legacy load_model/_transcribe_file пока
остаются для CLI.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
--threads больше не игнорируется ONNX adapter'ом: cpu_threads > 0 задаёт
intra_op_num_threads через SessionOptions обеим сессиям, 0 оставляет
настройки onnxruntime. Фактический бюджет виден в runtime_info().
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
CLI строит один ExecutionRequest, создаёт Transcriber после prescan
и получает результат с ExecutionInfo: разрешение auto, device-aware
умолчания, проверка пословного контракта, строка устройства для шапки
и fallback ушли за seam. --verbose печатает движок, потоки и runtime_info().
Удалены load_model, _transcribe_file, TranscribeFileResult,
apply_device_defaults и тесты переноса полей; сценарные тесты CLI идут
через CliRunner с fake adapter на get_backend.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ADR-002 и ADR-003 отражают Transcriber как единственного владельца
загрузки и fallback; README получил раздел «Диагностика исполнения»
и уточнение --threads для ONNX; AGENTS.md — новые тестовые паттерны.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- неявный compute_type при fallback переразрешается по умолчанию CPU
(float16 CUDA не переносится на CTranslate2 CPU);
- prepare() помечает module готовым только после проверки пословного
контракта;
- движок сообщает сам adapter (атрибут engine) вместо параллельной таблицы;
- сбой runtime_info() не роняет запуск;
- каскад конфига оставляет model/compute_type пустыми для module,
CLI не дублирует CLI > TOML;
- удалены недостижимые из CLI сообщения о mid-stream fallback;
- в --verbose потоки помечены как запрошенные, adapters сообщают
применённые; OpenVINO прямо говорит, что --threads не применяется;
- тесты: умолчания по устройствам, TOML compute_type, не-strict сценарий
обычной ошибки; CONTRIBUTING.md и AGENTS.md без устаревших имён.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Закрывает #56. Спецификация:
docs/specs/2026-09-21-transcription-execution.md.Что сделано
Transcriber(ExecutionRequest)вtranscriber.py: разрешаетautoи device-aware умолчания, загружает модель один раз на запуск, держит модель, adapter и фактическое исполнение, fallback GPU→CPU (при загрузке и mid-stream) остаётся внутри. Caller получаетTranscribeResultиExecutionInfo(запрошенное/выбранное исполнение, движок, модель, квантизация, потоки,runtime_info()adapter'а).--verboseпечатает движок, запрошенные потоки и версии runtime/providers. Строка устройства для шапки транскрипта берётся из данных module.--threadsзадаётintra_op_num_threadsсессиям ASR и VAD черезSessionOptions; 0 оставляет настройки onnxruntime. Providers по-прежнему только CPU; в диагностике доступные providers отделены от заданных сессиям.load_model,_transcribe_file,TranscribeFileResult,apply_device_defaults,_format_device_info, тесты переноса полей и недостижимые из CLI сообщения о fallback.Изменения публичного API
transcribe():model_name/compute_typeпо умолчаниюNone(умолчания устройства),device="auto"= ONNX CPU, как в CLI;strict_device=Falseсохранён — единственный путь к fallback.Проверка
uv run pytest -q— 535 passed, 2 skipped; реальные модели в тестах не загружаются.--verbose --threads 4показывает движок, потоки,onnxruntime/onnx-asr, providers ASR и VAD,intra_op_threads: 4; транскрипт с «ONNX (CPU)» записан.Ревью (два слепых, свежие сессии)
Astra (gpt-6-astra, high) — дефекты, регрессии, уместность решений, тексты. 5 находок, все подтверждены мной и закрыты; recheck: ALL_CLOSED, правки соразмерны.
float16уезжал на CPU, где CTranslate2 его не поддерживаетprepare()считал module готовым_infoприсваивается только после проверки--threadsне применяет--verboseпотоки помечены «запрошено», adapters сообщают применённыеstrict_device=Falseв тестеOpus (свежая сессия) — соответствие задаче, форма решения, запахи. 11 находок + 1 non-gating; 11 закрыты, recheck принёс TASK-12 (устаревший абзац ADR-003), закрыт отдельным коммитом.
apply_device_defaultsпропало покрытие умолчаний для cpu/cuda/openvino и TOML-переопределений (мутанты выживали)compute_typeresolve_defaultsотдавал значения, которые CLI выбрасывал и пересчитывалresolve_defaultsоставляетmodel/compute_typeпустыми, CLI передаёт их в module_ENGINESдублировала диспетчеризациюget_backendengineexecution, незащищённыйruntime_info()OpenVINO, устаревшие имена в тестах_is_openvino_errorсчитает любой RuntimeError ошибкой движкаstrict_device=FalseВне задачи, замечено по ходу: тесты
test_cli_windows_cuda_diagnostic/test_cli_linux_cuda_error_no_windows_hint(из #2) проверяют отсутствие строк, которых в коде уже нет — их негативные проверки формальны.🤖 Generated with Claude Code