Smoke на IFT: xAI отвечает 400 "Field 'language' is required when
'format' is true" → бэк маппит в 502 upstream_error. Проверено curl:
без поля format эндпоинт /v1/stt работает (200), язык определяется
автоматически. Убрано поле format из multipart xAI-адаптера, eunit
обновлён (полный прогон: 1211 тестов зелёные).
Refs EventHub/EventHubBack#79
Back-прокси STT для press-to-talk (канон PRODUCT-AI, голос и тап —
два канала одного движка действий):
- handler_ai_transcribe + logic_ai_transcribe (паттерн logic_geo):
адаптеры провайдеров xai и openai-совместимый; env STT_PROVIDER,
STT_URL, STT_API_KEY, STT_MODEL, STT_TIMEOUT_MS, STT_PROXY_URL
- multipart read_file_part в handler_upload_utils (лимит 10 MB)
- ETS rate-limit: 10 req/min на пользователя + глобальный троттлинг
апстрима; без ключа — 503 unavailable, ошибки апстрима — 502/503
- аудио и транскрипт не персистятся (приват-инвариант канона)
- отдельный httpc-профиль: STT_PROXY_URL применяется только к STT
(эгресс stt-egress для гео-блокированных провайдеров)
- trails в eventhub_trails.erl, маршрут в eventhub_app.erl,
docker/.env.example дополнен STT_*
Проверка: eunit модуля 8/8; полный прогон eunit зелёный (1211 тестов),
compile без новых warning'ов.
Refs EventHub/EventHubBack#79
Refs EventHub/EventHubFront#76