Commit graph

47584 commits

Author SHA1 Message Date
mateo-berri
edea0eeb15 Merge branch 'litellm_internal_staging' of https://github.com/BerriAI/litellm into litellm_fix_v1_messages_midstream_timeout_failure_logging 2026-09-03 16:42:10 -07:00
mateo-berri
fde676dc38 fix(anthropic): run the proxy failure hook when a detached /v1/messages stream fails 2026-09-03 16:42:08 -07:00
mateo-berri
bd9593b74d fix(proxy): share the Bedrock count-tokens predicate between auth and the passthrough handler 2026-09-03 16:41:31 -07:00
mateo-berri
a330bc98a6 test(vertex-passthrough): inject the forwarder into the short-route regression helper 2026-09-03 16:39:03 -07:00
devin-ai-integration[bot]
0b7773dd44
fix(router): count tools and Anthropic system prompt in context-window pre-call check (#39663)
Co-authored-by: yassin <yassin@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-03 16:38:48 -07:00
mateo-berri
f1f0294796 Merge branch 'litellm_internal_staging' of https://github.com/BerriAI/litellm into litellm_fix-batch-spend-key-double-hash-bcae 2026-09-03 16:36:12 -07:00
mateo-berri
3b43b5a3d6 Merge branch 'litellm_internal_staging' of https://github.com/BerriAI/litellm into litellm_bedrock_passthrough_model_access 2026-09-03 16:35:33 -07:00
ryan-crabbe-berri
ab0478f068
Merge pull request #39623 from BerriAI/litellm_scim_default_team_fallback
fix(scim): default-team fallback on create and keep memberships when PUT /Users has no groups
2026-09-03 16:32:45 -07:00
mubashir1osmani
27689c5919 Merge remote-tracking branch 'berri/litellm_internal_staging' into litellm_lit6899_vertex_batch_tuned_endpoints 2026-09-03 19:29:20 -04:00
yuneng-jiang
170a1eeb06
Merge pull request #39669 from BerriAI/litellm_fix_migrate_deploy_harness_popen_seam
test(proxy-extras): fake run_prisma instead of subprocess.run in the migrate deploy harness
2026-09-03 16:26:48 -07:00
mateo-berri
1125307b1a Merge branch 'litellm_internal_staging' of https://github.com/BerriAI/litellm into litellm_lit6905_vertex_passthrough_default_location 2026-09-03 16:25:50 -07:00
mateo-berri
656d81e84d Merge origin/litellm_internal_staging into litellm_lit6874_fireworks_perplexity_off_peak_pricing
Adapts both calculators to the TokenRates signature apply_off_peak_pricing took in #39635
2026-09-03 16:22:44 -07:00
ryan-crabbe-berri
07dd8a7e47 fix(scim): keep team memberships when PUT /Users carries no groups
Okta sends profile updates as full PUTs with no groups or groups: [], since SCIM User.groups is readOnly and membership is synced through /Groups. The PUT handler diffed that empty list against the stored teams, removed the user from every team (which also deletes their team keys) and recomputed the role from an empty group list. Treat an empty groups list on PUT as unspecified: keep the stored teams and leave the role alone. Explicit non-empty groups still replace memberships as before

Claude-Session: https://claude.ai/code/session_01CqwUV4Ywnu5aUjXx1UhJrM
2026-09-03 16:22:13 -07:00
ryan
0429339204 fix(scim): pass proxy admin auth to new_user so default team add succeeds
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-03 16:21:37 -07:00
ryan
dc98901dc1 fix(scim): apply default_internal_user_params.teams to SCIM-created users
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-03 16:21:37 -07:00
ryan
fb4cbccbf5 Merge remote-tracking branch 'origin/litellm_internal_staging' into litellm_fix_org_update_null_budget_limits 2026-09-03 23:19:14 +00:00
ryan
361170f9d4 feat(organization): expose PATCH /v2/organization/{organization_id} in the OpenAPI spec
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-03 23:19:04 +00:00
ryan-crabbe-berri
a53c550951
Merge pull request #39661 from BerriAI/litellm_lit_4741_copy_id_search
feat(ui): find rows by a pasted ID on keys, agents, memory, audit, and request logs
2026-09-03 16:17:59 -07:00
Mateo Wang
a3afbb17e0
Merge pull request #39652 from BerriAI/litellm_fix_openai_wif_openai_backed_hosts
fix(openai): mint workload identity tokens for PrivateLink and regional api.openai.com hosts
2026-09-03 16:17:44 -07:00
Mateo Wang
9b7acf791c
Merge pull request #39635 from BerriAI/litellm_off_peak_reasoning_cache_creation_rates
feat(cost): honor off_peak_pricing reasoning and cache-creation rates
2026-09-03 16:17:38 -07:00
Mateo Wang
16a8665bbd
Merge pull request #39659 from BerriAI/litellm_dedupe_router_mode_test
test(router): drop duplicate get_configured_mode test failing ruff F811
2026-09-03 16:17:24 -07:00
Yuneng Jiang
c550641d44
Merge remote-tracking branch 'origin/litellm_dedupe_router_mode_test' into litellm_fix_migrate_deploy_harness_popen_seam 2026-09-03 16:15:50 -07:00
Yuneng Jiang
7bdd148f38
test(proxy-extras): fake run_prisma instead of subprocess.run in the migrate deploy harness 2026-09-03 16:10:44 -07:00
mubashir1osmani
e5d51ee8be fix(vertex_ai): support fine-tuned Gemini endpoints in managed batches
Managed batches mangled any Vertex model that is not a plain publisher
model: a fine-tuned Gemini endpoint id was filed under
publishers/google/models/gemini/<id> at upload, then the batch create
parse dropped the id and targeted the nonexistent publisher model
'publishers/google/models/gemini', which Vertex rejects.

Fine-tuned endpoints are now stored under endpoints/<id> in the GCS
object path, and batch create resolves the endpoint to its deployed
tuned model resource (projects/../models/<id>) via GET endpoints/<id>,
which is the only form the v1 batch API accepts for tuned models. The
cost poller's bare-model parse round-trips the endpoint id so unmanaged
batch spend still maps to the configured deployment.

custom_endpoint deployments have no Vertex batch surface, so batch file
uploads and batch creation against them now return a clear 400 instead
of creating a doomed job.

Resolves LIT-6899
2026-09-03 19:06:01 -04:00
ryan-crabbe-berri
9464888ee9 test(proxy): pass search=None in direct ui_view_spend_logs calls
Calling the endpoint without going through FastAPI leaves the new search param set to its Query default object, which is not None, so the grouped-session and request_id lookup tests started taking the search branch

Claude-Session: https://claude.ai/code/session_01Q5sbiogJzPcCRmYSbaHxZf
2026-09-03 16:04:41 -07:00
ryan
04a2407244 fix(organization): clear org budget limits when PATCH /organization/update sends null
A sent null for tpm_limit, rpm_limit, max_budget and the other budget fields
was dropped by a 'v is not None' filter, so update_budget was never called and
the request returned 200 without changing the budget row. Presence is now read
from model_fields_set (merge-patch semantics, matching /v2/organization) and
the nested litellm_budget_table payload no longer drops nulls either

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-03 23:03:14 +00:00
ryan-crabbe-berri
9baa19c7d1 fix(proxy): stop hashing raw sk- values in list searches
The search= param on /key/list, /audit, and /spend/logs/ui, plus key_hash= on /key/list, now compare the pasted value verbatim. Only a copied key ID (the hash) matches, so a raw virtual key never needs to travel in a GET query string

Claude-Session: https://claude.ai/code/session_01Q5sbiogJzPcCRmYSbaHxZf
2026-09-03 15:54:42 -07:00
mateo-berri
f15bdfb669 chore: merge litellm_internal_staging into the mid-stream failure logging branch
Keeps staging's response-id keying next to the pass-through failure-path helpers
and types the read-only raw_bytes parameters as Sequence[bytes] so the merged tree
stays inside the lint budgets
2026-09-03 15:51:51 -07:00
mateo-berri
32293295f8 refactor(proxy): resolve the Bedrock route model through an early return
The Bedrock branch of get_model_from_request reassigned the already resolved
model binding. Move the route parsing into a helper that returns the URL model
or None so the caller picks between it and the body model without rebinding.
2026-09-03 15:40:35 -07:00
mateo-berri
1d71e306cc test(router): assert a non-chat configured mode round-trips
With every kept get_configured_mode test using mode "chat", a Router that
answered "chat" for any non-blank configured mode passed all four of them
(the deleted #39630 pair's audio_speech case was the only test catching it).
Read the mode back as audio_speech on an unmapped model so the configured
value itself is what the test checks. Six hand-applied mutations of
Router.get_configured_mode, including that hardcoded-chat one, are now all
killed by the four surviving tests.
2026-09-03 15:38:15 -07:00
mateo-berri
24531ee576 refactor(cost): drop the docstrings that restate TokenRates and the new tests 2026-09-03 15:37:56 -07:00
ryan-crabbe-berri
a5b3bc887a
Merge pull request #39218 from BerriAI/litellm_lit_6593_access_group_attached_teams
fix(access_groups): derive attached teams from the team table and reject unknown team ids
2026-09-03 15:30:32 -07:00
mateo-berri
57da95a77c fix(proxy): apply default_vertex_config location before building the Vertex passthrough base URL
Routes without /projects/<project>/locations/<location>/ built the upstream host from the URL's
still-empty location and 500ed even with default_vertex_config set. Build the base URL once after
the configured project and location are applied, drop the hook that re-derived it afterwards, and
answer 400 with a fix-it message when no location is available at all.

Resolves LIT-6905
2026-09-03 15:27:47 -07:00
ryan-crabbe-berri
e504477a69 chore(ui): regenerate schema.d.ts for the new search params
Claude-Session: https://claude.ai/code/session_01Q5sbiogJzPcCRmYSbaHxZf
2026-09-03 15:20:55 -07:00
ryan-crabbe-berri
a6b7ef6abe feat(ui): find a row by its pasted ID on every list page
Virtual Keys and Team Virtual Keys send the search box to the new
key/list search param so a key hash matches. Agents matches agent_id
client-side. Memory sends the box as search so a memory_id matches.
Audit Logs gains a search box. Request Logs sends the box as search so
a session, team, user, key hash, or model id matches without opening
the filter drawer.

Claude-Session: https://claude.ai/code/session_01Q5sbiogJzPcCRmYSbaHxZf
2026-09-03 15:20:46 -07:00
mateo-berri
ea12510f1a test(router): drop duplicate get_configured_mode test failing ruff F811
PRs #39630 and #39634 both added test_get_configured_mode_reads_deployment_model_info
to tests/test_litellm/test_router.py, so the staging tip defines it twice and the
required lint check fails with F811 on every PR synced past 321636ef5d.

Keep the four tests from #39634 (mode read, None for unset or unknown, no wildcard
pattern routing, malformed values treated as absent), which subsume the #39630 pair,
and delete that pair. Five hand-applied mutations of Router.get_configured_mode are
all still killed by the surviving tests.
2026-09-03 15:20:42 -07:00
ryan-crabbe-berri
4811041048 feat(proxy): add a search param to key, memory, audit, and spend log listings
GET /key/list?search= matches the key hash (a raw sk- key is hashed
first) or a case-insensitive alias substring, and key_hash= now hashes a
raw sk- value too. GET /v1/memory?search= matches a key prefix or an
exact memory_id. GET /audit?search= matches id, object_id, changed_by,
or changed_by_api_key. GET /spend/logs/ui?search= matches request_id
across all time and api_key, team_id, user, end_user, session_id, or
model_id inside the date window; session grouping is skipped while a
search is active.

Claude-Session: https://claude.ai/code/session_01Q5sbiogJzPcCRmYSbaHxZf
2026-09-03 15:20:13 -07:00
mateo-berri
8e4397d5f1 chore(ci): rebuild the PR merge ref against staging's router coverage fix 2026-09-03 15:19:49 -07:00
devin-ai-integration[bot]
942a46ffd7
fix(caching): don't trip redis circuit breaker on short timeout bursts (#38999)
* fix(caching): don't trip redis circuit breaker on short timeout bursts

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* fix(caching): scope timeout duration gate to timeout failures and count breaker states per label

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* fix(caching): reset the timeout streak on hard failures so stale timeouts cannot pre-age the duration gate

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: yassin <yassin@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-03 22:18:20 +00:00
mateo-berri
0bd2fd2a3b Merge remote-tracking branch 'origin/litellm_internal_staging' into litellm_lit6874_fireworks_perplexity_off_peak_pricing 2026-09-03 15:13:44 -07:00
devin-ai-integration[bot]
a0958d5c21
perf(auth): skip object permission DB lookup when no vector stores requested (#39347)
* perf(auth): skip object permission DB lookup when no vector stores requested

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* test(auth): justify module patches

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: yassin <yassin@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-03 15:12:06 -07:00
devin-ai-integration[bot]
24666d8dbf
fix(docker): match USE_DDTRACE case-insensitively and route build_from_pip through prod_entrypoint.sh (#39344)
* fix(docker): match USE_DDTRACE case-insensitively and route build_from_pip through prod_entrypoint.sh

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* test(docker): run build_from_pip ENTRYPOINT and CMD through the shipped prod_entrypoint.sh

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: yassin <yassin@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-03 15:10:33 -07:00
devin-ai-integration[bot]
35d20468cd
fix(mcp): normalize a schemed authentication_token on the v2 and OpenAPI static paths (#39345)
Co-authored-by: yassin <yassin@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-03 15:09:08 -07:00
devin-ai-integration[bot]
6da516e6f3
fix(mcp): strip inbound auth scheme case-insensitively before token exchange (#39346)
* fix(mcp): strip inbound auth scheme case-insensitively before token exchange

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* test(mcp): type the fake credential provider params in token exchange scheme tests

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: yassin <yassin@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-03 15:08:02 -07:00
yuneng-jiang
bed4086619
Merge pull request #33536 from BerriAI/litellm_/rbac-batches-action-items-c00ade
feat(proxy): enforce team isolation for provider-format batch ids and output files
2026-09-03 15:07:59 -07:00
devin-ai-integration[bot]
f2f65a6e8b
fix(mcp): resolve OAuth broker endpoints by server_id with IP access checks (#39432)
* fix(mcp): resolve OAuth broker endpoints by server_id with IP access checks

Resolve named OAuth lookups through server IDs while retaining client IP checks\n\nCo-authored-by: KK291860 <krishnakumar.kocherykumaran@sephora.com>

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* ci: retrigger e2e pipeline

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: yassin <yassin@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-03 15:04:45 -07:00
mateo-berri
f9e41470d6 test(cost): type the off-peak fixture helpers with OffPeakPricing 2026-09-03 15:03:10 -07:00
Riddhi04
6981ccf0ca fix(proxy): make URL model authoritative for Bedrock path-routed passthrough actions
The allowlist check read model from the request body first, while
bedrock_llm_proxy_route dispatches purely on the path model for invoke,
converse, and their streaming variants. A caller could put an allowed
model in the JSON body while targeting a disallowed model in the URL and
slip past the check. count_tokens keeps reading from the body since its
route has no model segment in the path.
2026-09-03 15:02:49 -07:00
Riddhi04
534ab1628d fix(proxy): enforce model access checks on Bedrock passthrough routes
get_model_from_request could not resolve a model for /bedrock/... routes since it only checked the JSON body's model field and a small set of URL regexes, none matching Bedrock's passthrough path. This let common_checks skip the key/project model allowlist entirely for any Bedrock passthrough action (invoke, converse, and their streaming variants), while the same model was correctly blocked on /v1/chat/completions

Extract the model from the Bedrock endpoint path using the same helper the passthrough handler itself relies on, so the existing allowlist check applies uniformly across auth methods and call paths
2026-09-03 15:02:49 -07:00
mateo-berri
0f759c56f0 fix(proxy): bill partial usage on failed Vertex and Gemini pass-through streams 2026-09-03 15:00:08 -07:00