Commit graph

34432 commits

Author SHA1 Message Date
Vasilisa Parshikova
4c816c53ad (sap) run black formater 2026-03-13 15:48:48 +04:00
Vasilisa Parshikova
a105cb336d (sap) mock commit 2026-03-11 22:42:29 +04:00
Vasilisa Parshikova
a179728f18 (sap) fix after bot review 2026-03-11 22:19:23 +04:00
Vasilisa Parshikova
32bdc30174 (sap) fix after bot review 2026-03-11 21:36:28 +04:00
Vasilisa Parshikova
0a37c5b27c (sap) fix after bot review 2026-03-11 20:34:29 +04:00
Vasilisa Parshikova
9b165735db (sap) fix after bot review 2026-03-11 20:00:20 +04:00
Vasilisa Parshikova
10249ce5e6 (sap) fix after bot review 2026-03-11 18:48:45 +04:00
Vasilisa Parshikova
61273e645d (sap) fix after bot review 2026-03-11 18:12:06 +04:00
Vasilisa Parshikova
25cd968a7a (sap) fix after bot review 2026-03-11 17:47:09 +04:00
Vasilisa Parshikova
b25ca3255b (sap) fix after bot review 2026-03-11 17:20:47 +04:00
Vasilisa Parshikova
2a523988d3 (sap) fix after bot review 2026-03-11 16:35:41 +04:00
Vasilisa Parshikova
e12fdd1ffd (sap) fix after bot review 2026-03-11 16:19:12 +04:00
Vasilisa Parshikova
5f4ac7d985 (sap) fix after bot review 2026-03-11 15:21:16 +04:00
Vasilisa Parshikova
c4eea9236b (sap) fix after bot review 2026-03-11 13:42:46 +04:00
Vasilisa Parshikova
f0bdbe6075 (sap) Align embedding request transformation with current API 2026-03-09 18:41:00 +04:00
Vasilisa Parshikova
16d7f7a9f1 (sap) linter fix 2026-03-05 13:35:36 +04:00
Vasilisa Parshikova
297246d11b (sap) update docs, solve merge conflict in transformation.py 2026-03-05 13:17:20 +04:00
Vasilisa Parshikova
2968d471d3 Merge remote-tracking branch 'origin/main' into sap-ai-hub-module-config-list
# Conflicts:
#	litellm/llms/sap/chat/transformation.py
2026-03-05 13:02:41 +04:00
Vasilisa Parshikova
e3188b1a6d Merge remote-tracking branch 'origin/main' into sap-ai-hub-module-config-list 2026-03-05 12:55:24 +04:00
Vasilisa Parshikova
bc514cec80 (sap) update tests 2026-03-05 12:55:10 +04:00
Sameer Kankute
cdf2d67fc8
Merge pull request #22503 from giulio-leone/fix/graceful-tool-args-repair
fix(tools): gracefully repair truncated JSON in tool call arguments
2026-03-05 13:00:07 +05:30
Sameer Kankute
f7d5ff9e2a
Merge pull request #22692 from giulio-leone/fix/vertex-ai-streaming-truncation
fix(streaming): prevent Vertex AI Claude content truncation when finish_reason races content
2026-03-05 12:50:49 +05:30
Ishaan Jaff
1bb713bc7b
feat(mcp): BYOK MCP servers with OAuth 2.1 PKCE authorization flow (#22850)
* feat(mcp): BYOK (Bring Your Own Key) for OpenAPI MCP servers with OAuth 2.1 flow

Adds per-user credential storage for BYOK MCP servers so external clients
can authenticate via standard OAuth 2.1 PKCE without needing a full identity
provider.

Backend:
- New DB table LiteLLM_MCPUserCredentials (user_id, server_id, credential_b64)
- is_byok, byok_description, byok_api_key_help_url fields on MCPServerTable
- OAuth 2.1 authorization server endpoints (/.well-known/oauth-authorization-server,
  /.well-known/oauth-protected-resource, /v1/mcp/oauth/authorize, /v1/mcp/oauth/token)
- 401 challenge with WWW-Authenticate header when BYOK server has no credential
- CRUD endpoints: POST/DELETE /v1/mcp/server/{id}/user-credential
- has_user_credential annotated on GET /v1/mcp/server response

UI:
- ByokCredentialModal: 2-step Connect flow (access description + API key entry)
- BYOK toggle + description fields on admin MCP server create form
- Connect/Connected state in MCP server table
- BYOK Demo page (/tools/byok-demo) showing full OAuth 2.1 PKCE flow

* feat(mcp/byok): redesign OAuth authorize page to match 2-step Connect mockup

- Step 1: L→S logos, requested access checklist, How it works box, Continue button
- Step 2: API key input, Save toggle, Duration pills (1h/24h/7d/30d/until_revoked), security note
- Matches screenshots: white modal on dark bg, progress dots, dark CTA buttons
- Authorize handler now fetches byok_description and byok_api_key_help_url from server registry
- CLAUDE.md: replace SQL snippet with proper DB migration troubleshooting guidance

* fix: address greptile review feedback (greploop iteration 1)

- XSS: escape all user-supplied values in _build_authorize_html() with html.escape()
- Open redirect: validate redirect_uri scheme and URL-encode code/state in redirect
- N+1 query: batch BYOK credential lookup into single find_many() call
- Critical path DB: add 60s TTL in-memory cache to _check_byok_credential()
- Encrypt BYOK credentials at rest using encrypt_value_helper/decrypt_value_helper

* fix(byok): update OAuth popup with LiteLLM logo, MCP title suffix, remove emojis

* fix(byok-demo): fix token endpoint URL (/v1/mcp/oauth/token not /v1/mcp/token)

* feat(byok): inject stored BYOK credential as mcp_auth_header on tool execution

* feat(byok): use contextvars to inject per-user credential into OpenAPI tool closures; remove byok-demo from LiteLLM UI

OpenAPI tools have auth headers baked into their closures at registration time. BYOK servers have
no static auth token, so per-user credentials were never reaching the HTTP calls.

Fix: add _request_auth_header ContextVar in openapi_to_mcp_generator.py. create_tool_function now
reads this var at call time and overrides the Authorization header if set. execute_mcp_tool resolves
the MCP server and performs BYOK checks before the local-tool dispatch branch, then sets the
ContextVar around _handle_local_mcp_tool so the credential flows into the HTTP request.

Also remove the /tools/byok-demo page from the LiteLLM UI dashboard — the demo lives at
~/Downloads/litellm-byok-demo/index.html (served separately on port 8080).

* fix: address greptile review feedback (greploop iteration 2)

- Cache invalidation: add _invalidate_byok_cred_cache() and call it after
  store_user_credential() in both token endpoint and management endpoint
- Unbounded cache: add _BYOK_CRED_CACHE_MAX_SIZE=4096 with clear-on-overflow
- Unbounded auth codes: add _AUTH_CODES_MAX_SIZE=1000 with 503 on overflow
- Double DB query: merge _check_byok_credential + _get_byok_credential into
  single _get_byok_credential call; raise 401 inline if None returned
- Sidebar: remove byok-demo entry (page was deleted in prior commit)
- JWT comment: document why byok_session HS256 token can't be used as proxy auth

* fix: address greptile review feedback (greploop iteration 3)

- auth_type: pre-format Authorization header (Bearer/ApiKey/Basic) in server.py
  before setting ContextVar so openapi_to_mcp_generator respects server auth_type
- cache invalidation on delete: call _invalidate_byok_cred_cache after
  delete_user_credential so stale True entries don't persist for 60s
- ContextVar guard: only set _request_auth_header when mcp_auth_header is set,
  avoiding unnecessary ContextVar overhead on non-BYOK tool calls

* fix: address greptile review feedback (greploop iteration 4)

- Unified credential cache: store actual credential value (Optional[str])
  instead of just bool so _get_byok_credential also benefits from caching —
  eliminates the DB hit on every BYOK tool call within the 60s TTL window
- Extracted _write_byok_cred_cache() helper for consistent cache writes
- Replaced has_user_credential with get_user_credential in _check_byok_credential
  so one DB call satisfies both existence check and value retrieval
- Remove false 'encrypted at rest' claim from OAuth HTML and ByokCredentialModal

* Update tests/test_litellm/proxy/_experimental/mcp_server/test_byok_oauth_endpoints.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Update tests/test_litellm/proxy/_experimental/mcp_server/test_byok_oauth_endpoints.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-03-04 21:19:25 -08:00
yuneng-jiang
3c389ad6f7
Merge pull request #22857 from BerriAI/litellm_fix_key_org_id_serialization
[Fix] UI - Keys: Organization always shows Not Set
2026-03-04 20:33:29 -08:00
yuneng-jiang
7eafac8e7f Fix remaining org_id fallbacks in filter_helpers and TeamVirtualKeysTable
filter_helpers.ts was not populating the Organization ID filter dropdown
(always empty). TeamVirtualKeysTable was showing the team's org for all
keys instead of each key's own org.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-04 20:18:54 -08:00
yuneng-jiang
51d876ce79 [Fix] UI - Keys: Organization shows Not Set due to org_id/organization_id mismatch
The /key/list API returns `org_id` (the Pydantic field name), but the UI
was reading `organization_id`, causing the Organization field to always
show "Not Set" and the Organization ID filter to never match.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-04 20:11:42 -08:00
Sameer Kankute
335c4d4946
Merge pull request #22851 from BerriAI/litellm_v182-messages-routing-note
docs(v1.82.0): add v1/messages routing note and caution to release notes
2026-03-05 09:31:51 +05:30
yuneng-jiang
6aeceb6512
Merge pull request #22846 from BerriAI/litellm_hide_bounce_icon
[Feature] Add option to hide bouncing icon in header
2026-03-04 19:59:29 -08:00
yuneng-jiang
6e59fe839d
Merge pull request #22845 from BerriAI/litellm_mcp_tab_spacing
[Fix] UI - MCP Servers: Current Team spacing alignment
2026-03-04 19:57:11 -08:00
Sameer Kankute
caa0296d15 docs(v1.82.0): add v1/messages routing note and caution to release notes
Made-with: Cursor
2026-03-05 09:26:51 +05:30
yuneng-jiang
726a8cc938 [Feature] Add option to hide bouncing icon in header
Adds a localStorage-based toggle to hide the bouncing 🌑 icon next to
the version tag in the navbar, following the same pattern used for
hiding prompts, usage indicator, new feature badges, and blog posts.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-04 19:20:08 -08:00
yuneng-jiang
cb4aee5ce6 fix: remove px-6 from table wrapper to align with tabs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-04 19:18:42 -08:00
yuneng-jiang
fa1b7b1042 [Fix] UI - MCP Servers: align Current Team section with tabs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-04 19:09:01 -08:00
Ishaan Jaff
38ea5aba80
Delete ttft-logs-screenshot.png 2026-03-04 18:51:02 -08:00
Shivam Rawat
7f4d1bc1ca
Merge pull request #22838 from BerriAI/doc_update_v1.81.14.pip
doc change
2026-03-04 18:28:06 -08:00
shivam
5bd692e649 doc change 2026-03-04 18:27:40 -08:00
Shivam Rawat
588b9b7797
Merge pull request #22837 from BerriAI/doc_update_v1.81.14.stable
new update
2026-03-04 18:25:10 -08:00
shivam
1c46495c01 new update 2026-03-04 18:24:04 -08:00
Shivam Rawat
9c20f4f6d1
Merge pull request #22834 from BerriAI/doc_update_v1.81.14.stable
chore
2026-03-04 18:17:12 -08:00
shivam
c60ea1878d chore 2026-03-04 18:15:45 -08:00
Shivam Rawat
440ae8933e
Merge pull request #22833 from BerriAI/doc_update_for_v1.82.0
[Fix] chore for release notes
2026-03-04 18:04:48 -08:00
shivam
b6c2028294 chore for release notes 2026-03-04 18:03:54 -08:00
Ishaan Jaff
9897df5089
feat(mcp): allow admins to override tool name and description per MCP server (#22828)
* feat(mcp): add tool_name_to_display_name and tool_name_to_description overrides for MCP servers

* docs(mcp): add mcp_openapi.md with OpenAPI→MCP guide and tool override section

* docs(mcp): add sequential UI screenshots to mcp_openapi.md

* fix(mcp): apply tool overrides after permission filtering; reverse-map display names in tools/call
2026-03-04 17:58:05 -08:00
Ishaan Jaff
dd183a7fcb
[Feat] UI - Allow sorting MCPs by created_at, Display name date (#22825)
* Add column sorting to MCP servers table

- Added sorting state management to DataTable component
- Enabled getSortedRowModel for tanstack/react-table
- Made column headers clickable with sort indicators (↑↓⇅)
- Added enableSorting: true to sortable columns in mcp_server_columns
- Columns now support ascending/descending sort by clicking headers
- Updated package-lock.json and tsconfig.json from build process

Co-authored-by: Ishaan Jaff <ishaan-jaff@users.noreply.github.com>

* Make table sorting opt-in to avoid conflicts with existing consumers

Address Greptile feedback (score 2/5):
- Added enableSorting prop to DataTable (defaults to false)
- Only enable sorting features when explicitly requested
- Pass enableSorting=true from MCP servers component
- This prevents unintended sorting on other DataTable consumers:
  * view_logs (has server-side sorting)
  * pass_through_settings
  * UsagePage
- Sorting UI (indicators, click handlers) only shown when enabled

Co-authored-by: Ishaan Jaff <ishaan-jaff@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Ishaan Jaff <ishaan-jaff@users.noreply.github.com>
2026-03-04 17:47:01 -08:00
yuneng-jiang
a33d3e035d
Merge pull request #22830 from BerriAI/litellm_fix_docs_build
[Fix] Docs build broken due to mismatched @docusaurus package versions
2026-03-04 17:41:26 -08:00
yuneng-jiang
e4dd3efe11
Merge pull request #22829 from BerriAI/litellm_projects_vitest
[Test] UI - Projects: add Vitest unit tests for all Projects components
2026-03-04 17:39:59 -08:00
yuneng-jiang
6ca7187999
Merge pull request #22827 from BerriAI/litellm_cleanup_networking_exports
[Refactor] UI - Dashboard: remove unused exports from networking.tsx
2026-03-04 17:38:43 -08:00
yuneng-jiang
9501a161e7 [Fix] Docs build broken due to mismatched @docusaurus package versions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-04 17:35:01 -08:00
yuneng-jiang
06d1616b9f remove unused exports from networking.tsx
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-04 17:26:18 -08:00
yuneng-jiang
e34960b3f0 [Test] UI - Projects: add Vitest unit tests for all Projects components
Adds 77 tests across 8 files covering ProjectsPage, ProjectDetailsPage,
ProjectKeysSection, ProjectKeysTable, CreateProjectModal, EditProjectModal,
ProjectBaseForm, and projectFormUtils.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-04 17:26:11 -08:00