- stt.yaml: rename WHISPER_URL to STT_URL to match what stt.py reads
- tts.py: improve WAV handling (BytesIO fix), sentence splitting, robust
_read_wav_bytes with wave+soundfile+raw-PCM fallbacks
- Add __pycache__/ to .gitignore
- Move Docker Hub + Gitea logins before setup-buildx-action so BuildKit
container inherits credentials from ~/.docker/config.json
- Remove broken 'Configure Docker for insecure registry' step (DinD runner
already configured via configmap daemon.json, systemd unavailable)
- Make Docker Hub login unconditional using secrets (not vars)
- Fixes 429 Too Many Requests on docker.io base image pulls
- Docker Hub login now happens before Gitea login, both via login-action
- Previous manual config.json write was clobbering Docker Hub auth
- buildx docker-container driver inherits auth from login-action correctly
- Fixes 429 Too Many Requests from unauthenticated Docker Hub pulls
Ruff runs via uvx in its own isolated environment and does not need
the project's runtime dependencies installed. This avoids PEP 668
externally-managed-environment errors on Debian-based runners.
Each UI now logs per-request metrics to MLflow:
- llm.py: latency, tokens/sec, prompt/completion tokens (gradio-llm-tuning)
- embeddings.py: latency, text length, batch size (gradio-embeddings-tuning)
- stt.py: latency, audio duration, real-time factor (gradio-stt-tuning)
- tts.py: latency, text length, audio duration (gradio-tts-tuning)
Uses try/except guarded imports so UIs still work if MLflow is
unreachable. Persistent run per Gradio instance, batched metric logging
via MlflowClient.log_batch().