Commit graph

46799 commits

Author SHA1 Message Date
moe-berri
39541f2c92 fix(proxy): reconcile mixed fusion responses 2026-09-03 16:35:14 -07:00
moe-berri
a8605d2f73 test(ui): stabilize fusion model selectors 2026-09-03 16:35:14 -07:00
moe-berri
8a00e1a3cd fix(ci): satisfy fusion type discipline 2026-09-03 16:35:14 -07:00
moe-berri
2b6d06e0b5 fix(ci): satisfy strict fusion lint gates 2026-09-03 16:35:14 -07:00
moe-berri
5746db7081 test(router): cover fusion adapter entrypoints 2026-09-03 16:35:14 -07:00
moe-berri
2852fb846a fix(router): preserve fusion tool boundaries 2026-09-03 16:35:14 -07:00
moe-berri
4859ac43da fix(router): bound fusion search transcripts 2026-09-03 16:35:14 -07:00
moe-berri
10d579418a fix(router): harden fusion search and lifecycle 2026-09-03 16:35:14 -07:00
moe-berri
40528bb4ed feat(ui): promote fusion web access 2026-09-03 16:35:14 -07:00
moe-berri
568b6c910e feat(router): implement native fusion deliberation 2026-09-03 16:35:14 -07:00
moe-berri
c72e4b8b43 fix(router): bound fusion candidates and cancellation cost 2026-09-03 16:34:53 -07:00
moe-berri
b294cac384 fix(router): address fusion review findings 2026-09-03 16:34:52 -07:00
moe-berri
a688e04775 fix(ui): improve fusion preset selector 2026-09-03 16:34:52 -07:00
mfkhalil
6bfa6ae498 feat(router): add fusion models 2026-09-03 16:34:52 -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
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
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-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
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-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
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
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
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 Wang
3244a034ac
Merge pull request #39534 from BerriAI/litellm_fix_responses_queued_id_encryption
fix(responses): encrypt the response id on every streamed event
2026-09-03 14:54:52 -07:00
moe-berri
321636ef5d
Merge pull request #39634 from BerriAI/litellm_fix_router_mode_coverage
test(router): cover configured mode lookup
2026-09-03 14:52:07 -07:00
mateo-berri
2df5f4a7c8 Merge remote-tracking branch 'origin/litellm_internal_staging' into litellm_fix_responses_queued_id_encryption
# Conflicts:
#	type-discipline-budget.json
2026-09-03 14:45:19 -07:00
devin-ai-integration[bot]
ab44e8d602
fix(team_endpoints): stop partial /team/update from wiping team metadata (#36328)
Co-authored-by: yassin <yassin@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-03 14:44:09 -07:00
devin-ai-integration[bot]
959e730d55
fix(agents): hide agents from non-admins who were never granted them (#39636)
Listing agents (GET /v1/agents and MCP agent_search) treated the absence of any
agent grant on the key or team as permission to see every agent. Non-admin keys
now list only the union of explicit grants, and dashboard sessions resolve that
union through the user's real teams and user row instead of the shared
dashboard team. Proxy admins still see everything and direct access to a named
agent is unchanged.

Resolves LIT-6862

Co-authored-by: yassin <yassin@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-03 14:40:36 -07:00
mateo-berri
19da217167 fix(openai): mint workload identity tokens for PrivateLink and regional api.openai.com hosts 2026-09-03 14:38:47 -07:00
yuneng-jiang
918ada8d57
Merge pull request #39611 from BerriAI/litellm_/dazzling-ellis-c9e9ff
test(team-race): wait on pg_locks instead of a fixed sleep
2026-09-03 14:38:41 -07:00
Mateo Wang
10aaea5fae
Merge pull request #39243 from BerriAI/litellm_fix_guardrail_event_hook_resync
fix(guardrails): rebuild the serving worker guardrail on PUT instead of patching it in place
2026-09-03 14:37:52 -07:00