v1.98.0-rc.1Pre-release
Added 8
- Calibrate the complexity router classifier rubric with worked examples, selectable per router
- Pre-adoption shadow eval for the auto-router with blind pairwise judge and derived state
- Migrate playground chat controls to shadcn in UI
- Add day-0 pricing for grok-4.6
- Add meta/muse-spark-1.2 model pricing and its contributor tier
- Show provider prompt cache tokens in chat response metrics in UI
- Add Fireworks FW model pricing on Azure AI Foundry
- Enable xhigh reasoning support for gpt-5.4-mini models
Changed 7
- Bump nanoid to 3.3.18
- Migrate TokenFlow and JsonViewer to shadcn in UI
- Migrate SimpleMessageBlock and SimpleToolCallBlock to shadcn in UI
- Migrate HistoryTree and CollapsibleMessage to shadcn in UI
- Replace Any with precise types across responses, proxy, and llms modules
- Migrate TruncatedValue and OutputCard to shadcn in UI
- Migrate SectionHeader and ToolsSection to shadcn in UI
Fixed 5
- Drop toolSpec.strict for Claude Sonnet 5 on Converse in Bedrock
- Stop scoring system prompt text for code/technical complexity in router
- Map step and turn history to Responses API roles and content types in interactions
- Restore playground model filtering by endpoint in UI
- Stop forwarding custom_llm_provider twice in proxy batches list and cancel operations
Verify Docker Image Signature
All LiteLLM Docker images are signed with cosign. Every release is signed with the same key introduced in commit 0112e53.
Verify using the pinned commit hash (recommended):
A commit hash is cryptographically immutable, so this is the strongest way to ensure you are using the original signing key:
cosign verify \
--key https://raw.githubusercontent.com/BerriAI/litellm/0112e53046018d726492c814b3644b7d376029d0/cosign.pub \
ghcr.io/berriai/litellm:v1.98.0-rc.1
Verify using the release tag (convenience):
Tags are protected in this repository and resolve to the same key. This option is easier to read but relies on tag protection rules:
cosign verify \
--key https://raw.githubusercontent.com/BerriAI/litellm/v1.98.0-rc.1/cosign.pub \
ghcr.io/berriai/litellm:v1.98.0-rc.1
Expected output:
The following checks were performed on each of these signatures:
- The cosign claims were validated
- The signatures were verified against the specified public key
What's Changed
- fix(bedrock): drop toolSpec.strict for Claude Sonnet 5 on Converse by @kr0k in https://github.com/BerriAI/litellm/pull/33196
- build(deps): bump nanoid to 3.3.18 to clear osv-scan by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/36787
- fix(router): stop scoring system prompt text for code/technical complexity by @tin-berri in https://github.com/BerriAI/litellm/pull/36721
- feat(complexity_router): calibrate the classifier rubric with worked examples, selectable per router by @tin-berri in https://github.com/BerriAI/litellm/pull/36578
- fix(interactions): map step and turn history to Responses API roles and content types by @mateo-berri in https://github.com/BerriAI/litellm/pull/36733
- fix(ui): restore playground model filtering by endpoint by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/36130
- fix(proxy/batches): stop forwarding custom_llm_provider twice in list and cancel by @anxkhn in https://github.com/BerriAI/litellm/pull/32813
- refactor(ui): migrate TokenFlow and JsonViewer to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36735
- feat: pre-adoption shadow eval for the auto-router (blind pairwise judge, derived state) by @tin-berri in https://github.com/BerriAI/litellm/pull/36587
- refactor(ui): migrate SimpleMessageBlock and SimpleToolCallBlock to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36737
- refactor(ui): migrate HistoryTree and CollapsibleMessage to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36738
- refactor: replace Any with precise types across responses, proxy, and llms modules by @mateo-berri in https://github.com/BerriAI/litellm/pull/36763
- refactor(ui): migrate TruncatedValue and OutputCard to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36739
- refactor(ui): migrate SectionHeader and ToolsSection to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36793
- feat(ui): migrate playground chat controls to shadcn by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/36129
- feat(xai): day-0 pricing for grok-4.6 by @mateo-berri in https://github.com/BerriAI/litellm/pull/36805
- feat(ui): highlight Auto Router in the navbar announcement by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/36315
- test(e2e): assert the model allow-list permits, not only denies by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36823
- fix(proxy): tolerate a concurrent creator when creating spend views by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36824
- fix(proxy): honor explicit null budget_duration on team and key create + clearable UI dropdowns by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/36699
- feat(model_prices): add meta/muse-spark-1.2 and its contributor tier by @mateo-berri in https://github.com/BerriAI/litellm/pull/36717
- fix(auth): carry team grants in lite login session tokens by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36826
- feat(ui): show provider prompt cache tokens in chat response metrics by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36827
- fix(auth): stop the team fallback from widening model access by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36837
- fix(proxy/team): resolve member_delete cleanup by user id, not the addressed email by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36839
- fix(cli): launch agents as a child process on Windows by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36822
- feat(ui): shadow evals tab beside auto-router usage by @tin-berri in https://github.com/BerriAI/litellm/pull/36588
- feat(cli): make the hidden
litecommand list configurable by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36816 - feat(azure_ai): add Fireworks FW model pricing on Azure AI Foundry by @emerzon in https://github.com/BerriAI/litellm/pull/35613
- fix: enable xhigh reasoning support for gpt-5.4-mini models by @emerzon in https://github.com/BerriAI/litellm/pull/26909
- feat(azure-ai): add Grok 4.3 model metadata by @emerzon in https://github.com/BerriAI/litellm/pull/27932
- feat(ui): render request metrics on the /ui/chat surface by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36845
- fix(ui): stop a deselected MCP server keeping its grant on a virtual key by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36840
- fix(team): sweep dangling team references and cache on team delete by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36819
- fix(mcp): resolve admin OAuth sessions from any worker via DB-backed drafts by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36844
- refactor(ui): migrate usage to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36834
- refactor(ui): migrate guardrails-monitor to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36838
- refactor(ui): migrate playground to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36847
- refactor(ui): migrate guardrails to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36832
- fix(batches): stop uncostable batches from starving the cost poll page by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/36714
- perf(spend-logs): bound retention cleanup so one run cannot saturate the database by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36594
- fix(proxy): fail config load when a callbacks entry is not dispatchable by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36858
- fix(bedrock): hoist custom.defer_loading before dropping custom on invoke tools by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36855
- fix(access groups): sync assigned_key_ids from the key write paths by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36843
- fix(mcp): expose client HTTP headers to logging callbacks and hooks by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/36724
- fix(ptu): stop per-token billing on a PTU-configured deployment by @yucheng-berri in https://github.com/BerriAI/litellm/pull/36829
- fix(ui): add nvidia riva to the model provider list by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/36769
- fix(scripts): end make check with a ran/skipped summary and verdict by @mateo-berri in https://github.com/BerriAI/litellm/pull/36864
- fix(proxy): track spend for OpenAI passthrough /v1/embeddings by @lostmartian in https://github.com/BerriAI/litellm/pull/36660
- test(proxy): stop monkeypatch.undo re-planting fixture-mocked prisma_client by @mateo-berri in https://github.com/BerriAI/litellm/pull/36872
- fix(access groups): sync assigned_team_ids from the team write paths by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36825
- ci: drop the CircleCI ui_build and ui_unit_tests jobs by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36893
- fix(langfuse)!: source the emitted metadata blob from StandardLoggingPayload by @yucheng-berri in https://github.com/BerriAI/litellm/pull/36744
- refactor(ui): migrate Navbar off antd to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36902
- refactor(ui): migrate log details drawer off antd to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36904
- refactor(ui): migrate AI Hub off antd and tremor to shadcn by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36908
- refactor(ui): move the shared dropdowns and selectors onto shadcn primitives by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36924
- refactor(ui): move the root-level dashboard components onto shadcn primitives by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36927
- refactor(ui): move the settings page and bulk user invite onto shadcn primitives by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36936
- refactor(ui): move the cost tracking components onto shadcn primitives by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36955
- ci: drop the duplicate proxy_unit_tests letter-shard workflow by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36866
- refactor(ui): migrate shared common_components off antd and tremor by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36910
- refactor(ui): migrate key info and permissions views off antd and tremor by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36913
- feat(proxy): serve Anthropic-native /v1/models for Claude Code gateway discovery by @Ar-maan05 in https://github.com/BerriAI/litellm/pull/35455
- refactor(ui): migrate router settings and shared badges off antd and tremor by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36915
- refactor(ui): move the model hub and model select onto shadcn primitives by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36918
- fix(ui): keep the cost tracking removal confirmation open until it settles by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36960
- refactor(ui): declare DateRangePickerValue locally instead of importing it from tremor by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36962
- fix(main): an explicit provider outranks a known OpenAI model name by @FahimaGold in https://github.com/BerriAI/litellm/pull/36800
- fix(exception_mapping): bare 429 in an error body no longer outranks the status code by @FahimaGold in https://github.com/BerriAI/litellm/pull/36705
- refactor(ui): move MCP permission panels onto shadcn primitives by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36964
- refactor(ui): migrate ten small dashboard files off antd and tremor by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36966
- fix(proxy): force prisma recreate on postgres cached-plan error by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/36428
- fix(transcription): stop a zero output rate from zeroing transcription cost by @hMED22 in https://github.com/BerriAI/litellm/pull/36914
- fix(langfuse): restrict trace steering keys to real langfuse trace fields by @yucheng-berri in https://github.com/BerriAI/litellm/pull/36862
- Revert "fix(auth): stop the team fallback from widening model access" (#36837) by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36982
- fix(ui): show zeroed auto-router usage stats when a window has no sessions by @tin-berri in https://github.com/BerriAI/litellm/pull/36868
- fix(mcp): keep admin-entered oauth endpoints in management reads by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/36888
- fix(ui): distinguish hosted and local vLLM in the provider dropdown by @mateo-berri in https://github.com/BerriAI/litellm/pull/36974
- fix(openai,azure): return a length-truncated 200 when the output budget fits no token by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36859
- fix(proxy): always emit the Anthropic /v1/models token limits, null when unknown by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36961
- feat(helm): add startupProbe and hpa.behavior to the componentized chart by @Louis-Vauterin in https://github.com/BerriAI/litellm/pull/36382
- fix(proxy): serve aggregate MCP endpoint on bare /mcp instead of 307-redirecting by @tin-berri in https://github.com/BerriAI/litellm/pull/34845
- feat(shadow_eval): add reverse-direction shadow eval jobs by @tin-berri in https://github.com/BerriAI/litellm/pull/36865
- fix(proxy): requeue Redis spend buffer transactions when the DB commit fails by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/33881
- feat(search): add Nimble as a search provider by @ilchemla in https://github.com/BerriAI/litellm/pull/36347
- fix(mcp): drop caller host and configured upstream headers from logged metadata by @yucheng-berri in https://github.com/BerriAI/litellm/pull/36901
- fix(azure_ai): recognize real Search doc endpoints so teams can read/write via passthrough by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/36798
- fix(anthropic): aggregate 5m/1h cache-write split across iterations path by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34860
- fix(anthropic cost): apply regional geo uplift to cached tokens by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34850
- fix(ui): match the MCP servers count badge to its sibling permission badges by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36984
- fix(batches): mark terminal batch with no output file as processed in CheckBatchCost by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/35360
- fix(caching): cache anthropic /v1/messages responses, including streaming by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/34581
- fix(anthropic_messages): make tool_result images visible to OpenAI-compatible providers by @hMED22 in https://github.com/BerriAI/litellm/pull/34462
- feat(fireworks_ai): translate NIM/vLLM extra params to Fireworks-native args by @milesadkins in https://github.com/BerriAI/litellm/pull/35969
- fix(ui): stop the models tab strip from scrolling vertically by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36993
- fix(ui): anchor chips-combobox popups to the field instead of the inner input by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36995
- feat(proxy): per-component response cost headers by @erensh27 in https://github.com/BerriAI/litellm/pull/36965
- fix(cost): track OpenAI/Azure web search tool cost per call by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/35286
- fix(bedrock): resolve aliases in batch file records by @daleselaji-dev in https://github.com/BerriAI/litellm/pull/36159
- fix: report real token usage on guardrail-blocked /v1/responses replies by @guptaishaan in https://github.com/BerriAI/litellm/pull/36907
- fix(proxy): requeue spend logs when the DB write fails with a transport error by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/36716
- fix(cost): tiered pricing supports cache creation cost and is all-or-nothing by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/36720
- fix(vertex_ai): translate /v1/embeddings batch rows to the Gemini embedding shape by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/35092
- docs(claude): require ReadOnly on every TypedDict field (LIT012) by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/37005
- refactor(ui): migrate access group create modal to RHF + zod + shadcn by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/37033
- refactor(ui): re-sync badge and skeleton onto the base-vega shadcn style by @yuneng-berri in https://github.com/BerriAI/litellm/pull/36991
- feat(ui): link user detail team names to team pages by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/37022
- fix(model_prices): correct DeepSeek V4 max output tokens by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/36925
- fix(ui): rename models table Status column to Source by @ryan-crabbe-berri in https://github.com/BerriAI/litellm/pull/37021
- chore: bump litellm-enterprise 0.1.55 -> 0.1.56, litellm-proxy-extras 0.4.85 -> 0.4.86 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/37045
- feat(proxy): gate the Global Control Plane worker registry on an enterprise license by @yassin-berriai in https://github.com/BerriAI/litellm/pull/36996
- fix(model_prices): add gemini 3.1 flash tts preview and legacy OpenAI shutdown dates by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/36788
- fix(panw_prisma_airs): surface scan_id on allowed requests by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/37037
- fix(model_map): flag native structured outputs on Anthropic-direct claude-sonnet-5 and claude-haiku-4-5 by @anmolg1997 in https://github.com/BerriAI/litellm/pull/35930
- fix(router): stop get_router_model_info from wiping cached pricing by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/36985
- fix(redis): unwrap decorated __init__s when deriving the from_url kwargs allowlist by @anmolg1997 in https://github.com/BerriAI/litellm/pull/36654
- fix(proxy): reserve the larger declared output budget for TPM limits by @yassin-berriai in https://github.com/BerriAI/litellm/pull/37001
- fix(databricks): surface provider usage, including prompt-cache counts, in streaming chunks by @pokepoke81 in https://github.com/BerriAI/litellm/pull/36943
- fix(spend): give a batch's cost row a primary key of its own by @marty-sullivan in https://github.com/BerriAI/litellm/pull/36876
- feat: shadow eval samples /v1/messages and /v1/responses traffic by @tin-berri in https://github.com/BerriAI/litellm/pull/36830
- fix(ptu): stop a PTU deployment billing for grounded search by @yucheng-berri in https://github.com/BerriAI/litellm/pull/37043
- fix(fireworks_ai): support router slugs via routers/ prefix by @heathriel in https://github.com/BerriAI/litellm/pull/34257
- fix(bedrock): register managed-batch litellm_params so they stop leaking to the provider (internal copy of #36633) by @mateo-berri in https://github.com/BerriAI/litellm/pull/37048
- fix(bedrock): resolve the managed-batch output bucket on every path that reads it by @mateo-berri in https://github.com/BerriAI/litellm/pull/37047
- fix(bedrock): resolve the managed-batch output bucket on every path that reads it by @marty-sullivan in https://github.com/BerriAI/litellm/pull/36634
- feat(scripts): queue heavy gates behind a machine-wide slot lock by @mateo-berri in https://github.com/BerriAI/litellm/pull/36988
- feat(mcp): scope gateway session bearers to the RFC 8707 resource by @tin-berri in https://github.com/BerriAI/litellm/pull/35045
- feat(ui): direction picker and reverse-mode display for shadow evals by @tin-berri in https://github.com/BerriAI/litellm/pull/36994
- fix(guardrails): return the full PANW AIRS scan response on blocked requests by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/37036
- fix(passthrough): stop forwarding client Accept-Encoding upstream by @mateo-berri in https://github.com/BerriAI/litellm/pull/37058
- fix(batches): account a managed batch's cost exactly once by @mateo-berri in https://github.com/BerriAI/litellm/pull/37050
- fix(panw_prisma_airs): scan tool call args as plain text, not a tool_event by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/37038
- feat(lint): exempt TypedDict-annotated dict literals from LIT002 by @mateo-berri in https://github.com/BerriAI/litellm/pull/36869
- docs(claude): tell agents to let heavy gates queue for machine-wide slots by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/37057
- test: unstick the suites CircleCI is failing on by @yuneng-berri in https://github.com/BerriAI/litellm/pull/37059
- docs(github): proof-of-fix section shows only the latest run as Before/After with nested cases by @mateo-berri in https://github.com/BerriAI/litellm/pull/37063
- test(e2e): assert provider error shape instead of pinned prose by @yuneng-berri in https://github.com/BerriAI/litellm/pull/37065
- fix(ui): de-duplicate the reset budget option and polish shadcn surfaces by @yuneng-berri in https://github.com/BerriAI/litellm/pull/37010
- chore: rebuild Admin UI bundle from litellm_internal_staging by @yuneng-berri in https://github.com/BerriAI/litellm/pull/37066
- test(e2e/ui): assert the log drawer chevrons by their lucide classes by @yuneng-berri in https://github.com/BerriAI/litellm/pull/37069
- chore(ci): promote internal staging to main by @yuneng-berri in https://github.com/BerriAI/litellm/pull/37042
New Contributors
- @kr0k made their first contribution in https://github.com/BerriAI/litellm/pull/33196
- @anxkhn made their first contribution in https://github.com/BerriAI/litellm/pull/32813
- @lostmartian made their first contribution in https://github.com/BerriAI/litellm/pull/36660
- @FahimaGold made their first contribution in https://github.com/BerriAI/litellm/pull/36800
- @Louis-Vauterin made their first contribution in https://github.com/BerriAI/litellm/pull/36382
- @ilchemla made their first contribution in https://github.com/BerriAI/litellm/pull/36347
- @milesadkins made their first contribution in https://github.com/BerriAI/litellm/pull/35969
- @erensh27 made their first contribution in https://github.com/BerriAI/litellm/pull/36965
- @guptaishaan made their first contribution in https://github.com/BerriAI/litellm/pull/36907
- @pokepoke81 made their first contribution in https://github.com/BerriAI/litellm/pull/36943
- @heathriel made their first contribution in https://github.com/BerriAI/litellm/pull/34257
Full Changelog: https://github.com/BerriAI/litellm/compare/v1.98.0-dev.2...v1.98.0-rc.1