Spec delta transcription-provider, proposal and design with decisions made without discussion. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QKHeGuAYh4W1jNdjMConZa
3.8 KiB
3.8 KiB
Proposal: openai-transcriber
Issue: #5 — Провайдер распознавания: OpenAI-совместимый /v1/audio/transcriptions (AITUNNEL, gpt-4o-transcribe).
Why
Core умеет сохранять запись и доводить её до текста через очередь с повторами, но реализации порта Transcriber нет: распознавать нечем. Нужен провайдер, который отправляет аудио файлом во внешний сервис и раскладывает любой исход в контракт TranscribeResult (ok / temporary / permanent) так, чтобы правила повторов из recording-lifecycle работали, а API-ключ не утекал ни в репозиторий, ни в заметки.
What Changes
- Новый порт
HttpClientвsrc/core/ports.ts: POST с теломArrayBufferи отдельным полемcontentType; любой HTTP-статус — ответ, исключение — только сетевой сбой. src/core/multipart.ts: побайтная сборкаmultipart/form-data(уrequestUrlнетFormData).src/core/openai.ts:OpenAiTranscriber— запрос к<baseUrl>/audio/transcriptions, предпроверки без сети, таймаут и отмена через гонку промисов, классификация ответа, очистка секретов в причине ошибки. Настройки и умолчания (AITUNNEL,gpt-4o-transcribe).src/obsidian/http.ts: адаптерHttpClientнаrequestUrl.src/obsidian/settings.tsиsrc/main.ts: загрузка и сохранение настроек провайдера вdata.json, вкладка настроек, команда «Проверить провайдер распознавания».- Интеграционный тест против живого AITUNNEL, пропускаемый без
AITUNNEL_API_KEY. - Вне объёма: запуск очереди в плагине, команды записи,
MediaRecorder, UI записи (issue обёртки); цепочка провайдеров с переключением по 403/таймауту; провайдерyandex.
Capabilities
New Capabilities
transcription-provider: запрос к OpenAI-совместимому сервису распознавания, предпроверки, таймаут и отмена, классификация ответов, причина ошибки без секретов, настройки провайдера и их хранение, команда проверки провайдера.
Modified Capabilities
Нет. Провайдер реализует контракт Transcriber, уже описанный в recording-lifecycle.
Impact
- Новые файлы:
src/core/multipart.ts,src/core/openai.ts,src/obsidian/http.ts,src/obsidian/settings.ts,tests/multipart.test.ts,tests/openai-*.test.ts,tests/integration/aitunnel.test.ts. - Изменяемые:
src/core/ports.ts(портHttpClient),src/core/naming.ts(mime по расширению для команды проверки),src/main.ts. - Зависимостей не добавляется: интеграционный тест использует встроенный
fetchNode. data.jsonуже в.gitignore; ключ синхронизируется через iCloud вместе с vault — это ожидаемое поведение.- Сетевые запросы появляются впервые: к
baseUrlиз настроек, только при отправке записи и по команде проверки.