·
1711 commits
to litellm_internal_staging
since this 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.100.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.100.0/cosign.pub \
ghcr.io/berriai/litellm:v1.100.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
- fix(responses): keep the conversation when chaining previous_response_id on the bridge by @mateo-berri in #37956
- feat(newrelic): per-team New Relic trace routing via team callbacks by @yucheng-berri in #37603
- perf(ci): cache uv dependencies in the lint job by @yuneng-berri in #37783
- perf(ci): fan the budget checkers out across cores by @yuneng-berri in #37784
- ci: port the Postgres suites off CircleCI onto service containers by @yuneng-berri in #37785
- feat(ci): gate patching of SDK internals in tests as TQ008 by @yuneng-berri in #37787
- ci: measure enterprise/ coverage by @yuneng-berri in #37788
- ci: run the keyless caching tests that ran in no job by @yuneng-berri in #37790
- fix(ci): run the migration DDL guard, and stop it reading comments as SQL by @yuneng-berri in #37791
- ci: run the enterprise package suite in GitHub Actions by @yuneng-berri in #37798
- perf(ci): give the two longest unit shards the runner's spare cores by @yuneng-berri in #37804
- test(exception-mapping): pin the status and error-shape table every provider maps to by @yuneng-berri in #37807
- fix(terraform): add soft_budget, tags, and soft_budget_alerting_emails to litellm_team by @yuneng-berri in #37918
- fix(ui): theme the created-key box so it follows dark mode by @yuneng-berri in #37985
- fix(ui): restore the public model name tooltip layout in the add model flow by @yuneng-berri in #37986
- fix(ui): render team and org tpm/rpm limits of 0 as 0 instead of Unlimited by @yuneng-berri in #37916
- fix(ui): repoint the key detail URL to the rotated hash after regenerating by @yuneng-berri in #37968
- fix(ui): make playground chat bubbles theme-aware by @yuneng-berri in #37978
- fix(UI): correct skill install command and marketplace setup UX by @ozolam in #33514
- fix(proxy): skip health checks for strategy routers by @devin-ai-integration[bot] in #37966
- fix(databricks): bill cached tokens at cache rates and add missing Claude pricing by @mateo-berri in #37975
- fix(anthropic): round-trip thinking blocks to OpenAI backends on /v1/messages by @mateo-berri in #37953
- fix(a2a): normalize agent card protocolBinding casing before transport match by @devin-ai-integration[bot] in #37917
- fix(interactions): track cost and spend for Google Interactions API requests by @mateo-berri in #33310
- fix(bedrock): stop emitting an empty assistant delta after the finish_reason chunk by @devin-ai-integration[bot] in #36806
- fix(anthropic): reconcile enum with declared type in output_format schema by @dkindlund in #37882
- feat(azure_ai): support entra id / oauth auth on every azure ai foundry route by @devin-ai-integration[bot] in #35415
- fix(ui): boot the UI image as an arbitrary uid by anchoring nginx writes under /tmp by @devin-ai-integration[bot] in #37982
- fix(proxy): parse form-encoded video edit/extension bodies after auth by @Souravrajvi0 in #36513
- fix(anthropic): keep legacy thinking budget_tokens on Claude 4.6 models on /v1/messages by @mateo-berri in #38108
- fix(utils): make prompt_token_calculator count claude models again by @ryan-crabbe-berri in #38130
- fix(proxy): keep every value of a repeated form key, and gate the tests that hid it by @ryan-crabbe-berri in #37908
- fix(health): apply model_info.health_check_params to health check probes by @mateo-berri in #38101
- fix(runwayml): route every generation endpoint and fix video cost tracking by @mateo-berri in #38115
- fix(passthrough): attribute spend and release budget reservation on router-model /vllm and /azure routes by @mateo-berri in #38111
- fix: match OpenAI SDK wire format on image/video routes by @mateo-berri in #38104
- fix(ci): give three unit shards a job deadline that outlasts their pytest budget by @tin-berri in #38139
- feat(ui): add Gemini Family auto-router preset by @tin-berri in #38138
- fix(logging_worker): carry queued tasks across event-loop change instead of dropping them by @mateo-berri in #38144
- feat(proxy): enforce vector-store upload security controls on /v1/rag/ingest by @mateo-berri in #38135
- test(e2e): pin require_managed_files enforcement behind a marker-gated stack phase by @mateo-berri in #38117
- refactor(ui): move the dashboard onto class-variance-authority by @yuneng-berri in #38125
- refactor(utils)!: delete prompt_token_calculator by @ryan-crabbe-berri in #38132
- fix(auto-router): list configured auto-routers in the usage picker before they have traffic by @tin-berri in #38129
- refactor(ui): install the shadcn field primitive by @yuneng-berri in #38126
- fix(complexity_router): keep both ends of a clipped classifier context turn by @tin-berri in #38141
- fix(ci): ignore-list recursive form-field flatteners in recursive_detector by @mateo-berri in #38149
- fix(passthrough): stop leaking the caller's virtual key on credential-less Vertex passthrough by @mateo-berri in #38114
- fix(router): stop copying forwarded credentials into retry breadcrumbs by @mateo-berri in #38133
- feat(e2e): record and replay streamed provider responses chunk-for-chunk by @mateo-berri in #38136
- fix: tolerate stream chunks without a choices key in stream_chunk_builder by @AkshaySasi in #34382
- fix(files): decode x-litellm-model encoded file_id in chat + responses by @hclsys in #29832
- fix(videos): forward uploaded source file on /v1/videos/edits to the provider by @mateo-berri in #38155
- fix(s3_v2): percent-encode object keys once so signed and sent URLs match by @devin-ai-integration[bot] in #38005
- feat(ui): add error-code drilldown for failed requests on caching page by @ryan-crabbe-berri in #38156
- feat(search): add Grounding with Bing Search (bing_grounding) as a search provider by @mateo-berri in #38119
- ci: ban row-rewriting DML from prisma migrations by @yucheng-berri in #37899
- fix(langsmith): keep root-run ids self-consistent so batch ingest stops rejecting header-tagged requests by @yucheng-berri in #38116
- ci(e2e): record the e2e suite weekly and replay it on weekdays with zero egress by @mateo-berri in #38163
- chore(codeowners): unown ui container plumbing and generated files by @ryan-crabbe-berri in #38124
- fix(logging): skip parsing redacted tool call arguments by @devin-ai-integration[bot] in #38169
- feat(complexity_router): bound the classifier context block, not each turn in it by @tin-berri in #38145
- fix(http_handler): dispose aiohttp session when AsyncHTTPHandler is finalized without a running loop by @anmolg1997 in #36670
- fix(proxy): reset a stuck team member's budget by @yassin-berriai in #37971
- fix(anthropic/bedrock): request summarized adaptive thinking for reasoning_effort and use provider thinking token counts by @devin-ai-integration[bot] in #37979
- fix(completion_extras): forward reasoning_effort=max through the Responses API bridge by @mateo-berri in #38222
- feat(vertex_ai): add native Vertex AI Interactions API support by @mateo-berri in #38229
- test(mcp): drain the logging worker after each test so queued callbacks cannot leak into the next test by @ryan-crabbe-berri in #38228
- fix(ui): forward OAuth issuer/authorization/token/registration URLs from the MCP server edit form by @yassin-berriai in #38154
- fix(together_ai): default endpoints to api.together.ai instead of api.together.xyz by @mateo-berri in #38233
- fix(bedrock_mantle): register a Bedrock runtime passthrough config so /bedrock/model//invoke works by @mateo-berri in #38231
- fix(router): resolve provider from api_base in deployment validation and acompletion by @mateo-berri in #38235
- fix(model_prices): raise bedrock_mantle gpt-5.6 max_input_tokens to Mantle's enforced 1050000 by @mateo-berri in #38225
- fix(bedrock_mantle): normalize Codex input item types Mantle rejects by @mateo-berri in #38227
- fix(proxy): store the actual selected model in spend logs for Azure Model Router by @devin-ai-integration[bot] in #37770
- feat(router): per-group supported reasoning efforts with the max level by @tin-berri in #37897
- fix(proxy): stop expected 4xx responses from saturating worker CPU on failure logging by @devin-ai-integration[bot] in #38102
- fix(caching): use upstream RedisCluster on redis-py with per-connection recovery by @devin-ai-integration[bot] in #38171
- perf(auth): drop guaranteed-miss internal-cache Redis read from team object lookup by @devin-ai-integration[bot] in #38073
- fix(together_ai): route chat completions through a dedicated TogetherAIChatConfig by @mateo-berri in #38248
- fix(ui): read reasoning tokens from Responses API output_tokens_details by @yassin-berriai in #37952
- fix(dashboard): don't show a stale provider prompt-cache chip on a response-cache hit by @yassin-berriai in #37951
- fix(ui): render tag-based guardrail mode instead of crashing the guardrails page by @devin-ai-integration[bot] in #37493
- fix(scim): return user_id as Group members[].value on transformed group responses by @devin-ai-integration[bot] in #38161
- fix(scim): preserve existing team memberships when POST /Users adoption carries no groups by @devin-ai-integration[bot] in #38166
- fix(router): support mid-stream fallback for anthropic_messages route type by @yassin-berriai in #38153
- fix(auth): support wildcard prefixes in jwt team_allowed_routes by @devin-ai-integration[bot] in #37756
- feat(models): add missing Together AI serverless models to the cost map by @mateo-berri in #38230
- fix(cerebras)!: add max_retries and extra_headers to get_supported_openai_params by @deepanshululla in #36601
- fix(anthropic): translate tool_result document blocks in the /v1/messages bridge by @mateo-berri in #38251
- fix(team): serialize member_add, member_delete, and delete under the team's advisory lock by @yassin-berriai in #37969
- docs(pr-template): split Caveats bullets into severity tiers and call for plain engineering language by @mateo-berri in #38252
- fix(anthropic): carry tool_result document blocks through the /v1/messages responses bridge by @mateo-berri in #38261
- fix(together_ai): pass tools through for models missing from the registry by @mateo-berri in #38265
- fix(anthropic): carry user-content document blocks through the /v1/messages responses bridge by @mateo-berri in #38267
- fix(rerank): emit latency and cost headers on /rerank by @devin-ai-integration[bot] in #35419
- perf(streaming): add shared JSONFragmentAccumulator for Vertex and Anthropic by @deepanshululla in #36610
- fix(together_ai): strip internal thinking fields from outbound messages, keep reasoning_content by @mateo-berri in #38275
- fix(router): persist attempted_fallbacks and original_model_group into spend logs metadata by @yucheng-berri in #38107
- fix(logging): redact tool call arguments to valid JSON and preserve null content by @yucheng-berri in #38182
- fix(ui): stack policy flow builder below the popup layer so guardrail options render by @devin-ai-integration[bot] in #38273
- test: gate the test tree on B003 so a test cannot swap os.environ for a plain dict by @ryan-crabbe-berri in #38274
- refactor(repositories): type prisma table access with one generic protocol by @mateo-berri in #38205
- fix(anthropic): buffer streamed responses carrying server-fulfilled tools so retrieval tool calls never reach the client by @mateo-berri in #36245
- test(together_ai): regression suite across chat, responses, and messages surfaces by @mateo-berri in #38283
- feat(logging): add async_post_call_failure_deployment_hook by @deepanshululla in #36657
- chore: bump litellm-enterprise 0.1.59 -> 0.1.60, litellm 1.99.0 -> 1.100.0 by @yuneng-berri in #38243
- test(e2e): cover Together AI reasoning, tool calls, template kwargs, and cost through a live proxy by @mateo-berri in #38286
- fix(logging): keep tracebacks for provider-originated 4xx errors by @mateo-berri in #38296
- chore(ci): promote internal staging to main by @yuneng-berri in #38293
- refactor(ui): install the shadcn alert primitive by @yuneng-berri in #38300
- refactor(ui): re-pull label, textarea, separator and skeleton from the registry by @yuneng-berri in #38302
- feat(prometheus): configure deployment caller identity by @mphilippnv in #38221
- test(e2e): let the Together replayed-reasoning case survive a single provider miss by @mateo-berri in #38314
- fix(otel): map /v1/messages provider errors before failure logging by @mateo-berri in #38310
- fix(exceptions): map upstream status codes for providers with no exception_type branch by @mateo-berri in #38318
- fix(passthrough): record ownership of streamed responses under managed ids by @mateo-berri in #38320
- fix(proxy): encrypt streamed responses ids on /openai/v1/responses and /responses aliases by @mateo-berri in #38325
- test(cost-calc): pin the rate fallbacks inside a tiered-pricing tier by @yuneng-berri in #38327
- test(e2e): cover the Bedrock provider-feature cells customers run by @mateo-berri in #38232
- fix(together_ai): fail open on response_format instead of dropping it for unregistered models by @mateo-berri in #38269
- fix(proxy): honor DATABASE_DISABLE_PREPARED_STATEMENTS in componentized entrypoints by @devin-ai-integration[bot] in #38363
- fix(anthropic-responses): preserve structured output strictness by @eugene-yao-zocdoc in #38211
- chore(typing): roll up the daily tech debt cleanups from Aug 20 to Aug 26 by @devin-ai-integration[bot] in #37922
- fix(router): resolve hidden aliases for explicit lookup by @daniel-meismer-zocdoc in #38272
- fix(ui): keep focus in the add model public name input while typing by @devin-ai-integration[bot] in #38366
- fix(model_prices): price 1-hour cache writes on claude-3-haiku and claude-3-opus at 2x input by @mateo-berri in #38371
- fix(proxy): keep the caller's Google token on credential-less Vertex passthrough under custom auth by @mateo-berri in #38299
- fix(mcp): preserve provider access token lifetime by @daniel-meismer-zocdoc in #38271
- chore(ui): remove stale "New" badges from the dashboard by @yuneng-berri in #38374
- test(cost-estimate): pin the prices and period totals /cost/estimate returns by @yuneng-berri in #38315
- fix(ci): let the mutation workflow find covered lines so it generates mutants by @yuneng-berri in #38305
- fix(model_prices): raise bedrock_mantle gpt-5.5 and gpt-5.4 max_input_tokens to Mantle's enforced 1050000 by @mateo-berri in #38368
- fix(azure/realtime): authenticate realtime websocket with Azure AD token when no api-key by @devin-ai-integration[bot] in #34658
- fix(bedrock): map reasoning_effort to reasoning.effort for OpenAI GPT-5.x on Converse by @6matt in #38279
- test(prometheus): cover caller-identity config failure cases by @yucheng-berri in #38380
- fix(redis): support credential providers across clients by @eugene-yao-zocdoc in #38094
- fix(health): support
mode: image_editin health checks by @devin-ai-integration[bot] in #38291 - fix(cost-map): add US data residency uplift to claude-sonnet-4-6 and mythos entries by @mateo-berri in #38369
- fix(anthropic): raise missing-credential error on /v1/messages passthrough by @devin-ai-integration[bot] in #38240
- fix(mcp): complete DCR bridge OAuth challenges by @daniel-meismer-zocdoc in #37384
- test(proxy): pin the request-validation contracts in proxy/_types.py by @yuneng-berri in #38307
- docs(CLAUDE.md): add pull-before-work rule by @mateo-berri in #38386
- fix(anthropic): scale cache costs by fast mode and trust served speed by @mateo-berri in #38378
- fix(pricing): add azure gpt-5.6 cache write rates and correct data zone priority by @mateo-berri in #38370
- docs: tighten the pull-before-work rule in CLAUDE.md by @devin-ai-integration[bot] in #38389
- fix(health): strip credential fields from GET /health output by @Siraj637909 in #37090
- fix(minimax): attach MINIMAX_API_KEY on anthropic messages requests by @mateo-berri in #38393
- refactor(ui): replace hand-picked z-index values with one named scale and lint it by @ryan-crabbe-berri in #38282
- fix(health): probe Azure GA realtime path for transcription-only models by @mateo-berri in #38390
- fix(bedrock): parse cacheDetails for Converse 1h/5m cache write cost split by @danielva-monday in #36762
- fix(caching): flush async cache writes cancelled at event loop shutdown by @mateo-berri in #38385
- fix(router): resolve model_group_alias before pre-routing strategy dispatch by @tin-berri in #38382
- feat(proxy): enforce rpm/tpm on model add + fix validation error title in UI by @kunal2002 in #36518
- refactor(ui): move every page header onto the shared PageHeader by @yuneng-berri in #38306
- fix(proxy): stop cache eviction errors from failing /key/update by @yuneng-berri in #38308
- fix(aiohttp): honor global ssl_verify on the aiohttp_openai handler path by @mateo-berri in #38400
- fix(logging_worker): rescue dequeued logging tasks lost at event loop close by @mateo-berri in #38394
- fix(caching): require the namespace delimiter when checking already-namespaced redis keys by @mateo-berri in #38403
- fix(prompts): reject keyed prompt_data with prompt_id and populate prompt version by @mateo-berri in #38404
- fix(cost_calculator): resolve real cost key when model_name alias contains '/' by @ksk2023 in #38344
- fix(cost-map): correct prompt_cache_min_tokens for Claude Fable 5 and backfill Anthropic re-export entries by @mateo-berri in #38405
- test(azure-ai): pin the 422 retry that drops the field the provider rejected by @yuneng-berri in #38309
- refactor(ui): read the auto-router tier set through one row list by @tin-berri in #38408
- fix(proxy): stop empty DB router_settings lists from clobbering yaml fallbacks by @mateo-berri in #38406
- fix(team): allow no-reset default budgets for team members by @devin-ai-integration[bot] in #37708
- fix: forward image content lists to DeepSeek vision models by @yucheng-berri in #38397
- fix(fireworks_ai): stop using the trace id as the session affinity key by @Hamjaster in #35754
- fix(gemini-realtime): keep the client's voice on Vertex AI native-audio Live by @yucheng-berri in #38395
- fix(vertex_ai): bill Gemini grounding per unique web search query by @ousamabenyounes in #36397
- fix(health): make the image_edit health probe moderation-safe by @mateo-berri in #38417
- test: gate the test tree on fifteen assertion and handler rules it already satisfies by @ryan-crabbe-berri in #38361
- fix(proxy): key lazy openapi stubs off registered features, not sys.modules by @mateo-berri in #38416
- fix(proxy): derive auto-router health from its underlying models by @tin-berri in #38174
- fix(responses): let cache-control injection reach the system prompt from instructions by @tin-berri in #38120
- fix(gemini): bill Google Maps grounding as its own SKU by @mateo-berri in #38418
- fix(speech): keep proxy metadata and completion cost through the TTS completion bridge by @mateo-berri in #38414
- fix: map Gemini ON_DEMAND_FLEX traffic type to flex service tier by @bisma-nawaz in #37724
- feat(langfuse): support langfuse_environment as a per-key dynamic callback param by @devin-ai-integration[bot] in #38264
- feat(proxy): hide unhealthy models from model listings, opt-in by @yuneng-berri in #38313
- fix(mcp): honor admin-entered OAuth URLs on authorize after issuer yield by @mateo-berri in #38379
- fix(model_prices): correct gemini-3.5-flash-lite flex cache-read pricing by @mateo-berri in #38422
- fix(cost): price gemini-live-2.5-flash-native-audio realtime sessions by @mateo-berri in #38419
- fix(cost-map): correct Gemini TTS and native-audio rates by @mateo-berri in #38412
- fix(prompts): propagate PATCHed prompt templates to every worker and pod by @mateo-berri in #38411
- fix(model_prices): bill gemini -latest/preview alias cache reads at 10% of input by @mateo-berri in #38423
- fix(proxy): sync search tools into the router on management writes by @yuneng-berri in #38392
- feat(guardrails): track Azure Prompt Shield usage and cost with spend isolation by @yucheng-berri in #38387
- fix(prompts): apply prompt templates before routing on /v1/responses and honor ignore_prompt_manager_model by @mateo-berri in #38407
- fix(cost): make cost-breakdown headers respect service tier by @mateo-berri in #38424
- fix(mcp): add litellm[mcp] extra and actionable error when streamable_http_client is missing by @mateo-berri in #38399
- revert(proxy): remove router_model_name from auto-routed response bodies by @tin-berri in #38429
- fix(google_genai): price streamed generateContent with the provider that served it by @devin-ai-integration[bot] in #36055
- fix(logging): stop billing and logging response reads as LLM calls by @devin-ai-integration[bot] in #36890
- fix(budget): serialize model_max_budget before the /budget/update write by @yuneng-berri in #38430
- fix(ui): block the auto-router submit on a missing classifier model and an orphaned keyword rule by @tin-berri in #38427
- feat(complexity_router): heuristic-first classifier chaining by @tin-berri in #38428
- test(e2e): un-skip the per-model budget update case by @yuneng-berri in #38437
- fix(cost): stop double-billing cached tokens that overlap a modality by @Srivatsa03 in #37407
- feat(ui): add Teams list CSV export with budgets, model grants, and rate limits by @devin-ai-integration[bot] in #38436
- fix(mcp): accept raw x-litellm-api-key on streamable HTTP admission by @devin-ai-integration[bot] in #38364
- fix: bound row count on GET /spend/logs to stop unbounded LiteLLM_SpendLogs scans by @devin-ai-integration[bot] in #38420
- fix(scim): apply default_team_params (incl. models) to SCIM-created teams by @devin-ai-integration[bot] in #38433
- fix(prompts): propagate prompt deletes to every worker and pod by @mateo-berri in #38434
- fix(anthropic_adapter): carry web search cost into /v1/messages breakdown headers by @mateo-berri in #38439
- fix(ui): show custom technical keywords on every router whose scorer runs by @tin-berri in #38451
- fix(e2e): move the vertex realtime suite off the retired Live preview model by @yuneng-berri in #38454
- feat(newrelic): per-team cost and usage metrics via team callbacks by @yucheng-berri in #37610
- fix(ui): carry a preset's per-tier litellm_params through the prefill by @tin-berri in #38453
- fix(e2e): size the mid-conversation-system cache prefix above the minimum deterministically by @yuneng-berri in #38468
- fix(e2e): disable thinking on the gemini chat cost test instead of racing its budget by @yuneng-berri in #38469
- feat(ui): put the auto-router savings hero on a spend rail and a four-tile row by @tin-berri in #38470
- feat(ui): toggle internal health check visibility in request logs by @mateo-berri in #38391
- fix(mcp): canonicalize bearer scheme on bridge egress by @daniel-meismer-zocdoc in #38398
- refactor: clean up fresh tech debt from 2026-08-27 window by @devin-ai-integration[bot] in #38484
- fix(exception_mapping_utils): map unmapped exceptions when model and provider are unset by @mateo-berri in #38496
- fix(ui_sso): resolve highest privilege Entra app role, not first in claim by @imranismail in #36728
- fix(proxy): regenerate lazy OpenAPI snapshot and guard it in CI by @mateo-berri in #38410
- feat(ui): add cache hit/miss filter to Request Logs by @devin-ai-integration[bot] in #38432
- fix(bedrock): sign rerank requests with the shared header-filtered SigV4 helper (internal copy of #36462) by @mateo-berri in #38093
- fix(bedrock): sign rerank requests with the shared, header-filtered SigV4 helper by @noahnistler in #36462
- fix(ui): order the auto-routers table newest first so a new router lands on page one by @tin-berri in #38545
- feat(ui): run the Anthropic Family preset's reasoning tier on Opus 5 at high thinking by @tin-berri in #38490
- build(ui): bump nginx to 1.31-alpine by @devin-ai-integration[bot] in #38541
- feat(otel): support per-team/per-key service.name for OTel v2 destinations by @devin-ai-integration[bot] in #38532
- test(e2e): de-flake the cost-header cache read and the router fallback control by @yuneng-berri in #38435
- feat(gemini): day-0 support for gemini-3.5-transcribe and transcribe-live by @mateo-berri in #38540
- feat(health): opt-in model-group allowlist for background health checks and health-check routing by @mateo-berri in #38539
- fix(mcp): keep upstream OAuth Authorization when jwt signer hook injects one on tools/call by @devin-ai-integration[bot] in #38555
- fix: suppress misleading register_model unresolved-cost warnings for entries without custom pricing by @devin-ai-integration[bot] in #38542
- feat(proxy): opt-in budget rollover carrying overage into the next window by @devin-ai-integration[bot] in #38514
- fix(auth): skip guaranteed-miss team lookup for the litellm-dashboard sentinel by @devin-ai-integration[bot] in #38471
- fix(key_management): allow /key/update to keep or shrink MCP server grants the key already holds by @devin-ai-integration[bot] in #38463
- fix: keep schema reconciliation from fighting a partitioned LiteLLM_SpendLogs by @devin-ai-integration[bot] in #38452
- fix(ui): open select popups below the trigger instead of over it by @tin-berri in #38554
- fix(realtime): bill trailing audio when a Gemini transcribe Live session closes by @mateo-berri in #38563
- test(e2e): cover key generate and update on the Admin UI path by @yuneng-berri in #38448
- chore: bump litellm-enterprise 0.1.60 -> 0.1.61, litellm-proxy-extras 0.4.89 -> 0.4.90 by @yuneng-berri in #38566
- fix(ui): let the paginated search select keep what the user types by @yuneng-berri in #38475
- fix(otel): anchor MCP tool-call spans to the gateway's own trace, link the client's context by @yucheng-berri in #38317
- fix: roll up the open deflake fixes for the MCP logging queue, PTU rollup, license gate, and pricing test isolation by @devin-ai-integration[bot] in #37833
- fix(model_prices): rolling registry audit - verified models and rates for Novita, DeepInfra, W&B, Bedrock Sol, Gemini, Fireworks, Azure gpt-5.6, Mistral, Together by @devin-ai-integration[bot] in #38207
- test(together_ai): assert fail-open supported params for models missing from the registry by @mateo-berri in #38487
- test(e2e): let the together tool tests accept parallel calls by @yuneng-berri in #38567
- feat(mcp): let a resolved OAuth token target a custom upstream header by @tin-berri in #38456
- feat(together_ai): map reasoning_effort per model class by @mateo-berri in #38263
- feat(dashscope): support qwen-image-3.0 and qwen-image-3.0-pro image generation by @devin-ai-integration[bot] in #38449
- fix(cost): apply Together AI cache read pricing and per-model registry rates by @mateo-berri in #38280
- fix(guardrails): forward aws_external_id when the bedrock guardrail assumes a role by @devin-ai-integration[bot] in #38376
- fix(transcription): synthesize srt/vtt output for adapters without native subtitle formats by @mateo-berri in #38561
- fix(streaming): preserve provider service-tier metadata so Vertex flex streams bill at flex rates by @mateo-berri in #38458
- fix(realtime): bill Gemini Live native-audio output tokens at the audio rate by @mateo-berri in #38457
- fix(anthropic): carry tool_reference tool results through the guardrail translation round trip by @mateo-berri in #38465
- fix(anthropic-adapter): pass provider-native and OpenAI-format tools through on /v1/messages by @mateo-berri in #38431
- test(e2e): serve the vision image from our own fixture by @yuneng-berri in #38575
- feat(together_ai): add zai-org/GLM-5.3-Flash to the model registry by @mateo-berri in #38486
- fix(ui): stop server-searched comboboxes from clobbering picks and queries by @ryan-crabbe-berri in #38574
- feat(model_prices): let a map entry declare its exact reasoning_effort levels by @tin-berri in #38481
- fix(anthropic): carry the adaptive effort tier to every bridged Claude target by @tin-berri in #38533
- feat(alerting): add native Microsoft Teams alerting destination by @devin-ai-integration[bot] in #38367
- chore(proxy): resync the generated API artifacts with the current models by @tin-berri in #38587
- fix(router): reject complexity-router settings written outside complexity_router_config by @tin-berri in #38570
- feat(ui): session-level cache observability in request logs by @devin-ai-integration[bot] in #38442
- fix(ui): link Virtual Keys hint through the migrated /ui route by @devin-ai-integration[bot] in #38596
- fix(anthropic): carry the effort tier only where the target declares reasoning_effort by @tin-berri in #38592
- fix(presidio): chunk oversized text before /analyze so large content blocks do not fail by @yucheng-berri in #38483
- fix(logging): stop stream-based log collectors classifying INFO logs as errors by @yucheng-berri in #38476
- feat(ui): dry-run an auto-router config against the backend before saving it by @tin-berri in #38595
- fix(guardrails): add fail-open mode to CrowdStrike AIDR guardrail by @yucheng-berri in #38568
- fix(router): copy instead of mutating caller metadata when scrubbing fallback stamp keys by @yucheng-berri in #38586
- feat(proxy): opt-in enforce_fallback_model_access authorizes router fallbacks against the calling key by @ryan-crabbe-berri in #38572
- fix(langfuse): warn and drop invalid LANGFUSE_TRACING_ENVIRONMENT instead of failing requests by @yucheng-berri in #38582
- fix(tencent): route thinking through extra_body in chat completions by @FelipeRodriguesGare in #38100
- test-check-commits by @nickhac in #36344
- feat(proxy): dry-run a real request body on /auto_router/test_routing by @tin-berri in #38590
- fix(shadow_eval): refuse a judge model that also serves one of the arms it grades by @tin-berri in #38589
- fix(anthropic): resolve /v1/messages effort tiers through the capability owner by @tin-berri in #38492
- fix(router): fall over on raised mid-stream errors in /v1/messages streams by @mateo-berri in #38606
- feat(models): add daily Together AI model registry sync script and workflow by @mateo-berri in #38257
- feat(ui): the model and wire layer for operator-defined auto-router tier sets by @tin-berri in #38602
- fix(moonshot, together_ai): send the reasoning effort Kimi K3 accepts by @tin-berri in #38611
- fix(ui): one-click theme toggle and matching Docs/Blog styling in the top bar by @ryan-crabbe-berri in #38601
- feat(proxy): opt-in flags to require rpm/tpm on model and project create by @ansh-agrawal in #36514
- fix(exceptions): keep a refused connection an APIConnectionError by @yuneng-berri in #38624
- chore(ci): promote internal staging to main by @yuneng-berri in #38616
- fix(anthropic): drop and self-heal empty thinking blocks on /v1/messages by @tin-berri in #38625
- fix(anthropic): handle per-level reasoning_effort flags without supports_reasoning by @tin-berri in #38618
- fix(complexity_router): route client housekeeping calls to the cheapest tier by @tin-berri in #38598
- test: fix staging CI regressions from #38182, #38144, #38265, #37962, and #37969 by @mateo-berri in #38304
- feat(spend): report prompt caching savings as total and gateway-attributed by @tin-berri in #38134
- fix(proxy): let llm_api virtual keys read /model_group/info by @devin-ai-integration[bot] in #38662
- feat(ui): edit the auto-router tier set with custom classifier-defined tiers by @tin-berri in #38603
- fix(proxy): count tools, system, and Anthropic image and document blocks in the count_tokens fallback (internal copy of #36671) by @mateo-berri in #38657
- test: refresh the suites that drifted from langfuse and OpenAI's retired Assistants API by @yuneng-berri in #38637
- test(e2e): unskip four tests whose blockers no longer hold by @yuneng-berri in #38640
- feat(proxy): add paginated GET /public/v1/model_hub by @yuneng-berri in #38636
- refactor(ui): type search tool params from the generated schema by @yuneng-berri in #38633
- feat(a2a): semantic search over the agent registry via GET /v1/agents?query and an agent_search MCP tool by @mateo-berri in #38609
- fix(model_prices): add bedrock_mantle gpt-5.5/5.4 272K tiers, align sol with AWS invoice by @mateo-berri in #38615
- fix(ui): keep the usage filter visible when the caller's scope is empty by @yuneng-berri in #38581
- fix(registry): add Gemini Omni 1.1 Flash, xAI grok-imagine image models, Mistral cache-read pricing, GLM 5.3 Flash + Kimi K2.7 Code entries by @devin-ai-integration[bot] in #38560
- fix(logging): preserve null end user in callbacks by @yucheng-berri in #38642
- test: close mutation-testing gaps in container, skills and openai-like config factories by @yuneng-berri in #38677
- fix: enforce MCP toolsets attached to a team, org, or internal user by @yucheng-berri in #38488
- fix(tests): drain the global logging worker in RAG aquery billing tests by @devin-ai-integration[bot] in #38653
- chore(techdebt): type new signatures and drop slop comments from the last 24h by @devin-ai-integration[bot] in #38644
- feat(auto_router): write and preview the classifier prompt an edited tier set sends by @tin-berri in #38605
- fix(proxy): price the /v1/messages cost header by the deployment model, not the client alias by @mateo-berri in #38691
- fix(streaming): preserve provider model for cost calculation by @aaaaaandrew in #38656
- feat(models): sync together_ai model registry by @github-actions[bot] in #38694
- test(e2e): cover Together reasoning_effort=none, json_schema, and cache-read pricing by @mateo-berri in #38697
- fix(model_info): map supports_parallel_function_calling into ModelInfo by @mateo-berri in #38692
- test(litellm_utils_tests): give the aiohttp transport tests teeth by @devin-ai-integration[bot] in #38066
- fix(proxy): use default_factory for _BudgetCascade.rollover_caps by @yassin-berriai in #38687
- feat(guardrails): add Lakera v2 skip-message honoring and advisory (inject_system_message) mode by @deepanshululla in #34940
- fix(router): drop a tier param the routed target cannot take by @tin-berri in #38622
- fix(router): scrub fallback stamp keys in place and strip them at the proxy boundary by @yucheng-berri in #38690
- fix(shadow-eval): validate Anthropic SDK judge credentials by @tin-berri in #38701
- feat(ui): run the Lite preset's medium and complex tiers at their documented efforts by @tin-berri in #38482
- chore: drop stray learnings.md workflow note from CLAUDE.md by @yucheng-berri in #38704
- fix(spend): remove the proxy-wide autorouter savings baseline override by @tin-berri in #38700
- fix(router): tier-pinned reasoning_effort supersedes client effort carriers by @tin-berri in #38698
- fix(proxy): reset a key's budget-window counters on spend reset by @yassin-berriai in #38686
- feat(shadow_eval): measure both arms' cost so a job reports what the router would have saved by @tin-berri in #38631
- fix(gpt-5): stop forwarding temperature and top_p to reasoning models that reject them by @tin-berri in #38593
- fix(streaming): report response_cost and Anthropic citations from stream_chunk_builder by @mateo-berri in #38696
- feat(ui): make provider logos readable in dark mode by @yuneng-berri in #38588
- feat(terraform): resource and data source parity with the community provider by @shivamrawat1 in #38158
- test(shadow_eval): configure the anthropic sdk judge in the funnel-seed test by @yucheng-berri in #38717
- fix(ci): fall back to github.token when the GH_TOKEN secret is unset in the Together sync workflow by @mateo-berri in #38695
- feat(terraform): add litellm_jwt_key_mapping resource by @devin-ai-integration[bot] in #38714
- feat(terraform): coverage-enforcing CI gate against the latest OpenAPI spec by @devin-ai-integration[bot] in #38710
- fix(terraform): refresh jwt key mapping allowlist entries now that the resource is merged by @devin-ai-integration[bot] in #38720
- fix(guardrails): record post_call scans on native /v1/messages streams by @mateo-berri in #38713
- chore(deps): raise RestrictedPython floor to 8.5 by @yuneng-berri in #38715
- fix(proxy): trigger async_pre_call_hook on POST /v1/files uploads by @devin-ai-integration[bot] in #38607
- test(responses): adapt temperature tests to the gpt-5 reasoning validation by @mateo-berri in #38748
- fix(router): pin batch, file, and fine-tuning job ids to their owning model group on fallback by @mateo-berri in #38742
- fix(bedrock): map real batch record counts and guard zero-count retire by @mateo-berri in #38744
- fix(aws): forward aws_external_id in Bedrock embeddings and SageMaker credential loading by @mateo-berri in #38727
- fix(aws): build every AWS endpoint and ARN from the region's partition (aws-cn, aws-us-gov) by @mateo-berri in #38747
- refactor(types): replace Any with real types across 178 backend files by @mateo-berri in #38501
- feat(hosted_vllm): add vLLM-Omni videos API by @mubashir1osmani in #38148
- fix(databricks): derive OAuth token URL from workspace origin by @ump45nose in #35940
- test(e2e): add logging e2e coverage (s3_v2, gcs_bucket, team langfuse callback, datadog failure) by @yucheng-berri in #38552
- fix(batches): fill a managed batch page past rows that will not parse by @mateo-berri in #38738
- fix(proxy): tag routing misses proxy-merged tags when chat requests carry litellm_metadata by @mateo-berri in #38739
- fix(health): honor allow_requests_on_db_unavailable in readiness probe by @devin-ai-integration[bot] in #37640
- feat(mcp): support asymmetric (RS256) signing for MCP gateway session tokens by @devin-ai-integration[bot] in #38728
- fix(ui): make code blocks follow the theme in dark mode by @yuneng-berri in #38771
- perf(rust): use pythonize for bridge serialization by @yujonglee-berri in #38764
- fix(policy): let the AI policy suggester drop sampling params its model refuses by @tin-berri in #38594
- feat(ui): link team and key model chips to the models page filtered to that group by @ryan-crabbe-berri in #38626
- fix(ui): make the logs JSON viewer follow the theme in dark mode by @yuneng-berri in #38778
- chore: bump litellm-enterprise 0.1.61 -> 0.1.62, litellm-proxy-extras 0.4.90 -> 0.4.91 by @yuneng-berri in #38779
- refactor: clean up tech debt that landed on 2026-08-29 by @devin-ai-integration[bot] in #38743
- fix(managed resources): let keys with no user_id or team_id read their own batches and files by @devin-ai-integration[bot] in #34849
- fix(proxy): pin model reconcile read to the writer DB so /model/new does not 500 under read replica lag by @devin-ai-integration[bot] in #38580
- fix(ui): restore the reopen control for the log drawer's trace sidebar by @yuneng-berri in #38782
- fix(azure): use /openai/v1 image routes for v1, preview and latest api versions by @devin-ai-integration[bot] in #38285
- fix(soniox): align synthesized SRT/VTT cues to real speech timing by @dan2k3k4 in #34440
- fix(bedrock): route all cohere.embed models to the cohere embedding config by @devin-ai-integration[bot] in #38670
- feat(mcp_gateway): add RFC 7662 introspection for gateway session tokens by @devin-ai-integration[bot] in #38726
- fix(headroom): resolve CCR retrieval on streaming /chat/completions by @devin-ai-integration[bot] in #35017
- fix: bound Hugging Face config fetch and keep embedding tests off the network by @devin-ai-integration[bot] in #38752
- feat(vertex-ai): add veo 3.1 lite model metadata by @emerzon in #30782
- feat(proxy): cyberark conjur secret manager configuration via Admin UI by @devin-ai-integration[bot] in #38445
- ci: build the benchmark environment outside the CodSpeed runner by @devin-ai-integration[bot] in #38426
- fix(proxy): give every
requestscall a timeout so a silent server cannot hang the caller by @ryan-crabbe-berri in #38234 - fix(batches): aggregate reasoning tokens and per-line pass/fail counts by @mubashir1osmani in #37208
- fix(ui): allow in-place editing of classifier numeric inputs by @tin-berri in #38803
- fix(anthropic): emit signature-only thinking blocks on the /v1/messages bridge by @tin-berri in #38809
- fix(ui): keep a deleted-from search query instead of blanking the box by @yuneng-berri in #38830
- fix(proxy): run SMTP send_email off the event loop with a connection timeout by @devin-ai-integration[bot] in #38473
- feat(budgets): enforce shared budgets on model access groups by @ryan-crabbe-berri in #38784
- feat(vertex_ai): support gemini-3.5-transcribe on /v1/audio/transcriptions by @mateo-berri in #38740
- fix(anthropic_endpoints): serialize dict-detail HTTPExceptions on /v1/messages like sibling surfaces by @mateo-berri in #38741
- fix(proxy): count auto-router classifier cost in savings and benchmarks by @tin-berri in #38835
- feat(proxy): add LiteLLM_BudgetWindowSpend table for per-window budget spend by @ryan-crabbe-berri in #35854
- fix(models): registry audit: new Together/Fireworks/Gemini/Mistral/xAI models, xai retirement repricing, bedrock grok-4.6 caching, deprecation dates by @mateo-berri in #38804
- feat(proxy): maintain per-window budget spend rows in the spend writer by @ryan-crabbe-berri in #35886
- perf(proxy): read budget-window spend from the maintained window table by @ryan-crabbe-berri in #35887
- fix(together_ai): stop writing context_length as max_output_tokens in the serverless sync by @mateo-berri in #38820
- fix(openai): flatten top-level anyOf/oneOf/allOf in Responses API tool schemas by @mateo-berri in #38792
- fix(anthropic): cap reasoning_effort thinking budget below max_tokens on /v1/messages by @mateo-berri in #38836
- fix(azure): flatten top-level tool schema combinators for Azure Responses GPT-4-family deployments by @mateo-berri in #38837
- chore: rebuild Admin UI bundle for the next release by @yuneng-berri in #38846
- fix(proxy): list all non-team models for users with an empty model list by @devin-ai-integration[bot] in #38249
- fix(guardrails): stop Lakera monitor mode forwarding unmasked PII on Responses-API bodies by @yucheng-berri in #38841
- feat(mcp): bulk-import Anthropic MCP connectors via API and admin UI by @devin-ai-integration[bot] in #38444
- feat(ui): set a model access group's shared budget from the dashboard by @ryan-crabbe-berri in #38843
- fix(ui): drop stray text next to Close in the model connection test dialog by @yuneng-berri in #38852
- feat(helm): make extra ingress paths configurable in the componentized chart by @yassin-berriai in #35700
- fix(otel/v2): detach credential-routed tenant spans into their own trace by @yucheng-berri in #38847
- test(e2e): stop the reliability fallback tests flaking on gpt-5.5's reasoning budget by @yuneng-berri in #38833
- test(e2e): retry upstream-saturation failures in the claude CLI driver by @yuneng-berri in #38850
- chore(ci): promote internal staging to main by @yuneng-berri in #38805
- fix(docker): bump wolfi-base for glibc 2.44 and pin apk python to 3.13 on rc/1.100.0 (cherry-pick #38917, #38973) by @yuneng-berri in #39992
New Contributors
- @ozolam made their first contribution in #33514
- @AkshaySasi made their first contribution in #34382
- @mphilippnv made their first contribution in #38221
- @Siraj637909 made their first contribution in #37090
- @danielva-monday made their first contribution in #36762
- @ksk2023 made their first contribution in #38344
- @Hamjaster made their first contribution in #35754
- @ousamabenyounes made their first contribution in #36397
- @bisma-nawaz made their first contribution in #37724
- @imranismail made their first contribution in #36728
- @nickhac made their first contribution in #36344
- @ansh-agrawal made their first contribution in #36514
- @aaaaaandrew made their first contribution in #38656
- @ump45nose made their first contribution in #35940
Full Changelog: v1.99.0...v1.100.0