Repository navigation
v1.5.0 — Standalone engine-hardening; drop Redis self-registration
Engine-hardening sweep. The server is now standalone — one process, one
VoxCPM2 model, an OpenAI-compatible API and a /health. Run one, or several
behind any load balancer. Same engine (nano-vllm-voxcpm) and model
(openbmb/VoxCPM2) as 1.4.x.
Added
- Engine circuit breaker (
ENGINE_FAIL_THRESHOLD): consecutive 5xx mark the
node not-ready so/healthreturns 503 instead of serving from a dead engine;
4xx never trip it; a later success closes it. - In-process recovery self-probe (
ENGINE_PROBE_SECONDS) so a transient
failure self-heals without a manual restart. Zero cost while healthy. - Correct HTTP status codes: oversized text → 413, GPU OOM → 503 (busy, not
broken — and it does not trip the breaker), malformed JSON → 400. Tracebacks
stripped from error bodies. - Voice preload + lazy load + LRU cap (
VOICE_PRELOAD,VOICE_CACHE_MAX). - Reference-sample trimming (
REF_MAX_SECONDS) so a long cloning upload
can't OOM the node. - Text normalization before synthesis (line breaks, unterminated sentences).
- On-disk cache sweep (
CACHE_SWEEP_SECONDS) soCACHE_TTL_MINUTESis a
real retention bound. - Response integrity headers:
X-Audio-Duration,X-Audio-SHA256,
Content-Digest(RFC 9530). - Optional offline mode (
UTTERA_OFFLINE=1), OFF by default.
Changed
- Cache key MD5 → SHA-256.
CACHE_TTL_MINUTESdefault10080(7 days) →60(1 hour): synthesized
audio may contain personal data; short retention is the privacy-friendly
default.
Removed
- The optional Redis self-registration loop and its env vars. Use a reverse
proxy or load balancer for discovery.
Validated end-to-end on an RTX 5090 (Blackwell): synthesis, cache
MISS/HIT/BYPASS, lazy voice load, adhoc cloning, streaming, 413/422/400,
circuit breaker + recovery probe.