v1.90.0-rc.1
Pre-release
Pre-release
Verify Docker Image Signature
All LiteLLM Docker images are signed with cosign. Every release is signed with the same key introduced in commit 0112e53.
Verify using the pinned commit hash (recommended):
A commit hash is cryptographically immutable, so this is the strongest way to ensure you are using the original signing key:
cosign verify \
--key https://raw.githubusercontent.com/BerriAI/litellm/0112e53046018d726492c814b3644b7d376029d0/cosign.pub \
ghcr.io/berriai/litellm:v1.90.0-rc.1Verify using the release tag (convenience):
Tags are protected in this repository and resolve to the same key. This option is easier to read but relies on tag protection rules:
cosign verify \
--key https://raw.githubusercontent.com/BerriAI/litellm/v1.90.0-rc.1/cosign.pub \
ghcr.io/berriai/litellm:v1.90.0-rc.1Expected output:
The following checks were performed on each of these signatures:
- The cosign claims were validated
- The signatures were verified against the specified public key
What's Changed
- fix(responses-bridge): map system-only chat request to system input item by @milan-berri in #29817
- feat(bedrock): forward strict and additionalProperties to Converse toolSpec by @mateo-berri in #29814
- fix(mcp): highlight MCP cards red when the logged-in user is missing per-user env vars by @mateo-berri in #29856
- feat(ui): add budget duration to edit team member form by @ryan-crabbe-berri in #29717
- fix(ui): make workflow runs page fill full width by @yuneng-berri in #29868
- feat: standardize rate limit errors with category, rate_limit_type, model, and llm_provider fields by @mateo-berri in #27687
- fix(ui): default guardrails page to the Guardrails tab by @yuneng-berri in #29872
- docs(readme): add Deploy on AWS/GCP Terraform section and fix deploy button rendering by @mateo-berri in #29879
- refactor(bedrock): build Converse toolSpec via a BedrockToolSpec dict subclass by @mateo-berri in #29869
- feat(litellm): add models and repository layers by @yassin-berriai in #29686
- feat(ui): include internal routes in the dashboard's generated OpenAPI types by @ryan-crabbe-berri in #29885
- feat(proxy): publish /v2/model/info in Swagger OpenAPI spec by @Sameerlite in #29900
- refactor(ui): single source of truth for migrated-page routing by @ryan-crabbe-berri in #29949
- fix(ui/model-hub): render provider icons on the public model hub by @yuneng-berri in #29958
- fix(ui): keep create guardrail modal open on outside click by @yuneng-berri in #29871
- fix(ui): label default key type as "Full Access" on key edit page by @yuneng-berri in #29870
- fix(ui): unify migrated-route URLs and migrate the API Reference page by @ryan-crabbe-berri in #29953
- fix(mcp): let non-creator users OAuth into OBO-mode MCP servers from the Tools page by @tin-berri in #29867
- Litellm oss staging 080626 by @Sameerlite in #29932
- feat(galileo): add health check support for UI callback test by @Sameerlite in #29908
- fix(model-management): allow deleting a BYOK model after its team is deleted by @yuneng-berri in #29875
- feat(jwt-auth): opt-in fallback to DB team on unresolved JWT claim by @milan-berri in #28913
- fix(team_endpoints): don't block /team/update on unchanged team budget by @milan-berri in #29525
- fix(fireworks): enable tool calling for glm-5p1 in model cost map by @milan-berri in #29697
- fix(vertex): propagate Vertex AI metadata in streaming success callbacks by @Sameerlite in #29899
- fix(ui): show team projects to internal users on key creation by @milan-berri in #28855
- build(deps): bump pyjwt to 2.13.0 and ws override to 8.20.1 by @yuneng-berri in #29982
- fix(team-management): delete a team's BYOK models when the team is deleted by @yuneng-berri in #29977
- feat(vantage): include organization metadata in FOCUS Tags export by @milan-berri in #28184
- fix(guardrails): read CrowdStrike AIDR identity from both metadata bags by @yuneng-berri in #29991
- fix(mcp): mirror upstream token lifetime instead of forcing a 1h OBO expiry by @tin-berri in #29951
- feat(azure_ai): add MAI-Image-2.5 image generation support by @Sameerlite in #29688
- fix(mcp): load MCP tool configuration tools via the OBO/passthrough-aware GET path by @tin-berri in #29960
- fix(team): reserve team budget raises for proxy admins on /team/update by @milan-berri in #30030
- test(ui): data-driven App Router migration E2E smoke (default + server-root-path) by @ryan-crabbe-berri in #29974
- fix(proxy): extend response headers hook to streaming, TTS, image gen, and pass-through by @michelligabriele in #24232
- chore(ui): remove dead App Router route stubs under (dashboard) by @ryan-crabbe-berri in #30045
- fix(ui/mcp): reset OAuth state on create-server modal close so a prior server's token no longer leaks into the next add-server session by @tin-berri in #30000
- fix(mcp): allow team access-group grants in OAuth authorize/token access check by @tin-berri in #30041
- docs(security): require a reproduction video for vulnerability reports by @yuneng-berri in #30063
- feat(ui): add admin flag to disable in-product UI nudges for everyone by @ryan-crabbe-berri in #29796
- chore(ui): remove dead dashboard files and unused dependencies by @ryan-crabbe-berri in #30047
- fix(proxy): authorize batch files using upload target_model_names (LIT-3593) by @Sameerlite in #30009
- Add Claude Fable 5 across Anthropic, Bedrock, Vertex AI, and Azure AI by @mateo-berri in #30064
- Add Claude Fable 5 cost map entries (data-only hotfix for the hosted map) by @mateo-berri in #30076
- fix(caching): restore stored prompt_tokens on embedding cache hits instead of recomputing by @michelligabriele in #30046
- Litellm oss 090626 by @Sameerlite in #30021
- fix(proxy): self-heal startup/reload prisma reads on engine disconnect by @michelligabriele in #28803
- chore(ui): make knip recognize .mjs scripts and openapi-typescript by @ryan-crabbe-berri in #30052
- fix(register_model): preserve built-in cache pricing when registering custom overrides under unmapped keys by @yassin-berriai in #30044
- [internal copy of #28007] Fix/gcp model garden streaming by @mateo-berri in #28363
- feat(cli): per-agent
lite claude/codex/opencodecommands that wrap coding agents through the proxy by @mateo-berri in #29850 - fix(callbacks): forward callback_settings to callback initializers and guard consumers against non-dict values by @yuneng-berri in #30161
- fix(mcp): drop orphaned per-user credential rows when an MCP server is deleted by @tin-berri in #30141
- fix(proxy): recover from cached-plan errors by reconnecting the Prisma client by @yassin-berriai in #29983
- feat(proxy): add option to disable server-side prepared statements for DB lookups by @yassin-berriai in #29984
- fix(release): stop backport releases from overwriting the latest badge by @yuneng-berri in #30005
- feat: add conventional commits and coding guidelines by @mateo-berri in #30159
- fix(proxy): return 5xx on DB infra errors during auth; reserve 401 for genuine auth failures by @yassin-berriai in #29986
- fix(ui): dev server 404s on migrated-page links because uiBase hardcodes /ui by @ryan-crabbe-berri in #30169
- refactor(ui): consolidate dashboard to one shell in the (dashboard) layout by @ryan-crabbe-berri in #30166
- fix(proxy): align /v1/model/info with router deployments by @Sameerlite in #30025
- fix: completion_cost AttributeError on streaming Anthropic web_search responses (#26153) by @ishaan-berri in #27346
- [internal copy of #30137] perf(realtime): eliminate redundant per-frame JSON work on OpenAI realtime relay by @mateo-berri in #30142
- feat(bedrock): aws_bedrock_project_id for bedrock-mantle project / workspace association by @mateo-berri in #30163
- chore(hooks): enforce Conventional Commits and Conventional Branches by @ryan-crabbe-berri in #30174
- feat(rate-limiter): allow opting out of v3 TPM reservation and Redis circuit breaker by @yassin-berriai in #30211
- feat(spend_logs): opt-in native Postgres partitioning for SpendLogs retention by @yassin-berriai in #29466
- feat(ui): migrate playground to path routing and colocate its files by @ryan-crabbe-berri in #30185
- feat(ui): migrate projects and access-groups to path routes by @ryan-crabbe-berri in #30226
- fix(proxy): coalesce NULL rollup metrics in aggregated daily-activity by @michelligabriele in #30151
- fix(anthropic_passthrough): resolve costing model from message_start chunk, litellm_params and model_group instead of 'unknown' by @yassin-berriai in #30160
- feat(ui): migrate budgets, workflows, and guardrails-monitor to path routes by @ryan-crabbe-berri in #30236
- feat(ui): migrate mcp-servers, search-tools, tag-management, vector-stores, and memory to path routes by @ryan-crabbe-berri in #30261
- fix(a2a): forward agent_extra_headers through completion bridge by @mateo-berri in #28277
- fix(gemini-live): forward audio buffer commit and correct Vertex PCM rate by @Sameerlite in #29946
- fix(proxy): skip double-wrapping unified batch output file ids on retrieve by @Sameerlite in #30011
- feat: litellm oss 110626 by @Sameerlite in #30202
- fix(docker): copy only runtime artifacts into the final image by @yuneng-berri in #30243
- feat(proxy): enforce key/team guardrails on bedrock passthrough routes by @Sameerlite in #30194
- feat(gemini): forward web search tools in image generation by @Sameerlite in #30119
- fix: bedrock mantle fixes by @Sameerlite in #30083
- feat(proxy): add require_managed_files setting for file uploads by @Sameerlite in #30186
- fix(mcp): honor server_id for REST tool calls with shared upstream URLs by @Sameerlite in #30184
- fix(responses): presidio PII masking for Azure WebSocket and streaming by @Sameerlite in #30003
- feat(passthrough): add configurable pass-through request timeouts by @Sameerlite in #30266
- fix(google_genai): preserve complete SSE events in Vertex/Gemini image streaming by @Sameerlite in #30270
- fix(proxy): populate access_via_team_ids on /v1/model/info by @Sameerlite in #30274
- chore(oss): litellm oss staging 120626 by @Sameerlite in #30292
- feat(ui): migrate policies, guardrails, prompts, tool-policies, and skills to path routes by @ryan-crabbe-berri in #30263
- feat(ui): migrate caching, cost-tracking, transform-request, ui-theme, and logs to path routes by @ryan-crabbe-berri in #30267
- fix(ui): gate dashboard layout on ui config load so deep links work under SERVER_ROOT_PATH by @ryan-crabbe-berri in #30312
- feat(ui): migrate admin-panel, logging-and-alerts, model-hub-table, and usage to path routes by @ryan-crabbe-berri in #30268
- fix(otel): cap metric attribute cardinality with include/exclude lists by @yassin-berriai in #30257
- fix(proxy): grace-period key rotation 401s; return deprecated-key lookup result directly by @yuneng-berri in #30327
- chore(deps): bump vitest, brace-expansion, pypdf and tornado by @yuneng-berri in #30220
- refactor(ui): remove unreachable /chat page by @ryan-crabbe-berri in #30178
- feat(ui): migrate agents and router-settings to path routes by @ryan-crabbe-berri in #30323
- feat: strengthen coding conventions in CLAUDE.md by @mateo-berri in #30333
- feat(ui): cut the users page over to the /ui/users path route by @ryan-crabbe-berri in #30334
- feat: ruff strict-rule suppressions baseline gate by @ryan-crabbe-berri in #30303
- feat(guardrails): add Cisco AI Defense integration (#28249) by @yassin-berriai in #30338
- chore(ui): remove dead UI components unreferenced by any page by @ryan-crabbe-berri in #30340
- ci: add osv-scanner lockfile scan workflow by @yuneng-berri in #30222
- fix(otel): record full error message on standard exception event in otel v2 by @yassin-berriai in #30380
- test(fireworks): mock whisper transcription tests instead of live calls by @yuneng-berri in #30391
- build(ui): pin esbuild to 0.28.1 via overrides by @yuneng-berri in #30390
- feat(ui): cut the organizations page over to the /ui/organizations path route by @ryan-crabbe-berri in #30336
- fix(proxy): support SMTP implicit SSL (port 465) by @yuneng-berri in #30395
- fix(mcp): default Linear MCP registry entry to streamable HTTP by @ryan-crabbe-berri in #30396
- fix(ui): stop Virtual Keys page from infinite render loop by @ryan-crabbe-berri in #30397
- fix(streaming): guard raise_on_model_repetition against empty choices by @shivamrawat1 in #30485
- feat(otel-v2): emit the 6 gen_ai.client.* metrics at parity with v1 by @yassin-berriai in #30326
- fix(mcp): drop phantom 401 span on delegated OAuth2 tool calls by @ryan-crabbe-berri in #30494
- feat(ui): cut the teams page over to the /ui/teams path route by @ryan-crabbe-berri in #30343
- fix(integrations): cap Anthropic cache_control injection at 4 blocks by @shivamrawat1 in #30480
- chore(codecov): add Batches, Videos, and Realtime components by @Sameerlite in #30517
- test(batches): move orphan tests into tests/test_litellm for CI coverage by @Sameerlite in #30510
- fix(guardrails): run pre_call hook once for model-level guardrails by @yassin-berriai in #30543
- fix(guardrails): stop re-initializing DB guardrails on every poll by @yassin-berriai in #30542
- chore(oss): litellm oss staging 150626 by @Sameerlite in #30463
- ci(lint): add blanket-noqa, dataclass-default, and unused-noqa Ruff rules by @mateo-berri in #30516
- ci: ratchet lint and type-check gates (ruff preview, ANN, mypy, basedpyright) by @mateo-berri in #30379
- fix(proxy): allow internal roles to access vector store CRUD routes by @shivamrawat1 in #30503
- fix(otel): stamp gen_ai.input/output.messages on v2 spans by @yassin-berriai in #30548
- fix(otel): export v2 gen_ai client metrics to the configured meter provider by @yassin-berriai in #30549
- fix(bedrock): preserve cache_control for ARN models in /v1/messages adapter by @mateo-berri in #29823
- fix: greatly increase basedpyright slack by @mateo-berri in #30563
- fix(budget): recompute budget_reset_at when budget_duration changes on /budget/update by @yassin-berriai in #30555
- fix(otel): accept UPPER_SNAKE_CASE OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT in v2 by @yassin-berriai in #30562
- chore(lint): remove PLR0915 too-many-statements ruff rule by @ryan-crabbe-berri in #30574
- ci(lint): ratcheted type-discipline gate (mutable collections, casts, guards, kwargs, suppressions) by @mateo-berri in #30500
- feat(proxy): add verification_uri_complete to CLI SSO device flow by @yassin-berriai in #30571
- chore: litellm oss staging160626 by @Sameerlite in #30527
- fix(guardrails): return 400 not 500 when AIM blocks a request by @ryan-crabbe-berri in #30573
- ci(lint): grandfather any-discipline with a per-file ratchet budget (50% headroom) by @mateo-berri in #30582
- fix(audio): don't override explicit response_format with verbose_json by @mateo-berri in #30599
- fix(anthropic): price and surface response service_tier in cost tracking by @mateo-berri in #30558
- feat: add dev and wildcard proxy configs for local testing by @mateo-berri in #30556
- fix(proxy): list public team model name in /v1/models by @ishaan-berri in #30588
- ci: drop mypy entirely, standardize type checking on basedpyright by @mateo-berri in #30648
- feat(guardrails): surface OpenAI moderation violation_categories on guardrail traces by @yassin-berriai in #30659
- fix(proxy): resolve list files credentials from team BYOK deployments by @shivamrawat1 in #30495
- feat(proxy): add --max_requests_before_restart_jitter to stagger worker restarts by @yassin-berriai in #30601
- fix(health): correct bedrock embedding health checks by @mateo-berri in #30583
- test: harden remaining pass-through CI flakes (image-gen spend poll, ruby assistants timeout) by @mateo-berri in #30685
- test(pass_through): harden vertex spendlog poll against transient empty reads by @mateo-berri in #30683
- fix(cost): stop non-string service_tier from silently dropping cost tracking by @mateo-berri in #30690
- feat(proxy): warn at startup when custom_auth skips common_checks enforcement by @tin-berri in #30665
- fix(pod_lock): release cron lock by matching async_set_cache JSON encoding by @yassin-berriai in #30600
- ci: run a local fake OpenAI endpoint instead of the shared Railway mock by @mateo-berri in #30695
- ci(windows): pin uv to Python 3.11 so it ignores the preinstalled 3.14 by @mateo-berri in #30704
- feat(ui): migrate models page to App Router path route by @ryan-crabbe-berri in #30677
- refactor(ui): remove orphaned pass-through-settings route by @ryan-crabbe-berri in #30692
- fix(cost): stop non-string response service_tier from dropping cost tracking by @yuneng-berri in #30706
- feat(agent-shin): automated PR/issue triage, low-quality auto-close, and review-gate label lifecycle by @mateo-berri in #30433
- chore: litellm oss 170626 by @Sameerlite in #30637
- fix(bedrock_mantle): add SigV4 fallback to chat completions auth by @mateo-berri in #30714
- feat(search): add TinyFish as search provider by @simantak-dabhade in #30634
- feat(ui): migrate old usage report to App Router path route by @ryan-crabbe-berri in #30694
- fix(proxy): enforce budgets against authoritative DB spend when the cross-pod counter is stale by @yassin-berriai in #30684
- chore(ci): remove Agent Shin pull_request_target workflows by @yuneng-berri in #30784
- chore: litellm oss staging by @Sameerlite in #30745
- ci(zizmor): also run on litellm_internal_staging by @yuneng-berri in #30789
- fix(test): drop references to removed Agent Shin workflows by @ryan-crabbe-berri in #30791
- chore: remove in-product survey and Claude Code feedback nudges by @ryan-crabbe-berri in #30773
- feat(ui): migrate api-keys landing to App Router path route by @ryan-crabbe-berri in #30699
- feat(proxy): configurable response headers and login-page hint by @yucheng-berri in #30792
- ci(zizmor): gate PRs on medium+ findings and clear existing ones by @yuneng-berri in #30797
- fix(proxy): use e.request_data for logging_obj in ModifyResponseException streaming passthrough by @mateo-berri in #30800
- chore: make pr template linear portion clearer by @mateo-berri in #30766
- chore(typing): add boto3/botocore stubs so basedpyright resolves the AWS SDK by @mateo-berri in #30815
- fix(otel): one v2 logger owns the global provider; scope tenant OTLP creds per exporter by @yucheng-berri in #30590
- fix(passthrough): recover output tokens for interrupted anthropic streams by @yassin-berriai in #30787
- fix(proxy): record partial spend on the failure row for interrupted streams by @yassin-berriai in #30788
- fix(ui): repoint dead usage guide link to cost tracking docs by @yuneng-berri in #30859
- fix(ui): warn that team models are deleted in the delete-team modal by @yuneng-berri in #29990
- feat(caching): add valkey-semantic cache backend and fix semantic cache scope keys by @yassin-berriai in #30675
- test(ui): isolate OldTeams delete-warning tests from leaked mock by @mateo-berri in #30871
- feat: add lint-gate target and truncation-proof summary to the strict ruff gate by @mateo-berri in #30877
- chore(ui): rebuild ui for release by @yuneng-berri in #30894
- chore(ci): bump deps by @yuneng-berri in #30899
- fix(watsonx): wrap string embedding input in array for WatsonX API by @shivamrawat1 in #30897
- test: point router/completion/triton tests at the local fake OpenAI endpoint by @mateo-berri in #30900
- feat(sandbox): e2b code execution primitive by @krrish-berri-2 in #30898
- fix(ui): source api-keys identity from useAuthorized to stop "User ID is not set" by @ryan-crabbe-berri in #30903
- chore(ui): rebuild ui by @yuneng-berri in #30906
- chore(ci): promote internal staging to main by @yuneng-berri in #30907
- fix(redis): prevent forcing SSLConnection when ssl=False in connection pool by @Jacopos311 in #30770
- fix(proxy): log UI setup failures instead of silently swallowing by @sarvesh1327 in #30819
New Contributors
- @simantak-dabhade made their first contribution in #30634
- @yucheng-berri made their first contribution in #30792
- @Jacopos311 made their first contribution in #30770
- @sarvesh1327 made their first contribution in #30819
Full Changelog: v1.89.0-rc.1...v1.90.0-rc.1