Commit graph

35265 commits

Author SHA1 Message Date
Hendrik Jaks
40eaab5693 refactor(ui): remove circular dependency in cookieUtils.ts
Derive the UI cookie path from window.location.pathname instead of
importing serverRootPath from networking.tsx. This breaks the
cookieUtils → networking → cookieUtils cycle that could cause
serverRootPath to be undefined under certain bundler configurations.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 00:07:06 +02:00
Hendrik Jaks
bd878e742e fix(ui): use dynamic cookie path based on server_root_path
Hardcoded path=/ui breaks when LiteLLM is deployed with a custom
server_root_path. Now derives the cookie path from serverRootPath
so it works at /ui, /myapp/ui, etc.

Also reuse clearTokenCookies() in deleteCookie() to avoid duplication.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 23:53:35 +02:00
Hendrik Jaks
a0937607a4 fix(ui): set JS-accessible cookie at /ui path as HttpOnly workaround
sessionStorage alone is unreliable. Also set the token via
document.cookie at path=/ui — nginx only adds HttpOnly to server-set
Set-Cookie headers, so a JS-set cookie is always readable.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 23:50:02 +02:00
Hendrik Jaks
01f8844114 fix(ui): preserve sessionStorage token across beforeunload clear
The existing beforeunload handler calls sessionStorage.clear() to
flush cached UI data on page refresh. This also wiped the token
stored by storeLoginToken, re-introducing the redirect loop after
any page refresh in the HttpOnly proxy scenario. Now the token is
saved and restored across the clear.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:15:39 +02:00
Hendrik Jaks
35bd69e146 fix(ui): guard storeLoginToken against empty/whitespace-only tokens
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:06:43 +02:00
Hendrik Jaks
06260df412 style: remove stray double blank line in user_dashboard.tsx
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:01:09 +02:00
Hendrik Jaks
20ad73fda4
Apply suggestion from @greptile-apps[bot]
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-03-13 11:40:01 +02:00
Hendrik Jaks
a607754b35
Update ui/litellm-dashboard/src/utils/cookieUtils.ts
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-03-13 11:33:53 +02:00
Hendrik Jaks
acdc6145b3 fix(ui): scope deleteCookie sessionStorage cleanup to token key only
Also document the sessionStorage cross-tab trade-off: per-tab scope
means users behind an HttpOnly proxy must log in once per tab, but
this is intentional to avoid localStorage XSS exposure.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 11:12:35 +02:00
Hendrik Jaks
523d1c388f fix(ui): use shared getCookie in page.tsx and user_dashboard.tsx
Replace local getCookie functions in page.tsx and user_dashboard.tsx
with the shared one from cookieUtils that has the sessionStorage
fallback. Without this, the HttpOnly cookie fix was incomplete —
page.tsx (the dashboard entry point) could not read the token,
causing the redirect loop to persist.

Also scope the sessionStorage fallback to the "token" key only,
and clear sessionStorage in page.tsx deleteCookie.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 11:06:43 +02:00
Hendrik Jaks
461cf00408 fix(ui): use sessionStorage instead of cookie for login token storage
Replace setTokenCookie (which is a no-op when reverse proxy adds HttpOnly)
with storeLoginToken using sessionStorage. Add sessionStorage fallback to
getCookie so the token is found even when the cookie is HttpOnly. Also handle
'=' in cookie values with .slice(1).join("=") and clear sessionStorage on
logout.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 10:58:06 +02:00
Hendrik Jaks
22409da932
Update ui/litellm-dashboard/src/utils/cookieUtils.ts
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-03-13 10:22:32 +02:00
Hendrik Jaks
04f835ecfa
Update ui/litellm-dashboard/src/utils/cookieUtils.ts
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-03-13 10:15:21 +02:00
Hendrik Jaks
2c5caac531 fix: address second round of Greptile review feedback
- Add loginCall integration tests verifying setTokenCookie is called with
  token and skipped when absent (backward-compatibility path)
- Use encodeURIComponent/decodeURIComponent in setTokenCookie/getCookie
  for defense-in-depth against non-standard token formats

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 10:09:52 +02:00
Hendrik Jaks
a8864ea12b fix: address Greptile review feedback
- Add window guard to setTokenCookie for SSR consistency with clearTokenCookies
- Add SSR test for window undefined case
- Add code comment explaining why JWT is included in response body

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 10:02:10 +02:00
Hendrik Jaks
6eb78e46c9 fix(ui): resolve login redirect loop when reverse proxy adds HttpOnly to cookies
When LiteLLM is behind nginx-ingress or similar with security-hardened
configs, the reverse proxy adds HttpOnly to all Set-Cookie headers. This
makes the JWT token unreadable by JavaScript, causing an infinite login
redirect loop. Fix by returning the JWT token in the /v2/login response
body so the frontend can set a JS-accessible cookie directly.

Fixes #19663

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 09:49:55 +02:00
github-actions[bot]
9cd7ad2634
chore: regenerate poetry.lock to match pyproject.toml (#23514)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-03-13 05:29:52 +00:00
yuneng-jiang
ef78fa7025
Merge pull request #23496 from BerriAI/bump_ver_1822
bump: version 1.82.1 → 1.82.2
2026-03-12 22:29:06 -07:00
Emerson Gomes
92d39c308c
fix(gemini): preserve toolConfig on native generate_content (#23493) 2026-03-12 17:48:09 -07:00
yuneng-jiang
976f1a0115
Merge pull request #23497 from BerriAI/litellm_/modest-dijkstra
[Fix] BaseModelResponseIterator crashes on non-string stream chunks
2026-03-12 16:20:28 -07:00
yuneng-jiang
d16c8c5590 [Fix] BaseModelResponseIterator crashes on non-string stream chunks
The empty-line filter in __next__/__anext__ called .strip() without
checking the type first. When the Responses API yields Pydantic
BaseModel events (e.g. ResponseCreatedEvent), this raises
AttributeError. Add an isinstance(str_line, str) guard so non-string
objects pass through to _handle_string_chunk as intended.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 16:16:32 -07:00
yuneng-jiang
820d63f3a6 bump: version 1.82.1 → 1.82.2 2026-03-12 16:07:38 -07:00
Shivam Rawat
f5ffc59309
fix(proxy): Windows compatibility for Prisma engine watchdog (#23494)
Guard os.waitpid and os.WNOHANG usage with sys.platform check.
These APIs are Unix-only; on Windows they cause AttributeError
and prevent proxy startup.

- _try_waitpid_watch: return False on Windows, fall back to
  os.kill polling
- _reap_all_zombies: return empty set on Windows (no zombies)

Add unit tests for Windows path.

Made-with: Cursor
2026-03-12 16:02:37 -07:00
yuneng-jiang
62c8494423
Merge pull request #23490 from BerriAI/litellm_add_pkce_env_key_docs
[Docs] Add PKCE_STRICT_CACHE_MISS to env variables reference
2026-03-12 15:35:06 -07:00
yuneng-jiang
372cc45164 [Docs] Add PKCE_STRICT_CACHE_MISS to environment variables reference
Document the PKCE_STRICT_CACHE_MISS environment variable in config_settings.md
to fix the CI env key documentation check.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 15:32:35 -07:00
yuneng-jiang
229d2008a3
Merge pull request #23488 from BerriAI/litellm_/peaceful-poincare
[Fix] Flaky and outdated router integration tests
2026-03-12 15:24:51 -07:00
yuneng-jiang
e351521243 [Fix] Fix flaky and outdated router integration tests
- test_router_cooldown_handlers: add mock_response to avoid real API call requiring OPENAI_API_KEY
- test_router_timeout: update deprecated claude-3-5-haiku-20241022 to claude-haiku-4-5
- test_router_fallbacks: relax assertion from == 4 to >= 3 to handle cooldown timing variance

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 15:20:55 -07:00
yuneng-jiang
8b256d7488
Merge pull request #23487 from BerriAI/litellm_fix_ruff_sso_statement_count
[Fix] Ruff PLR0915 too-many-statements in ui_sso.py
2026-03-12 15:15:04 -07:00
yuneng-jiang
c06bdaa68d [Fix] Ruff PLR0915 too-many-statements in ui_sso.py
Extract helpers to bring `get_generic_sso_response` (63 → ≤50) and
`prepare_token_exchange_parameters` (54 → ≤50) under the statement limit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 15:08:40 -07:00
yuneng-jiang
f1a7e42577
Merge pull request #23485 from BerriAI/litellm_/sleepy-swirles
[Fix] Realtime websocket tests for websockets v15+ API
2026-03-12 15:02:18 -07:00
yuneng-jiang
79ffcf297d
Merge pull request #23486 from BerriAI/litellm_/beautiful-kilby
[Fix] Add litellm-proxy-extras to CI requirements
2026-03-12 15:01:56 -07:00
yuneng-jiang
53d704a1f1 [Fix] Add litellm-proxy-extras to CI requirements for prisma migrations
PR #23257 made proxy startup fail if prisma migrate fails, which
exposed that litellm-proxy-extras was never installed in CI. The import
error was previously silently ignored. Unpinned so it always pulls the
latest version from PyPI.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 14:58:22 -07:00
Joe Reyna
03a0c37608
Merge pull request #23467 from joereyna/fix/mcp-oauth2-token-cache-tests
fix: add oauth2_flow="client_credentials" to MCPServer test helper
2026-03-12 14:55:42 -07:00
yuneng-jiang
3f0c7b5552 [Fix] Update realtime websocket tests for websockets v15+ API
Use explicit imports from websockets.exceptions (ConnectionClosedOK,
ConnectionClosedError) instead of the removed websockets.exceptions
attribute, and add openai/ model prefix so get_llm_provider resolves
the provider correctly in CI.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 14:40:48 -07:00
yuneng-jiang
89d8401d72
Merge pull request #23483 from BerriAI/litellm_update_deprecated_test_models
[Fix] Update Deprecated Model Names in CI Tests
2026-03-12 14:16:52 -07:00
yuneng-jiang
41b6cb02de
Merge pull request #23482 from BerriAI/litellm_fix_ruff_mcp_rest_endpoints
[Fix] Ruff lint errors in MCP server files
2026-03-12 14:16:33 -07:00
yuneng-jiang
cc81e3c226 Replace deprecated model names in tests that were removed from remote model cost map
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 14:12:07 -07:00
yuneng-jiang
515fbcae99 [Fix] Ruff lint errors in MCP server files
Remove unused `timezone` imports (F401) and extract single-server tool
listing logic into `_list_tools_for_single_server` helper to fix PLR0915
(too many statements) in `list_tool_rest_api`.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 14:11:05 -07:00
yuneng-jiang
f3e870a3a9
Merge pull request #23478 from BerriAI/litellm_fix_o1_preview_outdated_test
[Fix] Remove Deprecated o1-preview from Azure O-series Test
2026-03-12 13:26:46 -07:00
yuneng-jiang
fe8660da01
Merge pull request #23477 from BerriAI/litellm_/unruffled-shaw
[Fix] Remove recursion in BFL _read_image_bytes
2026-03-12 13:26:24 -07:00
yuneng-jiang
a93c069dd5 [Fix] Add max_depth guard to BFL _read_image_bytes recursive function
Use the standard depth/max_depth pattern with DEFAULT_MAX_RECURSE_DEPTH
to guard the recursive list-unwrapping in _read_image_bytes, matching
the existing pattern used by _read_all_bytes in vertex_imagen.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 13:22:56 -07:00
yuneng-jiang
fb65384a76 [Fix] Remove deprecated o1-preview from O-series test and deduplicate is_o_series check
o1-preview is deprecated and not in the model registry with supports_reasoning=True,
causing the Azure O-series config test to fail. Also removed a duplicate is_o_series
assignment in utils.py.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 13:22:00 -07:00
yuneng-jiang
553cfc6d72 [Fix] Remove recursion in BFL _read_image_bytes to pass CI recursive detector
Replace recursive list-unwrapping with an iterative loop (max 10 levels)
to avoid being flagged by the recursive function detector CI check.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 13:19:42 -07:00
yuneng-jiang
25e7d3372b
Merge pull request #23474 from BerriAI/litellm_litellm-ci-stability-c0eb
Litellm ci stability
2026-03-12 13:15:16 -07:00
Cursor Agent
ba8fed7fc8
refactor: extract _list_tools_for_single_server helper to fix PLR0915
Extract the single-server branch of list_tool_rest_api into a dedicated
helper function _list_tools_for_single_server. This reduces the statement
count in list_tool_rest_api from 57 to under 50, resolving the PLR0915
ruff lint error without needing a per-file-ignore.

The behavior is unchanged — all validation, IP-filtering, error handling,
and tool-fetching logic is preserved identically in the extracted helper.

Co-authored-by: yuneng-jiang <yuneng-jiang@users.noreply.github.com>
2026-03-12 20:06:10 +00:00
Cursor Agent
e242356570
fix(ci): fix ruff lint errors and 9 failing unit tests on main
Lint fixes (check_code_and_doc_quality job):
- Remove unused variable reasoning_effort in gpt_5_transformation.py (F841)
- Remove unused timezone imports in mcp_server rest_endpoints.py and server.py (F401)
- Remove unused ProxyBaseLLMRequestProcessing import in realtime endpoints.py (F401)
- Add BaseRealtimeHTTPConfig to TYPE_CHECKING block in utils.py (F821)
- Add PLR0915 per-file-ignore for mcp_server/rest_endpoints.py in ruff.toml

Test fixes (litellm_mapped_tests_llms job):
- Gemini video cost tests: pass explicit model_info to video_generation_cost()
  instead of relying on gemini/veo-3.0-generate-preview being in model_prices JSON
- Anthropic max_tokens tests: mock get_max_tokens() to return expected values
  instead of depending on claude-3-5-sonnet-20241022 being in model_prices JSON
- Vertex AI pydantic obj test: update from removed gemini-1.5-pro to gemini-2.5-flash,
  update expected request body to use response_json_schema format
- Vertex AI/Bedrock file_content integration tests: update mocks to target
  base_llm_http_handler.retrieve_file_content (the new code path via
  ProviderConfigManager) instead of the old vertex_ai_files_instance/
  bedrock_files_instance paths

Co-authored-by: yuneng-jiang <yuneng-jiang@users.noreply.github.com>
2026-03-12 19:58:43 +00:00
yuneng-jiang
7f0ec1e3d8
Merge pull request #23469 from BerriAI/litellm_extras_mar12
[Infra] Proxy Extras
2026-03-12 12:50:17 -07:00
yuneng-jiang
5ffa6b955e build 2026-03-12 12:49:36 -07:00
yuneng-jiang
3a3fd64fcb bump: version 0.4.55 → 0.4.56 2026-03-12 12:46:47 -07:00
yuneng-jiang
cffb2676a5 bump: version 0.4.54 → 0.4.55 2026-03-12 12:46:46 -07:00