v1.94.0-rc.1
Pre-release
Pre-release
Verify Docker Image Signature
All LiteLLM Docker images are signed with cosign. Every release is signed with the same key introduced in commit 0112e53.
Verify using the pinned commit hash (recommended):
A commit hash is cryptographically immutable, so this is the strongest way to ensure you are using the original signing key:
cosign verify \
--key https://raw.githubusercontent.com/BerriAI/litellm/0112e53046018d726492c814b3644b7d376029d0/cosign.pub \
ghcr.io/berriai/litellm:v1.94.0-rc.1Verify 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.94.0-rc.1/cosign.pub \
ghcr.io/berriai/litellm:v1.94.0-rc.1Expected 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(vertex_ai): surface Gemini grounding toolUsePromptTokenCount in Usage by @devin-ai-integration[bot] in #33533
- test(e2e): harness fixes for stage job green (skips + router/UI/budget) by @mubashir1osmani in #33634
- fix(router): resolve prompt cache minimum per model instead of a flat 1024 by @tin-berri in #33637
- fix(logging): classify async anthropic_messages and generate_content as async by @devin-ai-integration[bot] in #33589
- fix(ui): remove Chat item from dashboard leftnav by @devin-ai-integration[bot] in #33647
- fix(router): tag-aware pre-routing strategy selection for shared model_name by @devin-ai-integration[bot] in #33691
- fix(proxy): enforce max_parallel_requests as a per-slot concurrency gauge by @yassin-berriai in #32441
- fix(proxy): stop treating upstream model body field as a LiteLLM model on auth-enforced pass-through routes by @yassin-berriai in #33710
- fix(mcp): expand toolset grants in shared permission primitives so tools/call honors them by @tin-berri in #33612
- feat(complexity-router): user-triggered escalation keywords by @devin-ai-integration[bot] in #33656
- fix(fireworks_ai): bill prompt-cache hits at cache_read rate by @devin-ai-integration[bot] in #33714
- fix(pricing): mark realtime-only gpt-realtime models as mode realtime by @devin-ai-integration[bot] in #33728
- fix(rag): track LLM completion usage and spend for /v1/rag/query by @yassin-berriai in #32438
- feat(anthropic): add enable_anthropic_prompt_caching for automatic cache_control injection by @tin-berri in #33573
- fix(anthropic): self-heal on missing thinking-signature errors from Bedrock/Vertex by @devin-ai-integration[bot] in #33719
- fix(proxy): resolve router_settings.plugins dotted paths and load plugins from installed packages by @devin-ai-integration[bot] in #33644
- test(e2e): budget refusals are 429 for bare keys and team caps block every team key by @ryan-crabbe-berri in #33632
- feat(router): add router plugin reference catalog by @yuneng-berri in #33746
- test(e2e): assert an org budget block is a 429 naming the organization by @ryan-crabbe-berri in #33638
- fix(proxy): bill partial streamed spend when the client disconnects mid-stream by @yassin-berriai in #33736
- test(e2e): delete unreferenced Grafana panel docs by @yassin-berriai in #33743
- docs(tests/e2e): align skip-vs-fail docs with the hard-fail contract and scope the no-unit-tests rule by @yassin-berriai in #33755
- refactor(e2e): replace bespoke result reporter with standard JUnit report by @yassin-berriai in #33758
- test(e2e): user budget across keys and team member budget isolation by @yassin-berriai in #33745
- refactor(e2e): remove bob_the_builder; drive remediation from a Grafana alert (provisioned outside the repo) by @yassin-berriai in #33749
- feat(mcp): per-server outcomes for aggregate tools/list and truthful single-server REST statuses by @tin-berri in #33153
- test(e2e): mcp suite for key-without-access denial by @yassin-berriai in #33752
- chore(ci): merge oss branch by @yuneng-berri in #33784
- chore(ci): merge oss branch - July 17th by @yuneng-berri in #33793
- fix(ui): migrate tag deletion to shared DeleteResourceModal by @yuneng-berri in #33795
- build(rust): raise pyo3 to 0.29 so the native bridge compiles on Python 3.14 by @yuneng-berri in #33798
- chore(guardrails): remove docstring from singulr module for consistency by @yuneng-berri in #33800
- fix(ui): stop credential edit from persisting the masked api key by @ryan-crabbe-berri in #33797
- build(deps): allow redisvl, pypdf, and openapi-core on Python 3.14 by @yuneng-berri in #33801
- test(proxy): make streaming-cancel mocks awaitable for the disconnect slot release by @yuneng-berri in #33802
- test(e2e): a member's team budget cuts off only that member's key by @ryan-crabbe-berri in #33718
- test(e2e): a user's max_budget follows the person across personal and team keys by @ryan-crabbe-berri in #33762
- test(e2e): skip flaky OpenAI GPT cells; raise multi-window max_tokens by @mubashir1osmani in #33799
- chore: remove accidentally committed dist tarball and ignore dist/ by @yuneng-berri in #33805
- fix(passthrough): stop classifying plain 'predict'/'search' paths as Vertex by @devin-ai-integration[bot] in #33658
- build(deps): bump mcp lock to 1.28.1 to clear image-scan findings by @yuneng-berri in #33803
- test(pricing): pin the realtime mode assertion to the bundled cost map by @yuneng-berri in #33806
- fix(proxy): derive session id from Anthropic metadata.user_id for session affinity by @devin-ai-integration[bot] in #33723
- test(e2e): budget reset diagonal for team, org, user, and #32005 team-member keys by @ryan-crabbe-berri in #33771
- fix(proxy): source /v1/models token limits from the cost map instead of Router.get_model_group_info by @devin-ai-integration[bot] in #33721
- fix(fireworks_ai): correct glm-5p2 prompt-cache read price to $0.14/1M by @tin-berri in #33796
- feat(proxy): add x-litellm-model-name response header with deployment model string by @devin-ai-integration[bot] in #33698
- feat: add Straiker guardrail integration by @yucheng-berri in #33781
- fix(vertex_ai): exclude Gemini Google Search grounding tokens from input token billing by @devin-ai-integration[bot] in #33742
- feat(fireworks_ai): map litellm session id to x-session-affinity header for prompt caching by @devin-ai-integration[bot] in #33717
- feat(ui): configure Anthropic automatic prompt caching from the Admin UI by @tin-berri in #33581
- fix(router): enforce context-window pre-call checks for Responses API input by @devin-ai-integration[bot] in #33706
- fix(otel): restore proxy-level error.* attributes on v2 failure spans (LIT-4179) by @devin-ai-integration[bot] in #33664
- fix(mcp): persist config.yaml DCR clients in a server-scoped store so refresh survives token expiry by @tin-berri in #33768
- refactor(ui): consolidate Add/Edit credential modals into one CredentialModal by @ryan-crabbe-berri in #32572
- feat(mcp): add ID-JAG (identity assertion authorization grant) support for MCP egress by @yassin-berriai in #31516
- refactor(ui): migrate policy attachments table onto shared DataTable by @yuneng-berri in #33827
- docs(litellm-rust): add provider coding standards by @devin-ai-integration[bot] in #33833
- test(e2e): rename Gateway to ProxyClient and expose it as a session-scoped pytest fixture by @yassin-berriai in #33750
- feat(messages): route Azure Anthropic /messages through Rust behind rust:true by @devin-ai-integration[bot] in #33616
- test(e2e): add Locust throughput load test that runs last by @yassin-berriai in #33748
- fix(proxy): resolve team wildcard credentials for vector store files by @shivamrawat1 in #33649
- refactor(e2e): fold claude_code HTTP probes onto shared ProxyClient methods by @yassin-berriai in #33760
- test(e2e): harden stage flakes for batches, UI, and MCP by @mubashir1osmani in #33831
- fix(e2e): migrate load suite from e2e_gateway to ProxyClient by @mubashir1osmani in #33839
- chore(e2e): remove tests/e2e/docker-compose.yml by @devin-ai-integration[bot] in #33837
- test(e2e): cover /v1/responses openai basic nonstream and stream by @devin-ai-integration[bot] in #33830
- test(e2e): cover /v1/responses openai cost_logged and tool_use by @devin-ai-integration[bot] in #33835
- test(e2e): cover /v1/responses OpenAI vision and Anthropic basic by @devin-ai-integration[bot] in #33838
- test(e2e): spendlog cost for streaming /v1/messages via responses bridge by @yassin-berriai in #33753
- fix(docker): bake prisma CLI and engines at a fixed path so fresh-DB migrations work for any uid offline by @yuneng-berri in #33853
- feat(chat-ui): add personal Logs view scoped to the current user by @devin-ai-integration[bot] in #33829
- chore: bump litellm-proxy-extras 0.4.78 -> 0.4.79 by @yuneng-berri in #33855
- docs(litellm-rust): require the official Rust Style Guide in agent rules by @devin-ai-integration[bot] in #33867
- fix(router): treat malformed configured token limits as absent on /v1/models by @yuneng-berri in #33864
- chore: rebuild admin UI bundle for the rc release by @yuneng-berri in #33857
- docs(rust): add provider abstraction standards by @devin-ai-integration[bot] in #33865
- chore(ci): promote internal staging to main by @yuneng-berri in #33868
Full Changelog: v1.94.0-dev.3...v1.94.0-rc.1