Releases: BerriAI/litellm
Release list
v1.99.0-dev.2
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.99.0-dev.2Verify 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.99.0-dev.2/cosign.pub \
ghcr.io/berriai/litellm:v1.99.0-dev.2Expected 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(proxy): log spend for OpenAI passthrough embeddings with unmapped models by @mateo-berri in #37425
- fix(router): keep acreate_file fallbacks inside the requested model group by @mateo-berri in #37424
- fix(proxy): record estimated input tokens in spend logs for failed dispatched requests by @mateo-berri in #37365
- fix: accept bool thinking param instead of crashing with AttributeError by @mateo-berri in #37423
- refactor(ui): migrate the teams form graph off antd Form onto react-hook-form by @yuneng-berri in #37417
- fix(ui): restore the cache control Role and Index field hints by @yuneng-berri in #37437
- feat(ui): add mounted-field projections for the MCP server form graph by @yuneng-berri in #37440
- refactor(ui): extract the MCP server edit save payload into a pure builder by @yuneng-berri in #37436
- test: derive vertex batch cost expectation from the cost map by @mateo-berri in #37444
- refactor(ui): port the create key form off antd Form onto react-hook-form by @yuneng-berri in #37442
- refactor(ui): port the add model form off antd Form onto react-hook-form by @yuneng-berri in #37446
- refactor(ui): host KeyLifecycleSettings tests in react-hook-form instead of antd Form by @yuneng-berri in #37449
- fix(ui): rebuild nested and list paths in the mounted-field projection by @yuneng-berri in #37450
- fix(ui): gate the pass-through guardrail field inputs when the section is disabled by @yuneng-berri in #37435
- fix(tests): keep a host PROXY_BASE_URL out of request-derived URL tests by @mateo-berri in #37451
- refactor(ui): port the MCP server forms off antd Form onto react-hook-form by @yuneng-berri in #37483
- test(e2e): pin the tag-routing denial to its actual cause by @mateo-berri in #37432
- fix(proxy): read through to the DB on registry misses so just-created models, guardrails, and agents resolve on sibling replicas by @mateo-berri in #36263
- fix(mcp): forward the per-server auth header on OpenAPI tool calls by @tin-berri in #37410
- chore(typing): drop 1.3k basedpyright errors across 42 Any hotspot files by @mateo-berri in #37439
- test(ui): drive fields with change events where the typing is not the behaviour by @yuneng-berri in #37495
- fix(ui): restore tab strip styling and panel persistence lost in the shadcn migration by @ryan-crabbe-berri in #37403
- feat(spend-logs): add lifecycle timestamps by @sytianhe in #37361
- refactor(ui): migrate the antd Button call sites onto the shadcn Button by @yuneng-berri in #37505
- test(ui): split the vitest suite into unit, component, integration and type projects by @yuneng-berri in #37488
- refactor(ptu): give the rollup a source-agnostic deployment record by @yucheng-berri in #37501
- feat(auto-router)!: scope shadow eval jobs to multiple keys by @tin-berri in #37251
- refactor(ui): migrate the antd Alert call sites onto the shared Alert by @yuneng-berri in #37513
- chore(ui): upgrade the dashboard to React 19 by @ryan-crabbe-berri in #37411
- fix(streaming): accept provider cost objects when propagating usage cost by @devin-ai-integration[bot] in #36593
- fix(complexity-router): gate the reasoning override on a non-SIMPLE score by @tin-berri in #37500
- fix(mcp): stop reporting failed OpenAPI tool calls as successes by @tin-berri in #37496
- feat(e2e): add record/replay transport seam and fixture bundle format by @mateo-berri in #37360
- fix(proxy): accept inherited model sentinels in project key limits by @mateo-berri in #37515
- fix(model_prices): add provider-announced deprecation_date to 205 registry entries by @devin-ai-integration[bot] in #37283
- fix(model_prices): correct gemini 3.1 flash image and deepseek v4 pricing, add openai deprecation dates by @devin-ai-integration[bot] in #37473
- fix(model_prices): set prompt_cache_min_tokens=4096 for Gemini 3.5/3.6/3.7 Flash and 3.1 Pro Preview by @mateo-berri in #37516
- fix(anthropic,bedrock): report provider thinking tokens instead of classifying them as text by @devin-ai-integration[bot] in #35998
- fix(batches): stop one bad output line from zeroing an entire batch's spend by @mateo-berri in #37457
- feat(e2e): canonical content-based match keys for record-and-replay by @mateo-berri in #37525
- feat(cli): add
lite login --config-claudeto wire Claude Code at login by @yassin-berriai in #37507 - fix(auth): resolve bare model names against wildcard deployments in model access groups by @ryan-crabbe-berri in #37492
- docs: run only the tests covering your change, leave suites to CI by @devin-ai-integration[bot] in #37528
- feat(complexity-router): make the reasoning override floor configurable by @tin-berri in #37537
- fix(ui): drop stale user search answers so Enter commits the current match by @mateo-berri in #37504
- refactor(ui): migrate the remaining dashboard pages off antd by @ryan-crabbe-berri in #37524
- feat(proxy): auto-suppress the no-Redis banner for confirmed single-worker deployments by @mateo-berri in #36987
- fix(proxy): retry spend updates on Postgres deadlock instead of dropping them by @RayJueWang in #34887
- feat(search): add Amazon Bedrock AgentCore web search provider by @devin-ai-integration[bot] in #36331
- fix(helm): default litellm-helm to the ghcr.io/berriai/litellm image by @yassin-berriai in #37491
- refactor(ui): migrate antd Modal onto the shared shadcn Dialog by @yuneng-berri in #37540
- fix(ui): toggle unlimited budget when its text is clicked by @yuneng-berri in #37547
- feat(proxy): fast-fail validation for batch input files at /v1/files by @mateo-berri in #37527
- chore: gitignore CLAUDE.local.md by @devin-ai-integration[bot] in #37545
- perf(otel): build the credential-scoped tracer Resource once per logger by @yucheng-berri in #37542
- fix(ci): gate backend unit tests on the pull request's own file list by @yuneng-berri in #37550
- chore(codeowners): require pricing owner approval for the model prices jsons by @devin-ai-integration[bot] in #37551
- fix(proxy): initialize the secret manager before resolving os.environ config references by @yassin-berriai in #37544
- refactor(ui): swap @ant-design/icons for lucide-react by @ryan-crabbe-berri in #37553
- refactor(ui): migrate shared primitives and common components off antd by @ryan-crabbe-berri in #37521
- fix(spend-logs): backfill created_at/updated_at from row endTime instead of migration time by @mateo-berri in #37554
- refactor(ui): migrate the MCP servers pages off antd by @Ryan-...
v1.99.0-dev.1
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.99.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.99.0-dev.1/cosign.pub \
ghcr.io/berriai/litellm:v1.99.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
- chore(typing): drop 1.3k basedpyright errors across 30 Any hotspot files by @mateo-berri in #37073
- fix(proxy): register WebSocket passthrough for OpenAI prefixes by @LHMQ878 in #36151
- fix(bedrock): report uploaded size in the FileObject returned by managed batch uploads by @devin-ai-integration[bot] in #36392
- fix(batches): support AWS Bedrock batch cancellation via
StopModelInvocationJobby @ArjunPakhan in #34087 - feat: Async Rust OCR Bridge and MCP OAuth UI Restore by @ArjunPakhan in #31453
- fix(batches): don't crash logging when a completed batch has no output file by @MUSE-CODE-SPACE in #34067
- fix(UI): add default model pin to complexity router UI by @tin-berri in #36615
- feat(ui): add Lite mixed-provider auto-router preset by @tin-berri in #37068
- feat(ui): link key info header to its user, creator, team, and organization by @ryan-crabbe-berri in #37187
- fix(guardrails): scan text on /guardrails/apply_guardrail for Azure Content Safety by @yucheng-berri in #36894
- feat(bedrock): forward LiteLLM identity and metadata into Bedrock requestMetadata by @yassin-berriai in #36861
- fix(azure): rename max_tokens to max_completion_tokens for gpt-5-chat deployments by @yassin-berriai in #36857
- fix(bedrock): preserve cache token usage when invocationMetrics replace the usage block by @brian5021 in #36878
- fix(proxy): registry caches stop per-request tag and end-user Postgres reads in auth by @ryan-crabbe-berri in #36801
- test(e2e): replay a real tool-search assistant turn back to Bedrock Invoke by @yassin-berriai in #36856
- fix(proxy): return 400 naming the missing required param on POST /v1/batches by @mateo-berri in #37199
- fix(ci): bump sqlparse to 0.6.0 to resolve osv-scan CVEs by @mateo-berri in #37200
- fix(ui): stop pairing key spend with the team budget when a key has no budget by @ryan-crabbe-berri in #37196
- fix(guardrails): record MCP tool guardrail evaluations and blocks in … by @Scott-Wilson-ZocDoc in #36978
- fix(proxy): return 400 for non-object metadata and litellm_metadata instead of silent drop or 500 by @mateo-berri in #37203
- fix(anthropic): preserve optional Responses tool properties by @Scott-Wilson-ZocDoc in #36979
- feat(ui): add user ID request log filter by @daniel-meismer-zocdoc in #36781
- fix(anthropic): stop emitting empty thinking blocks on the Responses adapter by @Scott-Wilson-ZocDoc in #36033
- fix(ui): make per-user usage filter searchable by @daniel-meismer-zocdoc in #36790
- refactor(ui): decouple bulk invite from the invite user button by @yuneng-berri in #37061
- fix(helm): bound the migrations Job so a blocked migration cannot stall the release by @yuneng-berri in #36975
- feat(proxy): let USE_V2_MIGRATION_RESOLVER select the v2 migration resolver by @yuneng-berri in #36258
- fix(mcp): scope authorization server issuer by @irosh-colombage-ZocDoc2 in #36482
- fix(responses): unwrap object-form tool_choice before calling the Responses API by @Scott-Wilson-ZocDoc in #36032
- test(ui): query antd controls accessibly instead of by internal CSS class by @yuneng-berri in #37014
- fix(proxy): bill cancelled and failed batches that still produced an output file by @mateo-berri in #37205
- fix(bedrock): read batch usage by payload shape, not by provider name by @marty-sullivan in #37078
- fix(ui): self-contained searchable user filter on the Usage page by @ryan-crabbe-berri in #37206
- revert: don't fix mcp scope authorization server issuer by @mateo-berri in #37220
- fix(mcp): scope authorization server issuer for named MCP servers by @yucheng-berri in #37204
- test(ui): gate dashboard test assertions with testing-library and jest-dom rules by @yuneng-berri in #37018
- feat(shadow-eval): name the shadowed key in job responses and the UI headline by @tin-berri in #37221
- test(ui): assert what collaborators are called with, not merely that they were by @yuneng-berri in #37019
- fix(logging): stop deepcopying results redaction cannot redact by @marty-sullivan in #36638
- fix(gemini): price gemini 3.6 flash at Google's introductory rates on every service tier by @devin-ai-integration[bot] in #37197
- perf(guardrails): stop sending the conversation twice in the noma v2 payload by @itaimodi in #36764
- fix(streaming): track provider-reported cost when caller omits include_usage by @devin-ai-integration[bot] in #35013
- fix: stop rust flag from leaking into upstream provider request bodies by @mateo-berri in #37218
- fix(proxy): return 404 instead of 500 for unresolvable batch and file ids on /v1/batches by @mateo-berri in #37201
- fix(bedrock): validate file-content retrieval against the configured output bucket (#26335) by @kingdoooo in #31435
- fix(proxy): reject out-of-range limit on GET /v1/batches with OpenAI-parity 400 by @mateo-berri in #37198
- fix(batches): price a retrieved batch from its deployment's model and rates (internal copy of #37077) by @mateo-berri in #37219
- feat(ocr): return Azure Document Intelligence's native payload from /v1/ocr via req_format=native by @devin-ai-integration[bot] in #37194
- fix(anthropic): fold guardrail-modified leading system rows into top-level system param by @mateo-berri in #37231
- fix(shadow_eval): copy messages before router call and raise judge output cap by @tin-berri in #37232
- feat(proxy): add Amazon Comprehend Medical passthrough provider by @mateo-berri in #37229
- test(ui): settle the in-flight search before the loading tests end by @yuneng-berri in #37227
- test(cli): use example.com placeholder host in base-url trailing slash test by @ryan-crabbe-berri in #37240
- feat(complexity_router): operator-defined tier sets for the LLM classifier by @tin-berri in #37226
- feat(ui): configure the auto router's heuristic scorer from the Admin UI by @tin-berri in #37216
- fix(shadow_eval): drop unused judge reasoning field and salvage truncated verdicts by @tin-berri in #37239
- feat(proxy): proactive model deprecation alerts and
/model/deprecationsendpoint by @mateo-berri in #26900 - refactor(ui): move dashboard toasts from antd message/notification onto sonner by @ryan-crabbe-berri in #37207
- feat(guardrails): track bedrock guardrail usage units per invocation by @mateo-berri in #37225
- fix(proxy): strip callback credentials from the auth object stamped into request metadata by @yucheng-berri in #37233
- fix(guardrails): retry usage upserts only on connection errors by @mateo-berri in #372...
v1.98.0-rc.1
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.98.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.98.0-rc.1/cosign.pub \
ghcr.io/berriai/litellm:v1.98.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(bedrock): drop toolSpec.strict for Claude Sonnet 5 on Converse by @kr0k in #33196
- build(deps): bump nanoid to 3.3.18 to clear osv-scan by @devin-ai-integration[bot] in #36787
- fix(router): stop scoring system prompt text for code/technical complexity by @tin-berri in #36721
- feat(complexity_router): calibrate the classifier rubric with worked examples, selectable per router by @tin-berri in #36578
- fix(interactions): map step and turn history to Responses API roles and content types by @mateo-berri in #36733
- fix(ui): restore playground model filtering by endpoint by @mubashir1osmani in #36130
- fix(proxy/batches): stop forwarding custom_llm_provider twice in list and cancel by @anxkhn in #32813
- refactor(ui): migrate TokenFlow and JsonViewer to shadcn by @yuneng-berri in #36735
- feat: pre-adoption shadow eval for the auto-router (blind pairwise judge, derived state) by @tin-berri in #36587
- refactor(ui): migrate SimpleMessageBlock and SimpleToolCallBlock to shadcn by @yuneng-berri in #36737
- refactor(ui): migrate HistoryTree and CollapsibleMessage to shadcn by @yuneng-berri in #36738
- refactor: replace Any with precise types across responses, proxy, and llms modules by @mateo-berri in #36763
- refactor(ui): migrate TruncatedValue and OutputCard to shadcn by @yuneng-berri in #36739
- refactor(ui): migrate SectionHeader and ToolsSection to shadcn by @yuneng-berri in #36793
- feat(ui): migrate playground chat controls to shadcn by @mubashir1osmani in #36129
- feat(xai): day-0 pricing for grok-4.6 by @mateo-berri in #36805
- feat(ui): highlight Auto Router in the navbar announcement by @devin-ai-integration[bot] in #36315
- test(e2e): assert the model allow-list permits, not only denies by @yuneng-berri in #36823
- fix(proxy): tolerate a concurrent creator when creating spend views by @yuneng-berri in #36824
- fix(proxy): honor explicit null budget_duration on team and key create + clearable UI dropdowns by @ryan-crabbe-berri in #36699
- feat(model_prices): add meta/muse-spark-1.2 and its contributor tier by @mateo-berri in #36717
- fix(auth): carry team grants in lite login session tokens by @yassin-berriai in #36826
- feat(ui): show provider prompt cache tokens in chat response metrics by @yassin-berriai in #36827
- fix(auth): stop the team fallback from widening model access by @yassin-berriai in #36837
- fix(proxy/team): resolve member_delete cleanup by user id, not the addressed email by @yassin-berriai in #36839
- fix(cli): launch agents as a child process on Windows by @yassin-berriai in #36822
- feat(ui): shadow evals tab beside auto-router usage by @tin-berri in #36588
- feat(cli): make the hidden
litecommand list configurable by @yassin-berriai in #36816 - feat(azure_ai): add Fireworks FW model pricing on Azure AI Foundry by @emerzon in #35613
- fix: enable xhigh reasoning support for gpt-5.4-mini models by @emerzon in #26909
- feat(azure-ai): add Grok 4.3 model metadata by @emerzon in #27932
- feat(ui): render request metrics on the /ui/chat surface by @yassin-berriai in #36845
- fix(ui): stop a deselected MCP server keeping its grant on a virtual key by @yassin-berriai in #36840
- fix(team): sweep dangling team references and cache on team delete by @yassin-berriai in #36819
- fix(mcp): resolve admin OAuth sessions from any worker via DB-backed drafts by @yassin-berriai in #36844
- refactor(ui): migrate usage to shadcn by @yuneng-berri in #36834
- refactor(ui): migrate guardrails-monitor to shadcn by @yuneng-berri in #36838
- refactor(ui): migrate playground to shadcn by @yuneng-berri in #36847
- refactor(ui): migrate guardrails to shadcn by @yuneng-berri in #36832
- fix(batches): stop uncostable batches from starving the cost poll page by @devin-ai-integration[bot] in #36714
- perf(spend-logs): bound retention cleanup so one run cannot saturate the database by @yassin-berriai in #36594
- fix(proxy): fail config load when a callbacks entry is not dispatchable by @yassin-berriai in #36858
- fix(bedrock): hoist custom.defer_loading before dropping custom on invoke tools by @yassin-berriai in #36855
- fix(access groups): sync assigned_key_ids from the key write paths by @yassin-berriai in #36843
- fix(mcp): expose client HTTP headers to logging callbacks and hooks by @devin-ai-integration[bot] in #36724
- fix(ptu): stop per-token billing on a PTU-configured deployment by @yucheng-berri in #36829
- fix(ui): add nvidia riva to the model provider list by @devin-ai-integration[bot] in #36769
- fix(scripts): end make check with a ran/skipped summary and verdict by @mateo-berri in #36864
- fix(proxy): track spend for OpenAI passthrough /v1/embeddings by @lostmartian in #36660
- test(proxy): stop monkeypatch.undo re-planting fixture-mocked prisma_client by @mateo-berri in #36872
- fix(access groups): sync assigned_team_ids from the team write paths by @yassin-berriai in #36825
- ci: drop the CircleCI ui_build and ui_unit_tests jobs by @yuneng-berri in #36893
- fix(langfuse)!: source the emitted metadata blob from StandardLoggingPayload by @yucheng-berri in #36744
- refactor(ui): migrate Navbar off antd to shadcn by @yuneng-berri in #36902
- refactor(ui): migrate log details drawer off antd to shadcn by @yuneng-berri in #36904
- refactor(ui): migrate AI Hub off antd and tremor to shadcn by @yuneng-berri in #36908
- refactor(ui): move the shared dropdowns and selectors onto shadcn primitives by @yuneng-berri in #36924
- refactor(ui): move the root-level dashboard components onto shadcn primitives by @yuneng-berri in #36927
- refactor(ui): move the settings page and bulk user invite onto shadcn primitives by @yuneng-berri in #36936
- refactor(ui): move the cost tracking components onto shadcn primitives by @yuneng-berri in #36955
- ci: drop the duplicate proxy_unit_tests letter-shard workflow by @yuneng-berri in #36866
- refactor(ui): migrate shared common_components off antd and tremor by @yuneng-berri in #36910
- refactor(ui): migrate key info and permissions views off antd and tremor by @yuneng-berri in #36913
- feat(proxy): serve Anthropic-native /v1/models for Claude Code gateway discovery by @Ar-maan05 in #35455
- refactor(ui): migrate router settings and shared badges off antd and tremor by @yuneng-berri in #36915
- ...
v1.97.0
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.0Verify 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/cosign.pub \
ghcr.io/berriai/litellm:v1.97.0Expected 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 #35554
- fix(team-callbacks): actually stop logging when disable_logging is called by @yucheng-berri in #35520
- refactor(lint): drop redundant !s f-string conversion flags and fix displaced import-group comments by @mateo-berri in #35546
- fix(proxy): backfill null user_email on existing users during JWT auth by @devin-ai-integration[bot] in #34588
- feat(playground): add non-streaming response toggle by @ryan-crabbe-berri in #35560
- feat(teams): apply default organization to new teams from default team settings by @ryan-crabbe-berri in #35540
- fix(ui): block Playground page for viewer roles on direct URL access by @ryan-crabbe-berri in #35676
- fix(caching): close evicted LLM clients so their connections are reclaimed by @yassin-berriai in #35492
- chore(deps): update brace-expansion, postcss, and gitpython to current patch releases by @yuneng-berri in #35692
- refactor(ui): rename the create MCP server component to PascalCase by @yuneng-berri in #35686
- fix(openai): drop undefined Union from owns_wrapped_http_client annotation by @ryan-crabbe-berri in #35706
- fix(openai): drop the undefined Union from owns_wrapped_http_client by @devin-ai-integration[bot] in #35704
- chore(ui): note Google's Agent Platform rename in vector store setup by @ryan-crabbe-berri in #28076
- fix(proxy): apply key/team router_settings.model_group_alias by @yassin-berriai in #35486
- feat(complexity_router): default session affinity off and expose it in the UI by @tin-berri in #35714
- fix(datadog): read team callback dd_* params from kwargs instead of blocked dynamic params (#35115 port) by @ryan-crabbe-berri in #35687
- refactor(ui): extract the MCP create form's logic and field groups by @yuneng-berri in #35694
- test(ui): tier the MCP create tests into unit and integration by @yuneng-berri in #35697
- fix(proxy): redact credential headers from request logging copies by @yucheng-berri in #35678
- feat(guardrails/rubrik): prompt moderation, response-text blocking, streaming buffer, failure logging by @devin-ai-integration[bot] in #35722
- fix(ui): render Responses API request and response in the logs drawer by @yuneng-berri in #35718
- fix(ui): hide guardrail review buttons from non-admin users by @ryan-crabbe-berri in #27535
- feat(team): custom metadata validation hook for team create and update by @yuneng-berri in #33353
- ci(circleci): install a pinned Rust toolchain on the Linux jobs by @yuneng-berri in #35519
- fix(bedrock): stop forwarding no-op toolSpec.strict to Converse by @tin-berri in #35688
- fix(ui): reject an auto-router keyword rule left empty instead of dropping it by @tin-berri in #35705
- fix(guardrails/rubrik): attribute blocked requests to the caller that made them by @yucheng-berri in #35734
- fix(responses): forward client headers to the provider on /v1/responses by @devin-ai-integration[bot] in #34531
- feat(spend): add net auto-router savings to the cost-optimization dashboard by @tin-berri in #35521
- chore(typing): clear basedpyright Any errors in budget reset, access groups, and cache settings by @mateo-berri in #35719
- fix(spend): read what a request cost from the record instead of pricing it again by @tin-berri in #35736
- perf: install hiredis so redis-py parses replies with its C parser by @Classic298 in #35709
- feat(ui): show auto-router savings on the cost-optimization dashboard by @tin-berri in #35522
- perf: build log messages lazily so filtered-out log records cost nothing by @Classic298 in #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 #35739
- feat(otel): stamp service tier attributes on inference spans by @devin-ai-integration[bot] in #35679
- fix(proxy): log the model cost map reload failure lazily by @tin-berri in #35750
- fix(groq): translate web_search_options to the browser_search tool by @hMED22 in #34971
- feat(ui): add admin-configurable user banner by @yuneng-berri in #35729
- fix(e2e): make spend-counter redis connection env-driven for non-cluster deployments by @yuneng-berri in #35732
- fix(proxy): make /cursor/chat/completions work with Cursor agent mode by @tin-berri in #34029
- fix(proxy): propagate user_email and bind api_key on JWT auth attribution paths by @devin-ai-integration[bot] in #34331
- chore(build): move the Admin UI toolchain to Node 24 by @yuneng-berri in #35801
- test(e2e): vendor API strategy coverage across endpoints by @mubashir1osmani in #34649
- chore(deps): upgrade cryptography to 50.0.0 by @yuneng-berri in #35803
- test(e2e): cover legacy text /completions endpoint by @mubashir1osmani in #34431
- feat(gemini): add gemini-robotics-er-2-preview and gemini-robotics-er-1.6-preview by @devin-ai-integration[bot] in #35555
- test(e2e): move load/perf testing out of the main suite and drop the vllm passthrough test by @yuneng-berri in #35820
- feat(lint): enforce Final on locals and freeze function parameters (LIT010, LIT011) by @mateo-berri in #35807
- chore: bump litellm-proxy-extras 0.4.81 -> 0.4.82, litellm 1.96.0 -> 1.97.0 by @yuneng-berri in #35810
- fix(bedrock): drop conflicting tool_choice.type when toolConfig.toolChoice is set by @devin-ai-integration[bot] in #35738
- docs(CLAUDE.md): prefer commas over semicolons when replacing em dashes by @mateo-berri in #35825
- chore(lint): zero out basedpyright headroom for purely local rules by @mateo-berri in #35828
- test(e2e): retry provider-transient statuses at the transport with bounded backoff by @yuneng-berri in #35824
- chore(ci): promote internal staging to main by @yuneng-berri in #35836
- refactor(ui): route MCP session tokens through the shared storage helper by @yuneng-berri in #35835
- docs(helm): replace the classic chart's 128Mi resource example with the documented 4Gi sizing by @yassin-berriai in #35830
- fix(proxy): persist periodic reload schedule state so status survives restarts and fires without store_model_in_db by @ryan-crabbe-berri in #35165
- fix(router): eagerly fetch Vertex AI deferred stream to surface HTTP errors in _acompletion fallback path by @deepanshululla in #34627
- fix(azure_storage): honor AZURE_STORAGE_ENDPOINT_SUFFIX for sovereign clouds by @yucheng-berri in #35806
- fix(proxy): apply key_alias/key_hash filters to all /key/list visibility branches by @ryan-crabbe-berri in https://github.com/BerriAI/...
v1.98.0-dev.2
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.98.0-dev.2Verify 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.98.0-dev.2/cosign.pub \
ghcr.io/berriai/litellm:v1.98.0-dev.2Expected 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(batches): attribute Vertex passthrough batch cost to key/team/tags by @yucheng-berri in #34456
- docs: rewrite the CLAUDE.md comment rule with explicit exceptions by @devin-ai-integration[bot] in #36301
- fix(proxy): scope file list pagination cursors to the caller by @devin-ai-integration[bot] in #36093
- fix(proxy): skip prisma-dependent hooks when no database is attached by @mateo-berri in #36273
- fix(proxy): report has_more false on caller-scoped file list pages by @mateo-berri in #36326
- fix(proxy): restore management_v1 query-param validation under fastapi>=0.140.7 by @HuanQian571 in #35773
- fix(proxy): stop /{provider}/v1/files from capturing /openai_passthrough by @devin-ai-integration[bot] in #36092
- chore(typing): remove 914 basedpyright Any errors across 16 hotspot files by @mateo-berri in #36386
- fix(router): keep batch fallbacks inside the model group that owns the file by @mateo-berri in #36181
- feat(ptu): configure provisioned-throughput flat cost on a model deployment by @yucheng-berri in #35341
- docs: clarify the CLAUDE.md comment exceptions are any-of by @devin-ai-integration[bot] in #36421
- docs: replace the Changes PR template section with Caveats by @devin-ai-integration[bot] in #36423
- fix(bedrock): enable native structured output for GLM 5 and DeepSeek V3.2 by @alexshtf in #35669
- feat(ptu): daily rollup writes per-model PTU flat cost by active hour by @yucheng-berri in #35343
- feat(logging): add opt-in session_id and trace_id correlation to JSON log records via contextvars by @deepanshululla in #34418
- feat(ptu): surface PTU flat cost on the daily activity read path by @yucheng-berri in #35391
- feat(router): add per-deployment allowed_fails_policy and cooldown_time override support by @deepanshululla in #34416
- feat(ptu): add PTU inputs to the model form and flat cost to the Usage page by @yucheng-berri in #35393
- fix(cost): price dict-shaped image input token details at the image rate by @vairodp in #33490
- fix(model_prices): refresh deprecation dates, correct xAI pricing and add missing provider models by @devin-ai-integration[bot] in #36403
- feat(ptu): gate PTU flat-cost attribution behind an opt-in env var by @yucheng-berri in #36138
- ci: cache Prisma CLI and engine binaries, split test timeout from setup by @mateo-berri in #36417
- feat(rate limiting): configurable estimated output tokens per key, team and model by @yassin-berriai in #36143
- fix(ui): hide admin-only Logs tabs from roles that cannot call their endpoints by @yuneng-berri in #36333
- test(proxy): guard management_v1 against fastapi names removed in supported releases by @yuneng-berri in #36336
- fix(ui): gate policy and prompt lookups on an admin capability by @yuneng-berri in #36335
- build(deps): bump pypdf to 6.15.0 to clear osv-scan by @devin-ai-integration[bot] in #36350
- fix(proxy): isolate guardrail load failures per row by @yucheng-berri in #36432
- fix(ui): gate organization and agent usage views behind capabilities by @yuneng-berri in #36334
- fix(reset_budget_job): atomic budget cascade with chunked reset scans by @ryan-crabbe-berri in #36287
- feat(proxy): add GET /v1/indexes to list vector store indexes by @ryan-crabbe-berri in #36289
- feat(ui): show vector store indexes on the Vector Stores page by @ryan-crabbe-berri in #36306
- fix(proxy): treat SAML as configured in UI SSO detection by @fancybear-dev in #36196
- fix(bedrock): reject Anthropic server-side web_search tool with actionable error by @ryan-crabbe-berri in #36473
- fix(ui): open the classifier prompt editor above the edit auto-router form by @tin-berri in #36438
- fix(arize): trace MCP tool calls instead of crashing on CallToolResult by @yucheng-berri in #36453
- refactor(ui): make illegal DataTable prop combinations unrepresentable by @yuneng-berri in #36470
- fix(ui): scope Virtual Keys and Logs team lists to the caller by @yuneng-berri in #36472
- fix(ui): gate the Old Usage page behind a proxy-admin capability by @yuneng-berri in #36469
- docs(terraform): describe the provider release as automatic by @yuneng-berri in #36467
- feat(proxy): add per-deployment keepalive_seconds SSE heartbeat to prevent load-balancer timeout on long streams by @deepanshululla in #34423
- fix(router): cool down failed fallback deployments and correct cooldown TTL after Redis backfill by @deepanshululla in #35104
- perf(spend): write each daily spend batch in one upsert statement by @yassin-berriai in #36448
- fix(ui): gate four sidebar pages on the roles their endpoints allow by @yuneng-berri in #36475
- fix(ui): restore the Logs Deleted Teams tab for organization admins by @yuneng-berri in #36478
- fix(websearch): stop leaking interception control fields to providers by @yassin-berriai in #36480
- test(e2e): cover the Anthropic web_search server tool on Bedrock by @yassin-berriai in #36443
- fix(router): warn when a deployment's credentials contradict its provider by @yassin-berriai in #36486
- fix: net prompt-caching savings against the cache-write premium by @tin-berri in #36452
- feat(ui): deployment affinity toggle for the auto-router by @tin-berri in #36302
- fix(bedrock): use deployment credentials for AWS requests by @daleselaji-dev in #36160
- fix(anthropic): preserve midturn system corrections by @eugene-yao-zocdoc in #34290
- fix(email): stop duplicate legacy invitation email and fix its onboarding link by @mubashir1osmani in #36455
- feat(ui): show models under each tier in routing benchmark chart by @tin-berri in #36291
- fix(proxy): inject streaming usage cost on openai passthrough streams by @mateo-berri in #36503
- docs: require a user flow and live-proxy proof in bug reports by @devin-ai-integration[bot] in #36498
- fix(proxy): add config_updated_at audit timestamp for virtual keys by @ryan-crabbe-berri in #36488
- docs: require a user flow and a stuck-at proof in feature requests by @devin-ai-integration[bot] in #36500
- feat(router): add required-AND (&) tag prefix and allow_fail_open flag by @deepanshululla in #36193
- feat(proxy): per-key prompt caching toggle via enable_prompt_caching by @ryan-crabbe-berri in #36466
- fix(bedrock): send tool-search beta header for Haiku 4.5 on Invoke /v1/messages by @mateo-berri in #36502
- fix(bedrock): preserve adaptive thinking effort through the /v1/messages bridge by @mateo-berri in #36507
- ci: retry transient net...
v1.96.2
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.2Verify 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.2/cosign.pub \
ghcr.io/berriai/litellm:v1.96.2Expected 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
- chore(release): backport proxy request-handling maintenance and refresh runtime deps for 1.96.1 by @yuneng-berri in #36494
- bump: version 1.96.1 → 1.96.2 (1.96.1 burned by the PyPI storage failure) by @yuneng-berri in #36570
Full Changelog: v1.96.0...v1.96.2
v1.95.1
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.95.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.95.1/cosign.pub \
ghcr.io/berriai/litellm:v1.95.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
- chore(release): backport proxy request-handling maintenance and refresh runtime deps for 1.95.1 by @yuneng-berri in #36332
Full Changelog: v1.95.0...v1.95.1
v1.91.5
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.91.5Verify 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.91.5/cosign.pub \
ghcr.io/berriai/litellm:v1.91.5Expected 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
- chore(release): backport proxy request-handling maintenance and refresh runtime deps for 1.91.5 by @yuneng-berri in #36322
Full Changelog: v1.91.4...v1.91.5
v1.97.0-rc.1
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-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.97.0-rc.1/cosign.pub \
ghcr.io/berriai/litellm:v1.97.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(azure_sentinel): respect AZURE_AUTHORITY_HOST and derive the Azure Monitor audience per cloud by @yucheng-berri in #36137
- fix(bedrock): pass SSE-KMS key through to the batch input-file S3 upload by @devin-ai-integration[bot] in #35148
- fix(anthropic adapter): stop indexing choices[0] on choiceless streaming chunks by @devin-ai-integration[bot] in #35314
- fix(bedrock): normalize /v1/completions and /v1/responses batch records by @devin-ai-integration[bot] in #35675
- fix(proxy): return the real status code when a credential update is rejected by @yucheng-berri in #36166
- fix(proxy): improve Headroom /v1/compress HTTP 404 diagnostics by @aayush598 in #35952
- fix(proxy): invalidate cached project object on project update and delete by @ryan-crabbe-berri in #36028
- feat(proxy): add apply_user_budget_to_team_keys opt-in by @ryan-crabbe-berri in #36102
- fix(proxy): stop alerting on health probes that lose the planned engine-restart race by @yassin-berriai in #36141
- test(docker): gate the componentized gateway and backend images on an arbitrary-uid offline boot by @yassin-berriai in #36136
- fix(http): stop pooled clients persisting cookies on the aiohttp jar too by @yassin-berriai in #36149
- fix(router): bound fallback-walk work and error-log volume by @yassin-berriai in #36148
- ci: wire credential_endpoints tests into the proxy endpoints job by @cursor[bot] in #36187
- docs(keys): document /key/info fields and clarify budget_reset_at is the next reset by @ryan-crabbe-berri in #36127
- fix(azure_sentinel): add AZURE_SENTINEL_AUTHORITY_HOST as a Sentinel scoped override by @yucheng-berri in #36165
- docs(pr-template): add a User Flow section with authoring instructions by @mateo-berri in #36162
- fix(proxy): derive config agent ids from agent_name so grants survive secret rotation by @ryan-crabbe-berri in #36020
- chore(ui): regenerate schema.d.ts for the /key/info docstring update by @devin-ai-integration[bot] in #36210
- build(deps): bump gitpython to 3.1.58 to clear osv-scan on staging by @devin-ai-integration[bot] in #36212
- fix(proxy): deny agent access when key and team grants resolve to nothing by @ryan-crabbe-berri in #36221
- build(deps): defer the second pypdf advisory until the 6.15.0 bump by @devin-ai-integration[bot] in #36218
- fix(a2a): align agent list annotation and test with the tuple return type by @devin-ai-integration[bot] in #36217
- ci: always run the UI API types sync check so it can be required by @devin-ai-integration[bot] in #36213
- build(deps): bump nanoid to 3.3.17 in the dashboard lockfile by @devin-ai-integration[bot] in #36227
- feat(ui): show user email or alias in usage data export by @ryan-crabbe-berri in #36232
- feat(auto-router): track turns per complexity tier (LIT-5302) by @tin-berri in #36209
- fix(websearch): restore snippet text in native web_search_tool_result blocks (LIT-5315) by @tin-berri in #36228
- fix(proxy): resolve entity access groups in the model listing endpoints by @devin-ai-integration[bot] in #36230
- fix(ui): let access groups be a team's only model source, with hover provenance by @ryan-crabbe-berri in #36234
- fix(managed_files): return unified output file ids from GET /batches by @mateo-berri in #36049
- test(proxy): compare empty agent list to the tuple get_agent_list returns by @devin-ai-integration[bot] in #36225
- fix(otel): name the RPC system and upstream on MCP tool-call spans by @yucheng-berri in #35857
- fix(guardrails): chunk oversized Bedrock ApplyGuardrail requests instead of failing by @yucheng-berri in #36119
- test(e2e): settle control-plane writes across every replica, not just one by @yuneng-berri in #36247
- fix(responses): forward allowed_openai_params through the chat completions bridge by @devin-ai-integration[bot] in #35885
- test(proxy): assert the copy _add_team_member_budget_table returns by @devin-ai-integration[bot] in #36244
- chore(ui): regenerate dashboard api types for tier_turns by @devin-ai-integration[bot] in #36243
- refactor(types): declare mirrored pricing fields on ModelInfo by @devin-ai-integration[bot] in #36215
- fix(lint): make strict-gate noqas survive base ruff and flag stale ones by @mateo-berri in #36257
- fix(vertex_ai): surface real error/status on vertex batch create instead of IndexError 500 by @devin-ai-integration[bot] in #35141
- ci: give the remaining pull_request workflows a concurrency group by @devin-ai-integration[bot] in #36252
- refactor(lint): graduate zero-violation strict rules and guard the budget ratchet by @mateo-berri in #36161
- fix(proxy): enforce require_managed_files on every route that accepts a raw provider id by @devin-ai-integration[bot] in #35551
- chore(typing): clear 1.4k basedpyright Any errors across 21 hotspot files by @mateo-berri in #36282
- test: roll back live router replay membership between tests by @mateo-berri in #36278
- chore(ci): sync main into internal staging by @yuneng-berri in #36288
- build(lint): rename make pre-commit to make check with a working-tree fallback by @mateo-berri in #36277
- fix(ui): show team BYOK models in team fallback settings by @devin-ai-integration[bot] in #36241
- fix(otel): mark v2 server spans as failed for pre-call errors by @devin-ai-integration[bot] in #34546
- fix(websearch_interception): bill intercepted searches to the calling key by @devin-ai-integration[bot] in #35708
- chore: remove pre-commit rule by @mateo-berri in #36295
- docs: clarify guideline priority ordering in CLAUDE.md by @devin-ai-integration[bot] in #36296
- feat(router): independent, default-on deployment affinity for the auto-router by @tin-berri in #36146
- test: repair stale CircleCI contracts by @yuneng-berri in #36293
- chore(ci): promote internal staging to main by @yuneng-berri in #36286
- chore: rebuild Admin UI bundle for the 2026-08-08 release by @yuneng-berri in #36297
- chore(ci): promote internal staging to main by @yuneng-berri in #36304
New Contributors
- @aayush598 made their first contribution in #35952
- @cursor[bot] made their first contribution in #36187
Full Changelog: v1.97.0-dev.2...v1.97.0-rc.1
v1.96.0
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.0Verify 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/cosign.pub \
ghcr.io/berriai/litellm:v1.96.0Expected 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
- fix(pricing): adjust gpt-5.6-terra and gpt-5.6-luna prices according to OpenAI's latest article by @lihugang in #35258
- 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-integratio...