The signatures were verified against the specified public key
What's Changed
chore(release): backport proxy request-handling maintenance and refresh runtime deps for 1.96.1 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36494
## TLDR Problem this solves: - Shared team-detail controls still depend on antd and Tremor - Those dependencies block the shared-component migration track How it solves it: - Replaces both controls with installed shadcn primitives - Preserves member and virtual-key behavior with existing tests ## User Flow Before: an admin sees legacy controls inside a team
## TLDR Problem this solves: - A tiered-pricing tier that prices cached reads or reasoning tokens at an explicit `0.0` is billed at the fallback rate instead of being free - `calculate_tiered_cost` and `tier_rate` resolved a tier's per-token cost with `tier.get(cost_key) or tier.get(fallback_cost_key, 0)`, and the `or` short-circuits on a falsy `0.0`, so a r
## TLDR Problem this solves: - Content filtering still rendered four legacy Ant Design tables - Table styling differed from the rest of the dashboard How it solves it: - Moves content filtering tables onto the shared DataTable - Preserves existing selects, buttons, tags, and callbacks ## User Flow Before: an admin configures content filtering through legacy
Throwaway PR proving the Phase 2 PR e2e gate bootstrap. **Will be closed and its branch deleted as soon as the gate result is recorded — do not review or merge.**
Throwaway PR proving the Phase 2 PR e2e gate bootstrap. **Will be closed and its branch deleted as soon as the gate result is recorded — do not review or merge.**
Throwaway PR proving the Phase 2 PR e2e gate bootstrap. **Will be closed and its branch deleted as soon as the gate result is recorded — do not review or merge.**
Throwaway PR proving the Phase 2 PR e2e gate bootstrap. **Will be closed and its branch deleted as soon as the gate result is recorded — do not review or merge.**
## TLDR Problem this solves: - A model that prices cache-write (cache creation) tokens at an explicit `0.0` is billed at the plain input rate in batch cost, not at 0 - `batch_cost_calculator` resolved the cache-write rate with `model_info.get("cache_creation_input_token_cost") or input_cost_per_token`, and the `or` short-circuits on a falsy `0.0`, so a real
## TLDR Problem this solves: - `@`-prefixed path auto-inlines the PR template - Inlined copies get their HTML comment rules stripped How it solves it: - Reference the path as plain text instead ## User Flow Not user facing, this only changes agent guidance in CLAUDE.md ## Relevant issues ## Linear ticket ## Pre-Submission checklist - [x] I have added meaning
## TLDR Problem this solves: - Google removed the `Turn` schema from its live Interactions OpenAPI spec - The compliance test fetches that spec at CI time, so `test_turn_schema` now fails with `KeyError: 'Turn'` - That test is part of a required check, blocking every open PR How it solves it: - Replaces the `Turn` assertions with assertions on the step schem
## TLDR Problem this solves: - Google's Interactions API sends step-based multi-turn input since Aug 13 - The bridge passed Google `{"type": "text"}` parts raw, so OpenAI models 400 - Step types and the legacy `model` role were never mapped to `assistant` - Anthropic rejected turn history; accepted step history but misattributed it How it solves it: - Maps `
## TLDR Problem this solves: - Two log drawer components still render through antd - Both are shared by three routes, so neither had a test - Nothing proved a markup swap kept them identical How it solves it: - Characterise both against antd first, in their own commit - Migrate second, leaving those tests untouched and green - Prove pixel parity by driving t
## Summary - `claude-code-20250219` was missing from `anthropic_beta_headers_config.json`, causing `filter_and_transform_beta_headers` to silently drop it for every provider - Without this header reaching the upstream Anthropic API, the server never enters Claude Code mode, so IDE-integration tools (`Bash_ide`, `Skill_ide`, `Workflow_ide`) are never made ava
## TLDR Problem this solves: - Two log-drawer message blocks still render through antd - Both hardcode hex colours instead of design tokens How it solves it: - Replaces antd Typography with plain elements and token classes - Keeps both components' existing tests green, unedited ## User Flow Before: an operator reading a request's messages sees blocks built f
## TLDR Problem this solves: - Helm chart ignores `nodeSelector` on the migration job - The job lands on the wrong nodes and gets OOM-killed - Nothing warns you: the values look correct How it solves it: - Render `nodeSelector` in the migration job template - Add the chart test that would have caught it ## User Flow Before: an operator pins their LiteLLM ins
Fixes #36640. Retire permanently unroutable unified batch IDs and provider 404s after recording the existing error metric, while continuing to retry configuration-dependent and transient failures. Adds focused regression coverage for permanent routing classification.
## TLDR Problem this solves: - Bridged ChatGPT responses calls could miss cost tracking - Internal streams were logged as non-streaming requests How it solves it: - Records the provider-resolved streaming state before iteration - Keeps logging deduplication open until stream assembly completes ## User Flow Before: a developer sends a non-streaming chat reque
## TLDR Problem this solves: - Model map missed xai/grok-4.6 and Gemini 3.1 Flash TTS - Several deprecation dates were missing or stale vs provider docs How it solves it: - Adds xai/grok-4.6, xai/grok-4.6-latest, gemini/gemini-3.1-flash-tts-preview - Fixes gemini-embedding-001 shutdown date (2026-07-14, was 2028-05-14) - Adds published shutdown dates to Gemi
## TLDR Problem this solves: - Every access-control case asserted only that something was refused - A gateway denying the allowed model too would pass them all - The unknown-model case accepted any JSON, even `{}` How it solves it: - Adds the allow-list's positive half: allowed model works - Requires a real error envelope with a client-surfaceable message ##
## Summary Pipeline [#77387](https://app.circleci.com/pipelines/github/BerriAI/litellm/77387/workflows/7d02784e-92e7-4709-a6a5-ec0336e8b55c) failed mostly because the test OpenAI account has run out of quota (429 `insufficient_quota`) — that is an environment issue, not a code regression. While triaging the logs I found one real code bug that this PR fixes.
## Relevant issues N/A ## Linear ticket N/A ## Pre-Submission checklist - [x] I have added meaningful tests - [ ] My PR passes all unit tests on `make test-unit` - [x] My PR's scope is as isolated as possible; it only solves 1 specific problem - [ ] I have requested a Greptile review by commenting `@greptileai` and received a Confidence Score of at least 4/5
## Relevant issues Fixes #32614 Refs #20886 Backports #20888 onto `litellm_internal_staging` ## Linear ticket ## Pre-Submission checklist **Please complete all items before asking a LiteLLM maintainer to review your PR** - [x] I have added meaningful tests - [x] My PR passes all CI/CD checks (e.g., lint, format, unit tests) - [x] My PR's scope is as isolated
## Relevant issues Fixes #33347 ## Linear ticket ## Pre-Submission checklist - [x] I have added meaningful tests - [x] My PR passes all CI/CD checks (e.g., lint, format, unit tests) - [x] My PR's scope is as isolated as possible; it only solves 1 specific problem - [x] I have received a Greptile **Confidence Score of at least 4/5** before requesting a mainta
## Summary Fixes #36384 Calling `ModelResponse()` with no arguments crashes with: ``` pydantic.errors.PydanticUserError: `Message` is not fully defined; you should define `ChatCompletionReasoningSummaryTextBlock`, then call `Message.model_rebuild()`. ``` ## Root Cause In `litellm/types/llms/openai.py`, the `ChatCompletionReasoningItem` TypedDict has a field:
## Summary When calling `/customer/update` with `budget_duration` and `max_budget`, the `budget_duration` was not being propagated to the newly created budget. This meant the budget reset schedule was never set. This PR fixes the issue by: 1. Adding `budget_duration` field to `UpdateCustomerRequest` in `_types.py` 2. Computing `budget_reset_at` from `budget_
## Problem When using Ollama with strict OpenAI API clients (e.g. Zed's coding agent), tool calling fails because: 1. **Each streaming chunk gets a different `id`** OpenAI's spec requires all chunks in a streaming response to share the same `id`. Previously, `OllamaChatCompletionResponseIterator.chunk_parser` called `str(uuid.uuid4())` on every chunk, so the
## TLDR Problem this solves: - Usage still rendered six legacy table implementations - A private DataTable duplicated the shared component How it solves it: - Moves usage tables onto the shared DataTable - Removes the unused private DataTable and its tests ## User Flow Before: an admin opens usage analytics and sees legacy table treatments 1. They open https
## TLDR Problem this solves: - Guardrails Monitor still used an Ant Design table - Sorting and loading used a separate table implementation How it solves it: - Moves performance data onto the shared DataTable - Preserves sorting, row selection, loading, and empty states ## User Flow Before: an admin reviews guardrail performance in a legacy table 1. They ope
## TLDR Problem this solves: - Two log-drawer components still render antd Typography and Tooltip - antd in shared components blocks the dashboard's shadcn migration - Truncated ids are shortened in the page, not just visually How it solves it: - TruncatedValue moves to the shadcn Tooltip plus the shared CopyButton - OutputCard drops antd Typography for toke
## TLDR Problem this solves: - Realtime `client_secrets` calls through a Router model group ignore the resolved deployment - `session.model` still holds the caller's original alias, not the picked deployment - `acreate_realtime_client_secret` prefers `session.model`, so it fails provider inference How it solves it: - `Router._ageneric_api_call_with_fallbacks
## TLDR Problem this solves: - Failed Responses streams silently become successful empty chat completions - Router fallbacks never run after upstream stream failures How it solves it: - Raise an API error for failed and error events - Cover both upstream event shapes with regression tests ## User Flow Before: a developer streaming chat completions receives a
## TLDR Problem this solves: - User Usage filters require scrolling through every user How it solves it: - Reuses Global Usage search and pagination behavior - Keeps the picker usable when searches return no matches ## User Flow Before: an admin cannot type to find a user in User Usage 1. They open `http://localhost:4000/ui/?page=usage` 2. They select `User
## TLDR Problem this solves: - Log drawer still pulls antd Typography, Button, Tooltip, Collapse - Hex colours and inline styles ignore the design tokens - Hover states run through JS mouse handlers, not CSS How it solves it: - SectionHeader now uses shadcn Button and Tooltip - ToolsSection now uses shadcn Collapsible with lucide chevrons - Characterisation
<!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## Relevant issues Fixes Prometheus model-per-key remaining RPM/TPM gauge fallback from additional headers. ## Linear ticket N/A ## Pre-Submission checklist - [x] I have Added testing in the [`tests/test_litellm/`](https://github.com/BerriAI/litellm/tree/main/tests/test_litellm) directory, **Adding at least 1 test is a har
<!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## Relevant issues <!-- e.g. "Fixes #000" --> ## Linear ticket <!-- if you are an internal contributor, add the Linear ticket e.g. "Resolves LIT-1234" to magically link the Linear ticket to the GitHub PR --> ## Pre-Submission checklist **Please complete all items before asking a LiteLLM maintainer to review your PR** - [x]
<!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## Relevant issues ## Linear ticket ## Pre-Submission checklist **Please complete all items before asking a LiteLLM maintainer to review your PR** - [x] I have Added testing in the [`tests/test_litellm/`](https://github.com/BerriAI/litellm/tree/main/tests/test_litellm) directory, **Adding at least 1 test is a hard requirem
<!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## Relevant issues Fixes confusing budget IDs in the Budgets page by showing what each budget is attached to. ## Linear ticket N/A ## Pre-Submission checklist - [x] I have Added testing in the `tests/test_litellm/` directory - [ ] My PR passes all unit tests on `make test-unit` - [x] My PR's scope is as isolated as possibl
## Summary The `build_and_test` job on `litellm_fix_v3_stash_leak_provider-ceb3` failed on every recent workflow attempt. Investigation showed it wasn't broad flakiness — a handful of distinct issues compound under `pytest -x`, and a CI rerun bug turns every auto-retry into a guaranteed failure. ### 1. CircleCI rerun step was a guaranteed failure ```yaml --c
<!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## Summary Adds an admin-configurable dashboard banner backed by UI settings, with publish state, message text, and alert style persisted through the existing proxy UI settings endpoint. The dashboard renders the published banner under the navbar in both routing shells. ## Relevant issues ## Linear ticket Resolves LIT-3042
Temporary throwaway PR used to verify a CI pipeline behaviour. Touches a single scratch file under `tests/e2e/`. No product code. This will be closed and the branch deleted shortly.
## TLDR Problem this solves: - OpenShift runs containers as a random UID in group 0 - Stock image only grants root write on /app - DB schema step fails, so customers must rebuild the image internally How it solves it: - Builder stage aligns group perms with owner perms on /app - Runtime COPY layers carry them, so no extra venv-sized chmod layer - HOME=/app p
## TLDR Problem this solves: - Nebius requests target the retired AI Studio endpoint - Provider docs claim four unsupported API surfaces How it solves it: - Routes chat and embeddings to Token Factory - Tests routing, authentication, models, and overrides - Aligns branding and capability metadata with implementation ## User Flow Before: a developer using Lit
## Summary `gen_ai.system` was reaching the OTLP exporter as `None` from the metrics path (`_record_metrics`) and the semantic-log events path (`_emit_semantic_logs`, per-message and per-choice events). The OTLP protobuf encoder raises `Invalid type <class 'NoneType'> of value None` on every record, which the OTel SDK catches and logs at ERROR level with a f
## TLDR Problem this solves: - Push-triggered lint job on litellm_internal_staging fails at LIT012 gate - Recent adds pushed the LIT012 total to 4522, over the 4519 ceiling How it solves it: - Mark the new UsagePerChunk fields inference_geo and speed as ReadOnly - Suppress the new NvidiaNimPassageObject.image field with writable-ok - Net effect drops the LIT
## TLDR Problem this solves: - `osv-scan` is red on `litellm_internal_staging` - GHSA-2v37-7h3g-55p8 (CVSS 8.2) hits nanoid 3.3.17 How it solves it: - lock-only bump of nanoid to 3.3.18 - no other package or config touched ## User Flow Before: a maintainer opening any PR into a `litellm_**` branch sees the `osv-scan` check fail before they can merge 1. They
## TLDR Problem this solves: - UI Unit Tests fails on litellm_internal_staging every push - The workflows role-gate test asserts fetch was never called at all - useCan now transitively fetches /organization/list via useIsOrgAdmin How it solves it: - Drop the over-broad assertion, keep the scoped /v1/workflows check - Matches what PR #35176 already did for th
## TLDR Problem this solves: - UI Unit Tests are red on litellm_internal_staging - `workflows/page.integration.test.tsx` still asserts zero fetches for a denied role How it solves it: - Scope the waitFor to `/v1/workflows` URLs, matching the neighbour memory and guardrails-monitor tests ## User Flow Not user-facing, test-only change ## Relevant issues None #
## TLDR Problem this solves: - osv-scan turned red on every PR after nanoid 3.3.17 got a CVE How it solves it: - lock-only bump of nanoid to 3.3.18 in the dashboard's package-lock ## User Flow Before: a contributor opens any PR and CI immediately fails on osv-scan, blocking review 1. They push a branch and open a PR against litellm_internal_staging 2. The os