feat(transcriber): deep module выполнения транскрипции (#56) #58

Merged
ddmitry merged 7 commits from feat/56-transcription-execution into master 2026-09-22 09:46:24 +03:00
Owner

Закрывает #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

Закрывает #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)
ddmitry added 7 commits 2026-09-22 00:37:58 +03:00
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>
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>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ddmitry merged commit 328580abfb into master 2026-09-22 09:46:24 +03:00
Sign in to join this conversation.