v1.97.0-dev.1Pre-release
Added 8
- Resolve Cursor thinking/fast model-name suffixes on /cursor/chat/completions endpoint
- Add non-streaming response toggle to playground
- Apply default organization to new teams from default team settings
- Expose session affinity configuration in the complexity router UI and default it to off
- Add prompt moderation, response-text blocking, streaming buffer, and failure logging to Rubrik guardrails
- Add custom metadata validation hook for team create and update
- Add net auto-router savings to the cost-optimization dashboard
- Show auto-router savings on the cost-optimization dashboard
Changed 1
- Install hiredis so redis-py parses replies with its C parser
Fixed 14
- Stop logging when disable_logging is called for team callbacks
- Backfill null user_email on existing users during JWT auth
- Block Playground page for viewer roles on direct URL access
- Close evicted LLM clients so their connections are reclaimed
- Apply key/team router_settings.model_group_alias
- Read team callback dd_* params from kwargs instead of blocked dynamic params
- Redact credential headers from request logging copies
- Render Responses API request and response in the logs drawer
- Hide guardrail review buttons from non-admin users
- Stop forwarding no-op toolSpec.strict to Converse for Bedrock
- Reject an auto-router keyword rule left empty instead of dropping it
- Attribute blocked requests to the caller that made them in Rubrik guardrails
- Forward client headers to the provider on /v1/responses
- Read what a request cost from the record instead of pricing it again
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.97.0-dev.1
Verify 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.97.0-dev.1/cosign.pub \
ghcr.io/berriai/litellm:v1.97.0-dev.1
Expected 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(proxy): resolve Cursor thinking/fast model-name suffixes on /cursor/chat/completions by @mateo-berri in https://github.com/BerriAI/litellm/pull/35554
- fix(team-callbacks): actually stop logging when disable_logging is called by @yucheng-berri in https://github.com/BerriAI/litellm/pull/35520
- refactor(lint): drop redundant !s f-string conversion flags and fix displaced import-group comments by @mateo-berri in https://github.com/BerriAI/litellm/pull/35546
- fix(proxy): backfill null user_email on existing users during JWT auth by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34588
- feat(playground): add non-streaming response toggle by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/35560
- feat(teams): apply default organization to new teams from default team settings by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/35540
- fix(ui): block Playground page for viewer roles on direct URL access by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/35676
- fix(caching): close evicted LLM clients so their connections are reclaimed by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35492
- chore(deps): update brace-expansion, postcss, and gitpython to current patch releases by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35692
- refactor(ui): rename the create MCP server component to PascalCase by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35686
- fix(openai): drop undefined Union from owns_wrapped_http_client annotation by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/35706
- fix(openai): drop the undefined Union from owns_wrapped_http_client by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/35704
- chore(ui): note Google's Agent Platform rename in vector store setup by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/28076
- fix(proxy): apply key/team router_settings.model_group_alias by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35486
- feat(complexity_router): default session affinity off and expose it in the UI by @tin-berri in https://github.com/BerriAI/litellm/pull/35714
- fix(datadog): read team callback dd_* params from kwargs instead of blocked dynamic params (#35115 port) by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/35687
- refactor(ui): extract the MCP create form's logic and field groups by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35694
- test(ui): tier the MCP create tests into unit and integration by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35697
- fix(proxy): redact credential headers from request logging copies by @yucheng-berri in https://github.com/BerriAI/litellm/pull/35678
- feat(guardrails/rubrik): prompt moderation, response-text blocking, streaming buffer, failure logging by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/35722
- fix(ui): render Responses API request and response in the logs drawer by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35718
- fix(ui): hide guardrail review buttons from non-admin users by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/27535
- feat(team): custom metadata validation hook for team create and update by @yuneng-berri in https://github.com/BerriAI/litellm/pull/33353
- ci(circleci): install a pinned Rust toolchain on the Linux jobs by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35519
- fix(bedrock): stop forwarding no-op toolSpec.strict to Converse by @tin-berri in https://github.com/BerriAI/litellm/pull/35688
- fix(ui): reject an auto-router keyword rule left empty instead of dropping it by @tin-berri in https://github.com/BerriAI/litellm/pull/35705
- fix(guardrails/rubrik): attribute blocked requests to the caller that made them by @yucheng-berri in https://github.com/BerriAI/litellm/pull/35734
- fix(responses): forward client headers to the provider on /v1/responses by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34531
- feat(spend): add net auto-router savings to the cost-optimization dashboard by @tin-berri in https://github.com/BerriAI/litellm/pull/35521
- chore(typing): clear basedpyright Any errors in budget reset, access groups, and cache settings by @mateo-berri in https://github.com/BerriAI/litellm/pull/35719
- fix(spend): read what a request cost from the record instead of pricing it again by @tin-berri in https://github.com/BerriAI/litellm/pull/35736
- perf: install hiredis so redis-py parses replies with its C parser by @Classic298 in https://github.com/BerriAI/litellm/pull/35709
- feat(ui): show auto-router savings on the cost-optimization dashboard by @tin-berri in https://github.com/BerriAI/litellm/pull/35522
- perf: build log messages lazily so filtered-out log records cost nothing by @Classic298 in https://github.com/BerriAI/litellm/pull/35703
- fix(proxy): retry model cost map fetch with Retry-After-aware backoff and keep current map on reload failure by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/35739
- feat(otel): stamp service tier attributes on inference spans by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/35679
- fix(proxy): log the model cost map reload failure lazily by @tin-berri in https://github.com/BerriAI/litellm/pull/35750
- fix(groq): translate web_search_options to the browser_search tool by @hMED22 in https://github.com/BerriAI/litellm/pull/34971
- feat(ui): add admin-configurable user banner by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35729
- fix(e2e): make spend-counter redis connection env-driven for non-cluster deployments by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35732
- fix(proxy): make /cursor/chat/completions work with Cursor agent mode by @tin-berri in https://github.com/BerriAI/litellm/pull/34029
- fix(proxy): propagate user_email and bind api_key on JWT auth attribution paths by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34331
- chore(build): move the Admin UI toolchain to Node 24 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35801
- test(e2e): vendor API strategy coverage across endpoints by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/34649
- chore(deps): upgrade cryptography to 50.0.0 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35803
- test(e2e): cover legacy text /completions endpoint by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/34431
- feat(gemini): add gemini-robotics-er-2-preview and gemini-robotics-er-1.6-preview by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/35555
- test(e2e): move load/perf testing out of the main suite and drop the vllm passthrough test by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35820
- feat(lint): enforce Final on locals and freeze function parameters (LIT010, LIT011) by @mateo-berri in https://github.com/BerriAI/litellm/pull/35807
- chore: bump litellm-proxy-extras 0.4.81 -> 0.4.82, litellm 1.96.0 -> 1.97.0 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35810
- fix(bedrock): drop conflicting tool_choice.type when toolConfig.toolChoice is set by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/35738
- docs(CLAUDE.md): prefer commas over semicolons when replacing em dashes by @mateo-berri in https://github.com/BerriAI/litellm/pull/35825
- chore(lint): zero out basedpyright headroom for purely local rules by @mateo-berri in https://github.com/BerriAI/litellm/pull/35828
- test(e2e): retry provider-transient statuses at the transport with bounded backoff by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35824
- chore(ci): promote internal staging to main by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35836
- refactor(ui): route MCP session tokens through the shared storage helper by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35835
- docs(helm): replace the classic chart's 128Mi resource example with the documented 4Gi sizing by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35830
- fix(proxy): persist periodic reload schedule state so status survives restarts and fires without store_model_in_db by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/35165
- fix(router): eagerly fetch Vertex AI deferred stream to surface HTTP errors in _acompletion fallback path by @deepanshululla in https://github.com/BerriAI/litellm/pull/34627
- fix(azure_storage): honor AZURE_STORAGE_ENDPOINT_SUFFIX for sovereign clouds by @yucheng-berri in https://github.com/BerriAI/litellm/pull/35806
- fix(proxy): apply key_alias/key_hash filters to all /key/list visibility branches by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/35840
- fix(proxy): enforce per-model budgets against resolved cursor model variants by @mateo-berri in https://github.com/BerriAI/litellm/pull/35834
- feat(ui): reorder Add Auto Router into name + template, with a collapsible detailed config by @tin-berri in https://github.com/BerriAI/litellm/pull/35746
- test: repair three failing suites on litellm_internal_staging by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35845
- fix(guardrails): scan model output on the /openai/v1/responses alias by @yucheng-berri in https://github.com/BerriAI/litellm/pull/35818
- ci: pin Node on the Playwright UI lanes so npm ci meets the engines floor by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35848
- fix(pricing): apply OpenAI's gpt-5.6 terra/luna cut to Azure cost map by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/35481
- feat(spend): add caller-scoped key/user/team/organization spend report endpoints by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35725
- revert: "fix(caching): close evicted LLM clients so their connections are reclaimed (#35492)" by @mateo-berri in https://github.com/BerriAI/litellm/pull/35856
- refactor(repositories): add prisma protocol seams and a spend-reset unit of work by @mateo-berri in https://github.com/BerriAI/litellm/pull/35748
- perf(streaming): assemble streamed tool-call arguments in linear time by @mateo-berri in https://github.com/BerriAI/litellm/pull/35826
- fix(s3_v2): sign S3 object URLs with S3SigV4Auth so encoded paths verify by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/35726
- test(e2e): self-seed the ui suite's password-login users in global setup by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35863
- fix(claude-code): create-only skill registration with a PUT update route (LIT-4110) by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/31752
- fix(proxy): fix zguard httpcode when block input by @jwang-gif in https://github.com/BerriAI/litellm/pull/31948
- fix(lint): pick the merge-aware base so in-progress merges are not blamed for base drift by @mateo-berri in https://github.com/BerriAI/litellm/pull/35868
- chore: bump litellm-proxy-extras 0.4.82 -> 0.4.83 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35877
- feat(ui): add Test Routing to the auto router create form by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/35859
- fix(ui): derive auto-router preset tests from the bundled preset JSON by @tin-berri in https://github.com/BerriAI/litellm/pull/35882
- revert: "test(e2e): vendor API strategy coverage across endpoints" (#34649) by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35881
- chore(deps): bump grpc and golang.org/x modules in the terraform provider by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35844
- test(e2e): skip view-backed global spend probes pending LIT-5211 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35875
- fix(lint): move the basedpyright heap flag into the type check gate by @mateo-berri in https://github.com/BerriAI/litellm/pull/35869
- chore(ci): promote internal staging to main by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35876
New Contributors
- @hMED22 made their first contribution in https://github.com/BerriAI/litellm/pull/34971
Full Changelog: https://github.com/BerriAI/litellm/compare/v1.96.0-rc.1...v1.97.0-dev.1