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.104.0-dev.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.104.0-dev.1/cosign.pub \
ghcr.io/berriai/litellm:v1.104.0-dev.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
- build(deps): re-suppress GHSA-h7x2-h6g9-p789 in osv-scan, mlflow still has no fixed release by @devin-ai-integration[bot] in #41036
- feat(auth): add breached password detection to password policy by @ojensen-berri in #39321
- feat(auth): add self-service password change and plug plaintext password leaks by @ojensen-berri in #39562
- feat(auth): force password reset for breached or admin-set passwords by @ojensen-berri in #40107
- perf(proxy): serialize /model/info listing once with orjson by @devin-ai-integration[bot] in #41061
- fix(utils): stop wrapper_async submitting the sync success handler twice by @devin-ai-integration[bot] in #41058
- test(cost_map): stop pinning supports_reasoning absent on the openrouter o1 entry by @devin-ai-integration[bot] in #41734
- fix(model_prices): add cache-read pricing to Mistral chat models missing it by @devin-ai-integration[bot] in #41736
- refactor(rust): isolate legacy callback contract by @devin-ai-integration[bot] in #41752
- test(cost_map): drop tests that pin provider-owned catalog values by @devin-ai-integration[bot] in #41763
- test(e2e/ui): wait for the filtered budget list before clicking a row action by @yuneng-berri in #41756
- chore(prices): sync OpenRouter prices: 443 models, 191 new, 4 deprecated by @berriai-litellm-provider-info-sync[bot] in #41727
- fix(batches): bill Bedrock Titan embedding batch lines from inputTextTokenCount by @devin-ai-integration[bot] in #41767
- fix(proxy): persist only the keys a caller changed in save_config by @yuneng-berri in #41748
- chore(prices): sync OpenRouter prices: 2 models, 1 deprecated by @berriai-litellm-provider-info-sync[bot] in #41770
- fix(proxy): run prompt injection heuristics off the event loop by @devin-ai-integration[bot] in #41541
- fix(proxy): evict jwt key mapping cache on user, team, org, and bulk key deletion by @devin-ai-integration[bot] in #41707
- refactor(ui): remove unused HelpLink and HelpIcon components by @devin-ai-integration[bot] in #41644
- chore(ui): remove orphaned ROLE_STYLES and RoleStyle from pretty messages view by @devin-ai-integration[bot] in #41645
- chore(ui): remove never-rendered GuardrailConfig mock component and its test by @devin-ai-integration[bot] in #41646
- chore(ui): remove unused NewBadge component and its test by @devin-ai-integration[bot] in #41647
- chore(ui): remove dead compareUI ModelSelector and its test by @devin-ai-integration[bot] in #41649
- refactor(ui): remove unused createCredentialFromModel helper and CredentialValues interface by @devin-ai-integration[bot] in #41650
- refactor(ui): drop unused cost-tracking barrel re-exports and response types by @devin-ai-integration[bot] in #41651
- refactor(ui): drop unused rolesAllowedToSeeUsage, viewOnlyRoles and isViewOnlyRole exports by @devin-ai-integration[bot] in #41653
- chore(ui): remove unused access-groups type interfaces by @devin-ai-integration[bot] in #41655
- refactor(ui): remove dead networking exports and orphaned Claude Code marketplace helpers by @devin-ai-integration[bot] in #41656
- refactor(ui): remove dead useKeyList hook from key_list.tsx by @devin-ai-integration[bot] in #41657
- chore(ui): remove orphaned useDeleteProject hook and its test by @devin-ai-integration[bot] in #41658
- refactor(interactions): remove expired use_legacy_interactions_schema shim by @devin-ai-integration[bot] in #41663
- refactor(rust): align crates with Python package layering by @devin-ai-integration[bot] in #41829
- chore(prices): sync OpenRouter prices: 15 models, 6 deprecated by @berriai-litellm-provider-info-sync[bot] in #41772
- refactor(proxy): make the config file win over the database by @yuneng-berri in #41779
- fix(ui): let admins change a model's team from the model edit page by @devin-ai-integration[bot] in #40700
- fix(ui): show per-second pricing for video models instead of $0.00 token costs by @devin-ai-integration[bot] in #39308
- fix(cost): bill cache-read tokens at the input rate when the map has no cache-read rate by @devin-ai-integration[bot] in #41832
- fix(responses): honor nested additional_drop_params paths by @devin-ai-integration[bot] in #40730
- feat(router): reject with 429 when a deployment's max_parallel_requests slots are all in use by @devin-ai-integration[bot] in #41555
- perf: defer fastapi and tiktoken BPE imports out of import litellm by @devin-ai-integration[bot] in #41585
- feat(proxy): add Amazon Transcribe pass-through with completion-time job pricing by @devin-ai-integration[bot] in #41515
- feat(proxy): per-key default budget for dynamically created customers by @devin-ai-integration[bot] in #41636
- feat(mcp): show live gateway sessions by AI client and user by @devin-ai-integration[bot] in #41692
- ci: replace the title-similarity duplicate bot with a Codex semantic check by @ryan-crabbe-berri in #40935
- feat(proxy): temporary budget increase for team members by @devin-ai-integration[bot] in #41620
- feat(vault): add separate login and secret namespaces for HashiCorp Vault by @devin-ai-integration[bot] in #41539
- feat(vertex_ai): stream GCS batch output files from /v1/files/{id}/content by @devin-ai-integration[bot] in #41506
- feat(a2a): reach Microsoft Foundry agents with Entra auth and versioned card discovery by @devin-ai-integration[bot] in #41511
- fix(azure): strip litellm format field from file and image content parts by @devin-ai-integration[bot] in #41275
- ci: classify new issues into domain, provider, kind, priority and lift labels by @ryan-crabbe-berri in #41695
- fix(router): validate routing_groups at save time and keep invalid DB groups from blocking SSO load by @devin-ai-integration[bot] in #41351
- fix(bedrock): send aws_session_tags on every STS call via one typed auth struct by @ryan-crabbe-berri in #40500
- fix(anthropic): register thinking-binding-controls-2026-08-01 in beta headers config by @clonylu in #41203
- feat(guardrails): add TypeSafe Jev relevance-based compaction guardrail by @devin-ai-integration[bot] in #41757
- feat(keys): let team service account keys use key management endpoints for their own team by @devin-ai-integration[bot] in #40807
- test(docs): read only the first column of the router_settings reference table by @devin-ai-integration[bot] in #41860
- fix(scim): accept entitlements and roles entries without a value on SCIM user PUT by @devin-ai-integration[bot] in #41830
- perf(proxy): split aggregated usage query into key-free rollups and bounded top-N keys by @devin-ai-integration[bot] in #41293
- chore(deps): bump anyio from 4.13.0 to 4.14.2 by @dependabot[bot] in #41846
- feat(proxy): limit repeated failed Admin UI sign-in attempts by @devin-ai-integration[bot] in #40982
- fix(proxy): make SettingsStore.clear() terminate when the config file owns a key by @devin-ai-integration[bot] in #41862
- feat(vscode): add LiteLLM language model provider extension by @devin-ai-integration[bot] in #41865
- feat(mcp): let proxy admins force-close live MCP sessions and revoke stored user credentials by @devin-ai-integration[bot] in #41725
- feat(models): add qwen3.8 flash rows, fix Cohere embed v3 context, Bedrock Mantle and OpenRouter pricing by @devin-ai-integration[bot] in #41754
- fix(azure): keep api-version query after vector store search path by @devin-ai-integration[bot] in #41384
- fix(router): honor stream_timeout on the SDK-native passthrough route (/v1/messages, /converse) by @devin-ai-integration[bot] in #41875
- fix(proxy): track team member spend when the member has no budget by @devin-ai-integration[bot] in #41349
- feat(proxy): add Azure AI Speech pass-through route by @devin-ai-integration[bot] in #41557
- fix(responses): stop managed Responses WebSocket from leaking litellm_params into provider request body by @devin-ai-integration[bot] in #33101
- feat(rust): port exception_type to litellm-core-utils by @devin-ai-integration[bot] in #41873
- fix(ui): show internal user email in logs table and log detail drawer by @devin-ai-integration[bot] in #40737
- fix(router): report null cost for unpriced deployments instead of 0 by @devin-ai-integration[bot] in #40878
- feat(azure_ai): support FLUX.2 flex images by @emerzon in #39424
- fix(mistral): accept reasoning_effort on all models and drop client_metadata for Codex compatibility by @devin-ai-integration[bot] in #41062
- feat(passthrough): deepgram streaming /v1/listen WebSocket passthrough with duration-based cost tracking by @devin-ai-integration[bot] in #41554
- test(ocr): declarative provider x auth x input matrix, fix Rust 401 mapping by @devin-ai-integration[bot] in #41884
- fix(proxy): classify Azure Speech short audio behind a prefixed api base by @devin-ai-integration[bot] in #41882
- feat(proxy): add LiteLLM_DailyGlobalSpend key-free rollup for the usage dashboard by @devin-ai-integration[bot] in #41324
- fix(proxy): keep requested model guardrails and key disable_fallbacks on rate-limit fallback by @devin-ai-integration[bot] in #41783
- fix(bedrock): carry s3_endpoint_url and s3_region_name into file content downloads by @devin-ai-integration[bot] in #41138
- ci(duplicate-check): let Codex reach GitHub from its sandbox by @ryan-crabbe-berri in #41883
- fix(proxy): resolve model_group_alias to its target for /v1/models metadata by @devin-ai-integration[bot] in #41483
- fix(proxy): reset sibling tpm/rpm counters when the shared rate limit window rolls over by @devin-ai-integration[bot] in #41838
- feat(ui): link MCP Servers page to the user's connected MCP servers by @devin-ai-integration[bot] in #41888
- fix(proxy): name the blocking guardrail in x-litellm-applied-guardrails by @devin-ai-integration[bot] in #41583
- fix(responses): merge deployment litellm_params into native websocket response.create frames by @devin-ai-integration[bot] in #41881
- feat: honor eager_input_streaming on Bedrock and Anthropic Claude tools by @devin-ai-integration[bot] in #41871
- fix(otel): keep caller traceparent and tracestate on pass-through relays by @devin-ai-integration[bot] in #41786
- ci: remove the dead Agent Shin triage workflows and scripts by @devin-ai-integration[bot] in #41894
- fix: set vertex gemma-4-26b-a4b-it-maas context window to 262144 by @devin-ai-integration[bot] in #41887
- refactor(rust): formalize legacy callback contract by @devin-ai-integration[bot] in #41885
- fix(gemini): preserve candidates with finishReason and no content (#40477) by @devin-ai-integration[bot] in #41892
- fix(team): apply team_member_budget updates to members still on the team default by @devin-ai-integration[bot] in #41347
- fix(enterprise): resolve openai_moderations model at call time and default to omni-moderation-latest by @devin-ai-integration[bot] in #41895
- fix(proxy): track project spend and enforce project budgets additively by @devin-ai-integration[bot] in #41354
- fix(proxy): refuse config-owned keys on POST /config/update by @devin-ai-integration[bot] in #41868
- test(integration): cover off-peak pricing on a live proxy by @devin-ai-integration[bot] in #41901
- fix(proxy): requeue daily spend rows when the commit fails without the Redis buffer by @devin-ai-integration[bot] in #41878
- fix(responses): emit typed streaming failure events by @zoroyihan7 in #40243
- fix(bedrock): clamp maxTokens to the 16-token minimum for OpenAI GPT and xAI Grok models on Converse by @devin-ai-integration[bot] in #41870
- chore(model_info): backfill reseller Gemini entries from provider catalogs and prune retired ids by @devin-ai-integration[bot] in #41902
- feat(mcp): allowlist MCP client applications at the gateway by @devin-ai-integration[bot] in #41667
- fix(schema): classify off_peak_pricing as a structured object in the model prices schema generator by @devin-ai-integration[bot] in #41847
- fix(rate_limiter): render the 429 reset time in UTC as labelled by @devin-ai-integration[bot] in #41911
- ci(issues): comment which release carries the fix when a pull request closes an issue by @ryan-crabbe-berri in #41910
- feat(proxy): let team admins manage projects via team_admin_editable_team_fields by @devin-ai-integration[bot] in #41916
- fix(bedrock): sign batch retrieve and cancel with deployment credentials when AWS_BEARER_TOKEN_BEDROCK is set by @devin-ai-integration[bot] in #41904
- fix(websearch_interception): surface a failed search as a web_search_tool_result_error block and end the turn by @devin-ai-integration[bot] in #41905
- fix(cost_calc): default fireworks cached input to the documented 50% discount when the map has no cache-read rate by @devin-ai-integration[bot] in #41917
- fix(timing): anchor response duration and overhead at proxy receive time by @devin-ai-integration[bot] in #41891
- feat(xai): add speech-to-text (Grok Voice Transcribe) via /v1/audio/transcriptions by @devin-ai-integration[bot] in #41914
- feat(rust): add litellm-http client pool and inject it into the OCR route by @devin-ai-integration[bot] in #41897
- feat(vertex_ai): stream Chirp speech-to-text over /v1/realtime by @devin-ai-integration[bot] in #41721
- chore: consolidate CLAUDE.md into AGENTS.md by @devin-ai-integration[bot] in #41921
- feat(proxy): serve the Claude Code gateway protocol under /claude_code_gateway by @devin-ai-integration[bot] in #34267
- fix(responses): restore encrypted_content and apply affinity on the native WebSocket relay by @devin-ai-integration[bot] in #41893
- feat(proxy): add RFC 8693 token exchange for IdP JWTs on the gateway token endpoint by @devin-ai-integration[bot] in #41485
- fix(websearch): forward the deployment api_base to agentic follow-up calls on /v1/messages by @devin-ai-integration[bot] in #41918
- fix(proxy): parse role_permissions where it is read by @yuneng-berri in #41924
- fix(responses): announce message item before text events in the chat completions bridge by @devin-ai-integration[bot] in #41564
- fix(proxy): unpin cost-map pricing copied into model_info and report pricing overrides by @devin-ai-integration[bot] in #41843
- feat(websearch): let the model emit objective + multi-query search shapes by @adssoccer1 in #40399
- fix(exceptions): keep internal_server_error as the public type of an upstream 500 by @devin-ai-integration[bot] in #41930
- fix(proxy): dispatch llm_api_check moderation through during_call_hook by @devin-ai-integration[bot] in #41685
- fix(policy_engine): deliver guardrail text rewrites on multi-choice, unfinished, and envelope-less streams by @devin-ai-integration[bot] in #41933
- fix(anthropic): keep cache_control for Gemini targets on /v1/messages and normalize Anthropic ttl units by @devin-ai-integration[bot] in #41938
- fix(guardrails): stop the Javelin api_version default leaking into Azure Content Safety by @devin-ai-integration[bot] in #41941
- fix(alerting): clarify budget threshold messages by @gaurav-pandey-zocdoc in #39102
- fix(cost): carry image and video input tokens through the Responses usage bridge (internal copy of #36887) by @devin-ai-integration[bot] in #41237
- ci(unit): fail a hung test in 120s with a traceback instead of idling the shard to its step timeout by @devin-ai-integration[bot] in #41948
- refactor(types): replace Any with proven types in 6 files by @devin-ai-integration[bot] in #41947
- fix(proxy): register transcribe as a known provider for model grants by @yuneng-berri in #41926
- feat(batches): support Mistral files/batches and per-page OCR batch cost tracking (internal copy of #40484) by @devin-ai-integration[bot] in #41934
- fix(utils): reject an untranslatable tool_choice with a 400 instead of a 500 by @devin-ai-integration[bot] in #41234
- fix(proxy): keep request metadata out of the cost tracking failure alert by @devin-ai-integration[bot] in #41950
- fix(masker): memoize shared nodes and fail closed past the depth cap by @devin-ai-integration[bot] in #41952
- fix(responses): drop tool_search and local_shell in the chat completions bridge by @devin-ai-integration[bot] in #41953
- fix(rag): resolve registry stores on /v1/rag/ingest and reject providers without ingestion by @devin-ai-integration[bot] in #41940
- fix(azure): send the resolved Entra ID token on image generation requests by @abhirup7 in #40147
- fix(proxy): keep the raw client model out of spend logs for rejections outside the router by @devin-ai-integration[bot] in #41943
- fix(cost): resolve dated openai/azure snapshots to their undated cost map entry by @devin-ai-integration[bot] in #41423
- fix(proxy): /key/bulk_update writes only the fields each item carries by @devin-ai-integration[bot] in #41949
- fix(cost): bill DeepSeek V4.1 Flash and V4 Pro at off-peak rates outside peak hours by @devin-ai-integration[bot] in #41960
- test(cost): point dated snapshot tests at a date the cost map cannot carry by @devin-ai-integration[bot] in #41971
- fix(proxy): refuse runtime writes to config-owned settings by @yuneng-berri in #41931
- refactor(rust): centralize layered settings resolution by @devin-ai-integration[bot] in #41969
- test(utils): isolate dated model fallback from pricing additions by @joshua-berri in #41975
- test(response_metadata): anchor detailed-timing test on a fixed instant instead of wall clock by @devin-ai-integration[bot] in #41946
- test(integration): literal request/response cost tracking suite on a test-owned cost map by @devin-ai-integration[bot] in #41328
- chore(prices): sync Azure prices: 5 models, 5 deprecated by @berriai-litellm-provider-info-sync[bot] in #41966
- feat(ocr): add Rust-only Textract and sign provider requests after host hooks by @devin-ai-integration[bot] in #41977
- refactor(rust): use typed pyo3 APIs instead of getattr/import strings by @devin-ai-integration[bot] in #41981
- fix(router): enforce model tpm limits against shared redis usage across replicas by @devin-ai-integration[bot] in #41915
- feat(proxy): say when a stored setting is ignored because the config file owns it by @yuneng-berri in #41985
- fix(otel v2): summarize embedding vectors as Langfuse observation output by @devin-ai-integration[bot] in #41982
- fix(caching): scope automatic breakpoints to supported Claude transports by @tin-berri in #41920
- fix(proxy): return 400 instead of 500 for /v1/responses without input by @devin-ai-integration[bot] in #41939
- fix(llmguard): accept proxy async call types by @yucheng-berri in #41787
- fix(model_prices): drop anthropic deprecation floors and correct azure gpt-4.1-nano retirement date by @devin-ai-integration[bot] in #41964
- fix(ui): show user attribution in Top Virtual Keys usage tables by @devin-ai-integration[bot] in #40729
- chore(prices): sync OpenRouter prices: 172 models, 2 new by @berriai-litellm-provider-info-sync[bot] in #41833
- fix(ocr): set DeepSeek OCR sampling defaults by @devin-ai-integration[bot] in #41992
- ci: remove auto-merge-price-sync workflow, the Devin sync automation merges price PRs by @devin-ai-integration[bot] in #41993
- refactor(mcp): upgrade SDK2 while preserving legacy gateway behavior by @joshua-berri in #41718
- revert(guardrails): drop the scoped request conversation and tools from post-call scans (#41220) by @devin-ai-integration[bot] in #41986
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #41996
- test(unified_google_tests): use the Vertex global endpoint and retry 429s with backoff by @devin-ai-integration[bot] in #41995
- fix(rust): refuse native routes in processes forked after the runtime started by @devin-ai-integration[bot] in #41987
- fix(terraform): unlink the registry docs entries that 404 on click by @shivamrawat1 in #42003
- test(integration): native responses and messages cost cases by @devin-ai-integration[bot] in #42010
- fix(otel v2): map Responses API output onto the Langfuse generation output by @devin-ai-integration[bot] in #41991
- test(e2e): stop the config suite locking itself out of the shared proxy by @yuneng-berri in #42008
- chore: bump litellm-enterprise 0.1.68 -> 0.1.69, litellm-proxy-extras 0.4.99 -> 0.4.100 by @yuneng-berri in #42025
- fix(proxy): close the config-ownership gaps QA found in the settings store by @yuneng-berri in #42009
- fix(proxy): block project requests when max_budget is 0 by @ryan-crabbe-berri in #41997
- fix(auth): inherit org alias, budget and rate limits for JWT and team-linked keys by @devin-ai-integration[bot] in #41681
- feat(batches): run hosted_vllm batches inside LiteLLM by @devin-ai-integration[bot] in #41942
- fix(proxy): forward stream response attributes through the hook boundary and merge logged applied_guardrails by @devin-ai-integration[bot] in #42027
- feat(ui): configure web search interception from the Admin UI by @yuneng-berri in #42007
- fix(azure): drop tool_choice when the request has no tools (internal copy of #41781) by @devin-ai-integration[bot] in #42031
- fix(azure): tool choice without tools causes 400 by @dsteeley in #41781
- test(mcp): verify scoped execution and OAuth credential isolation by @joshua-berri in #41731
- test(e2e): cover MCP OAuth SSO and cold restart persistence by @devin-ai-integration[bot] in #41909
- fix(proxy): estimate auto-router baseline costs from durable cache history by @tin-berri in #41177
- fix(auto-router): show heuristic v2 score estimates in routing details by @tin-berri in #42001
- feat(router): add maintained Fuse model and harness presets by @tin-berri in #41617
- refactor(rust): rename legacy callback adapter crate by @devin-ai-integration[bot] in #42037
- Revert "test(mcp): verify scoped execution and OAuth credential isolation" by @mateo-berri in #42039
- revert(e2e): remove MCP OAuth SSO and cold restart tests by @mateo-berri in #42040
- test(mcp): cover SDK redirect compatibility by @joshua-berri in #42033
- feat(ui): report whether the serving proxy has applied web search interception by @yuneng-berri in #42042
- fix(test): unbreak the integration-cost and proxy_e2e_anthropic_messages CircleCI jobs on main by @devin-ai-integration[bot] in #42048
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42006
- feat(otel v2): opt-in llm_only span scope for Langfuse destinations and the operator Langfuse exporter by @devin-ai-integration[bot] in #41740
- test(e2e): point the Nova Sonic realtime test at nova-2-sonic by @yuneng-berri in #42053
- fix(team): emit audit events for member_delete and role changes and carry the final roster on team create by @devin-ai-integration[bot] in #41840
- chore(prices): sync OpenRouter prices: 5 models by @berriai-litellm-provider-info-sync[bot] in #42058
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42063
- chore: rebuild Admin UI bundle from main (build kXnLzJ6ylsRPmgSkCkCKM) by @yuneng-berri in #42054
- fix(proxy): stop re-sending un-resendable spend batches from the Redis buffer by @devin-ai-integration[bot] in #41994
- fix(router): skip cooldown for background response cost poll 404s by @devin-ai-integration[bot] in #42046
- fix(router): stamp model_group when retrieving a batch, so batch tokens are attributable (internal copy of #38499) by @devin-ai-integration[bot] in #42062
- test(mcp): restore scoped execution and credential isolation regressions by @joshua-berri in #42050
- feat(proxy)!: refuse to start with an unset, empty, or publicly known master key by @ryan-crabbe-berri in #42019
- docs: stop advertising sk-1234 as the master key in shipped configs and examples by @ryan-crabbe-berri in #42011
- test(logging): add autorouter estimate keys to the GCS pub/sub spend-log golden by @devin-ai-integration[bot] in #42061
- fix(router): add NotFoundErrorRetries so a retry policy can pin 404 retries by @devin-ai-integration[bot] in #42045
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42077
- fix(google_genai): forward response schema and tool parameters through the generateContent adapter by @devin-ai-integration[bot] in #42067
- test(e2e): restore MCP OAuth happy-path coverage (LIT-3467) by @joshua-berri in #42051
- fix(mcp): tools/call no longer 404s on a worker that has not served tools/list by @devin-ai-integration[bot] in #42072
- chore(prices): sync OpenRouter prices: 7 models, 6 deprecated by @berriai-litellm-provider-info-sync[bot] in #42082
- fix(proxy): wait for the spend-log table before creating startup views by @devin-ai-integration[bot] in #41974
- fix(guardrails): scan each choice's tool-call arguments apart on n>1 streams and log why a rewrite was discarded by @devin-ai-integration[bot] in #40986
- chore(prices): sync OpenRouter prices: 1 model by @berriai-litellm-provider-info-sync[bot] in #42089
- chore(prices): sync OpenRouter prices: 1 model by @berriai-litellm-provider-info-sync[bot] in #42092
- chore: remove the dead telemetry flag from the SDK, proxy CLI and configs by @devin-ai-integration[bot] in #42071
- docs(tests): define the tier contract for unit, integration and e2e by @devin-ai-integration[bot] in #42099
- fix(proxy): coordinate v2 migration startup and qualify container recovery by @yuneng-berri in #40932
- ci(tests): wire tests/unit into CircleCI and keep draining GHA shards green by @devin-ai-integration[bot] in #42103
- test(unit): block external sockets at import time and add a socket policy regression test by @devin-ai-integration[bot] in #42113
- fix(ci): excuse retired test-quality rules in the budget ratchet by @devin-ai-integration[bot] in #42116
- test: migrate wave 1 phase 2 legacy unit tests to tests/unit by @devin-ai-integration[bot] in #42108
- test(llms): migrate bedrock, baseten and base_llm batch tests to tests/unit by @devin-ai-integration[bot] in #42110
- test(llms): migrate phase 6 provider unit tests to tests/unit by @devin-ai-integration[bot] in #42107
- test: migrate nvidia, oci, ocr, oobabooga and openai legacy tests to tests/unit by @devin-ai-integration[bot] in #42115
- test: migrate phase 9 legacy llm provider tests to tests/unit by @devin-ai-integration[bot] in #42117
- test(llms): migrate phase 7 provider unit tests to tests/unit by @devin-ai-integration[bot] in #42114
- test: migrate wave 1 phase 8 legacy llm tests to tests/unit by @devin-ai-integration[bot] in #42112
- test(llms): migrate phase 5 provider unit tests to tests/unit by @devin-ai-integration[bot] in #42109
- refactor(types): replace Any with proven types in 30 files by @devin-ai-integration[bot] in #42127
- test(unit): make every tests/unit directory a package so pytest collection is unique by @devin-ai-integration[bot] in #42135
- test(unit): migrate wave 1 phase 3 anthropic, apiserpent, azure and azure_ai legacy tests by @devin-ai-integration[bot] in #42118
- test: migrate openai, openai_like and openrouter legacy tests to tests/unit by @devin-ai-integration[bot] in #42128
- test: migrate phase 14 wave 2 provider tests to tests/unit by @devin-ai-integration[bot] in #42132
- test: migrate phase 16 legacy tests to tests/unit by @devin-ai-integration[bot] in #42131
- test: migrate wave 1 phase 1 legacy tests to tests/unit by @devin-ai-integration[bot] in #42123
- test: migrate phase 12 legacy llm provider tests to tests/unit by @devin-ai-integration[bot] in #42137
- test: migrate phase 15 legacy tests to tests/unit by @devin-ai-integration[bot] in #42136
- fix(proxy): enforce virtual key budgets for JEV test routing by @devin-ai-integration[bot] in #41879
- feat(fal_ai): add Seedance 2.5 / 2.0 video generation via fal queue API by @devin-ai-integration[bot] in #41980
- chore(prices): sync OpenRouter prices: 11 models by @berriai-litellm-provider-info-sync[bot] in #42096
- test: migrate legacy provider tests to tests/unit (wave 2, phase 13) by @devin-ai-integration[bot] in #42145
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42154
- chore(prices): sync OpenRouter prices: 5 models by @berriai-litellm-provider-info-sync[bot] in #42155
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42157
- fix(auth): reject deactivated JWT users and refresh cached status by @joshua-berri in #42064
- fix(mcp): explain missing public client dependencies by @joshua-berri in #42148
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42162
- chore(prices): sync OpenRouter prices: 3 models by @berriai-litellm-provider-info-sync[bot] in #42163
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42164
- chore(prices): sync OpenRouter prices: 1 model by @berriai-litellm-provider-info-sync[bot] in #42166
- chore(prices): sync OpenRouter prices: 3 models by @berriai-litellm-provider-info-sync[bot] in #42168
- refactor(rust): split token counter backends by @devin-ai-integration[bot] in #42165
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42169
- chore(prices): sync OpenRouter prices: 3 models by @berriai-litellm-provider-info-sync[bot] in #42175
- chore(prices): sync OpenRouter prices: 4 models by @berriai-litellm-provider-info-sync[bot] in #42178
- chore(prices): sync OpenRouter prices: 3 models by @berriai-litellm-provider-info-sync[bot] in #42179
- chore(prices): sync OpenRouter prices: 1 model by @berriai-litellm-provider-info-sync[bot] in #42182
- feat(rust): add typed secret managers and shared auth adapters by @devin-ai-integration[bot] in #42173
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42184
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42187
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42192
- fix(responses): forward safety_identifier through the chat completion bridge by @devin-ai-integration[bot] in #42193
- refactor(types): replace Any with proven types in 32 files by @devin-ai-integration[bot] in #42220
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42227
- fix(helm): render a fixed replicaCount on componentized deployments when HPA is disabled by @devin-ai-integration[bot] in #42207
- fix(proxy): return 422 instead of 429 for BudgetExceededError by @devin-ai-integration[bot] in #42097
- chore(prices): sync OpenRouter prices: 1 model by @berriai-litellm-provider-info-sync[bot] in #42234
- chore(prices): sync OpenRouter prices: 1 model by @berriai-litellm-provider-info-sync[bot] in #42240
- chore(prices): sync OpenRouter prices: 4 models by @berriai-litellm-provider-info-sync[bot] in #42243
- fix(a2a): send message/stream for Bedrock AgentCore streaming requests by @devin-ai-integration[bot] in #42239
- fix(registry): add MAI-Image-2.5-Pro pricing, fix Fireworks/Together entries, absorb verified open registry PRs, add Groq deprecation and Bedrock regional Qwen3 Next pricing by @devin-ai-integration[bot] in #34941
- fix(anthropic): forward safeguards and anthropic-beta unchanged on native /v1/messages by @devin-ai-integration[bot] in #42152
- chore(prices): sync OpenRouter prices: 4 models by @berriai-litellm-provider-info-sync[bot] in #42246
- chore(prices): sync OpenRouter prices: 3 models by @berriai-litellm-provider-info-sync[bot] in #42251
- chore(prices): sync Azure prices: 1 model, 1 deprecated by @berriai-litellm-provider-info-sync[bot] in #42249
- chore(prices): sync AWS Bedrock prices: 25 models [enrichment failed: AWS Bedrock, 66 held] by @berriai-litellm-provider-info-sync[bot] in #42250
- test(a2a): migrate a2a_protocol legacy tests to tests/unit (wave 3 phase 17) by @devin-ai-integration[bot] in #42160
- feat(proxy): default to the v2 migration resolver by @yuneng-berri in #42105
- feat(auto-router): configure heuristic v2 success threshold by @tin-berri in #42252
- chore(prices): sync Together AI prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42258
- chore(prices): sync OpenRouter prices: 6 models, 1 new by @berriai-litellm-provider-info-sync[bot] in #42253
- fix(key_generate): use the user's own budget as the ceiling for UI session personal keys by @devin-ai-integration[bot] in #41588
- feat(team): show whether a member follows the team default budget and allow resetting to it by @devin-ai-integration[bot] in #41906
- chore(prices): sync AWS Bedrock prices: 13 models, 1 new [1 with gaps, enrichment failed: AWS Bedrock, 38 held] by @berriai-litellm-provider-info-sync[bot] in #42254
- chore(prices): sync OpenRouter prices: 7 models by @berriai-litellm-provider-info-sync[bot] in #42261
- feat(proxy): add GET /utils/model_info to look up cost map info for unregistered models by @devin-ai-integration[bot] in #42121
- chore(prices): sync OpenRouter prices: 4 models by @berriai-litellm-provider-info-sync[bot] in #42265
- feat(xai): add grok-4.7 to the cost map by @devin-ai-integration[bot] in #42264
- ci(e2e): fix the stage-mirror batch reds and keep a redacted pytest log by @devin-ai-integration[bot] in #42143
- chore(prices): sync AWS Bedrock prices: 3 models [enrichment failed: AWS Bedrock, 32 held] by @berriai-litellm-provider-info-sync[bot] in #42269
- chore(prices): sync OpenRouter prices: 6 models by @berriai-litellm-provider-info-sync[bot] in #42270
- feat(fal_ai): add gpt-image-2.5 flare/sunburst, flux/dev and image edits by @devin-ai-integration[bot] in #42095
- feat(bedrock): add us.moonshotai.kimi-k3 pricing and fill the global Kimi K3 entry by @devin-ai-integration[bot] in #42271
- test(google): boot the unified Google proxy fixture with a real master key by @yuneng-berri in #42120
- feat(auto-router): add JEV classifier alongside LLM classifier by @devin-ai-integration[bot] in #41886
- fix(proxy): park requeued spend logs in Redis so they survive a pod restart during a DB outage by @devin-ai-integration[bot] in #42022
- fix(bedrock): forward anthropic-beta headers verbatim on the Claude platform messages path by @devin-ai-integration[bot] in #42275
- chore(prices): sync AWS Bedrock prices: 4 models [enrichment failed: AWS Bedrock, 26 held] by @berriai-litellm-provider-info-sync[bot] in #42279
- chore(prices): sync OpenRouter prices: 3 models by @berriai-litellm-provider-info-sync[bot] in #42280
- fix(azure_ai): bridge gpt-5.4+ function tools with reasoning to the Foundry Responses API by @devin-ai-integration[bot] in #42041
- fix: apply configured cache_control_injection_points beside client cache_control marks by @devin-ai-integration[bot] in #41956
- fix(token_counter): count replayed redacted_thinking blocks so prompt_caching keeps pinning by @devin-ai-integration[bot] in #42069
- fix(mcp): paginate prompt and resource discovery by @devin-ai-integration[bot] in #39189
- chore(prices): sync AWS Bedrock prices: 3 models [enrichment failed: AWS Bedrock, 18 held] by @berriai-litellm-provider-info-sync[bot] in #42290
- chore(prices): sync OpenRouter prices: 1 model by @berriai-litellm-provider-info-sync[bot] in #42289
- fix(router): keep prompt caching affinity when the breakpoint moves by @devin-ai-integration[bot] in #42080
- feat(ui): show prompt caching requests and net savings by @tin-berri in #42055
- feat(bedrock_mantle): serve /v1/messages for Claude models on Mantle's native Anthropic Messages API by @devin-ai-integration[bot] in #42049
- feat(policy_engine): add default fallback policy attachments by @devin-ai-integration[bot] in #42119
- fix(mcp): handle split UTF-8 routing previews by @devin-ai-integration[bot] in #34919
- fix(bedrock): send s3BucketOwner on batch input and output data config by @devin-ai-integration[bot] in #42262
- feat(rust): scaffold cache foundation for Python parity by @devin-ai-integration[bot] in #42196
- fix(fal_ai): price images from the dimensions fal returns by @devin-ai-integration[bot] in #42282
- chore(prices): sync AWS Bedrock prices: 1 model [enrichment failed: AWS Bedrock, 16 held] by @berriai-litellm-provider-info-sync[bot] in #42298
- chore(prices): sync OpenRouter prices: 1 model by @berriai-litellm-provider-info-sync[bot] in #42297
- feat(fal_ai): add MiniMax H3 text-to-video and reference-to-video by @devin-ai-integration[bot] in #42286
- fix(ci): let the install smoke test boot its key-less proxy config by @devin-ai-integration[bot] in #42296
- fix: rename the mainland China brand to Qianwen AI Platform by @devin-ai-integration[bot] in #42284
- test(integration): endpoint, breakdown component and failure support in the cost harness by @devin-ai-integration[bot] in #41999
- test(integration): embeddings, rerank, completions and moderations cost cases by @devin-ai-integration[bot] in #42020
- chore(prices): sync OpenRouter prices: 4 models, 3 new by @berriai-litellm-provider-info-sync[bot] in #42305
- test(integration): audio, image and per-unit cost cases by @devin-ai-integration[bot] in #42024
- feat(ui): add upgrade banner with latest release changelog stats by @kerry-berri in #40429
- fix(fal_ai): surface fal errors in video status and content instead of completed and generic 500 by @devin-ai-integration[bot] in #42306
- test(integration): passthrough route cost cases by @devin-ai-integration[bot] in #42028
- fix(proxy): detach stored credential when model editor selects None by @devin-ai-integration[bot] in #42291
- fix(proxy): renew budget reservation counter TTL while the request is in flight by @devin-ai-integration[bot] in #40322
- chore(prices): sync OpenRouter prices: 1 model by @berriai-litellm-provider-info-sync[bot] in #42320
- test(integration): pricing dimension and provider reported cost cases by @devin-ai-integration[bot] in #42035
- fix(anthropic): forward Claude Code safeguards and dangerous-tool-use beta to Bedrock Invoke and Vertex on /v1/messages by @devin-ai-integration[bot] in #42288
- feat(edenai): add Eden AI provider across chat, Responses, Messages, embeddings, audio, images and video by @hMED22 in #41101
- feat(rust-cache): serve RedisClusterCache natively as a Redis topology by @devin-ai-integration[bot] in #42317
- test(integration): provider wire cost cases by @devin-ai-integration[bot] in #42052
- test(e2e): replace custom endpoints_client with provider SDK clients by @mateo-berri in #34358
- fix(mcp): keep oauth scopes in admin api credential redaction by @devin-ai-integration[bot] in #39805
- fix(otel v2): map OCR page markdown onto the generation output by @devin-ai-integration[bot] in #42267
- test(integration): proxy behaviour cost cases by @devin-ai-integration[bot] in #42060
- chore(prices): sync OpenRouter prices: 1 model by @berriai-litellm-provider-info-sync[bot] in #42333
- test(integration): batch and realtime cost cases by @devin-ai-integration[bot] in #42066
- fix(proxy): keep config-defined deployments when a config read returns no model_list by @devin-ai-integration[bot] in #41505
- feat(rust): add CyberArk Conjur secret manager backend by @devin-ai-integration[bot] in #42303
- fix(rust): preserve Python settings semantics at the native boundary by @devin-ai-integration[bot] in #42300
- fix(alerting): deliver every distinct alert queued in one flush window by @devin-ai-integration[bot] in #42314
- fix(bedrock): keep batch S3 credentials out of chat requests and debug logs by @devin-ai-integration[bot] in #42312
- fix(proxy): evict the cached user row when SCIM or /user/delete removes a user by @devin-ai-integration[bot] in #42315
- fix(auth): fail closed when the team membership lookup hits a db outage by @devin-ai-integration[bot] in #42036
- test(migrations): cover the release-to-release upgrade path by @yuneng-berri in #42294
- feat(rust): add Azure Key Vault secret manager backend by @devin-ai-integration[bot] in #42309
- feat(rust): native Azure Blob response cache backend by @devin-ai-integration[bot] in #42321
- chore(prices): sync AWS Bedrock prices: 6 models [enrichment failed: AWS Bedrock, 4 held] by @berriai-litellm-provider-info-sync[bot] in #42338
- chore(prices): sync OpenRouter prices: 3 models by @berriai-litellm-provider-info-sync[bot] in #42337
- refactor(types): remove 1,173 Any errors across 169 backend files by @mateo-berri in #40251
- fix(responses): stream one lifecycle across MCP auto-execute rounds by @Atharva-Kanherkar in #40121
- fix(responses): stop agentic follow-up from passing request params twice by @chopratejas in #41560
- fix(streaming): keep an explicit provider prompt_tokens=0 or completion_tokens=0 in streamed usage by @devin-ai-integration[bot] in #42323
- fix(router): walk every entry of a fallback list after a mid-stream failure by @devin-ai-integration[bot] in #42283
- refactor(mcp): extract explicit operation context and dispatch by @joshua-berri in #42292
- test: fix stale budget-status and bad-database-url assertions by @yuneng-berri in #42339
- chore(prices): sync OpenRouter prices: 3 models by @berriai-litellm-provider-info-sync[bot] in #42349
- fix(responses): patch custom_tool_call_output in place on guardrail write-back by @chopratejas in #41561
- feat(rust): add native disk cache backend by @devin-ai-integration[bot] in #42311
- feat(auth): breached password detection, self-service change-password and forced password reset by @devin-ai-integration[bot] in #42278
- feat(docker): add a quickstart compose file served from the product repo by @yuneng-berri in #42326
- fix(xai): accept max_completion_tokens as a supported param by @devin-ai-integration[bot] in #42353
- feat(rust): add native GCS object-store cache backend by @devin-ai-integration[bot] in #42325
- feat(rust): add HashiCorp Vault secret manager crate by @devin-ai-integration[bot] in #42308
- fix(proxy): apply DB-stored callback redaction settings before logger init by @devin-ai-integration[bot] in #42122
- fix(mcp): keep server lists stable across refreshes by @devin-ai-integration[bot] in #41074
- chore(prices): sync OpenRouter prices: 4 models, 3 deprecated by @berriai-litellm-provider-info-sync[bot] in #42357
- feat(rust): add native S3 cache backend by @devin-ai-integration[bot] in #42313
- feat(xiaomi_mimo): add mimo-v2.6-pro and mimo-v2.6-flash cost map rows with live e2e coverage by @devin-ai-integration[bot] in #42362
- fix(bedrock): add bare moonshotai.kimi-k3 cost map entry by @devin-ai-integration[bot] in #42363
- feat(cache): add native Valkey semantic cache backend by @devin-ai-integration[bot] in #42316
- fix(logging_worker): make flush() survive an event loop change by @devin-ai-integration[bot] in #42355
- fix(auth): let jwt team_allowed_routes paths grant auth=true passthrough by @ryan-crabbe-berri in #42346
- fix(rust): declare _CacheTestHandle.valkey_semantic in native stub by @devin-ai-integration[bot] in #42364
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42365
- feat(ui): add internal-user savings and auto-router usage by @tin-berri in #42026
- test(model_management): cover actor edges and wildcard models by @yuneng-berri in #41769
- feat(ui): expose remaining complexity router advanced settings by @devin-ai-integration[bot] in #42293
- test(ui): cover dashboard form journeys by @yuneng-berri in #41773
- test(router): cover legacy lowest TPM selection by @yuneng-berri in #41795
- feat(proxy): report the source of alerting, UI and router settings on read by @yuneng-berri in #41788
- fix(proxy): record aborted outcome when spend-log cleanup is cancelled at shutdown by @yucheng-berri in #41213
- fix(router): make context-window escalation opt-in by @tin-berri in #41872
- feat(cache): serve Redis Semantic caches natively in Rust by @devin-ai-integration[bot] in #42319
- fix(cli): preserve newer installed status lines during setup by @tin-berri in #42356
- chore(prices): sync OpenRouter prices: 4 models by @berriai-litellm-provider-info-sync[bot] in #42371
- feat(agents): attach access groups to agents and enforce them for models, MCP servers and agent calls by @devin-ai-integration[bot] in #41634
- fix(guardrails): run key-attached guardrails on /v1/videos by @devin-ai-integration[bot] in #42354
- fix(azure): propagate asyncio.CancelledError instead of raising a 500 by @devin-ai-integration[bot] in #42295
- test(e2e): cover chat and responses registry gaps by @yuneng-berri in #41794
- feat(cache): serve QdrantSemanticCache natively from Rust by @devin-ai-integration[bot] in #42324
- chore(prices): sync OpenRouter prices: 4 models by @berriai-litellm-provider-info-sync[bot] in #42377
- feat(ui): show Capability and FUSE v2 routing forecasts by @tin-berri in #42057
- fix(cache): keep native Redis semantic binding and Qdrant batch writes after merge by @devin-ai-integration[bot] in #42379
- feat(ui): add per-user breakdown to team usage export by @devin-ai-integration[bot] in #42367
- feat(jwt-key-mapping): accept token_id as an alternative to the plaintext key by @Louis-Vauterin in #39578
- fix(openrouter): remove the retired stealth/union-alpha model from the cost map by @devin-ai-integration[bot] in #42386
- feat(pricing): add xai grok-4.20 aliases and image token prices from /v1/language-models by @devin-ai-integration[bot] in #42384
- test(proxy): isolate the agent read-through singleton between unknown-agent tests by @devin-ai-integration[bot] in #42389
- fix(mcp): return camelCase tool keys from /v1/mcp/tools after the SDK 2 upgrade by @devin-ai-integration[bot] in #42352
- fix(logging): price terminal Responses stream events from their inner response by @devin-ai-integration[bot] in #42385
- fix(bedrock): send every Mantle beta in the anthropic-beta header on the bedrock/mantle route by @devin-ai-integration[bot] in #42376
- fix(bedrock): sign batch S3 requests with s3_access_key_id and s3_secret_access_key by @devin-ai-integration[bot] in #42342
- feat(fal_ai): add flux-lora-depth image edits and moondream3 chat completions by @devin-ai-integration[bot] in #42334
- feat(proxy): opt-in litellm_call_id in JSON error bodies by @devin-ai-integration[bot] in #42391
- fix(fal_ai): price non-canonical image sizes from the nearest row and honour dump options by @devin-ai-integration[bot] in #42336
- fix(proxy): drop cost-map metadata echoed back on model save by @devin-ai-integration[bot] in #41944
- feat(openrouter): price typesafe/jev-1.13 and add an openrouter decisions pass-through by @devin-ai-integration[bot] in #42301
- feat(cost): warn and count $0 cost on billable requests by @devin-ai-integration[bot] in #42345
- fix(proxy): release unclaimed budget reservations at request end by @devin-ai-integration[bot] in #42304
- test(integration): move Xiaomi MiMo coverage from live e2e to the providers wire shard by @devin-ai-integration[bot] in #42395
- feat(fal_ai): add queue-only /fal_ai pass-through route with spend tracking by @devin-ai-integration[bot] in #42360
- fix(auth): fail closed when the JWT single-team fallback or compact editor membership read hits a DB outage by @devin-ai-integration[bot] in #42344
- refactor(agentic-loop): build follow-up kwargs in one place so no executor can repeat a request param by @ryan-crabbe-berri in #42307
- fix(responses): drop client_metadata and merge system messages for Databricks chat-only models by @devin-ai-integration[bot] in #42390
- test(e2e-ui): check the MCP Tools tab against the upstream's own tools/list by @devin-ai-integration[bot] in #42397
- test(integration): chain a proxy-issued previous_response_id in the cost suite by @devin-ai-integration[bot] in #42396
- feat(rust-bridge): add cache and secret migration foundations by @devin-ai-integration[bot] in #42328
- fix(proxy): surface a database outage from the user read as 503 no_db_connection by @devin-ai-integration[bot] in #42399
- test(pricing): assert cache-priced vertex grok rows advertise supports_prompt_caching by @kumarpriyanshu09 in #41526
- fix(bedrock): price bedrock/mantle/ deployments from the base model row by @devin-ai-integration[bot] in #42402
- fix(anthropic_adapter): keep reasoning_effort a string for targets that stay on chat completions by @devin-ai-integration[bot] in #42401
- chore(prices): sync OpenRouter prices: 2 models, 2 deprecated by @berriai-litellm-provider-info-sync[bot] in #42381
- feat(proxy): add TinyFish Agent API passthrough with per-step billing by @Zechereh in #41099
- chore(prices): sync OpenRouter prices: 2 models, 2 new by @berriai-litellm-provider-info-sync[bot] in #42407
- ci: skip cost map file checks on PRs that leave the cost map untouched by @devin-ai-integration[bot] in #42406
- feat(tokenizer): preserve Python defaults with opt-in Rust dispatch by @devin-ai-integration[bot] in #42174
- fix(presidio): mask PII in streaming /v1/messages output by @devin-ai-integration[bot] in #42351
- fix(otel v2): map completions, images, speech, transcription and moderation output onto the Langfuse generation output by @devin-ai-integration[bot] in #42394
- fix(cost): honor per-second custom pricing on chat completions for every provider by @devin-ai-integration[bot] in #42403
- chore(prices): sync OpenRouter prices: 2 models by @berriai-litellm-provider-info-sync[bot] in #42418
- feat(errors): prefilled GitHub issue link on unmapped internal errors by @devin-ai-integration[bot] in #42065
- test(e2e): add conversational matrix across chat, messages and responses by @devin-ai-integration[bot] in #42359
- fix(proxy): answer 503 no_db_connection on management routes when the caller's user read hits a database outage by @devin-ai-integration[bot] in #42410
- fix(e2e-stack): print add-mask lines only under GitHub Actions by @devin-ai-integration[bot] in #42423
- feat(errors): add stream and safe config flags to the bug report link by @ryan-crabbe-berri in #42428
- feat(router): native compact-to-fit across conversation APIs by @tin-berri in #42074
- fix(mcp): keep config-defined servers read-only by @joshua-berri in #42299
- ci(code-quality): allowlist _render_json in the recursive detector by @devin-ai-integration[bot] in #42442
- fix(guardrails): store the masked output in spend logs when Presidio masks the response by @devin-ai-integration[bot] in #42441
- fix(jwt): accept a team alias in x-litellm-team-id by @devin-ai-integration[bot] in #42445
- chore(prices): sync OpenRouter prices: 14 models, 1 deprecated [enrichment failed: OpenRouter, 5 held] by @berriai-litellm-provider-info-sync[bot] in #42438
- feat(rust): align secret manager operation contexts by @devin-ai-integration[bot] in #42480
- chore(prices): sync OpenRouter prices: 1 model [enrichment failed: OpenRouter, 5 held] by @berriai-litellm-provider-info-sync[bot] in #42485
- feat(arize): per-team success and error sampling rates for the Arize AX callback by @devin-ai-integration[bot] in #42383
- test(unit): make bedrock collector and secret scan timing tests deterministic by @devin-ai-integration[bot] in #42405
- feat(anthropic): add Claude Opus 5.5 by @devin-ai-integration[bot] in #42489
- fix(gemini): simplify model version check by @philschmid in #42465
- fix(bedrock/claude_platform): strip body params the AWS endpoint rejects by @mateo-berri in #31203
- fix(proxy): never render credential-bearing config keys in the bug report by @devin-ai-integration[bot] in #42493
- fix(cost): bill batch prompts above 272K at OpenAI's long-context batch tier by @mateo-berri in #39861
- fix(otel v2): map rerank and search output and the OCR, image edit and search input onto the Langfuse generation by @devin-ai-integration[bot] in #42444
- test(response_metadata): make the detailed-timing receive-anchor test timezone independent by @devin-ai-integration[bot] in #42429
- fix(utils): stop a nested additional_drop_params entry from crashing openai-compatible calls by @yuneng-berri in #42492
- fix(jwt): say x-litellm-team-id matched no team id or alias in the 403 by @devin-ai-integration[bot] in #42495
- fix(ui): surface the owner's user budget on keys without their own budget by @devin-ai-integration[bot] in #38220
- test(proxy): give every ui settings endpoint test a fresh settings store by @devin-ai-integration[bot] in #42430
- chore(prices): sync Azure prices: 34 models by @berriai-litellm-provider-info-sync[bot] in #42502
- chore(prices): sync OpenAI prices: 25 models [enrichment failed: OpenAI, 32 held] by @berriai-litellm-provider-info-sync[bot] in #42501
- feat(router): time-windowed team reservation of deployments via model_info.access_windows by @devin-ai-integration[bot] in #42398
- feat(terraform): expose server_metadata on litellm_key so undeclared metadata is visible by @devin-ai-integration[bot] in #42453
- fix(mcp): restore legacy SSE and bounded cancellation cleanup by @joshua-berri in #42382
- chore(prices): sync Google Gemini prices: 13 models by @berriai-litellm-provider-info-sync[bot] in #42500
- fix(realtime): surface an upstream handshake refusal as an error event and policy close by @devin-ai-integration[bot] in #42388
- feat(openai): add GPT-6 Sol and GPT-6 Luna by @devin-ai-integration[bot] in #42515
- fix(router): explain fallback outcome in plain words in the raised error by @devin-ai-integration[bot] in #42509
- fix(cost): honor deployment pricing for image generation by @patel-26meet in #39311
- fix(streaming): let a later usage event zero out stale cache counts (#40736) by @devin-ai-integration[bot] in #42330
- fix(fal_ai): handle seconds=auto and oversized sizes for minimax h3 videos by @devin-ai-integration[bot] in #42504
- fix(proxy): write key deleted audit logs for cascade and alias key deletions by @devin-ai-integration[bot] in #42446
- fix(rust_bridge): keep Messages, token counter and tokenizer routes on Python by @devin-ai-integration[bot] in #42517
- chore(pricing): remove retired models flagged by the provider sync by @devin-ai-integration[bot] in #42521
- feat(proxy): admin-only /debug/report sharing the bug report environment by @devin-ai-integration[bot] in #42440
- fix(aws_secret_manager_v2): restore secret scheduled for deletion instead of failing CreateSecret by @devin-ai-integration[bot] in #42454
- feat(rust): add python-compat crate for Python data formats by @devin-ai-integration[bot] in #42510
- fix(langsmith): json.dumps with default=str so non-serializable metadata does not crash batch flush by @devin-ai-integration[bot] in #42424
- fix(proxy): make the lazy OpenAPI snapshot byte-identical on every Python version by @devin-ai-integration[bot] in #42519
- test(rust_bridge): drop route dispatch assertions, test the bridge directly by @devin-ai-integration[bot] in #42536
- fix(websearch_interception): keep intercepted searches under the parent request's session and trace by @devin-ai-integration[bot] in #41711
- test(e2e): assert a cooldown reaches a sibling replica within the 1s Redis read interval by @devin-ai-integration[bot] in #42422
- feat(proxy): opt-in include_guardrail_response returns guardrail_information in the response by @devin-ai-integration[bot] in #42327
- feat(logs): add span type filter to request logs by @devin-ai-integration[bot] in #42491
- fix(e2e): route credential, cost map, and UI login calls to the control plane by @devin-ai-integration[bot] in #42506
- test(google_genai): move unified_google_tests to gemini-3.5-flash-lite by @devin-ai-integration[bot] in #42520
- feat(router): add group-scoped priority routing strategy by @tin-berri in #42378
- fix(fal_ai): align /fal_ai queue gate with the pricer and normalise resolution type by @devin-ai-integration[bot] in #42505
- fix(fal_ai): reuse the status client and headers on the video result probe by @devin-ai-integration[bot] in #42511
- refactor(rust): align the cache crates with Python and wire every native backend by @devin-ai-integration[bot] in #42530
- fix(fal_ai): honour global api_base for image generation and reject non-string reasoning_effort with 400 by @devin-ai-integration[bot] in #42512
- fix(ui): rename reminder markers to Ignore Custom Tags by @tin-berri in #42370
- chore(prices): sync Baseten prices: 12 models, 9 new [enrichment failed: Baseten, 15 held] by @berriai-litellm-provider-info-sync[bot] in https://github.com/BerriAI/litellm/pull/42558
- fix: enforce disable_custom_api_keys from general_settings by @yuneng-berri in https://github.com/BerriAI/litellm/pull/42437
- feat: add configurable provider affinity header mapping by @togear in https://github.com/BerriAI/litellm/pull/41033
- fix(proxy): share model rate-limit buckets between a model_group_alias and its target by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42516
- test(e2e): one request lands the same spend on every surface by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42540
- fix(mcp): apply post-call rewrites without stale structured output by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/41530
- chore(prices): sync Baseten prices: 4 models, 4 new [enrichment failed: Baseten, 3 held] by @berriai-litellm-provider-info-sync[bot] in https://github.com/BerriAI/litellm/pull/42578
- fix(otel): honor SSL_CERT_FILE and ssl_verify in OTLP HTTP exporters by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42106
- chore(prices): sync OpenAI prices: 3 models by @berriai-litellm-provider-info-sync[bot] in https://github.com/BerriAI/litellm/pull/42557
- fix(ssrf): point the blocked-address remediation at litellm_settings by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42508
- fix(model_prices): registry audit 2026-09-22, absorb open pricing PRs by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42543
- fix(gateway): expose /api/event_logging/batch on the gateway allowlist by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42572
- fix(proxy): honor DATABASE_DISABLE_PREPARED_STATEMENTS in the litellm CLI by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42556
- chore(prices): sync Vertex AI prices: 20 models by @berriai-litellm-provider-info-sync[bot] in https://github.com/BerriAI/litellm/pull/42577
- fix(proxy): attribute provider and model_info on pre_call_hook rejections by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/41077
- chore(cost-map): remove models past their deprecation date by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42435
- test(vcr): guard leaked cassette patches and make injected-transport embedding tests immune by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42542
- fix(otel): keep text completion choice fields beside the synthesized message by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42537
- fix(mcp): preserve discovery attribution and sanitize logging headers by @joshua-berri in https://github.com/BerriAI/litellm/pull/42541
- fix(proxy_cli): import proxy_server once on script-style boot by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42584
- feat(bedrock): add Claude Opus 5.5 pricing and capabilities by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42588
- test(e2e): hold every worker under an idle RSS budget before any traffic by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42552
- feat(cost-map): add Claude Opus 5.5 for Vertex AI and Azure AI by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42599
- feat(proxy): configurable key_alias_pattern for key generate, update, and regenerate by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42553
- test(proxy): make two proxy-infra tests independent of sibling-test state by @yuneng-berri in https://github.com/BerriAI/litellm/pull/42581
- test: count a zombie grandchild as gone in the migrate deploy timeout test by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42570
- test(e2e): run the memory cell alone on the shared stack by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42518
- fix(caching): keep embedding cache hits aligned with request inputs by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42571
- chore(prices): sync xAI prices: 3 models, 3 new [3 with gaps] by @berriai-litellm-provider-info-sync[bot] in https://github.com/BerriAI/litellm/pull/42591
- fix(otel): record the GenAI exception event through the Logs API on both OpenTelemetry lines by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42431
- fix(spend): return 400 from /spend/calculate for a model with no pricing row by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42497
- fix(anthropic): return 400 instead of 500 when a content list holds a bare string by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42420
- feat(rust): add standalone cost calculator by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42604
- feat(logging): add normalized_error cluster key to error_information by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/41715
- test(bedrock): point unit tests at model ids still in the cost map by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42606
- feat(rust): add immutable model catalog crate by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42605
- fix(ui): let the Create Key user picker find users by user_id, not just email by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/41687
- test(cost_calculator): point image-generation deployment price test at a live gemini row by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42615
- test(utils): accept the per-size image cost keys in the price-map schema check by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42612
- fix(ollama): send PNG and JPEG images without requiring Pillow. by @Pawan-Shahane in https://github.com/BerriAI/litellm/pull/41979
- fix: answer get_api_base for github_copilot and chatgpt without running the login flow by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42602
- test: point CircleCI-only suites at models still in the cost map by @yuneng-berri in https://github.com/BerriAI/litellm/pull/42617
- fix: drop duplicate cache_read_input_token_cost_batches keys from the price maps by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42623
- fix(s3): replace colons in generated log filenames by @mubashir1osmani in https://github.com/BerriAI/litellm/pull/40452
- test(realtime): drop legacy InvalidStatusCode tests and pin websockets imports by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42624
- fix(bedrock): treat blank AWS_S3_* env vars as unset for batch jobs by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42528
- ci(test-unit): drop dead misc shard paths and skip missing paths with a warning by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42603
- fix(proxy): keep the in-flight daily spend batch when shutdown cancels the flush by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42593
- fix(utils): isolate callback errors in async_post_call_success_deployment_hook by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42535
- test(e2e): add secret manager lanes for HashiCorp Vault and CyberArk Conjur by @yujonglee-berri in https://github.com/BerriAI/litellm/pull/42503
- feat(ui): simplify auto-router setup and clarify feature limits by @moe-berri in https://github.com/BerriAI/litellm/pull/42625
- feat(ui): add native LiteAdmin assistant by @tin-berri in https://github.com/BerriAI/litellm/pull/42443
- fix(mcp): preserve credential authority in DCR bridge authentication by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42563
- feat(ci): close open pull requests superseded by a merged fix on their linked issue by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42609
- test(cost): repoint the Azure image cost test at gpt-image-2 by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42631
- feat(logger): dispatch Python logging through the Rust diagnostics processor by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42616
- fix(bedrock): drop unsupported sampling params on converse reasoning models by @emerzon in https://github.com/BerriAI/litellm/pull/39834
- test(utils): raise the post-success hook error from a guardrail in the failure-hook regression by @devin-ai-integration[bot] in https://github.com/BerriAI/litellm/pull/42646
- chore(docker): bump wolfi-base digest to pick up glibc 2.44-r6 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/42643
- chore: bump litellm-enterprise 0.1.69 -> 0.1.70, litellm-proxy-extras 0.4.100 -> 0.4.101, litellm 1.103.0 -> 1.104.0 by @yuneng-berri in https://github.com/BerriAI/litellm/pull/42633
- fix: repair seven regressions caught by CircleCI on main by @yuneng-berri in https://github.com/BerriAI/litellm/pull/42640
New Contributors
- @clonylu made their first contribution in #41203
- @zoroyihan7 made their first contribution in #40243
- @adssoccer1 made their first contribution in #40399
- @gaurav-pandey-zocdoc made their first contribution in #39102
- @abhirup7 made their first contribution in #40147
- @chopratejas made their first contribution in #41560
- @kumarpriyanshu09 made their first contribution in #41526
- @Zechereh made their first contribution in #41099
- @philschmid made their first contribution in #42465
- @patel-26meet made their first contribution in #39311
- @togear made their first contribution in https://github.com/BerriAI/litellm/pull/41033
- @Pawan-Shahane made their first contribution in https://github.com/BerriAI/litellm/pull/41979
Full Changelog: v1.103.0-dev.2...v1.104.0-dev.1