v1.96.0-dev.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.96.0-dev.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.96.0-dev.1/cosign.pub \
ghcr.io/berriai/litellm:v1.96.0-dev.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
- feat(prometheus): add service_tier label to latency and spend metrics by @yassin-berriai in #34966
- fix(aiohttp): keep keep-alive connector config when a session is rebuilt by @yassin-berriai in #34962
- fix(helm): pin bundled postgres and redis to the bitnamilegacy images by @yassin-berriai in #34963
- fix(vertex): decide rawPredict passthrough streaming from the request body by @tin-berri in #34672
- fix(anthropic-adapter): translate stop_sequences and disabled thinking for non-Claude targets by @tin-berri in #34589
- ci: publish a generated JSON schema for model_prices_and_context_window.json by @mateo-berri in #34816
- fix(jwt_auth): allow /v1/messages for JWT teams by default by @devin-ai-integration[bot] in #34222
- fix(proxy): skip team model aliases that point at deleted deployments by @mateo-berri in #34993
- fix(proxy): report when a model write does not survive the post-write reload by @tin-berri in #34861
- fix(proxy): reject model writes that corrupt an auto-router pseudo-model by @tin-berri in #34151
- fix(router_strategy): serialize latency for non-chat responses in lowest-latency routing by @mihidumh in #33290
- fix(logging): preserve callback order in get_combined_callback_list by @Harsh23Kashyap in #33008
- fix(router): honor explicit priority=0 in acompletion by @Harsh23Kashyap in #33214
- fix(router_strategy): serialize latency for non-chat responses in lowest-latency routing by @tin-berri in #35048
- fix(anthropic-adapter): open the first content block with the real upstream type so reasoning-first streams start with thinking by @Napuh in #34433
- test(e2e): poll MCP tools across multi-worker lag by @mubashir1osmani in #35047
- fix(scim): stop provisioning nested group ids as internal users by @ryan-crabbe-berri in #34997
- chore(typing): clear basedpyright Any errors in proxy management endpoints by @mateo-berri in #35074
- fix(ui): size Object Permissions card grid by container width by @ryan-crabbe-berri in #35019
- fix(proxy): allow /key/update to identify the key by key_alias by @ryan-crabbe-berri in #34851
- feat(ui): split failed requests into their own series on the cache dashboard by @ryan-crabbe-berri in #34862
- feat(ui): shareable log links via log_id query param on the logs page by @ryan-crabbe-berri in #34879
- fix(ui): show public model names in usage breakdowns by @mateo-berri in #35107
- fix(ui): point the navbar and sidebar logos at the dashboard home route by @yuneng-berri in #35041
- fix(proxy): stop serving stale team model allowlist after /team/update by @mateo-berri in #34266
- feat(ui): deep link team detail page via ?team= query param by @ryan-crabbe-berri in #35112
- feat(ui): deep link organization detail page via ?org= query param by @ryan-crabbe-berri in #35117
- fix(proxy): resolve named credentials on provider-only batch and files calls by @mateo-berri in #35028
- fix(router): drop duplicate Mapping import that fails ruff F811 by @ryan-crabbe-berri in #35122
- refactor(rust): make litellm-core the callable messages() SDK; drop the ai-gateway handler by @devin-ai-integration[bot] in #35044
- fix(otel): make OTLP export work against Grafana Cloud by @yassin-berriai in #35060
- test(e2e): remove the Presidio guardrail suite by @mubashir1osmani in #35129
- feat(dashscope): add qwen3.7-plus and qwen3.7-max to the model cost map by @devin-ai-integration[bot] in #35123
- feat(ui): link organization teams to their team detail pages by @ryan-crabbe-berri in #35120
- fix(tests): assert Content variants are identified by type, not by the discriminator keyword by @yassin-berriai in #35161
- fix(mcp): never write discovery results to the row, heal already-stamped rows, and retry failed discovery with backoff by @devin-ai-integration[bot] in #34990
- fix(vertex_ai): honor per-model gcs_bucket_name on managed-file read path by @devin-ai-integration[bot] in #34847
- feat(cli): read base_url from persistent config file by @ryan-crabbe-berri in #35015
- fix(auth): resolve managed batch/file deployment model_id to model name for team access checks by @devin-ai-integration[bot] in #32587
- fix(vertex_ai): forward function_call id on Vertex Gemini 3+ tool turns by @ljogeiger in #34603
- build(makefile): give local basedpyright runs the node heap CI uses by @mateo-berri in #35173
- fix(complexity_router): capture the classifier request body in spend logs by @tin-berri in #35164
- test(managed-files): lock in store_unified_file_id idempotency on batch retrieve by @devin-ai-integration[bot] in #32601
- fix(vertex_ai): skip context caching when the cached block ends on a model turn by @mateo-berri in #35172
- refactor(bedrock): remove the dead BedrockLLM invoke code path by @mateo-berri in #35188
- fix(pricing): correct gpt-5.4-mini and gpt-5.4-nano token limits by @mateo-berri in #35182
- feat(cookbook): add a Grafana dashboard for the OTel GenAI metrics by @yassin-berriai in #35159
- chore(typing): clear basedpyright Any errors in proxy auth, repositories, and openai transforms by @mateo-berri in #35240
- fix(batches): calculate cost and usage for completed Vertex AI batches by @mateo-berri in #35186
- feat(ui): give auto-routers their own tab on Models + Endpoints by @tin-berri in #35009
- refactor(batches): aggregate batch output cost, usage, and models in a single pass by @mateo-berri in #35205
- feat(router): record why the auto-router picked a tier in spend logs by @tin-berri in #35016
- fix(otel): cap tool-definition attributes so they cannot evict gen_ai.* from the LLM span by @yassin-berriai in #34828
- feat(mcp): enforce per-user MCP tool-call entitlements in the auth module by @yassin-berriai in #35146
- fix(otel): record the GenAI duration metric on failed requests by @yassin-berriai in #35152
- chore: bump litellm 1.95.0 -> 1.96.0 by @yuneng-berri in #35254
- revert(proxy)!: stop enforcing user budget on team keys by @yuneng-berri in #35271
- fix(otel): label retrieval and agent metrics correctly and emit gen_ai.provider.name by @yassin-berriai in #35151
- test(e2e): align budget e2e with the team-key budget hierarchy by @yuneng-berri in #35276
- feat(mcp): scan and mask MCP tool results via post_mcp_call guardrails by @yassin-berriai in #35155
- docs(claude): require 15-25 word human-readable replies to AI PR review bots by @devin-ai-integration[bot] in #35266
- fix(redis): stop an unreachable Redis from blocking every request by @yassin-berriai in #35273
- fix(rate-limits): keep the v3 limiter out of provider-facing metadata on responses routes by @devin-ai-integration[bot] in #35207
- docs(pr-template): require e2e proof on all three LLM endpoints when applicable by @mateo-berri in #35280
- feat(mcp): manual authorization-code delivery for headless MCP clients by @tin-berri in #34848
- feat(db): opt-in REPLICA IDENTITY FULL after prisma migrations by @yassin-berriai in #35267
- fix(ui): stop clamping the budgets Budget ID column at 15 characters by @yuneng-berri in #35268
- fix(proxy): only enforce budgets on routes that can spend by @ryan-crabbe-berri in #35274
- chore(ci): promote internal staging to main by @yuneng-berri in #35285
New Contributors
- @Harsh23Kashyap made their first contribution in #33008
- @ljogeiger made their first contribution in #34603
Full Changelog: v1.95.0-rc.1...v1.96.0-dev.1