v1.98.0rc1 - Provisioned Throughput Billing, Shadow Evals & Routing Groups
Deploy this version​
- Docker
- Pip
docker run \
-e STORE_MODEL_IN_DB=True \
-p 4000:4000 \
docker.litellm.ai/berriai/litellm:1.98.0-rc.1
pip install litellm==1.98.0rc1
The Langfuse metadata blob is now sourced from the StandardLoggingPayload allowlist instead of raw request metadata. Roughly 20 fields no longer appear on the generation, measured live at 52 keys down to 38, so any saved Langfuse filter, dashboard, or alert built on model_group, model_info, deployment, deployment_model_name, model_group_alias, model_group_size, litellm_api_version, litellm_received_at, litellm_parent_otel_span, queue_time_seconds, attempted_retries, max_retries, agent_id, caller_tags, inherited_tags, global_max_parallel_requests, user_api_key, or the remaining user_api_key_* budget and permission-id fields will stop matching. model_group and the deployment id are still recoverable from hidden_params. Direct-SDK callers passing flat custom metadata must nest it, metadata={"metadata": {"my_key": "v"}}, and it arrives under requester_metadata; proxy callers are unaffected. debug_langfuse now emits caller scalars rather than the raw metadata dump. See PR #36744.
The Global Control Plane worker registry now requires an Enterprise license. A proxy configured with worker_registry and no valid LITELLM_LICENSE refuses to boot instead of silently running unlicensed. Set a valid license to keep the control plane, or remove the worker_registry key to start without it. See PR #36996.
A litellm_settings.callbacks entry whose dotted path names a class now fails config load. Those entries used to be accepted and silently inert: the proxy booted, served traffic, and never ran the hook. Point the entry at an instance or a function, for example custom_callbacks.proxy_handler_instance, to start again. See PR #36858.
Key Highlights​
- Reserved capacity is billed as reserved capacity - a deployment can now carry
ptu_countandcost_per_ptu_per_hourwith an effective window, the daily rollup writes per-model flat cost by active hour, and per-token billing is switched off entirely on that deployment so a team paying for provisioned throughput is no longer charged twice for the same traffic. Attribution is opt-in behind an env var, and a price sent alongside PTU config is rejected with a 400 - You can measure the auto-router before you adopt it - a shadow eval job samples a slice of one key's successful traffic, replays it through the auto-router in a detached task that never serves a response or adds latency, and has an LLM judge compare both answers blind with randomized A/B labels. Counts, status, judge spend, and win rates by tier and incumbent model are all derived at read time from one append-only row per sample, and the job also runs in reverse
- Routing groups are callable models -
model=<group_name>now routes across the union of member deployments using the group's own strategy, group names appear in/v1/modelsso Claude Code and Codex discovery surface them, and they are grantable on keys and teams. The Create Group modal has promised this since day one - Every response can state its own cost breakdown - six
x-litellm-response-cost-*headers ship next to the total, where input, cache read, cache creation, output, and tool usage sum exactly to the total and reasoning is a subset of output, so a platform team attributes spend per component with no local pricing table - TPM reservations follow declared output size - expected output tokens are now declarable per key, per team, and per model instead of one static floor for every tenant, so concurrent requests stop overrunning a team's TPM limit and teams whose models emit far less stop being throttled. No config means byte-identical behavior and no migration
- The Admin UI finished its move off antd and Tremor - 74 UI pull requests in this window carry the dashboard onto shadcn (base-vega) primitives, covering the navbar, playground, guardrails, usage, cost tracking, models and endpoints, team and user surfaces, the log details drawer, the AI Hub, and the shared component library
New Providers and Endpoints​
New Providers (1 new provider)​
| Provider | Supported LiteLLM Endpoints | Description |
|---|---|---|
| Nimble | /search | Nimble's Search API as the 18th native search provider, registered in the provider enum, config map, pricing map, and dashboard, priced at $0.005 per query |
New LLM API Endpoints (2 new endpoints)​
| Endpoint | Method | Description | Documentation |
|---|---|---|---|
/v1/indexes | GET | Admin-only listing of every registered vector store index, newest first, so indexes created through POST /v1/indexes can be audited | Vector Stores |
/auto_router/shadow_eval/{start,stop,{job_id}} | POST, GET | Start, stop, and read a pre-adoption shadow eval job for an auto-router, returning derived counts, judge spend, latest error, and win rates | Auto Router |
New Models / Updated Models​
New Model Support (52 new models)​
| Provider | Model | Context Window | Input ($/1M tokens) | Output ($/1M tokens) | Features |
|---|---|---|---|---|---|
| Anthropic | claude-mythos-5 | 1M | $10.00 | $50.00 | Reasoning, adaptive thinking, xhigh and max reasoning effort, vision, PDF input, computer use, function calling, tool choice, prompt caching, response schema, output config |
| Anthropic | claude-mythos-preview | 1M | $10.00 | $50.00 | Reasoning, adaptive thinking, xhigh and max reasoning effort, vision, PDF input, computer use, function calling, tool choice, prompt caching, response schema, output config |
| OpenAI | gpt-transcribe | - | - | - | Audio transcription, $0.000075 per second |
| OpenAI | gpt-live-transcribe | - | - | - | Audio transcription, $0.00028333 per second |
| OpenAI | gpt-realtime-translate | 16K | - | - | Realtime, audio input and output, $0.00056667 per second |
| Google Gemini | gemini/gemini-3.7-flash | 1M | $0.75 | $3.75 | Reasoning, vision, audio input, video input, PDF input, function calling, parallel function calling, tool choice, prompt caching, response schema, web search, URL context, native streaming |
| Google Gemini | gemini/gemini-3.1-flash-tts-preview | 8K | $1.00 | $20.00 | Audio speech |
| Google Gemini | gemini/gemini-robotics-er-2-streaming-preview | - | $2.00 | $10.00 | Vision, audio input, video input, function calling, web search |
| Google Vertex AI | vertex_ai/gemini-3.7-flash | 1M | $0.75 | $3.75 | Reasoning, vision, audio input, video input, PDF input, function calling, parallel function calling, tool choice, prompt caching, response schema, web search, URL context, native streaming |
| Google Vertex AI | gemini-3.7-flash | 1M | $0.75 | $3.75 | Reasoning, vision, audio input, video input, PDF input, function calling, parallel function calling, tool choice, prompt caching, response schema, web search, URL context, native streaming |
| xAI | xai/grok-4.6 | 500K | $2.00 | $6.00 | Reasoning, vision, function calling, tool choice, prompt caching, response schema, web search, above-200K tier pricing |
| xAI | xai/grok-build-0.1 | 256K | $1.00 | $2.00 | Reasoning, vision, function calling, tool choice, prompt caching, response schema, above-200K tier pricing |
| xAI | xai/grok-4.20-0309-non-reasoning | 1M | $1.25 | $2.50 | Vision, function calling, tool choice, prompt caching, response schema, web search |
| xAI | xai/grok-4.20-multi-agent-0309 | 1M | $1.25 | $2.50 | Reasoning, vision, function calling, tool choice, prompt caching, response schema, web search |
| Mistral | mistral/mistral-small-2603 | 262K | $0.15 | $0.60 | Reasoning, function calling, tool choice, response schema, assistant prefill |
| Mistral | mistral/labs-leanstral-1-5 | 262K | $0.00 | $0.00 | Function calling, tool choice, response schema |
| Mistral | mistral/mistral-moderation-2603 | 131K | $0.00 | $0.00 | Moderation |
| Mistral | mistral/voxtral-mini-2602 | - | - | - | Audio transcription, $0.00005 per second |
| Mistral | mistral/voxtral-mini-transcribe-realtime-2602 | - | - | - | Audio transcription, $0.0001 per second |
| Mistral | mistral/voxtral-mini-tts-2603 | - | - | - | Audio speech, $0.000016 per output character |
| Groq | groq/qwen/qwen3.6-27b | 131K | $0.60 | $3.00 | Reasoning, vision, function calling, tool choice |
| Groq | groq/meta-llama/llama-prompt-guard-2-22m | 512 | $0.03 | $0.03 | Chat |
| Groq | groq/meta-llama/llama-prompt-guard-2-86m | 512 | $0.04 | $0.04 | Chat |
| Groq | groq/canopylabs/orpheus-v1-english | 4K | - | - | Audio speech, $0.000022 per character |
| Groq | groq/canopylabs/orpheus-arabic-saudi | 4K | - | - | Audio speech, $0.00004 per character |
| Meta | meta/muse-spark-1.2 | 1M | $1.25 | $4.25 | Reasoning, minimal and xhigh reasoning effort, vision, PDF input, function calling, parallel function calling, tool choice, prompt caching, response schema, web search |
| Meta | meta/muse-spark-1.2-contributor | 1M | $0.10 | $0.20 | Reasoning, minimal and xhigh reasoning effort, vision, PDF input, function calling, parallel function calling, tool choice, prompt caching, response schema, web search |
| Azure AI | azure_ai/grok-4.3 | 200K | $1.25 | $2.50 | Reasoning, vision, function calling, tool choice, prompt caching, response schema, web search |
| Azure AI | azure_ai/FW-DeepSeek-V3.2 | 164K | $0.62 | $1.85 | Reasoning, function calling, tool choice, prompt caching |
| Azure AI | azure_ai/FW-DeepSeek-V4-Pro | 1M | $1.925 | $3.828 | Reasoning, function calling, tool choice, prompt caching |
| Azure AI | azure_ai/FW-GLM-5 | 200K | $1.10 | $3.52 | Reasoning, function calling, tool choice, prompt caching |
| Azure AI | azure_ai/FW-GLM-5.1 | 203K | $1.54 | $4.84 | Reasoning, function calling, tool choice, prompt caching |
| Azure AI | azure_ai/FW-GLM-5.2 | 1M | $1.54 | $4.84 | Reasoning, function calling, tool choice, prompt caching |
| Azure AI | azure_ai/FW-GLM-5.2-Fast | 1M | $2.10 | $6.60 | Reasoning, function calling, tool choice, prompt caching |
| Azure AI | azure_ai/FW-Inkling | 1M | $1.00 | $4.05 | Reasoning, function calling, tool choice, prompt caching |
| Azure AI | azure_ai/FW-Kimi-K2.5 | 262K | $0.66 | $3.30 | Reasoning, vision, function calling, tool choice, prompt caching |
| Azure AI | azure_ai/FW-Kimi-K2.6 | 262K | $1.045 | $4.40 | Reasoning, vision, function calling, tool choice, prompt caching |
| Azure AI | azure_ai/FW-Kimi-K2.7-Code | 262K | $1.05 | $4.40 | Reasoning, vision, function calling, tool choice, prompt caching |
| Azure AI | azure_ai/FW-Kimi-K3 | 1M | $3.30 | $16.50 | Reasoning, vision, function calling, tool choice, prompt caching |
| Azure AI | azure_ai/FW-MiniMax-M2.5 | 1M | $0.33 | $1.32 | Reasoning, function calling, tool choice, prompt caching |
| Azure AI | azure_ai/FW-MiniMax-M3 | 512K | $0.33 | $1.32 | Reasoning, vision, function calling, tool choice, prompt caching |
| Azure AI | azure_ai/FW-Nemotron-3-Ultra-NVFP4 | 262K | $0.60 | $2.40 | Reasoning, function calling, tool choice, prompt caching |
| DashScope | dashscope/deepseek-v4-flash | 1M | $0.20 | $0.40 | Reasoning, function calling, tool choice, prompt caching, response schema |
| DashScope | dashscope/deepseek-v4-flash-0731 | 1M | $0.20 | $0.40 | Reasoning, function calling, tool choice, prompt caching, response schema |
| DashScope | dashscope/deepseek-v4-pro | 1M | $2.40 | $4.80 | Reasoning, function calling, tool choice, prompt caching, response schema |
| DashScope | dashscope/glm-5.1 | 203K | $1.40 | $4.40 | Reasoning, function calling, tool choice, prompt caching, response schema |
| DashScope | dashscope/glm-5.2 | 1M | $1.40 | $4.40 | Reasoning, function calling, tool choice, prompt caching, response schema |
| DashScope | dashscope/kimi-k2.7-code | 229K | $0.95 | $4.00 | Reasoning, vision, function calling, tool choice, prompt caching, response schema |
| DashScope | dashscope/qwen3.8-max | 992K | $2.00 | $6.00 | Reasoning, vision, function calling, tool choice, prompt caching, response schema |
| DeepInfra | deepinfra/nvidia/NVIDIA-Nemotron-3.5-Lightning | 262K | $0.05 | $0.20 | Reasoning, function calling, tool choice |
| OpenRouter | openrouter/nvidia/nemotron-3.5-lightning | 262K | $0.05 | $0.20 | Reasoning, function calling, tool choice |
| Nimble | nimble/search | - | - | - | Search, $0.005 per query |
Beyond the new entries, this release is a large cost-map maintenance pass: 270 existing entries gain or correct a provider-announced deprecation_date across Bedrock, Mistral, Cohere, Gemini, OpenAI, and xAI, and 85 gain a search_context_cost_per_query block. xAI pricing is corrected in both directions: the grok-4.20 reasoning and non-reasoning variants drop from $2.00 / $6.00 to $1.25 / $2.50 per 1M and their context window is corrected from 2M to 1M, while grok-code-fast rises from $0.20 / $1.50 to $1.00 / $2.00. The Bedrock Mantle openai.gpt-5.6-sol, -terra, and -luna entries move from a 272K to a 1M context window with matching above-272K tiers, gpt-5-pro max output rises from 128K to 272K, the DeepSeek V4 entries go from 8K to 393K max output, and the Groq llama-3.1-8b-instant, llama-3.3-70b-versatile, and gpt-oss entries are resynced with Groq's own docs. Native structured output is flagged on 17 entries, supports_tool_search on 43, and reasoning-effort flags on a further 29. No pricing entries were removed.
Features​
- Fireworks AI
- Azure AI
- Google Gemini
- Day-0 pricing for
gemini-3.7-flash- PR #36792
- Day-0 pricing for
- xAI
- Day-0 pricing for
grok-4.6- PR #36805
- Day-0 pricing for
- DashScope
- Add the latest Model Studio models to the cost map - PR #36496
- Meta
- Add
meta/muse-spark-1.2and its contributor tier - PR #36717
- Add
- OpenRouter
- Add NVIDIA Nemotron 3.5 Lightning on OpenRouter and DeepInfra - PR #36696
- OpenAI
- Enable xhigh reasoning support for the
gpt-5.4-minimodels - PR #26909
- Enable xhigh reasoning support for the
Bug Fixes​
- Amazon Bedrock
- Use the deployment's credentials for AWS requests, and resolve aliases in batch file records - PR #36160, PR #36159
- Resolve the managed-batch output bucket on every path that reads it, and stop managed-batch
litellm_paramsleaking to the provider - PR #37047, PR #37048 - Drop
toolSpec.strictfor Claude Sonnet 5 on Converse - PR #33196 - Add a text block to Converse user messages carrying documents - PR #36499
- Send the tool-search beta header for Haiku 4.5 on Invoke
/v1/messages- PR #36502 - Preserve adaptive thinking effort through the
/v1/messagesbridge - PR #36507 - Hoist
custom.defer_loadingbefore droppingcustomon invoke tools - PR #36855 - Reject the Anthropic server-side
web_searchtool with an actionable error instead of a provider failure - PR #36473 - Enable native structured output for GLM 5 and DeepSeek V3.2, and advertise it on every Bedrock id - PR #35669, PR #36597
- Give the Bedrock Mantle GPT-5.6 Sol, Terra, and Luna entries a 1M context window with long-context pricing - PR #36698
- Anthropic
- Google Vertex AI
- Translate
/v1/embeddingsbatch rows to the Gemini embedding shape - PR #35092
- Translate
- Azure AI
- Recognize real Search doc endpoints so teams can read and write through passthrough - PR #36798
- Databricks
- Surface provider usage, including prompt-cache counts, in streaming chunks - PR #36943
- NVIDIA NIM
- Preserve image passages and stop sending
top_kto/v1/ranking- PR #34177
- Preserve image passages and stop sending
- Groq
- Sync the Groq registry with Groq's docs - PR #36664
- OpenAI
- Return a length-truncated 200 when the output budget fits no token - PR #36859
- General
- Ship boto3 with the base SDK so Bedrock works out of the box on
pip install litellm- PR #36568 - Let an explicit provider outrank a known OpenAI model name - PR #36800
- Refresh deprecation dates, correct xAI pricing, add missing provider models, and correct DeepSeek V4 max output - PR #36403, PR #36538, PR #36788, PR #36925
- Ship boto3 with the base SDK so Bedrock works out of the box on
LLM API Endpoints​
Features​
- Anthropic
/v1/messages- Serve an Anthropic-native
/v1/modelsso Claude Code's gateway discovery populates its model picker - PR #35455
- Serve an Anthropic-native
- Vector Stores
- Admin-only
GET /v1/indexeslisting every registered vector store index - PR #36289
- Admin-only
Bugs​
- Responses API
- Batches
- Stop forwarding
custom_llm_providertwice in list and cancel - PR #32813
- Stop forwarding
- Managed files
- Passthrough
- Stop forwarding the client's
Accept-Encodingupstream, which garbled Claude Code's/v1/modelsandcount_tokensbodies on stock Docker images once Anthropic began brotli-compressing JSON - PR #37058
- Stop forwarding the client's
- Anthropic
/v1/models- Always emit the token limits, null when unknown - PR #36961
- Web search
- Stop leaking interception control fields to providers - PR #36480
- General
Management Endpoints / UI​
Features​
- Virtual Keys
- Proxy CLI
- Make the hidden
litecommand list configurable through~/.litellm/config.json- PR #36816
- Make the hidden
- Auto-router screens
- Dashboard
- Render request metrics on the
/ui/chatsurface, including provider prompt cache tokens in the chat response metrics - PR #36845, PR #36827 - Show vector store indexes on the Vector Stores page - PR #36306
- Surface PTU inputs on the model form and flat cost on the Usage page - PR #35393
- Migrate the playground chat controls to shadcn - PR #36129
- Warn in the Admin UI when no Redis is configured - PR #36495
- Link user detail team names to their team pages - PR #37022
- Render request metrics on the
Bugs​
- Auth & roles
- Carry team grants in
lite loginsession tokens so team-bound CLI users stop seeing the whole proxy on/v1/models- PR #36826 - Expand config-defined model access groups when resolving team models for
/v2/model/info- PR #34211 - Treat SAML as configured in UI SSO detection - PR #36196
- Restore
management_v1query-param validation underfastapi>=0.140.7- PR #35773
- Carry team grants in
- Teams & access groups
- Sync
assigned_team_idsandassigned_key_idsfrom the team and key write paths - PR #36825, PR #36843 - Sweep dangling team references and cache on team delete - PR #36819
- Resolve
member_deletecleanup by user id rather than the addressed email - PR #36839 - Stop the duplicate legacy invitation email and fix its onboarding link - PR #36455
- Sync
- Proxy CLI
- Launch agents as a child process on Windows - PR #36822
- Dashboard
- Hide admin-only Logs tabs from roles that cannot call their endpoints, and restore the Deleted Teams tab for organization admins - PR #36333, PR #36478
- Gate organization and agent usage views, policy and prompt lookups, the Old Usage page, and four sidebar pages behind the roles their endpoints allow - PR #36334, PR #36335, PR #36469, PR #36475
- Scope the Virtual Keys and Logs team lists to the caller - PR #36472
- Show and edit key-level router settings on a virtual key - PR #36674
- Stop a deselected MCP server keeping its grant on a virtual key, and match the MCP servers count badge to its sibling permission badges - PR #36840, PR #36984
- Restore playground model filtering by endpoint, and distinguish hosted from local vLLM in the provider dropdown - PR #36130, PR #36974
- Add NVIDIA Riva to the model provider list - PR #36769
- Align the spend and budget columns, and rename the models table Status column to Source - PR #35176, PR #37021
- Show zeroed auto-router usage stats when a window has no sessions, and open the classifier prompt editor above the edit auto-router form - PR #36868, PR #36438
- Keep the cost tracking removal confirmation open until it settles, de-duplicate the reset budget option, stop the models tab strip scrolling vertically, and anchor chips-combobox popups to the field - PR #36960, PR #37010, PR #36993, PR #36995
- Dashboard internals: the shadcn migration
- Page-level migrations off antd and Tremor: guardrails-monitor, projects and logs, cost-optimization, cost-tracking, admin-panel, team settings, users dashboard, prompts, models-and-endpoints, guardrails, usage, playground, and the AI Hub - PR #34606, PR #36629, PR #36631, PR #36635, PR #36641, PR #36642, PR #36643, PR #36648, PR #36832, PR #36834, PR #36838, PR #36847, PR #36908
- Navbar, log details drawer, settings page and bulk user invite, key info and permissions views, router settings and shared badges, MCP permission panels, model hub and model select, shared dropdowns and selectors, root-level dashboard components, cost tracking components, shared
common_components, and ten remaining small files - PR #36902, PR #36904, PR #36936, PR #36913, PR #36915, PR #36964, PR #36918, PR #36924, PR #36927, PR #36955, PR #36910, PR #36966 - Log viewer internals: TokenFlow and JsonViewer, SimpleMessageBlock and SimpleToolCallBlock, HistoryTree and CollapsibleMessage, TruncatedValue and OutputCard, SectionHeader and ToolsSection, the guardrail and duration controls, search and user controls, team detail controls, and the policy impact popover - PR #36735, PR #36737, PR #36738, PR #36739, PR #36793, PR #36693, PR #36694, PR #36695, PR #36653
- Move the usage, guardrails content, and guardrails monitor tables onto the shared DataTable, make illegal DataTable prop combinations unrepresentable, migrate the access group create modal to RHF and zod, re-sync badge and skeleton onto the base-vega style, and declare
DateRangePickerValuelocally instead of importing it from Tremor - PR #36707, PR #36708, PR #36709, PR #36470, PR #37033, PR #36991, PR #36962
AI Integrations​
Logging​
- Langfuse
- Source the emitted metadata blob from the StandardLoggingPayload, so a team's own Langfuse credentials stop arriving inside that team's own traces - PR #36744
- Restrict trace steering keys to real Langfuse trace fields, and coerce header-sourced mask and trace-update steering values - PR #36862, PR #36740
- Emit the OTel trace version and release on the keys Langfuse v4 reads - PR #36702
- Arize
- Trace MCP tool calls instead of crashing on
CallToolResult- PR #36453
- Trace MCP tool calls instead of crashing on
- Slack alerting
- Dedupe scheduled Slack spend reports across pods - PR #36489
- General
Guardrails​
Spend Tracking, Budgets and Rate Limiting​
- Provisioned throughput (PTU)
- Configure
ptu_count,cost_per_ptu_per_hour, and an effective window on a model deployment - PR #35341 - Write per-model PTU flat cost by active hour in the daily rollup, and surface it on the daily activity read path - PR #35343, PR #35391
- Gate PTU flat-cost attribution behind an opt-in env var - PR #36138
- Stop per-token billing, and stop billing for grounded search, on a PTU-configured deployment - PR #36829, PR #37043
- Configure
- Rate limiting
- Cost tracking
- Emit six per-component
x-litellm-response-cost-*headers next to the total - PR #36965 - Track OpenAI and Azure web search tool cost per call, and bill xAI web search from
server_side_tool_usage_details- PR #35286, PR #30817 - Support cache creation cost in tiered pricing, all-or-nothing - PR #36720
- Net prompt-caching savings against the cache-write premium - PR #36452
- Apply the Anthropic regional geo uplift to cached tokens, and aggregate the 5m and 1h cache-write split across the iterations path - PR #34850, PR #34860
- Price dict-shaped image input token details at the image rate - PR #33490
- Stop a zero output rate from zeroing transcription cost - PR #36914
- Forward resolved provider and deployment pricing in
/cost/estimate- PR #35880 - Never price a strategy-router alias, and stop
get_router_model_infowiping cached pricing - PR #36691, PR #36985
- Emit six per-component
- Passthrough and batches
- Track spend for OpenAI passthrough
/v1/embeddings, inject streaming usage cost on OpenAI passthrough streams, and track streamed passthrough Responses cost - PR #36660, PR #36503, PR #36529 - Carry the budget reservation into passthrough request metadata, so successful requests stop leaking reservations into Redis and tripping false
BudgetExceededError- PR #36592 - Attribute Vertex and Anthropic passthrough batch cost to the creating key, team, and tags - PR #34456, PR #36468
- Account a managed batch's cost exactly once, give a batch's cost row a primary key of its own, mark a terminal batch with no output file as processed, and stop uncostable batches starving the cost poll page - PR #37050, PR #36876, PR #35360, PR #36714
- Strip NUL bytes from passthrough batch tags before the managed object write - PR #36688
- Track spend for OpenAI passthrough
- Spend logs and budgets
- Requeue Redis spend buffer transactions when the DB commit fails, requeue spend logs on a transport error, and stop losing rows when a flush is cancelled - PR #33881, PR #36716, PR #34826
- Atomic budget cascade with chunked reset scans in the reset budget job - PR #36287
- Honor an explicit null
budget_durationon team and key create, with clearable UI dropdowns - PR #36699 - Tolerate a concurrent creator when creating spend views - PR #36824
MCP Gateway​
- Scope gateway session bearers to the RFC 8707 resource - PR #35045
- Serve the aggregate MCP endpoint on bare
/mcpinstead of a 307 redirect - PR #34845 - Resolve admin OAuth sessions from any worker via DB-backed drafts, and keep admin-entered OAuth endpoints in management reads - PR #36844, PR #36888
- Bound MCP client requests with a session read timeout - PR #36675
- Expose client HTTP headers to logging callbacks and hooks - PR #36724
- Drop the caller host and configured upstream headers from logged metadata - PR #36901
Performance / Loadbalancing / Reliability improvements​
- Router & auto-router
- Make routing groups callable as virtual models and list them in
/v1/models- PR #36519 - Pre-adoption shadow eval for the auto-router with a blind pairwise judge, extended to sample
/v1/messagesand/v1/responsestraffic and to run reverse-direction jobs - PR #36587, PR #36830, PR #36865 - Calibrate the complexity classifier rubric with worked examples, selectable per router, and stop scoring system prompt text for code and technical complexity - PR #36578, PR #36721
- Add a required-AND (
&) tag prefix and anallow_fail_openflag, let untagged requests bypass a tagged pre-routing strategy on shared model names, and stop re-applying router-selecting request tags to the routed tier's deployments - PR #36193, PR #36627, PR #36628 - Forward auto-router alias params from the marker entry rather than the first same-name deployment - PR #36626
- Per-deployment
allowed_fails_policyandcooldown_timeoverrides, cooldown for failed fallback deployments, and a corrected cooldown TTL after Redis backfill - PR #34416, PR #35104 - Keep batch fallbacks inside the model group that owns the file - PR #36181
- Warn when a deployment's credentials contradict its provider - PR #36486
- Make routing groups callable as virtual models and list them in
- Streaming & connections
- Global
litellm_settings.sse_keepalive_ping_interval_seconds, on top of the per-deploymentkeepalive_secondsSSE heartbeat, so silent streams stop being killed by ingress idle timeouts - PR #36154, PR #34423 - Refactor HTTP handler initialization with client support - PR #30952
- Cache Anthropic
/v1/messagesresponses, including streaming - PR #34581 - Unwrap decorated
__init__s when deriving the Redisfrom_urlkwargs allowlist - PR #36654
- Global
- Database & background jobs
- Write each daily spend batch in one upsert statement - PR #36448
- Bound spend-logs retention cleanup so one run cannot saturate the database - PR #36594
- Stagger scheduled background jobs across jobs and pods - PR #36589
- Force a Prisma recreate on a Postgres cached-plan error - PR #36428
- Serialize model reconciles so concurrent model writes stop evicting each other - PR #36687
- Skip prisma-dependent hooks when no database is attached - PR #36273
- Deployment
Documentation Updates​
- Describe the Terraform provider release as automatic - PR #36467
- Require a user flow and a live-proxy proof in bug reports, and a user flow plus a stuck-at proof in feature requests - PR #36498, PR #36500
- Show only the latest run as Before/After in the proof-of-fix section, with nested cases - PR #37063
- Replace the Changes PR template section with Caveats - PR #36423
- Rewrite the CLAUDE.md comment rule with explicit any-of exceptions, require
ReadOnlyon every TypedDict field, tell agents to let heavy gates queue for machine-wide slots, and drop the@prefix from the PR template path - PR #36301, PR #36421, PR #37005, PR #37057, PR #36726
PR roll-up by ownership area​
PRs by ownership area (total: 276)
- UI: 74
- Models & Providers: 39
- Spend / Budgets / Rate Limits: 37
- Other (CI / chore / tests / build / version bumps): 36
- Performance: 27
- Auth & Management: 16
- LLM API Endpoints: 14
- Docs: 10
- Logging: 9
- Guardrails: 7
- MCP: 7
End-to-End Testing​
We are investing heavily in end-to-end testing to cut regressions and make LiteLLM more stable release over release. Every version is exercised by a live suite that runs against a real deployed proxy and hits real provider endpoints, not mocks, so the behavior we validate is the behavior you get in production.
This window added 18 test-only pull requests, 10 of them touching the live e2e suite. Vendor API coverage was hardened so that provider denials, disconnects, server errors, and missing credentials hard-fail instead of passing, and new cells cover Google-native generateContent framing, Prometheus queue time, the Anthropic web_search server tool on Bedrock, and the model allow-list's positive case rather than only its denials. Admin UI e2e tests no longer stop at a success toast: every mutating flow now asserts the outgoing request body and reads the resource back from the API, with new coverage for Logs, Playground, Usage, and MCP edit and delete. Three reproducers for open gateway gaps in passthrough headers and per-model budgets are checked in skipped, with the product gap named in each skip reason, so removing the skip becomes the regression test once a fix lands. On the maintenance side, OTel assertions now target the attempt that served the stream rather than the span count, live Bedrock tests were repointed off the retired Claude 3 Sonnet, and the stale antd selectors that were failing the UI suite on every run were repointed at what the migrated dashboard actually renders.
New Contributors​
- @Praveen11558 made their first contribution in PR #30952
- @geraint0923 made their first contribution in PR #30817
- @dcadenas made their first contribution in PR #32536
- @anxkhn made their first contribution in PR #32813
- @kr0k made their first contribution in PR #33196
- @vairodp made their first contribution in PR #33490
- @atomic made their first contribution in PR #34177
- @heathriel made their first contribution in PR #34257
- @eugene-yao-zocdoc made their first contribution in PR #34290
- @alexshtf made their first contribution in PR #35669
- @HuanQian571 made their first contribution in PR #35773
- @milesadkins made their first contribution in PR #35969
- @daleselaji-dev made their first contribution in PR #36160
- @fancybear-dev made their first contribution in PR #36196
- @ilchemla made their first contribution in PR #36347
- @Louis-Vauterin made their first contribution in PR #36382
- @william-xue made their first contribution in PR #36529
- @lostmartian made their first contribution in PR #36660
- @FahimaGold made their first contribution in PR #36705
- @guptaishaan made their first contribution in PR #36907
- @pokepoke81 made their first contribution in PR #36943
- @erensh27 made their first contribution in PR #36965
Full Changelog​
https://github.com/BerriAI/litellm/compare/v1.97.0-rc.1...v1.98.0-rc.1