Голосовой центр L2: прокси транскрибации POST /v1/ai/transcribe #79

Closed
opened 2026-08-20 23:46:34 +03:00 by cursor-ai · 1 comment
Owner

Прокси транскрибации голоса для press-to-talk (канон: EventHubSpec/PRODUCT-AI.md, клиентская часть EventHub/EventHubFront#76).

Контракт

POST /v1/ai/transcribe — Bearer-auth, multipart-поле file (аудио записи, лимит 10 MB).

Ответы:

  • 200 {transcript, lang} — пустой transcript означает «не расслышал» (клиент показывает тост без retry);
  • 400missing_file / bad_multipart / too_large / invalid_audio;
  • 429rate_limited (10 req/min на пользователя + глобальный троттлинг апстрима ~2 rps, ETS);
  • 502upstream_error (ошибка/некорректный ответ STT-провайдера);
  • 503unavailable (нет STT_API_KEY).

Реализация

  • handler_ai_transcribe.erl + logic_ai_transcribe.erl (паттерн logic_geo: os:getenv, ETS rate-limit, без персиста аудио/транскрипта — приват-инвариант канона).
  • Адаптеры провайдеров: STT_PROVIDER=xai (POST {STT_URL}, Bearer, multipart, поле file последним) и openai-совместимый (Groq/faster-whisper на будущее). Env: STT_PROVIDER, STT_URL, STT_API_KEY, STT_MODEL, STT_TIMEOUT_MS, STT_PROXY_URL.
  • Вызов апстрима через отдельный httpc-профиль; STT_PROXY_URL — HTTP-эгресс (vless-образ, сервис stt-egress) для гео-блокированных провайдеров.
  • Трейл зарегистрирован в eventhub_trails.erl, маршрут в eventhub_app.erl, .env.example дополнен.

Проверка

  • eunit logic_ai_transcribe_tests: 8/8; полный прогон eunit зелёный (1211 тестов).
Прокси транскрибации голоса для press-to-talk (канон: EventHubSpec/PRODUCT-AI.md, клиентская часть EventHub/EventHubFront#76). ## Контракт `POST /v1/ai/transcribe` — Bearer-auth, multipart-поле `file` (аудио записи, лимит 10 MB). Ответы: - `200 {transcript, lang}` — пустой `transcript` означает «не расслышал» (клиент показывает тост без retry); - `400` — `missing_file` / `bad_multipart` / `too_large` / `invalid_audio`; - `429` — `rate_limited` (10 req/min на пользователя + глобальный троттлинг апстрима ~2 rps, ETS); - `502` — `upstream_error` (ошибка/некорректный ответ STT-провайдера); - `503` — `unavailable` (нет `STT_API_KEY`). ## Реализация - `handler_ai_transcribe.erl` + `logic_ai_transcribe.erl` (паттерн logic_geo: `os:getenv`, ETS rate-limit, без персиста аудио/транскрипта — приват-инвариант канона). - Адаптеры провайдеров: `STT_PROVIDER=xai` (POST {STT_URL}, Bearer, multipart, поле `file` последним) и `openai`-совместимый (Groq/faster-whisper на будущее). Env: `STT_PROVIDER`, `STT_URL`, `STT_API_KEY`, `STT_MODEL`, `STT_TIMEOUT_MS`, `STT_PROXY_URL`. - Вызов апстрима через отдельный httpc-профиль; `STT_PROXY_URL` — HTTP-эгресс (vless-образ, сервис `stt-egress`) для гео-блокированных провайдеров. - Трейл зарегистрирован в `eventhub_trails.erl`, маршрут в `eventhub_app.erl`, `.env.example` дополнен. ## Проверка - eunit `logic_ai_transcribe_tests`: 8/8; полный прогон eunit зелёный (1211 тестов).
Author
Owner

Готово: коммит 1ef9020, CI run 601 зелёный (test/deploy-ift/e2e-ift/deploy-stage/e2e-stage). eunit 1211/1211. Деплой stt-egress (STT_PROXY_URL/STT_API_KEY в стеках) — отдельным шагом.

Готово: коммит 1ef9020, CI run 601 зелёный (test/deploy-ift/e2e-ift/deploy-stage/e2e-stage). eunit 1211/1211. Деплой stt-egress (STT_PROXY_URL/STT_API_KEY в стеках) — отдельным шагом.
Sign in to join this conversation.