Commit graph

1345 commits

Author SHA1 Message Date
Mateo Wang
79e25d1e96
Merge pull request #42045 from BerriAI/litellm_lit_8201_notfound_retry_policy
fix(router): add NotFoundErrorRetries so a retry policy can pin 404 retries
2026-09-19 19:37:45 -07:00
Mateo Wang
5417abd586
Merge pull request #42011 from BerriAI/litellm_scrub_default_master_key
docs: stop advertising sk-1234 as the master key in shipped configs and examples
2026-09-19 19:05:31 -07:00
mateo-berri
a9ad3eaf95 fix(router): add NotFoundErrorRetries so a retry policy can pin 404 retries
RetryPolicy had no field for 404s, so any policy that set DefaultRetries made
the router retry every 404 across the pool, including OpenAI's 404 on a missing
response id, which arrives as a BadRequestError whose status_code is 404

NotFoundErrorRetries now governs every answer whose status code is 404 whatever
exception class the mapping picked, ahead of the class walk and DefaultRetries.
A 404 without it still falls back to BadRequestErrorRetries for the
BadRequestError shape and then to DefaultRetries, so existing policies keep
their behavior until the new field is set. The Admin UI retry settings tab
gains a NotFoundError (404) row above the catch-all row

Fixes #36896
2026-09-19 16:25:47 -07:00
tin-berri
1944d40097
Merge pull request #41177 from BerriAI/litellm_autorouter_baseline_cache
fix(proxy): estimate auto-router baseline costs from durable cache history
2026-09-19 16:16:29 -07:00
Yuneng Jiang
d5ae810ea9
fix: let operators allowlist web search interception settings
Peer pods gate the settings poll on general_settings.supported_db_objects,
which validates against SupportedDBObjectType. Without a member for this
name an operator could not opt in, so a configured allowlist left every
pod but the one that served the write on stale settings.

Also types the dashboard's settings payload off the generated schema
instead of Record<string, any>.
2026-09-19 13:02:29 -07:00
ryan-crabbe-berri
c8e0f2ddb4 docs: stop advertising sk-1234 as the master key in shipped configs and examples
Shipped proxy configs now read general_settings.master_key from
os.environ/LITELLM_MASTER_KEY, the .env examples ship a blank value with
the openssl generate command above it, and READMEs, the missing env vars
page and Admin UI code snippets show a generate command or the
<your-master-key> placeholder instead of the literal sk-1234

The two CircleCI docker runs that mount proxy_server_config.yaml and
oai_misc_config.yaml now pass LITELLM_MASTER_KEY so their runtime key is
unchanged
2026-09-19 12:59:48 -07:00
Tin Chi Lo
ed40241d26 fix(proxy): estimate auto-router baseline costs from durable cache history 2026-09-19 12:44:47 -07:00
Yuneng Jiang
8622c93a11
Merge remote-tracking branch 'origin/main' into litellm_/web-search-autoship-scope-01a237 2026-09-19 12:22:49 -07:00
Yuneng Jiang
e12cbb4e13
feat(ui): configure web search interception from the Admin UI
Web search interception could only be switched on by editing config.yaml
and restarting the proxy, so an admin had no way to turn it on, choose
which providers it covers, or pick which configured search tool runs the
searches without a redeploy.

Adds GET/PATCH /get|update/websearch_interception_settings backed by a
WebSearchInterceptionSettings model, and an Admin Settings panel that
reads and writes them. Config/database precedence comes from the existing
settings store, so a key the config file declares is still refused here.

The stored settings apply to a running proxy: the DB poll rebuilds the
WebSearchInterceptionLogger, removing the old instance before adding the
new one, because two instances with different params hash differently in
the callback dedup key and the first to short-circuit would win. A proxy
that activates interception the existing way, through
litellm_settings.callbacks with no stored params, is left untouched.
2026-09-19 11:54:57 -07:00
ryan-crabbe-berri
89bf870225 fix(ui): stop Top Virtual Keys from opening keys that are not in the database
/user/daily/activity now reports key_exists on each api key's metadata, true
only when the key is in the active key table that /key/info reads. Top Virtual
Keys renders the Key ID as plain text with an explanatory tooltip and ignores
chart bar clicks when key_exists is false, so deleted keys and CLI/SSO session
keys no longer dead-end on a "Key not found in database" toast
2026-09-19 11:08:21 -07:00
Devin AI
107ec2706b style(ui): format Top Virtual Keys aggregation test
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 11:04:46 -07:00
Devin AI
88799f6f80 fix(ui): fall back to user id in Top Virtual Keys user column
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 11:04:46 -07:00
Devin AI
3d805e5166 fix(ui): show user attribution in Top Virtual Keys usage tables
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 11:04:26 -07:00
Yassin Kortam
6d8a960e1d
Merge pull request #41667 from BerriAI/litellm_mcp_client_allowlist
feat(mcp): allowlist MCP client applications at the gateway
2026-09-18 17:48:36 -07:00
yassin
e2141da81e fix(ui): treat MCP allowed clients with an empty alias or value as malformed
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 00:23:11 +00:00
yassin
c32309fb2d feat(ui): show MCP allowed clients as cards edited in a dialog
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 00:13:44 +00:00
yassin
da603c629b fix(ui): surface a malformed stored MCP allowlist as deny-all and let Save replace or remove it
Some checks failed
LiteLLM Rust / rust-lint (push) Has been cancelled
LiteLLM Rust / rust-test (push) Has been cancelled
LiteLLM Rust / rust-wheel (push) Has been cancelled
Terraform Modules / fmt, validate, test (aws) (push) Has been cancelled
Terraform Modules / fmt, validate, test (gcp) (push) Has been cancelled
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 22:37:30 +00:00
yassin
2231a3ca43 feat(mcp): give each allowed MCP client an alias and a value
mcp_allowed_clients entries become {alias, value} objects: the value is what the JWT claim or header must equal, the alias is the name the dashboard and logs show. The Network Settings section is renamed Allowed Clients with one alias/value row per client

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 22:29:17 +00:00
joshua
c9c4f21b55 fix(ui): let MCP Servers header actions wrap on narrow screens
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 22:10:43 +00:00
joshua
19ef8e47a6 feat(ui): link MCP Servers page to the user's connected MCP servers
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 22:01:56 +00:00
ryan-crabbe-berri
2332d3f183
Merge pull request #40737 from BerriAI/litellm_logs_user_email_display
fix(ui): show internal user email in logs table and log detail drawer
2026-09-18 14:20:16 -07:00
ryan-crabbe-berri
c21e86a443 feat(ui): reset a team member's spend from the Members tab
Every member now carries a membership row, so a member who spent with no budget is over budget the moment a member budget is added later. The only fix was POST /team/{team_id}/member/{user_id}/reset_spend, which had no UI.

The Members tab gets a Reset spend action on rows that have current cycle spend. It confirms in a dialog, posts reset_to 0 through the typed client, and refreshes the team without remounting the page so the tab stays open. A team admin does not see it on their own row because the backend rejects that reset
2026-09-18 13:54:28 -07:00
yassin
9917375d4b Merge remote-tracking branch 'origin/main' into litellm_mcp_client_allowlist
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

# Conflicts:
#	litellm/proxy/_experimental/mcp_server/server.py
2026-09-18 20:46:50 +00:00
yassin
737c6e1b2d Merge remote-tracking branch 'origin/main' into litellm_mcp_admin_terminate_sessions_revoke_credentials
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

# Conflicts:
#	tests/test_litellm/proxy/config_resolvers/test_settings_store.py
2026-09-18 20:32:31 +00:00
yassin
191ca14872 Merge remote-tracking branch 'origin/main' into litellm_usage_key_free_aggregate_split 2026-09-18 20:05:54 +00:00
yassin
fe8cf02823 feat(mcp): resolve the allowlisted client identity from the JWT claim or an opt-in header instead of clientInfo.name
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 19:27:43 +00:00
yassin
c5919a3c0e Merge remote-tracking branch 'origin/main' into litellm_mcp_client_allowlist
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

# Conflicts:
#	litellm/proxy/_experimental/mcp_server/server.py
#	litellm/proxy/proxy_server.py
2026-09-18 19:01:08 +00:00
yassin
048aaad627 Merge remote-tracking branch 'origin/main' into litellm_mcp_admin_terminate_sessions_revoke_credentials 2026-09-18 18:39:16 +00:00
Yassin Kortam
f6d9b2552f
Merge pull request #41692 from BerriAI/litellm_mcp_gateway_sessions_by_client_user
feat(mcp): show live gateway sessions by AI client and user
2026-09-18 11:37:16 -07:00
Yassin Kortam
ca79c393d5
Merge pull request #41636 from BerriAI/litellm_per_key_end_user_default_budget
feat(proxy): per-key default budget for dynamically created customers
2026-09-18 11:36:59 -07:00
yassin
fa70e49b81 chore: merge main into litellm_transcribe_passthrough
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 17:54:59 +00:00
ryan-crabbe-berri
a9ee15372f
Merge pull request #39308 from BerriAI/litellm_ui_per_second_video_pricing
fix(ui): show per-second pricing for video models instead of $0.00 token costs
2026-09-18 10:05:26 -07:00
ryan
4f86035a79 style(ui): format pricing test fixtures with prettier
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 16:16:28 +00:00
ryan
d197ca20fa fix(ui): type transformModelData output as ModelData so the dashboard build typechecks
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 16:13:28 +00:00
ryan
b5070408e7 refactor(ui): move per-second cost formatter to dataUtils and type transformModelData input
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 15:48:56 +00:00
Mateo Wang
861f79797f
Merge pull request #41663 from BerriAI/litellm_remove_legacy_interactions_schema_flag
refactor(interactions): remove expired use_legacy_interactions_schema shim
2026-09-18 08:48:30 -07:00
Mateo Wang
48c4204b43
Merge pull request #41658 from BerriAI/litellm_remove_orphaned_use_delete_project_hook
chore(ui): remove orphaned useDeleteProject hook and its test
2026-09-18 08:48:05 -07:00
Mateo Wang
e9823c6063
Merge pull request #41655 from BerriAI/litellm_remove_unused_access_group_types
chore(ui): remove unused access-groups type interfaces
2026-09-18 08:47:34 -07:00
Mateo Wang
57a273b087
Merge pull request #41651 from BerriAI/litellm_cost_tracking_dead_barrel_exports
refactor(ui): drop unused cost-tracking barrel re-exports and response types
2026-09-18 08:47:16 -07:00
Mateo Wang
1f50923211
Merge pull request #41649 from BerriAI/litellm_remove_dead_compareui_modelselector
chore(ui): remove dead compareUI ModelSelector and its test
2026-09-18 08:46:57 -07:00
Mateo Wang
8183199992
Merge pull request #41646 from BerriAI/litellm_remove_dead_guardrail_config
chore(ui): remove never-rendered GuardrailConfig mock component and its test
2026-09-18 08:46:25 -07:00
Mateo Wang
57a59889ac
Merge pull request #41644 from BerriAI/litellm_remove_dead_helplink_helpicon
refactor(ui): remove unused HelpLink and HelpIcon components
2026-09-18 08:46:08 -07:00
ryan
0beb2ffb81 Merge remote-tracking branch 'origin/main' into litellm_ui_per_second_video_pricing 2026-09-18 15:45:18 +00:00
yassin
3d2913307a Merge remote-tracking branch 'origin/main' into litellm_usage_key_free_aggregate_split 2026-09-18 08:59:24 +00:00
yassin
e6349d00f3 Merge remote-tracking branch 'origin/main' into litellm_mcp_admin_terminate_sessions_revoke_credentials 2026-09-18 02:10:58 +00:00
yassin
9d92b10575 fix(ui): clear a stored List general setting when its input is emptied
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 01:37:41 +00:00
yassin
aea33b4b50 fix(ui): hide MCP disconnect and revoke controls from view-only admin sessions
The auth hook normalizes proxy_admin_viewer to Admin for page access, so the role check alone let a view-only admin see Disconnect and Revoke buttons that the backend refuses with 403. Thread isViewOnly from useAuthorized into the MCP servers page and gate both mutation controls on it

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 01:37:12 +00:00
yassin
393d084db7 feat(proxy): restrict Transcribe media and output buckets per operator allowlist
Non-admin keys may only start transcription jobs whose media and transcript output live in the S3 buckets listed in general_settings.transcribe_media_buckets, and may not supply DataAccessRoleArn or JobExecutionSettings. The setting is editable from the Admin UI general settings table (new List editor) and DB values load into the running proxy when config.yaml does not set it

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 01:18:07 +00:00
yassin
ea37596b88 feat(mcp): let proxy admins force-close live MCP sessions and revoke stored user credentials
Adds an admin-only DELETE /v1/mcp/sessions that terminates stateful MCP gateway sessions on the current worker by session id prefix and/or by the LiteLLM user that opened them, tombstones the terminated ids so a client reusing one gets 404 instead of a silently recreated stateless session, and lets PROXY_ADMIN name a user_id on the BYOK and OAuth credential delete routes. Full and view-only admins can list every user's stored credential metadata for a server (never the secret). The dashboard gains Disconnect controls on the Live Connections tab and a User Credentials tab with Revoke controls, both hidden from read-only admins.

Resolves LIT-8001

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 01:01:26 +00:00
yucheng-berri
a9bea4f64d
Merge pull request #41571 from BerriAI/litellm_policy_attachment_priority
feat(policy_engine): explicit priority for policy attachment execution order
2026-09-17 17:27:55 -07:00