v0.5.0 — Cross-modality routing and white-label
v0.5.0 — Cross-modality routing and white-label
Two capabilities ship together because they target the same agency rung of the buyer ladder. The router runs once per session at session-create time, reads the project's latency budget and recent observed per-provider latency, and picks the (STT, LLM, TTS) combination from the project's rosters that minimises predicted total latency under budget. White-label branding lets agencies upload a per-project logo, accent color, and product name; the dashboard chrome reflects the brand for users scoped to that project.
Highlights
- REQ-VG-ROUTE-001 (latency budget per project): new
routing.budget_msonProjectConfigwith the OQ1-locked 1500 ms default; in-flight sessions keep their prior budget when the operator edits the project. - REQ-VG-ROUTE-002 (pick the triple at session start):
voicegateway/middleware/router.py::route_sessionpicks the lowest-predicted-total triple under budget from project rosters; falls back to fastest +budget_overrun=true(or raisesBudgetExceeded). Observed p50 fromlatency_observationswins; missing observations fall back tovoicegateway/core/provider_baselines.json(10 curated(provider, modality)entries withsource_url). Caller overrides win for named modalities. The 15-minute roll-up worker keeps the snapshot fresh (OQ2). - REQ-VG-ROUTE-003 (show routing + observed latency): new
Routingdashboard page with a sortable per-provider table, hourly auto-refresh, "no observations yet" labels (AC-4).SessionDetailmodal gains aRoutingStripshowing the picked triple, budget, and overrun chip.GET /api/routing/observationspowers both. - REQ-VG-ROUTE-004 (per-project white-label branding): new
BrandingConfig(logo_url / accent_color / product_name) onProjectConfig;branding_jsoncolumn onmanaged_projects. Dashboard endpoints:GET/POST /api/projects/{id}/branding+ multipartPOST /api/projects/{id}/branding/logo(Pillow-validated PNG: 256 KB + 512×512 cap; SVG header validated).lib/branding.tsapplies brand as CSS variables ondocument.documentElementplus favicon + title; read-once-per-mount (OQ5). Projects page Brand button opens aBrandingModalwith color picker + logo upload + preview.voicegw brand set/show/clearCLI for scripted provisioning.
Migration notes
None breaking. Migration 0006 is idempotent and adds five nullable routing columns to sessions, branding_json nullable on managed_projects (guarded by sqlite_master for v0.0.5-only installs), and a new latency_observations table. Pre-v0.5.0 sessions keep NULL on the new columns; the dashboard's RoutingStrip is hidden entirely on those rows so they don't show empty UI. The new pillow>=10.0 dependency lands automatically with pip install -e .[dev] or any cloud-extra reinstall.
Five Foundry Open Questions locked in this release: budget_ms default 1500 (OQ1), 24h rolling / 15-min refresh (OQ2), curated provider_baselines.json fallback (OQ3), 256 KB / 512×512 / PNG-SVG logo cap (OQ4), read-once-per-mount branding cache (OQ5).
Out of scope this release: no mid-call provider switching, no adaptive learning, no custom-domain dashboard hosting, no per-tenant branding inside one project, no email/exported-report branding, no cost-aware routing, no multi-region routing, no in-flight latency-budget enforcement. The agency quickstart guide enumerates these explicitly.
Refinery and Foundry