v1.95.0-rc.2
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.95.0-rc.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.95.0-rc.2/cosign.pub \
ghcr.io/berriai/litellm:v1.95.0-rc.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
- test(e2e): lower realtime server-VAD threshold to 0.5 by @mubashir1osmani in #32710
- fix(guardrails): mask credentials embedded in guardrail_response before persist (LIT-4314) by @yucheng-berri in #32687
- feat: add Meta Model API provider and muse-spark-1.1 (day-0) by @devin-ai-integration[bot] in #32701
- feat(models): add Azure GPT-5.6 (sol/terra/luna) pricing and metadata by @devin-ai-integration[bot] in #32678
- ci: skip backend unit tests on ui-only PRs without stranding required checks by @devin-ai-integration[bot] in #32532
- refactor(ui): colocate cost-tracking and prompts components into _components/ by @ryan-crabbe-berri in #32716
- refactor(ui): colocate tag-management and vector-stores views, keeping the shared selectors by @ryan-crabbe-berri in #32719
- refactor(ui): colocate the policies view, keeping PolicySelector shared by @ryan-crabbe-berri in #32720
- test: add /v1/messages to supported_endpoints schema enum by @tin-berri in #32739
- fix(spend-logs): honor store_prompts_in_spend_logs for guardrail_information (LIT-4314) by @yucheng-berri in #32688
- fix(spend): sum multi-round session cost in logs UI by @devin-ai-integration[bot] in #32796
- refactor(ui): colocate agents and guardrails views, keeping shared selectors and types by @ryan-crabbe-berri in #32728
- fix(mcp): stop persisting the DCR client onto true_passthrough and oauth_delegate server rows by @tin-berri in #32735
- fix(e2e): batch credentials wiring and compose harness for live proxy suite by @mubashir1osmani in #32744
- feat(mcp): add dcr_bridge column and plumbing for client-forwarded auth modes by @tin-berri in #32745
- chore(ui): make knip trustworthy and enforce dead-code in CI by @ryan-crabbe-berri in #32727
- build(pre-commit): regenerate eslint-metrics.json instead of failing on drift by @ryan-crabbe-berri in #32717
- feat(mcp): relay upstream 401 on client-forwarded pass-through tool calls by @tin-berri in #32556
- feat(ui): add shared composable DataTable component by @yuneng-berri in #32680
- fix(mcp): fail closed and surface semantic filter context window errors by @tin-berri in #32715
- refactor(ui): colocate the skills view, keeping the AIHub-shared skill components by @ryan-crabbe-berri in #32803
- feat(mcp): dcr_bridge authorize and token relay redirect handling with mandatory S256 by @tin-berri in #32747
- ci(ui): move frontend lint into its own "UI Lint" workflow by @ryan-crabbe-berri in #32810
- feat(mcp): dcr_bridge discovery facade and register relay by @tin-berri in #32753
- feat(mcp): add sealed envelope module for dcr_bridge client-held credentials by @tin-berri in #32748
- fix(bedrock): keep mid-conversation system messages in place for Claude Invoke by @mateo-berri in #32578
- fix(proxy): add coordination_redis routes to component allowlist by @yucheng-berri in #32823
- docs: point OSS contributors at the daily OSS branch by @yuneng-berri in #32830
- fix(proxy): build redis usage cache from REDIS_* env when cache backend is not Redis by @yassin-berriai in #32635
- refactor(ui): full-height sidebar shell with content-scoped top bar by @yuneng-berri in #32793
- feat(otel): emit the gen_ai.client.operation.exception event on failed LLM calls by @yassin-berriai in #32655
- feat(proxy): configure the coordination redis independently of the response cache by @yassin-berriai in #32661
- feat(deploy): make coordination redis a first-class chart and terraform surface by @yassin-berriai in #32662
- feat(mcp): add dcr_bridge envelope consumer helpers by @tin-berri in #32794
- fix(proxy): match multi-mode guardrail_mode without false-COMPLIANT by @yucheng-berri in #32832
- fix(mcp): merge credentials within the client-forwarded class on an auth-type switch by @tin-berri in #32815
- ci: authorize the expression package (MIT) in liccheck.ini by @tin-berri in #32847
- fix(redis): only use SSLConnection when ssl is truthy in connection pool kwargs by @yucheng-berri in #32825
- refactor(ui): convert caching page charts to shadcn/recharts by @ryan-crabbe-berri in #32721
- fix: strip trailing slash from --base-url in lite CLI by @krrish-berri-2 in #32845
- feat(router): add LLM-based classifier option to complexity router by @krrish-berri-2 in #32169
- fix(bedrock): add jp.anthropic.claude-opus-4-8 to model cost map by @mateo-berri in #32840
- fix(responses): preserve reasoning_tokens through chat->responses usage translation by @mateo-berri in #32837
- fix(bedrock): gate in-place system role messages on model support for Claude Invoke by @mateo-berri in #32831
- fix(responses-api): raise APIError on in-stream error events; widen ErrorEventError.param to accept dict by @mateo-berri in #32835
- fix(prometheus): skip budget metric DB/cache lookups when gauges are NoOpMetric by @mateo-berri in #32834
- fix(anthropic): strip @Version suffix in _model_map_lookup_candidates so @default Vertex AI models resolve to adaptive thinking by @mateo-berri in #32833
- fix(datadog): split log batches proactively under intake payload limits by @yucheng-berri in #32860
- fix(anthropic): translate adaptive thinking/effort to pre-4.6 model support by @mateo-berri in #32867
- test(models): assert capability fields on regional Azure gpt-5.6 entries by @mateo-berri in #32875
- fix(bedrock): flag mapped Claude 4.8+ entries with supports_mid_conversation_system by @mateo-berri in #32882
- fix(mcp): rework the dashboard credential-field lifecycle so the OAuth app is upstream-scoped by @tin-berri in #32752
- feat(ui): root the gateway breadcrumb in the AI Gateway selector by @yuneng-berri in #32886
- feat(ui): dcr_bridge toggle for client-forwarded MCP auth modes by @tin-berri in #32804
- feat(ui): add filter drawer, column visibility, and search to the shared DataTable by @yuneng-berri in #32856
- feat(ui): typed openapi-fetch foundation (fetchClient) + first typed caller (useCustomers) by @ryan-crabbe-berri in #29884
- test(e2e): cover Langfuse logging.yaml P0 logs_spend cells by @mubashir1osmani in #32857
- refactor(ui): use TanStack Pacer debounce for the team keys search by @yuneng-berri in #32919
- fix(mcp): strip scheme default port from get_request_base_url netloc by @tin-berri in #32921
- fix(mcp): re-register DCR client when proxy origin no longer matches its registered redirect_uri by @tin-berri in #32527
- refactor(fallback-generalizations): split rules into routing and provider-neutral capability kinds by @mateo-berri in #32873
- test(e2e): drop vertex from pipecat tool smoke and remove key models dropdown suite by @mubashir1osmani in #32925
- ci: gate tests/e2e on zero basedpyright errors in pre-commit and lint CI by @mateo-berri in #32918
- fix(rate-limit-v3): populate x-ratelimit-* remaining/limit values in standard_logging_object for streaming by @yucheng-berri in #32711
- test: remove live OpenAI fine-tuning job-creation test blocked by platform wind-down by @mateo-berri in #32933
- feat(team): add RESTful PATCH /team/{team_id} with JSON merge patch semantics by @yuneng-berri in #32883
- chore(ui): remove eslint-metrics.json lint-count snapshot by @yuneng-berri in #32930
- feat: add lite auth print-token for Claude Code apiKeyHelper support by @krrish-berri-2 in #32846
- refactor(ui): convert activity metrics charts to shadcn/recharts by @ryan-crabbe-berri in #32726
- feat(ui): extend topnav border across the sidebar header by @yuneng-berri in #32920
- fix(anthropic): thread real provider through capability probes instead of pinning anthropic by @mateo-berri in #32874
- feat(auto_router): keyword tier overrides and semantic keyword matching for the complexity router by @mateo-berri in #32859
- feat(auto_router): keyword tier overrides and semantic keyword matching for the complexity router by @akapur99 in #32829
- feat(ui): add redesigned sidebar account menu by @yuneng-berri in #32931
- fix(guardrails): filter Add-Guardrail mode dropdown per provider by @yucheng-berri in #32712
- feat(complexity_router): log the cause of each routing decision by @akapur99 in #32943
- feat(mcp): admit dcr_bridge oauth_delegate clients via a single envelope bearer by @tin-berri in #32824
- refactor(ui): convert user agent and per-user usage charts to shadcn/recharts by @ryan-crabbe-berri in #32725
- docs(anthropic): clarify the Opus 4.5 branch in adaptive-effort translation by @akapur99 in #32876
- fix(proxy): enforce budget and cost tracking for Dashscope tiered pricing by @shivamrawat1 in #32942
- refactor(ui): extract a shared CopyButton and fix the sidebar copy confirmation by @yuneng-berri in #32945
- refactor(ui): convert entity usage and usage page charts to shadcn/recharts by @ryan-crabbe-berri in #32729
- feat(guardrails): add pre_mcp_call support to Content Filter by @yucheng-berri in #32936
- refactor(e2e): bucket rate limits, budgets, and spend tracking under quota_management by @mateo-berri in #32928
- chore: bump litellm-proxy-extras 0.4.75 -> 0.4.76 by @yuneng-berri in #32957
- feat(proxy): add expires filter to GET /key/list by @ryan-crabbe-berri in #32953
- refactor(ui): colocate the usage view, keeping the shared usage components by @ryan-crabbe-berri in #32952
- chore(ui): rebuild committed admin dashboard bundle for rc release by @yuneng-berri in #32960
- refactor(ui): convert projects page chart to shadcn/recharts by @ryan-crabbe-berri in #32722
- feat(ui): working Test Connection for the complexity auto router by @akapur99 in #32950
- fix(xecguard): use StandardLoggingGuardrailInformation in logging hook by @yucheng-berri in #32911
- feat(ui): adopt openapi-react-query ($api) and convert useCustomers by @ryan-crabbe-berri in #32949
- refactor(ui): colocate the mcp-servers view, keeping the shared mcp_tools surface by @ryan-crabbe-berri in #32968
- refactor(ui): convert endpoint usage charts to shadcn/recharts by @ryan-crabbe-berri in #32723
- fix(proxy-auth): stop unrecognized model namespaces slipping through provider wildcard keys by @mateo-berri in #32979
- feat(router): random-pick multi-model complexity tiers by @krrish-berri-2 in #32967
- fix(xecguard): sanitize scan result before recording it for logging by @yucheng-berri in #32935
- fix(auto_router): filter embedding models in complexity tab dropdowns, require all tiers, inline validation by @akapur99 in #32978
- fix(anthropic): translate raw adaptive thinking for pre-4.6 models on chat completions and Bedrock Converse by @akapur99 in #32944
- feat(router): add Router(plugins=[...]) routing-plugin pipeline by @krrish-berri-2 in #32972
- feat(router): soft-floor adaptive mode for complexity router by @krrish-berri-2 in #32947
- docs(github): add QA runbook section to the PR template by @mateo-berri in #32965
- fix(model_cost): add supports_reasoning: false to Gemini image generation models by @mateo-berri in #32836
- build(dev-env): add make bootstrap and unprovisioned-checkout preflight to pre-commit by @mateo-berri in #32981
- ci(ui): report only error-level knip findings in CI by @ryan-crabbe-berri in #32971
- feat(batches): track cost for unmanaged Bedrock batches, generalize the flag by @Sameerlite in #32315
- fix(guardrails): walk custom_tool_call_output items in _content_utils by @yucheng-berri in #32969
- fix: show and allow editing team model aliases after team creation by @ryan-crabbe-berri in #33047
- chore(deps): bump pillow to 12.3.0 to resolve osv-scan CVEs by @yucheng-berri in #33093
- feat(mcp): mint gateway-bound envelope at the token endpoint for dcr_bridge oauth_delegate by @tin-berri in #32828
- fix(mcp): surface rejected delegate-auth upstream tokens as connect-time 401 by @tin-berri in #32741
- fix(proxy): track unauthenticated pass-through requests in spend logs by @devin-ai-integration[bot] in #32410
- feat(lasso): send source.type for Used By attribution by @yucheng-berri in #33090
- fix(responses): continue MCP gateway tool turns from the final response and surface failures by @thibault-linktree in #33025
- fix(responses): continue MCP gateway tool turns from the final response and surface failures by @tin-berri in #33099
- fix(completion): forward aws credential kwargs into litellm_params so the responses bridge keeps WIF auth by @mateo-berri in #32956
- fix(ui): respect litellm_key_header_name in BYOK credential save and workflow runs fetches by @ryan-crabbe-berri in #33103
- refactor(ui): standardize debounce waits behind shared DEBOUNCE_WAIT_MS constant by @ryan-crabbe-berri in #33040
- feat(ui): rebuild the Virtual Keys table on the shared DataTable by @yuneng-berri in #32991
- fix: redact async complete streaming response for custom callbacks by @yucheng-berri in #33106
- build(ui): bump @tanstack/react-pacer from 0.2.0 to 0.22.1 by @ryan-crabbe-berri in #33041
- fix(ui): address Virtual Keys redesign review nits by @yuneng-berri in #33112
- fix(openai/responses): clamp max_output_tokens below API minimum by @devin-ai-integration[bot] in #33098
- fix(prometheus): read v3 rate limiter remaining values for per-key model gauges by @yucheng-berri in #33119
- fix(ui): drop w-full from page-content wrappers to remove 32px horizontal overflow by @yuneng-berri in #33118
- refactor(ui): migrate straightforward value debounces to react-pacer by @ryan-crabbe-berri in #33042
- feat(mcp): interactive SSO sign-in for dcr_bridge oauth_delegate DCR clients by @tin-berri in #32946
- test(proxy): add regression tests for management_endpoints edge cases by @yuneng-berri in #32976
- fix(auto-router): correct Responses API tool_choice shape and propagate alias litellm_params by @krrish-berri-2 in #32974
- fix(ui): render the sidebar scrollbar with shadcn ScrollArea by @yuneng-berri in #33124
- refactor(ui): migrate callback debounce sites to react-pacer with regression tests by @ryan-crabbe-berri in #33043
- chore: add CODEOWNERS for ui and proxy UI build artifacts by @yuneng-berri in #33131
- feat(mcp): client-held refresh envelope for the dcr_bridge oauth_delegate flow by @tin-berri in #32980
- feat(ui): rebuild the Teams table on the shared DataTable by @yuneng-berri in #33128
- fix(mcp): relay upstream OAuth token and DCR rejections instead of a generic 500 by @tin-berri in #33113
- fix(keys): persist key_type so the UI shows correct key scope instead of "All Proxy Models" by @devin-ai-integration[bot] in #33115
- feat(router): opt-in session affinity for complexity router by @krrish-berri-2 in #33126
- feat(prometheus): expose video duration and image count consumption metrics by @yucheng-berri in #33138
- test(e2e): otel trace completeness on /chat/completions by @yucheng-berri in #33132
- fix(sso): paginate through all pages when fetching service principal group assignments by @ryan-crabbe-berri in #33149
- test(e2e): otel trace completeness on /v1/messages by @yucheng-berri in #33133
- feat(ui): add adaptive routing settings to Auto-Router v2 by @krrish-berri-2 in #33146
- refactor(mcp): extract the dcr_bridge token flow into bridge_token_flow.py by @tin-berri in #33141
- chore: bump litellm 1.93.0 -> 1.94.0, litellm-enterprise 0.1.49 -> 0.1.50, litellm-proxy-extras 0.4.76 -> 0.4.77 by @yuneng-berri in #33229
- fix(proxy): route master key to team-scoped models by @kunal2002 in #32926
- chore(deps): pin httplib2 and setuptools transitive floors by @yuneng-berri in #33233
- feat(ui): left-anchor the Create Key and Create Team CTAs by @yuneng-berri in #33248
- fix(anthropic/passthrough): drop incompatible temperature when downgrading adaptive thinking for pre-4.6 models by @devin-ai-integration[bot] in #33244
- fix(guardrails): run apply_guardrail-style model-level pre_call guardrails at deployment hook by @yucheng-berri in #33136
- fix(proxy)!: enforce user budget on team keys (read-time + reservation) with UI opt-out by @devin-ai-integration[bot] in #32005
- fix(e2e): bound spend-log snapshots to a /spend/logs/v2 window by @mubashir1osmani in #33265
- test(e2e): cover key rpm/tpm rate limiting, window reset, and pacing headers by @mateo-berri in #32914
- fix(anthropic): use native output capability by @krrish-berri-2 in #33235
- fix(ci): retry setup-uv installs to survive transient manifest fetch failures by @mateo-berri in #33279
- fix(proxy): never log raw virtual keys in key insertion debug output by @yucheng-berri in #33268
- fix(bedrock_mantle): route xai.grok-4.3 via /openai/v1 frontier path by @marty-sullivan in #33027
- feat(pricing): add gemini-omni-flash-preview with video output token pricing by @mateo-berri in #33274
- fix(auth): scope the JWT enterprise gate to actual JWTs by @mubashir1osmani in #33296
- fix(s3): sanitize slashes in response-id-derived object key file name by @yucheng-berri in #33271
- refactor(ui): migrate guardrails table onto shared DataTable by @yuneng-berri in #33303
- feat(guardrails): streaming text transformation in generic_guardrail_api by @yucheng-berri in #33110
- test(e2e): cover model-aware mid-conversation system handling on Bedrock Invoke /v1/messages by @mateo-berri in #32963
- test(claude_code): move the Claude Code compatibility matrix under tests/e2e by @devin-ai-integration[bot] in #32548
- chore(ci): sync litellm_internal_staging into daily OSS branch by @yuneng-berri in #33337
- feat(bedrock guardrails): add resource-less InvokeGuardrailChecks (detect-only) mode by @yucheng-berri in #33299
- Revert "chore(ci): sync litellm_internal_staging into daily OSS branch" by @yuneng-berri in #33339
- fix(websearch): intercept web search on the Responses API by @devin-ai-integration[bot] in #33129
- fix(anthropic-adapter): drop empty content_block_delta events by @mateo-berri in #33315
- fix(mcp): persist discovered OAuth endpoints and keep last known good on failed re-discovery by @tin-berri in #33286
- test(e2e): otel trace completeness on streaming chat, messages, and responses (LIT-3787) by @yucheng-berri in #33234
- feat(router): resolve auto-router routing plugins from proxy YAML config by @krrish-berri-2 in #33251
- test(e2e): failed request error span carries the full untruncated message and status (LIT-4179) by @yucheng-berri in #33304
- refactor(ui): migrate tags table onto shared DataTable by @yuneng-berri in #33314
- fix(cli): surface actionable CLI SSO errors when CLI and proxy versions skew by @ryan-crabbe-berri in #33309
- feat(bedrock_mantle): add GPT-5.6 sol/terra/luna to model cost map by @mateo-berri in #33412
- chore(codeowners): exempt generated schema.d.ts from UI ownership by @yuneng-berri in #33411
- feat(proxy): push-based OTLP billable-request metering for enterprise deployments by @yassin-berriai in #31592
- fix(mcp): cap per-user OAuth token cache TTL at the token's own lifetime by @tin-berri in #33346
- feat(ui): move Caching out of Experimental into Developer Tools by @devin-ai-integration[bot] in #33432
- chore(ci): merge daily internal staging branch by @yuneng-berri in #33335
- feat(guardrails): add Compresr guardrail for query-aware context compression by @yucheng-berri in #33295
- fix(logging): preserve callback order in get_combined_callback_list by @devin-ai-integration[bot] in #33005
- fix(logging): redact assistant tool call arguments in spend logs by @devin-ai-integration[bot] in #33111
- fix(anthropic): honor messages request timeout by @yucheng-berri in #33418
- fix(llm_guard): apply sanitized prompt returned by moderation API to request by @devin-ai-integration[bot] in #33331
- fix(logging): stop pinning large request payloads past request end by @yassin-berriai in #33455
- feat(guardrails): forward optional metadata on POST /guardrails/apply_guardrail by @devin-ai-integration[bot] in #33067
- build: raise requires-python cap to <3.15 so Python 3.14 installs current releases by @ryan-crabbe-berri in #33438
- feat(ui): add reusable BetaBadge and use it for Projects sidebar item by @devin-ai-integration[bot] in #33449
- fix(mcp): discover missing OAuth scopes and token_url when authorization_url is set manually by @tin-berri in #33317
- feat(ui): show exact license expiration date in usage cards by @yuneng-berri in #33478
- test(claude_code): rename misleading REPO_ROOT to SUITE_ROOT in test_v0_layout by @mateo-berri in #33472
- build(deps): update ddtrace to the 4.x line by @yuneng-berri in #33484
- fix(complexity_router): return empty dict from _classifier_call_metadata when metadata is absent by @devin-ai-integration[bot] in #33452
- fix(ui/chat): resolve chat routes at render time so navigation works under server_root_path by @yuneng-berri in #33446
- fix(key management): enforce minimum custom key length and mask short keys in key_name by @yucheng-berri in #33462
- chore(ui): remove unmounted UsageIndicator and the Hide Usage Indicator flag by @yuneng-berri in #33482
- test(e2e/claude_code): add passthrough matrix row for the big-3 clouds and Anthropic API by @mateo-berri in #33473
- fix(ui): stop sending the complexity-router pseudo-model to /health/test_connection by @krrish-berri-2 in #33498
- feat(cli): add lite up/down to ambiently route Claude Code through the proxy by @krrish-berri-2 in #33231
- feat(complexity_router): enable session_affinity by default by @devin-ai-integration[bot] in #33500
- fix(anthropic): stop 500 on combined thinking+signature streaming chunk by @devin-ai-integration[bot] in #33505
- feat(autoroute): prompt for semantic keywords per tier in configure wizard by @devin-ai-integration[bot] in #33508
- fix(cli/anthropic): unblock lite autoroute proxy deps, adaptive thinking, and thinking+signature streaming by @devin-ai-integration[bot] in #33507
- test(ocr): use mistral-document-ai-2512 in azure_ai OCR tests by @mateo-berri in #33489
- fix(guardrails): show YAML-defined guardrails in the Guardrail Monitor by @yuneng-berri in #32853
- refactor(ui): migrate policies, deleted keys, deleted teams, budgets, and search tools tables onto shared DataTable by @yuneng-berri in #33357
- refactor(ui): migrate vector stores, prompts, and skills tables onto shared DataTable by @yuneng-berri in #33343
- test(e2e): datadog log delivery for successful chat, messages, and responses (LIT-4447) by @yucheng-berri in #33415
- fix(cli): make CLI output ASCII-only so it doesn't crash legacy Windows consoles by @devin-ai-integration[bot] in #33465
- fix: remove dead user-cache lookup with None key in spend-update path by @yassin-berriai in #33555
- feat(helm): add per-component PodDisruptionBudget and topologySpreadConstraints to componentized chart by @yassin-berriai in #33430
- fix(e2e/claude_code): unblock stage collection, align proxy env names, register compat models by @mubashir1osmani in #33433
- fix(mcp): index authed request-time tools missing from the semantic filter startup index by @tin-berri in #33318
- fix(streaming): use provider-reported usage cost for OpenRouter streams by @mateo-berri in #32255
- feat(mcp): issuer-anchored OAuth discovery (RFC 8414 §3.3) to close the authorization-server mix-up by @tin-berri in #33450
- feat(logging): add user and team level spend and budget to StandardLoggingPayload metadata by @yucheng-berri in #33459
- fix(router): cast model_info cost values to float in _set_model_group_info by @yassin-berriai in #33556
- chore(e2e): establish litellm_e2e_staging integration line by @mubashir1osmani in #33502
- fix(ui): navigate to /ui/login/ with trailing slash via hard navigation by @ryan-crabbe-berri in #33561
- feat(logging): add structured budget fields to budget rejection failure logs by @yucheng-berri in #33460
- fix(streaming): surface upstream connection resets instead of empty 200 streams by @mateo-berri in #33222
- fix(proxy_cli): reap orphaned prisma query-engine processes when a worker dies by @yassin-berriai in #33424
- test(reasoning_effort_grid): enable azure fable-5 and opus-4-8 grid cells by @mateo-berri in #33485
- build(deps): bump uvicorn lock to 0.51.0 so worker health-check and jitter flags take effect by @yassin-berriai in #33574
- fix(proxy): coerce default_internal_user_params.max_budget to float on config load by @yassin-berriai in #32434
- fix(router): honor per-request routing_strategy from key/team router_settings by @yassin-berriai in #33429
- fix(redis): honor ssl value instead of key presence when building async connection pool by @yassin-berriai in #32590
- fix(langfuse_otel): build per-request OTLP exporter from key and team dynamic Langfuse credentials by @yassin-berriai in #32437
- ci: run zizmor and proxy-db unit tests on PRs targeting litellm_ branches by @mateo-berri in #33568
- fix(router): apply team/key enable_tag_filtering to tag routing by @yassin-berriai in #33436
- feat(proxy): add disable_auto_add_proxy_admin_to_teams flag by @ryan-crabbe-berri in #33563
- fix(proxy): stop stale auth cache re-publish to Redis so key updates propagate across replicas by @yassin-berriai in #33565
- feat(e2e): emit structured E2E_RESULT lines for package status history by @mubashir1osmani in #33578
- chore: bump litellm-enterprise 0.1.50 -> 0.1.51, litellm-proxy-extras 0.4.77 -> 0.4.78 by @yuneng-berri in #33571
- fix(docker): restore litellm-proxy-extras source dir in runtime images by @yuneng-berri in #33592
- feat(ui): require embedding model for semantic auto router by @devin-ai-integration[bot] in #33313
- feat(scim): ingest and round-trip SCIM entitlements and roles user attributes by @tin-berri in #33587
- refactor(ui): migrate 5 simple tables onto shared DataTable by @yuneng-berri in #33548
- fix(model_armor): restore reference attachments via skip_unscannable_attachments and remove the attachment count cap by @devin-ai-integration[bot] in #33554
- fix(mcp): keep the MCP reference intact when the semantic filter narrows tools by @tin-berri in #33584
- fix(sso): stop enforcing UI session budget on CLI login tokens by @mubashir1osmani in #33312
- test: e2e staging leftovers by @mubashir1osmani in #33613
- test(e2e/claude_code): add GPT-5.6 Sol/Terra/Luna columns for OpenAI, Azure OpenAI, and Bedrock Mantle by @mateo-berri in #33474
- test(e2e): otel streaming spans record a real ttft below span duration by @yucheng-berri in #33588
- fix(mcp): make the preemptive-401 OAuth challenge decision mode-aware by @tin-berri in #33586
- fix(ui): show all teams in policy attachment form for admins by @ryan-crabbe-berri in #33628
- refactor(ui): migrate AI Hub, public hub, and MCP Toolsets tables onto shared DataTable by @yuneng-berri in #33629
- test(e2e): datadog log delivery for streamed routes, read back from the real datadog api by @yucheng-berri in #33566
- fix(vertex_ai): surface Gemini grounding toolUsePromptTokenCount in Usage by @devin-ai-integration[bot] in #33533
- test(e2e): harness fixes for stage job green (skips + router/UI/budget) by @mubashir1osmani in #33634
- fix(router): resolve prompt cache minimum per model instead of a flat 1024 by @tin-berri in #33637
- fix(logging): classify async anthropic_messages and generate_content as async by @devin-ai-integration[bot] in #33589
- fix(ui): remove Chat item from dashboard leftnav by @devin-ai-integration[bot] in #33647
- fix(router): tag-aware pre-routing strategy selection for shared model_name by @devin-ai-integration[bot] in #33691
- fix(proxy): enforce max_parallel_requests as a per-slot concurrency gauge by @yassin-berriai in #32441
- fix(proxy): stop treating upstream model body field as a LiteLLM model on auth-enforced pass-through routes by @yassin-berriai in #33710
- fix(mcp): expand toolset grants in shared permission primitives so tools/call honors them by @tin-berri in #33612
- feat(complexity-router): user-triggered escalation keywords by @devin-ai-integration[bot] in #33656
- fix(fireworks_ai): bill prompt-cache hits at cache_read rate by @devin-ai-integration[bot] in #33714
- fix(pricing): mark realtime-only gpt-realtime models as mode realtime by @devin-ai-integration[bot] in #33728
- fix(rag): track LLM completion usage and spend for /v1/rag/query by @yassin-berriai in #32438
- feat(anthropic): add enable_anthropic_prompt_caching for automatic cache_control injection by @tin-berri in #33573
- fix(anthropic): self-heal on missing thinking-signature errors from Bedrock/Vertex by @devin-ai-integration[bot] in #33719
- fix(proxy): resolve router_settings.plugins dotted paths and load plugins from installed packages by @devin-ai-integration[bot] in #33644
- test(e2e): budget refusals are 429 for bare keys and team caps block every team key by @ryan-crabbe-berri in #33632
- feat(router): add router plugin reference catalog by @yuneng-berri in #33746
- test(e2e): assert an org budget block is a 429 naming the organization by @ryan-crabbe-berri in #33638
- fix(proxy): bill partial streamed spend when the client disconnects mid-stream by @yassin-berriai in #33736
- test(e2e): delete unreferenced Grafana panel docs by @yassin-berriai in #33743
- docs(tests/e2e): align skip-vs-fail docs with the hard-fail contract and scope the no-unit-tests rule by @yassin-berriai in #33755
- refactor(e2e): replace bespoke result reporter with standard JUnit report by @yassin-berriai in #33758
- test(e2e): user budget across keys and team member budget isolation by @yassin-berriai in #33745
- refactor(e2e): remove bob_the_builder; drive remediation from a Grafana alert (provisioned outside the repo) by @yassin-berriai in #33749
- feat(mcp): per-server outcomes for aggregate tools/list and truthful single-server REST statuses by @tin-berri in #33153
- test(e2e): mcp suite for key-without-access denial by @yassin-berriai in #33752
- chore(ci): merge oss branch by @yuneng-berri in #33784
- chore(ci): merge oss branch - July 17th by @yuneng-berri in #33793
- fix(ui): migrate tag deletion to shared DeleteResourceModal by @yuneng-berri in #33795
- build(rust): raise pyo3 to 0.29 so the native bridge compiles on Python 3.14 by @yuneng-berri in #33798
- chore(guardrails): remove docstring from singulr module for consistency by @yuneng-berri in #33800
- fix(ui): stop credential edit from persisting the masked api key by @ryan-crabbe-berri in #33797
- build(deps): allow redisvl, pypdf, and openapi-core on Python 3.14 by @yuneng-berri in #33801
- test(proxy): make streaming-cancel mocks awaitable for the disconnect slot release by @yuneng-berri in #33802
- test(e2e): a member's team budget cuts off only that member's key by @ryan-crabbe-berri in #33718
- test(e2e): a user's max_budget follows the person across personal and team keys by @ryan-crabbe-berri in #33762
- test(e2e): skip flaky OpenAI GPT cells; raise multi-window max_tokens by @mubashir1osmani in #33799
- chore: remove accidentally committed dist tarball and ignore dist/ by @yuneng-berri in #33805
- fix(passthrough): stop classifying plain 'predict'/'search' paths as Vertex by @devin-ai-integration[bot] in #33658
- build(deps): bump mcp lock to 1.28.1 to clear image-scan findings by @yuneng-berri in #33803
- test(pricing): pin the realtime mode assertion to the bundled cost map by @yuneng-berri in #33806
- fix(proxy): derive session id from Anthropic metadata.user_id for session affinity by @devin-ai-integration[bot] in #33723
- test(e2e): budget reset diagonal for team, org, user, and #32005 team-member keys by @ryan-crabbe-berri in #33771
- fix(proxy): source /v1/models token limits from the cost map instead of Router.get_model_group_info by @devin-ai-integration[bot] in #33721
- fix(fireworks_ai): correct glm-5p2 prompt-cache read price to $0.14/1M by @tin-berri in #33796
- feat(proxy): add x-litellm-model-name response header with deployment model string by @devin-ai-integration[bot] in #33698
- feat: add Straiker guardrail integration by @yucheng-berri in #33781
- fix(vertex_ai): exclude Gemini Google Search grounding tokens from input token billing by @devin-ai-integration[bot] in #33742
- feat(fireworks_ai): map litellm session id to x-session-affinity header for prompt caching by @devin-ai-integration[bot] in #33717
- feat(ui): configure Anthropic automatic prompt caching from the Admin UI by @tin-berri in #33581
- fix(router): enforce context-window pre-call checks for Responses API input by @devin-ai-integration[bot] in #33706
- fix(otel): restore proxy-level error.* attributes on v2 failure spans (LIT-4179) by @devin-ai-integration[bot] in #33664
- fix(mcp): persist config.yaml DCR clients in a server-scoped store so refresh survives token expiry by @tin-berri in #33768
- refactor(ui): consolidate Add/Edit credential modals into one CredentialModal by @ryan-crabbe-berri in #32572
- feat(mcp): add ID-JAG (identity assertion authorization grant) support for MCP egress by @yassin-berriai in #31516
- refactor(ui): migrate policy attachments table onto shared DataTable by @yuneng-berri in #33827
- docs(litellm-rust): add provider coding standards by @devin-ai-integration[bot] in #33833
- test(e2e): rename Gateway to ProxyClient and expose it as a session-scoped pytest fixture by @yassin-berriai in #33750
- feat(messages): route Azure Anthropic /messages through Rust behind rust:true by @devin-ai-integration[bot] in #33616
- test(e2e): add Locust throughput load test that runs last by @yassin-berriai in #33748
- fix(proxy): resolve team wildcard credentials for vector store files by @shivamrawat1 in #33649
- refactor(e2e): fold claude_code HTTP probes onto shared ProxyClient methods by @yassin-berriai in #33760
- test(e2e): harden stage flakes for batches, UI, and MCP by @mubashir1osmani in #33831
- fix(e2e): migrate load suite from e2e_gateway to ProxyClient by @mubashir1osmani in #33839
- chore(e2e): remove tests/e2e/docker-compose.yml by @devin-ai-integration[bot] in #33837
- test(e2e): cover /v1/responses openai basic nonstream and stream by @devin-ai-integration[bot] in #33830
- test(e2e): cover /v1/responses openai cost_logged and tool_use by @devin-ai-integration[bot] in #33835
- test(e2e): cover /v1/responses OpenAI vision and Anthropic basic by @devin-ai-integration[bot] in #33838
- test(e2e): spendlog cost for streaming /v1/messages via responses bridge by @yassin-berriai in #33753
- fix(docker): bake prisma CLI and engines at a fixed path so fresh-DB migrations work for any uid offline by @yuneng-berri in #33853
- feat(chat-ui): add personal Logs view scoped to the current user by @devin-ai-integration[bot] in #33829
- chore: bump litellm-proxy-extras 0.4.78 -> 0.4.79 by @yuneng-berri in #33855
- docs(litellm-rust): require the official Rust Style Guide in agent rules by @devin-ai-integration[bot] in #33867
- fix(router): treat malformed configured token limits as absent on /v1/models by @yuneng-berri in #33864
- chore: rebuild admin UI bundle for the rc release by @yuneng-berri in #33857
- docs(rust): add provider abstraction standards by @devin-ai-integration[bot] in #33865
- feat(spend): track prompt compression saved tokens in daily spend aggregates by @tin-berri in #33810
- test(e2e): assert the long budget window keeps blocking after the short window resets by @ryan-crabbe-berri in #33832
- feat(messages): route native Anthropic /messages through Rust behind LITELLM_RUST env var by @devin-ai-integration[bot] in #33848
- test(e2e): cover credential-backed /v1/messages request by @devin-ai-integration[bot] in #33863
- feat(rust): expose Anthropic Messages route (POST /v1/messages) on the axum gateway by @devin-ai-integration[bot] in #33880
- feat(rust): 1:1 port of OpenAI Responses API WebSockets to litellm-rust by @devin-ai-integration[bot] in #33849
- fix(proxy): treat malformed cost-map token limits as absent on /v1/models by @yuneng-berri in #33903
- feat(rust): port BaseAWSLLM auth (credential resolution + SigV4) to litellm-core as a base provider by @devin-ai-integration[bot] in #33888
- feat(complexity-router): add return_raw_model_name toggle for response model field by @devin-ai-integration[bot] in #33875
- feat(mcp): always-on aggregate gateway DCR discovery front door by @tin-berri in #33174
- fix(langfuse): send v4 ingestion header for otel callback by @yucheng-berri in #33907
- feat(ui): add configuration tabs to the Cost Optimization page by @devin-ai-integration[bot] in #33899
- test(e2e): guard destructive spend-log truncate behind an explicit opt-in by @yassin-berriai in #33751
- chore(rust): migrate the litellm-rust workspace (core, ai-gateway, python-bridge) from Rust edition 2021 to edition 2024 by @vineetpuranik in #33940
- fix(fireworks_ai): restore Content-Type application/json header (fixes 415) by @devin-ai-integration[bot] in #33929
- feat(spend): raise /spend/logs/v2 page_size cap to 1000 by @yuneng-berri in #33994
- feat(mcp): identity-only session tokens for the gateway DCR front door by @tin-berri in #33182
- test(e2e): cover key regeneration rotating to a working new key by @yassin-berriai in #34000
- test(e2e): cover tag creation persisting for spend categorization by @yassin-berriai in #34018
- test(e2e): cover organization deletion removing it from /organization/info by @yassin-berriai in #34009
- perf(bedrock): audio transcription via rust core (py->rust bridge) by @devin-ai-integration[bot] in #33990
- chore(ci): retire daily OSS branches in favor of litellm_internal_staging by @yuneng-berri in #34030
- test(e2e): cover model update persisting to /model/info by @yassin-berriai in #34017
- test(e2e): cover key block persisting to /key/info by @yassin-berriai in #34014
- test(e2e): cover created team appearing in /team/list by @yassin-berriai in #34015
- test(e2e): cover created user appearing in /user/list by @yassin-berriai in #34016
- test(e2e): cover team update persistence via /team/info by @yassin-berriai in #33997
- feat(bedrock): forward bedrock_tags to CreateModelInvocationJob for batch jobs by @mateo-berri in #33733
- test(e2e): cover model registration persistence in /model/info by @yassin-berriai in #33996
- test(e2e): cover user update persistence via /user/info by @yassin-berriai in #33998
- test(proxy): make model_info endpoint tests hermetic to kill an order/merge-skew flake by @mateo-berri in #34037
- chore(e2e): prune the non-deterministic perf.latency SLO coverage cell by @yassin-berriai in #34024
- fix(ui): hide guardrail group headers when only one group has entries by @yuneng-berri in #33885
- test(e2e): cover model deletion removing it from the catalog by @yassin-berriai in #34006
- test(e2e): cover organization update persistence via /organization/info by @yassin-berriai in #34010
- test(e2e): cover team deletion persistence and key revocation by @yassin-berriai in #33999
- test(e2e): cover user deletion removing it from user inventory by @yassin-berriai in #34007
- test(e2e): cover created key appearing in /key/list inventory by @yassin-berriai in #34008
- fix(cache): make in-memory and disk cache increments atomic by @yucheng-berri in #34013
- test(e2e): add reliability suite covering fallback, timeout, and cache behavior by @yassin-berriai in #34023
- test(true_rabbit): cover passthrough headers, batch assume-role, gemini, vllm, bedrock guardrails, batch rate-limit mapping by @mubashir1osmani in #33843
- fix(anthropic): only inject cache_control when the request carries none by @tin-berri in #33886
- feat(mcp): support MCP servers on the Anthropic /v1/messages API by @tin-berri in #33631
- feat(mcp): migrate client_credentials (M2M) onto the v2 resolver arm by @tin-berri in #32259
- fix(router): stop custom model_info leaking onto shared backend cost map key by @mateo-berri in #34041
- perf(streaming): build per-chunk Delta directly instead of setattr/delattr churn by @yassin-berriai in #33992
- refactor(mcp): consolidate exception-tree walkers into one shared faults traversal by @tin-berri in #33183
- fix(budget): reset users/teams whose budget_reset_at is NULL by @jyeung-r7 in #33623
- perf(core): fast-path SafeAttributeModel.delattr for declared fields by @yassin-berriai in #33993
- fix(auth): set budget_reset_at when JWT upsert seeds a budget_duration by @ryan-crabbe-berri in #34050
- fix(proxy/auth): handle tz-aware temp_budget_expiry by @devin-ai-integration[bot] in #33840
- fix(vertex,azure): model-aware mid-conversation system for Claude /v1/messages by @mateo-berri in #33807
- fix(auth): apply temp_budget_increase for cache-hit keys by @devin-ai-integration[bot] in #33841
- fix(agents): allow optional securityScheme fields so /public/agent_hub does not 500 by @devin-ai-integration[bot] in #33897
- build(deps-dev): bump js-yaml to 4.3.0 and brace-expansion to 5.0.7 by @yuneng-berri in #34056
- refactor(ui): migrate credentials table onto shared DataTable by @yuneng-berri in #34053
- fix(cli): stable port and persisted master key for lite autoroute up by @tin-berri in #34026
- fix(mcp): return the DCR client's own redirect_uris to stop the /callback self-redirect loop by @tin-berri in #33756
- feat: add deepkeep as custom guardrail by @yucheng-berri in #33844
- fix(router): propagate capability flags to shared backend cost map key by @mateo-berri in #34047
- fix(mcp): add Google Sheets, Drive, Calendar, and Docs to the OpenAPI registry by @tin-berri in #34059
- fix(bedrock_mantle): hoist Codex additional_tools input items to top-level tools by @lyb0307 in #33228
- fix(bedrock_mantle): gate unsupported service_tier on drop_params for the Responses API by @mateo-berri in #34058
- feat(proxy): auto-enable drop_params for Codex user agents by @mateo-berri in #34068
- refactor(ui): migrate available teams table onto shared DataTable by @yuneng-berri in #34070
- fix(ui): serve /ui/assets from the nginx image instead of SPA fallback by @ryan-crabbe-berri in #34066
- feat(gemini): day-0 pricing for gemini-3.6-flash and gemini-3.5-flash-lite by @mateo-berri in #34106
- refactor(ui): migrate audit logs table onto shared DataTable by @yuneng-berri in #34080
- refactor(ui): migrate organizations table onto shared DataTable by @yuneng-berri in #34081
- refactor(ui): migrate memory table onto shared DataTable by @yuneng-berri in #34079
- refactor(ui): migrate access groups table to shared DataTable by @yuneng-berri in #34078
- fix(model_armor): sanitize error details by default by @yucheng-berri in #33908
- refactor(ui): migrate agents table onto the shared DataTable by @yuneng-berri in #34089
- fix(ui): add tooltip to the Active key status badge by @ryan-crabbe-berri in #34109
- fix(interactions): add queued to the Interaction status enum by @yuneng-berri in #34135
- ci(image-scan): match Python packages against CPE data by @yuneng-berri in #34136
- chore(deps): bump pypdf to 6.14.2 and pyasn1 to 0.6.4 by @yuneng-berri in #34148
- feat(budgets): add configurable budget_reset_time of day by @ryan-crabbe-berri in #31007
- feat(ui): surface key budget_reset_at in key info and keys table by @ryan-crabbe-berri in #34113
- fix(a2a): accept semver protocolVersion values like 0.3.0 in agent cards by @mateo-berri in #34154
- feat(ui): add block/unblock key action to key info page by @ryan-crabbe-berri in #34116
- fix(mcp): attach resolved OAuth credentials to OpenAPI spec_path tool calls by @tin-berri in #34063
- fix(e2e): use EndpointsClient.proxy after Gateway to ProxyClient rename by @yassin-berriai in #34127
- refactor(auth): derive temp budget increase without mutating the token by @ryan-crabbe-berri in #34121
- test(e2e): add Other suite and Guardrails coverage incl. an MCP tool-call guardrail by @mubashir1osmani in #34149
- fix(mcp): let an admin-pinned issuer drive OAuth discovery for url-less servers by @tin-berri in #34065
- fix(router): stop per-deployment num_retries from double-counting as provider max_retries by @yassin-berriai in #34129
- fix(e2e): pin harness Python and surface proxy boot crash output by @ryan-crabbe-berri in #34157
- fix(proxy): stop save_config from snapshotting environment_variables into the DB by @yassin-berriai in #34119
- fix(ui): stop cloning body-carrying requests into stream uploads in fetchClient middleware by @ryan-crabbe-berri in #34122
- fix(ui): distinguish response cache from provider prompt caching by @ryan-crabbe-berri in #34138
- fix(ui): bundle provider logos as static imports and unify fallback in Logo component by @ryan-crabbe-berri in #34125
- refactor(ui): migrate inline provider logo lookups to the shared Logo component by @ryan-crabbe-berri in #34141
- test(e2e): cover team management routes for Management/UI coverage by @yassin-berriai in #34115
- test(e2e): cover key management routes for Management/UI coverage by @yassin-berriai in #34114
- test(e2e): cover budget, customer, user and org routes for Management/UI coverage by @yassin-berriai in #34117
- fix(router): honor request-level num_retries over global litellm_settings.num_retries by @yassin-berriai in #34124
- test(e2e): cover model, tag and access group routes for Management/UI coverage by @yassin-berriai in #34118
- feat(proxy): make DB config-reload interval configurable via config.yaml and UI by @yassin-berriai in #34130
- feat(ui): add controlled row selection to the shared DataTable by @yuneng-berri in #34167
- feat(mcp): store the enterprise IdP identity assertion at SSO login for EMA egress by @tin-berri in #34072
- chore(deps): bump gitpython to 3.1.52 in uv.lock by @yuneng-berri in #34168
- feat(ui): add react-hook-form + zod form infrastructure by @yuneng-berri in #34170
- chore(tests): replace a customer name and domain with neutral placeholders by @mateo-berri in #34172
- refactor(ui): migrate MCP, callback, guardrail, SSO, and search tool logos to the shared Logo component by @ryan-crabbe-berri in #34169
- fix(ui): stop dashboard key-edit form 403ing on non-budget saves by @ryan-crabbe-berri in #34112
- fix(ui): harden provider logo map typing and bundled asset guard by @ryan-crabbe-berri in #34163
- fix(proxy): populate user_email on UserAPIKeyAuth for JWT auth by @ryan-crabbe-berri in #34174
- test(e2e): cover config and misc management routes for Management/UI coverage by @yassin-berriai in #34120
- test(e2e): add Azure AI Foundry and Anthropic /v1/messages coverage for the Rust bridge by @yassin-berriai in #34021
- test(ui): run vitest unit tests in GitHub Actions and fix stale key-info tests by @yuneng-berri in #34175
- refactor(ui): migrate users and model health checks tables onto the shared DataTable by @yuneng-berri in #34182
- fix(ui): restore guardrail_info_helpers exports in GuardrailsPanel test mock by @yuneng-berri in #34197
- chore(ui): bump sharp to 0.35.x via npm override by @yuneng-berri in #34193
- refactor(ui): migrate Tool Policies table onto the shared DataTable by @yuneng-berri in #34176
- chore: bump litellm-proxy-extras 0.4.79 -> 0.4.80, litellm 1.94.0 -> 1.95.0 by @yuneng-berri in #34199
- feat(rust): honor pre-computed Entra ID auth for Azure /messages by @yassin-berriai in #34107
- fix(rust): route agentic-hook /messages requests to Python for all stream modes by @yassin-berriai in #34126
- fix(e2e): drop httpbin.org from passthrough headers test, use real Anthropic by @mubashir1osmani in #34159
- test(e2e): cover 12 non-core LLM coverage registry cells by @ryan-crabbe-berri in #34123
- test(logging): pin compression_savings in the gcs pubsub spend log fixture by @yuneng-berri in #34204
- docs: add TLDR section to PR template by @mateo-berri in #34203
- (Security) - Prevent potential provider key exposure through URL-valued model destinations and fallbacks by @yucheng-berri in #34189
- docs(issue-template): ask for a numbered list of reproduction steps by @ryan-crabbe-berri in #34207
- test(ui): fix key and credential e2e specs after the overflow menu migrations by @yuneng-berri in #34206
- test(e2e): add live A2A agent e2e suite by @devin-ai-integration[bot] in #34052
- fix(ui): reflect REDIS_* env cache config and stop the UI overwriting the stored password by @yassin-berriai in #34160
- fix(ui): surface env-var-sourced theme and logging-callback settings by @yassin-berriai in #34156
- test(musty_leopard): cover customer chat/messages cost + streaming paths by @mubashir1osmani in #34164
- test(e2e): add weekly session-anomaly load test against real providers by @mateo-berri in #34166
- fix(bedrock): emit Nova Sonic realtime session.created on connect and session.updated on session.update by @mubashir1osmani in #34133
- feat(guardrails): add only_scan_new_messages for per-session incremental scanning by @devin-ai-integration[bot] in #33278
- fix(proxy): share CLI SSO login sessions across workers without enable_redis_auth_cache by @devin-ai-integration[bot] in #33261
- test(e2e): move Admin UI Playwright suite to tests/e2e/ui by @ryan-crabbe-berri in #34196
- fix(scim): use members_with_roles as the source of truth for group membership by @yassin-berriai in #34162
- fix(scim): sync team roster and dedup teams for existing-user email upsert by @yassin-berriai in #34183
- fix(proxy): raise dashboard session budget default to $1 and make it configurable in config and Admin UI by @tin-berri in #34146
- fix(scim): prune deleted user from teams' members_with_roles by @yassin-berriai in #34180
- test(e2e): fail the run when a Rust gateway silently serves /messages through Python by @yassin-berriai in #34208
- fix(team): make team member add atomic to prevent concurrent-add member loss by @yassin-berriai in #34185
- fix(ui): surface SSO and SMTP settings supplied as process env vars by @tin-berri in #33576
- fix(scim): parse membership id from filtered PATCH path when value omitted by @yassin-berriai in #34181
- fix(ui): remove misleading os.environ tooltip from logging settings by @devin-ai-integration[bot] in #34305
- fix(anthropic): strip uniqueItems + other unsupported array/object constraints from output_format schema by @mateo-berri in #34313
- fix(e2e): satisfy basedpyright in test_session_anomaly so the e2e lint gate passes by @devin-ai-integration[bot] in #34288
- refactor(proxy): type the PATCH /team/{team_id} request body by @yuneng-berri in #34195
- feat(ui): edit fallback chains from router settings by @devin-ai-integration[bot] in #32841
- fix(mcp): use official Google Drive streamable HTTP MCP server by @devin-ai-integration[bot] in #34322
- refactor(ui): migrate api-reference to shadcn by @yuneng-berri in #34263
- refactor(ui): migrate prompts list page to shadcn by @yuneng-berri in #34289
- refactor(ui): migrate old-usage to shadcn by @yuneng-berri in #34304
- refactor(ui): migrate transform-request to shadcn by @yuneng-berri in #34303
- chore(ui): bump next to 16.2.11 by @yuneng-berri in #34329
- test(e2e): cover key max_budget blocks on personal, team, and team-member keys by @ryan-crabbe-berri in #33895
- fix(tests): remove importlib.reload of http_handler that breaks client injection in later tests by @mateo-berri in #34336
- test(e2e): require a cache-hit row instead of skipping when absent by @devin-ai-integration[bot] in #34283
- fix(mcp): fall through to an ephemeral DCR mint when passthrough authorize has no client_id by @tin-berri in #33884
- ci: run UI unit tests on a 16-core runner by @yuneng-berri in #34330
- test(e2e): induce spend failure row deterministically instead of skipping by @devin-ai-integration[bot] in #34282
- chore(ui): add filename, size, JSX-handler, prefer-const, and antd lint rules by @ryan-crabbe-berri in #34341
- fix(responses): preserve reasoning through prompt hooks by @devin-ai-integration[bot] in #33422
- fix(budget): resolve word-form budget_duration so it no longer silently resets daily by @devin-ai-integration[bot] in #34250
- fix(bedrock): include type in tool_choice disable_parallel_tool_use config for Converse by @mateo-berri in #34347
- fix(autoroute): discover models via /v1/models so an AI-API-only key works by @devin-ai-integration[bot] in #34259
- feat(ui): give each Models + Endpoints tab its own path by @ryan-crabbe-berri in #34327
- feat(organization): add RESTful PATCH /v2/organization/{organization_id} by @ryan-crabbe-berri in #32350
- refactor(ui): migrate search-tools info view to shadcn by @yuneng-berri in #34323
- fix(docker): bake non_root prisma engines at /opt/prisma so migrations run offline for any uid by @yuneng-berri in #34325
- fix(anthropic): strip all remaining output_format schema keywords rejected by Anthropic by @mateo-berri in #34319
- fix(sagemaker): forward stream events as they arrive to cut TTFT by @devin-ai-integration[bot] in #34338
- test(e2e): cover key budget_duration resets on personal, team, and team-member keys by @ryan-crabbe-berri in #33896
- feat(mcp): admit gateway DCR session bearers at the aggregate /mcp scope by @tin-berri in #33190
- fix(mcp): log actionable OAuth discovery failures for misconfigured server urls by @tin-berri in #34225
- refactor(ui): migrate workflow runs to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34370
- refactor(ui): migrate models and endpoints table onto the shared DataTable by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34363
- test(e2e): drive a real Linear OAuth MCP through chat completions under both ingress headers by @tin-berri in https://github.com/BerriAI/litellm/pull/33787
- refactor(ui): migrate request logs table onto the shared DataTable by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34343
- feat(ui): rebuild Organization Settings on react-hook-form + zod with a dirty-field PATCH by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/34324
- refactor(e2e): drop require_env, read os.environ where a cred is used by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/34413
- refactor(mcp): delete unreachable v1 OBO handler and gate REST OAuth on v2 resolver by @tin-berri in https://github.com/BerriAI/litellm/pull/34407
- feat(cost-optimization): add spend-by-tool and cache leakage views by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/33978
- refactor(ui): migrate agents to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34365
- refactor(ui): extract shared tab-routing helpers and adopt them in Models + Endpoints by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/34435
- feat(proxy): add overwrite_user_with_key_hash to stamp outgoing user param with key hash by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/34417
- fix(ui): find logs by request id across pages and dates (LIT-3981) by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/31743
- fix(proxy): reject failed atomic budget reservations under fail_closed_budget_enforcement by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/34429
- ci: only run CodSpeed benchmarks on backend changes by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34345
- fix(cost_tracking): map OpenAI cache_write_tokens for prompt cache creation billing by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34046
- fix(proxy): restore atomic user upsert when adding team members by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34457
- fix(ui): keep cache leakage time range picker inline at narrow widths by @tin-berri in https://github.com/BerriAI/litellm/pull/34439
- feat(ui): show in the log drawer and session sidebar when an auto-router served a request by @tin-berri in https://github.com/BerriAI/litellm/pull/34434
- refactor(ui): migrate memory page to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34366
- refactor(ui): migrate budgets, skills, ui-theme to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34465
- refactor(ui): migrate access-groups, vector-stores, organizations to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34466
- refactor(ui): migrate logging-and-alerts, caching, policies to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34468
- feat(ui): standalone /connect route for MCP OAuth, decoupled from Chat UI flag by @tin-berri in https://github.com/BerriAI/litellm/pull/34334
- refactor(ui): migrate mcp-servers, tag-management, tool-policies to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34469
- test(e2e): pin the a2a bridge agent's Anthropic key so message/send works by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/34512
- fix(guardrails/model_armor): handle None metadata in post_call _process_response (#34390) by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34405
- feat(anthropic): add Claude Opus 5 by @mateo-berri in https://github.com/BerriAI/litellm/pull/34518
- test(a2a): assert the property agent returns listings, not just non-empty text by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34515
- fix(logging): stop scheduling sync failure_handler concurrently with async_failure_handler by @yassin-berriai in https://github.com/BerriAI/litellm/pull/34306
- fix(vertex): incrementally parse accumulated Gemini stream JSON to prevent multi-value wedge by @yassin-berriai in https://github.com/BerriAI/litellm/pull/34320
- test: replace deprecated gpt-5-codex with gpt-5.3-codex by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34520
- fix(gateway): install bedrock-realtime extra for Nova Sonic realtime by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/34426
- feat(proxy): add SAML 2.0 SSO for the admin UI by @yassin-berriai in https://github.com/BerriAI/litellm/pull/31429
- feat(guardrails): add run_in_parallel opt-in for concurrent pre_call and post_call guardrails by @noahnistler in https://github.com/BerriAI/litellm/pull/33770
- fix: handle explicit outputInfo: null in Vertex AI batch response by @yucheng-berri in https://github.com/BerriAI/litellm/pull/34473
- fix(otel): keep an MCP tool call in one trace, anchored to its own request by @yassin-berriai in https://github.com/BerriAI/litellm/pull/34537
- fix(ui): keep a key's MCP toolsets when saving an edit by @tin-berri in https://github.com/BerriAI/litellm/pull/34452
- fix(ui): bind key duration input to one Form.Item so pre-filled expiry submits by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/34521
- feat(ui): migrate the Create Organization form to shadcn and react-hook-form by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/34552
- refactor(ui): derive the dashboard object_permission type from the generated schema by @tin-berri in https://github.com/BerriAI/litellm/pull/34454
- test(e2e): cover MCP access-group tool selection at key creation by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/34480
- test: remove tests that mutation analysis proved assert nothing by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34475
- fix(ui): keep entity usage tabs aligned with their panels by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34573
- fix(guardrails): stop reporting a no-op guardrail as applied on passthrough by @tin-berri in https://github.com/BerriAI/litellm/pull/34411
- fix(proxy): return 400 instead of 500 for chat completions without messages by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34547
- fix(guardrails): keep guardrail information in spend logs when the caller sends its own metadata by @tin-berri in https://github.com/BerriAI/litellm/pull/34458
- fix(responses): strip include_usage from stream_options instead of dropping the param by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34549
- fix(guardrails): add /v1/messages support for Straiker plugin by @yucheng-berri in https://github.com/BerriAI/litellm/pull/34548
- fix(proxy/batches): resolve managed unified input_file_id to storage_url with ownership check before dispatch by @yucheng-berri in https://github.com/BerriAI/litellm/pull/34474
- fix(guardrails): derive tokens_saved when Headroom compression service omits it by @tin-berri in https://github.com/BerriAI/litellm/pull/34578
- refactor(ui): migrate routing groups table onto the shared DataTable by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34571
- fix(proxy): attribute org spend for team-linked credentials minted without org_id by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/34577
- fix(proxy/batches): make managed-file resolution additive, restore fall-back for missing-row and lookup errors by @yucheng-berri in https://github.com/BerriAI/litellm/pull/34584
- fix(bedrock-mantle): backfill usage on non-streaming /v1/messages responses by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34446
- fix(proxy): cap /v1/tool/spend window at 30 days and bound every SpendLogs read by @tin-berri in https://github.com/BerriAI/litellm/pull/34582
- feat(passthrough): record cost and usage reported by the upstream target by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34590
- fix(logs): scope and bound the End User filter on the logs page by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34579
- feat(ui): deep-link virtual key detail view via ?key= query param by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/34591
- revert(ui): return Models + Endpoints tabs to in-memory routing, keep the ?model drill-in by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/34629
- fix(proxy): merge model-level guardrails before pre_call_hook by @hclsys in https://github.com/BerriAI/litellm/pull/29654
- fix(router): don't cool down parent deployment on advisor sub-call failure by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/33792
- test(e2e): cover /vllm chat passthrough against a hosted backend by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/34432
- test(e2e): point four suites at models the providers still serve by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/34567
- test(e2e): make the bedrock guardrail test match the guardrail it points at by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/34568
- fix(otel): stamp an MCP tool failure on the request that carried it by @yassin-berriai in https://github.com/BerriAI/litellm/pull/34551
- test(e2e): set reasoning_effort=none for gpt-5.6 chat tool calls by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/34569
- test(e2e): cover /v1/images/edits by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/34476
- chore(deps): bump gitpython and postcss to advisory-clear versions by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34634
- fix(proxy): hash caller-supplied key in key update audit log object_id by @yucheng-berri in https://github.com/BerriAI/litellm/pull/34632
- test(e2e): cover /openai chat passthrough cost logging by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/34470
- fix(proxy): global max_budget ignores budget_duration; enforce against the resettable proxy budget row by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/33732
- fix(mcp): use a toolset row's stored tool name as written by @tin-berri in https://github.com/BerriAI/litellm/pull/34559
- fix(auth): route JWT default-team into memberships instead of the create payload by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/33082
- ci: drop the docker SERVER_ROOT_PATH e2e job for a unit test by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34642
- test: stop bedrock tool acompletion tests from making real network calls by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/34644
- fix(proxy): stop litellm/proxy from shadowing installed packages on sys.path by @yassin-berriai in https://github.com/BerriAI/litellm/pull/34656
- fix(cost-optimization): swap methodology Collapse for a shadcn HoverCard by @tin-berri in https://github.com/BerriAI/litellm/pull/34598
- fix(ci): scope UI lint to the files a PR actually changed by @mateo-berri in https://github.com/BerriAI/litellm/pull/34600
- fix(mcp): stop leaking upstream server credentials in tool-call 403 by @tin-berri in https://github.com/BerriAI/litellm/pull/34340
- fix(batches): paginate managed batch list by unified_object_id cursor by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34192
- fix(e2e): stop tests from breaking the shared proxy for every suite after them by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/34664
- fix(cost-optimization): anchor the savings line at a $0 range start by @tin-berri in https://github.com/BerriAI/litellm/pull/34453
- fix(bedrock): stop replaying expired Google OIDC tokens to STS on guardrail auth by @yucheng-berri in https://github.com/BerriAI/litellm/pull/34637
- chore: bump litellm-enterprise 0.1.51 -> 0.1.52, litellm-proxy-extras 0.4.80 -> 0.4.81 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34669
- chore(ui): rebuild Next.js build artifacts by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34671
- fix: backport the management/v1 end-user filter and four dashboard fixes onto rc/1.95.0 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/34811
- chore(release): backport #35271 to rc/1.95.0 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/35299
New Contributors
- @akapur99 made their first contribution in #32829
- @vineetpuranik made their first contribution in #33940
- @jyeung-r7 made their first contribution in #33623
- @lyb0307 made their first contribution in #33228
Full Changelog: v1.93.0-dev.3...v1.95.0-rc.2