Changelog
Highlights
- Failover is now load balancing (#788, #813). Virtual models replace failover rules: one name routes to weighted targets under a round_robin, cost, or failover strategy, with chaining. Existing failover rules are auto-migrated on startup into managed virtual models with identical behavior — no action needed.
- Model allowlists (#804, #812). Per-user-path and per-key allowed_models with inheritance down the user tree; denied requests return model_access_denied. GET /v1/models now returns only the models the caller can access.
Breaking
- Admin API: virtual-model responses now use a targets[] array instead of separate provider/model fields (#788). Update automation reading /admin/virtual-models.
Features
- 26cd11d feat(failover): make retry statuses, error phrases, and max attempts configurable (#798)
- 7017707 feat(models): add option to list bare model IDs at GET /v1/models (#796)
- 244b4c8 feat(telemetry): move OpenTelemetry export into open-core (#802)
- 6262598 feat(users): per-user-path and per-key model allowlists (#804)
- 66c0334 feat(virtualmodels): chain virtual models and fold failover into load balancing (#788)
Bug Fixes
- 082ce27 fix(elevenlabs): request pcm_24000 for pcm speech output (#787)
- 2b24098 fix(models): scope GET /v1/models by the user-path header (#812)
- 0e86972 fix(passthrough): retain models from uncaptured opaque bodies (#795)
- 42a2df5 fix(responses): always emit annotations on output_text parts (#807)
- 31f5668 fix(server): accept only plain-token client request IDs and resolve code-scanning alerts (#799)
- 154d399 fix(virtualmodels): do not chain through a redirect that shadows its own source (#813)