v1.97.0-dev.2Pre-release
Added 6
- Add role capability gating to UI and migrate Tool Policies route
- Make reminder marker pair configurable in auto-router
- Derive a default auto-router savings baseline from the hardest tier in spend tracking
- Let operators rename the four complexity tiers in complexity_router
- Let operators replace the LLM classifier's system prompt in auto-router
- Make the gateway middleware the source of truth for successful requests in SGR
Changed 2
- Inject the fetch client's base URL instead of reading it at import in UI
- Perform python, dashboard, and gen-api checks concurrently in pre-commit
Fixed 13
- Name enable_jwt_auth when a JWT-shaped key is rejected
- Update anthropic model presets in UI
- Switch to the dashboard node floor via nvm or fnm in bootstrap
- Self-heal handler clients closed after cache eviction
- Keep OpenAI prompt cache token details through usage reassembly in cost tracking
- Bill gpt-5.6 prompt cache reads at the cache read rate
- Account for Responses API usage in batches
- Skip rows without file objects in managed-files
- Redact fallback tracebacks at the call site and cover the sync deferred stream in router
- Recover from an interrupted Prisma toolchain install in migrations
- Give proxy_admin_viewer read parity with proxy_admin in proxy
- Make the env-key doc gate see get_secret_bool reads in CI
- Keep the connected DB client when a startup health check fails in proxy
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.2
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.2/cosign.pub \
ghcr.io/berriai/litellm:v1.97.0-dev.2
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(ui): add role capability gating, migrate Tool Policies route by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35812
- refactor(ui): inject the fetch client's base url instead of reading it at import by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35802
- chore: remove unused .flake8 config and flake8 dev dependency by @mateo-berri in https://github.com/BerriAI/litellm/pull/35888
- chore: stop advising pre-commit and bootstrap by @mateo-berri in https://github.com/BerriAI/litellm/pull/35884
- fix(auth): name enable_jwt_auth when a JWT-shaped key is rejected by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35831
- feat(auto-router): make reminder marker pair configurable by @akapur99 in https://github.com/BerriAI/litellm/pull/35874
- fix(UI): update anthropic model presets by @tin-berri in https://github.com/BerriAI/litellm/pull/35896
- fix(bootstrap): switch to the dashboard node floor via nvm or fnm by @mateo-berri in https://github.com/BerriAI/litellm/pull/35895
- perf(pre-commit): run python, dashboard, and gen-api checks concurrently by @mateo-berri in https://github.com/BerriAI/litellm/pull/35903
- feat(spend): derive a default auto-router savings baseline from the hardest tier by @tin-berri in https://github.com/BerriAI/litellm/pull/35907
- fix(http_handler): self-heal handler clients closed after cache eviction by @mateo-berri in https://github.com/BerriAI/litellm/pull/35862
- fix(cost_tracking): keep OpenAI prompt cache token details through usage reassembly by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34812
- fix(cost): bill gpt-5.6 prompt cache reads at the cache read rate by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34957
- fix(batches): account for Responses API usage by @rimysore in https://github.com/BerriAI/litellm/pull/35367
- ci: retry Codecov uploads and stop failing jobs on OIDC token flakes by @mateo-berri in https://github.com/BerriAI/litellm/pull/35251
- feat(complexity_router): let operators rename the four complexity tiers by @akapur99 in https://github.com/BerriAI/litellm/pull/35893
- chore(lint): zero stale ruff and LIT headroom and strip inert type: ignore comments by @mateo-berri in https://github.com/BerriAI/litellm/pull/35928
- chore(lint): zero out seven more purely local basedpyright rules by @mateo-berri in https://github.com/BerriAI/litellm/pull/35927
- chore(ui): zero stale headroom on local dashboard eslint budgets by @mateo-berri in https://github.com/BerriAI/litellm/pull/35929
- fix(managed-files): skip rows without file objects by @rimysore in https://github.com/BerriAI/litellm/pull/35365
- fix(router): redact fallback tracebacks at the call site and cover the sync deferred stream by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35843
- fix(migrations): recover from an interrupted Prisma toolchain install by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35832
- fix(lint): bring basedpyright rule counts back under their budget limits by @mateo-berri in https://github.com/BerriAI/litellm/pull/35962
- chore(ui): don't zero out stale headroom except no-console by @mateo-berri in https://github.com/BerriAI/litellm/pull/35964
- fix(proxy): give proxy_admin_viewer read parity with proxy_admin by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/35851
- refactor(ui): address UI lint budget issues by refactoring UI by @tin-berri in https://github.com/BerriAI/litellm/pull/35960
- fix(ci): make the env-key doc gate see get_secret_bool reads by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35833
- fix(caching): re-land evicted LLM client closing (#35492) atop self-healing handlers by @mateo-berri in https://github.com/BerriAI/litellm/pull/35870
- fix(proxy): keep the connected DB client when a startup health check fails by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35837
- chore(lint): remove litellm/types from the ruff lint exclusion by @mateo-berri in https://github.com/BerriAI/litellm/pull/35926
- feat(sgr): make the gateway middleware the source of truth for successful requests by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35717
- feat(auto-router): let operators replace the LLM classifier's system prompt by @akapur99 in https://github.com/BerriAI/litellm/pull/35855
- fix(docker): bake the pip image's prisma engines at a world-readable path by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35976
- fix(auth): return 403 from the OAuth2 enterprise gate by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35838
- fix(router): keep custom model_info across a price data reload by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35491
- fix(proxy): resolve pass-through credentials live from router deployments by @mateo-berri in https://github.com/BerriAI/litellm/pull/35916
- fix(ci): fetch only head and merge-base in lint jobs instead of every branch by @mateo-berri in https://github.com/BerriAI/litellm/pull/35982
- fix(autorouter): match CJK keyword_tier_rules that regex word boundaries miss by @akapur99 in https://github.com/BerriAI/litellm/pull/35984
- feat(spend): rebuild the auto-router benchmarks backend as a per-session rollup by @tin-berri in https://github.com/BerriAI/litellm/pull/35910
- refactor(ui): replace hand-rolled query-param routing with nuqs by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/35871
- fix(docker): bake the componentized prisma engines at /opt/prisma so any uid can start by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35989
- fix(migrations): keep the toolchain heal from raising on an unreadable nodeenv cache by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35986
- fix(bedrock): sign Bedrock managed-file S3 requests with S3SigV4Auth by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35983
- chore(typing): replace Any seams with real types across responses, proxy, and provider adapters by @mateo-berri in https://github.com/BerriAI/litellm/pull/35809
- fix(ai21): resolve the documented AI21_API_KEY instead of a misspelled name by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35985
- fix(docker): fail the image build when the generated prisma engine paths drift off /opt/prisma by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35979
- fix(jina_ai): resolve the documented JINA_API_KEY as a fallback by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35992
- fix(proxy): only treat a recoverable database outage as grounds to serve without one by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35864
- fix(ci): make every remaining CI checkout shallow by @mateo-berri in https://github.com/BerriAI/litellm/pull/35997
- fix(auto-router): stop the embedding model's context window from failing long requests by @akapur99 in https://github.com/BerriAI/litellm/pull/35956
- fix(ci): make the env-key doc gate see bare get_secret and get_secret_str reads by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35996
- fix(logging): extend secret redaction to records litellm does not emit directly by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35977
- test(utils): pin the register_model replay test to the recorded half by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35994
- fix(ci): run every helm test suite, not just the first one per file by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35993
- ci: fail the build when a test file or Dockerfile is invoked by no job by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35991
- fix(langfuse): stop a collected httpx handler from closing a shared client by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35981
- fix(bedrock): grant bedrock:CountTokens in OIDC session policy by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/33145
- feat(pre-commit): save full lint output to a per-worktree log file by @mateo-berri in https://github.com/BerriAI/litellm/pull/36004
- feat(ui): match auto-router preset models against deployments' underlying model IDs by @tin-berri in https://github.com/BerriAI/litellm/pull/35972
- fix(core_helpers): map generic 'error' finish_reason to 'stop' by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/33972
- fix(proxy)!: apply request-parameter checks consistently across body, path and form inputs by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36011
- fix: rebuild models_by_provider in add_known_models so cost map reloads reach wildcard expansion by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/36010
- feat(complexity_router): report LLM classifier cost per request via routing_decision and x-litellm-classifier-cost header by @tin-berri in https://github.com/BerriAI/litellm/pull/36015
- fix(model-prices): correct replicate model key typo by @AkashNaickar in https://github.com/BerriAI/litellm/pull/34800
- fix(proxy): register managed batch output files on terminal retrieve by @Souravrajvi0 in https://github.com/BerriAI/litellm/pull/34092
- perf(pre-commit): fetch basedpyright base counts from CI artifacts by @mateo-berri in https://github.com/BerriAI/litellm/pull/35970
- fix(ui): sync projects list page index to ?page= so back and reload keep the page by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/36003
- fix(ui): link project page keys to their virtual key detail by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/36002
- refactor(ui): drop unreferenced locals from dashboard route components by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35819
- fix(ui): opening a project now pushes ?project= so back and deep links work by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/36001
- refactor(ui): drop unreferenced locals from shared dashboard components by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35821
- refactor(ui): drop unreferenced locals from tests and narrow destructures by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36025
- fix(guardrails): allow litellm_content_filter to run on post_mcp_call by @mateo-berri in https://github.com/BerriAI/litellm/pull/35980
- fix(guardrails): scan /v1/messages tool traffic by @mateo-berri in https://github.com/BerriAI/litellm/pull/35999
- refactor(ui): drop dead locals and unused React state across the dashboard by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36026
- feat(ui): add the auto-router usage tab to cost optimization by @tin-berri in https://github.com/BerriAI/litellm/pull/35995
- fix(managed_files): derive unified output file ids deterministically so concurrent registrations converge by @mateo-berri in https://github.com/BerriAI/litellm/pull/36019
- fix(proxy): send keepalive pings on anthropic messages SSE streams during upstream silence by @mateo-berri in https://github.com/BerriAI/litellm/pull/36024
- fix(managed_files): return unified ids from unscoped file listing by @mateo-berri in https://github.com/BerriAI/litellm/pull/36031
- fix(arize_phoenix): lowercase OTLP/gRPC auth metadata key by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34883
- fix(auto-router): accept every reminder marker pair a harness emits by @tin-berri in https://github.com/BerriAI/litellm/pull/36029
- fix(pricing): sync flex/priority tier keys to dated OpenAI snapshot variants by @mateo-berri in https://github.com/BerriAI/litellm/pull/35923
- fix(cost): bill reasoning tokens at the service tier output rate by @mateo-berri in https://github.com/BerriAI/litellm/pull/35925
- fix(proxy): include today's UTC bucket when a daily activity range ends at the caller's current day by @tin-berri in https://github.com/BerriAI/litellm/pull/36051
- fix: expired-miss share over all measured turns + cost-optimization tab labels by @tin-berri in https://github.com/BerriAI/litellm/pull/36037
- fix(router): include Bedrock batch/S3 fields and model in deployment credentials by @mpcusack-altos in https://github.com/BerriAI/litellm/pull/24548
- fix(batch): track cost for managed batches with no attributable key/u… by @elinacse in https://github.com/BerriAI/litellm/pull/35468
- feat(guardrails): add scan_only_tool_results to scope unified guardrails to tool results by @mateo-berri in https://github.com/BerriAI/litellm/pull/36014
- fix(cost): stop token-pricing the placeholder input on file content calls by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/35140
- fix(proxy): fetch background responses through the router in CheckResponsesCost by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/35137
- fix(proxy): yaml store_prompts_in_spend_logs should take precedence over DB cached value by @Praveena-617 in https://github.com/BerriAI/litellm/pull/35769
- fix(lint): measure the basedpyright budget gate in a gate-owned venv by @mateo-berri in https://github.com/BerriAI/litellm/pull/36050
- docs: cap all GitHub comments at 15-25 words, curb semicolon splices by @mateo-berri in https://github.com/BerriAI/litellm/pull/36059
- chore(lint): name MappingProxyType in the mutable-collection fix messages by @mateo-berri in https://github.com/BerriAI/litellm/pull/36072
- test: roll back runtime model registrations between tests by @mateo-berri in https://github.com/BerriAI/litellm/pull/36039
- refactor(types): cut 653 implicit and explicit Any diagnostics across 11 modules by @mateo-berri in https://github.com/BerriAI/litellm/pull/36054
- fix(proxy): stop resolving the UI session sentinel team on /search_tools/list by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36061
- fix(batches): persist managed file ids for cancelled/failed/expired batches by @mateo-berri in https://github.com/BerriAI/litellm/pull/36048
- fix(batches): register managed output files on batch cancel by @mateo-berri in https://github.com/BerriAI/litellm/pull/36034
- fix(proxy): allow non-admins to reach /user/daily/activity/aggregated by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36062
- fix(anthropic): coerce explicit additionalProperties to false in output_format schema by @dkindlund in https://github.com/BerriAI/litellm/pull/35811
- fix(batches): prevent managed file fallbacks by @rimysore in https://github.com/BerriAI/litellm/pull/35371
- chore: ignore the mechanical lint and typing sweeps in git blame by @mateo-berri in https://github.com/BerriAI/litellm/pull/36076
- fix(proxy): warn at startup when max_budget is set but no database is connected by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/36041
- fix(proxy): promote caller metadata trace fields into litellm_metadata by @yucheng-berri in https://github.com/BerriAI/litellm/pull/35866
- feat(terraform): sync provider 0.3.0 from the mirror and cut 0.4.0 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36098
- fix(guardrails): honor configured timeout in Zscaler AI Guard by @yucheng-berri in https://github.com/BerriAI/litellm/pull/36110
- fix(logging): fall back to litellm_metadata when metadata is empty by @yucheng-berri in https://github.com/BerriAI/litellm/pull/36105
- fix(proxy): re-assert the authenticated identity on passthrough requests by @yucheng-berri in https://github.com/BerriAI/litellm/pull/36121
- chore: bump litellm-enterprise 0.1.53 -> 0.1.54, litellm-proxy-extras 0.4.83 -> 0.4.84 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36139
- fix(ui): match auto-router preset models against wildcard-expanded model groups by @tin-berri in https://github.com/BerriAI/litellm/pull/36111
- test(router): assert the auto-router max_input_chars kwarg by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36109
- fix(ui): allow clearing a key's budget reset from the Edit Key form by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/36140
- fix(managed_files): skip unparseable rows when listing managed files by @mateo-berri in https://github.com/BerriAI/litellm/pull/36021
- fix(a2a): stop writing per-caller headers onto the shared cached httpx client by @yassin-berriai in https://github.com/BerriAI/litellm/pull/35978
- build(deps): bump h2 to 4.4.1 and js-yaml to 4.3.1 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36147
- chore: promote staging to main by @mateo-berri in https://github.com/BerriAI/litellm/pull/36057
New Contributors
- @rimysore made their first contribution in https://github.com/BerriAI/litellm/pull/35367
- @AkashNaickar made their first contribution in https://github.com/BerriAI/litellm/pull/34800
- @Souravrajvi0 made their first contribution in https://github.com/BerriAI/litellm/pull/34092
- @elinacse made their first contribution in https://github.com/BerriAI/litellm/pull/35468
Full Changelog: https://github.com/BerriAI/litellm/compare/v1.97.0-dev.1...v1.97.0-dev.2