Commit graph

35329 commits

Author SHA1 Message Date
Ryan Crabbe
f8d1be2e9b fix: gate /v3/login behind control_plane_url and fix RFC 3986 hostname comparison
- /v3/login now returns 404 unless control_plane_url is configured
- _validate_return_to uses urlparse().hostname for case-insensitive comparison
- Add rejection test for /v3/login without control_plane_url
- Add case-insensitive hostname test for _validate_return_to
2026-03-19 16:00:19 -07:00
Ryan Crabbe
719974f0b3 fix: validate return_to against control_plane_url to prevent open redirect
Add origin validation for the return_to parameter in SSO flow to prevent
JWT theft via crafted redirect URLs. Workers must configure control_plane_url
in general_settings.
2026-03-19 15:35:13 -07:00
Ryan Crabbe
5543718caf feat: add cross-origin SSO cookie handoff for control plane
- Add return_to param to /sso/key/generate for cross-origin redirect
- Store return_to in httpOnly cookie during SSO redirect
- Read cookie in /sso/callback and pass to OpenID handler
- Redirect to control plane with token in URL, delete cookie after use
2026-03-19 14:02:49 -07:00
Ryan Crabbe
d04f8bcc45 Keep /v2/login untouched — use /v3/login exclusively for control-plane cross-origin auth
/v2/login is battle-tested; control-plane token-in-body behavior belongs
only in /v3/login. Removes the conditional worker_registry check from v2
and its associated test.
2026-03-17 11:57:09 -07:00
Ryan Crabbe
96cd74440c Add /v3/login endpoint for cross-origin control-plane login
Workers don't have worker_registry, so /v2/login omits the token
from the response body. The control plane UI needs the token in the
body to set the cookie cross-origin (document.cookie) when
authenticating against a worker. /v3/login always includes it.
2026-03-14 12:58:40 -07:00
Ryan Crabbe
6686a1213f Fix login test fragility and add control-plane token test
Explicitly mock proxy_config.worker_registry in the existing login test
to isolate it from global state. Add positive test verifying the token
is returned in the response body when workers are configured.
2026-03-14 11:24:06 -07:00
Ryan Crabbe
1786f5ad97 Move WorkerRegistryEntry import to types import block 2026-03-14 11:06:38 -07:00
Ryan Crabbe
d3d2ecb44e Gate control-plane-only fields behind worker_registry presence
Only return JWT token in /v2/login response body when workers are
configured (control plane mode). Non-CP instances continue to set
the cookie only, avoiding unnecessary token exposure. Also make
workers list in discovery endpoint explicitly conditional on
is_control_plane flag.
2026-03-14 10:47:19 -07:00
Ryan Crabbe
ec59eef43b feat(proxy): add control plane worker registry backend
Add backend support for a control plane mode where one LiteLLM instance
serves as a worker directory. Parses `worker_registry` from YAML config,
exposes `is_control_plane` flag and worker list via the existing
`/.well-known/litellm-ui-config` endpoint, and returns JWT in /v2/login
JSON body for cross-origin auth.

- WorkerRegistryEntry pydantic model with HTTP URL validation
- Config parsing in ProxyConfig._init_non_llm_configs
- is_control_plane + workers fields on UiDiscoveryEndpoints response
- Example control_plane_config.yaml
- Tests for discovery endpoint and /v2/login response shape
2026-03-13 17:25:08 -07:00
yuneng-jiang
0e44c460b5
Merge pull request #23584 from BerriAI/litellm_release_day_03_12_2026
[Infra] Merge Release Day Branch with Main
2026-03-13 14:31:27 -07:00
yuneng-jiang
f351bbdb36 [Fix] Derive SPEND_PER_REQUEST dynamically in spend accuracy tests
Instead of hardcoding SPEND_PER_REQUEST (which broke when the model
changed from gpt-3.5-turbo-0301 to gpt-3.5-turbo), make a single
calibration request first, poll for its spend, and use that as the
per-request cost. Fails fast with pytest.fail() after 5 retries if
calibration cannot determine the cost.

Also fixes a bug in test_basic_spend_accuracy where the user spend
assertion error message referenced user_info['info'] instead of
user_info['user_info'].

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 13:27:06 -07:00
yuneng-jiang
f5662eeb8a [Fix] Update otel and spend tracking test configs to use gpt-3.5-turbo
Same deprecated model fix as proxy_server_config.yaml — these two CI
configs also referenced gpt-3.5-turbo-0301 which has no pricing data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 13:08:36 -07:00
yuneng-jiang
3ec7c2a81e [Fix] Fail fast when team member spend not flushed in time
Increase wait timeout to 90s and pytest.fail() instead of silently
continuing, so the failure message points at the real cause.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:40:17 -07:00
yuneng-jiang
e2779639c0 [Fix] Fix test_users_in_team_budget using model with no pricing data
gpt-3.5-turbo-0301 was removed from the model cost map, so every call
had response_cost=0 and team member spend never increased. The wait
helper also returned True after 3s regardless of whether spend updated.

- Switch fake-openai-endpoint to gpt-3.5-turbo (has pricing in cost map)
- Remove premature early-return in wait_for_team_member_spend_update

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:35:20 -07:00
yuneng-jiang
4e70254d56 [Fix] Increase _delete_file retry budget to reduce flakiness
Increase max_retries from 6 to 9 and retry_delay from 10s to 20s
(180s total wait, up from 60s) to give batch cost tracking more time
to finish before cleanup attempts file deletion.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:32:55 -07:00
yuneng-jiang
57865ec96e Revert "[Fix] Populate _hidden_params.model_id in batch terminal-state shortcut path"
This reverts commit ca2033036f.
2026-03-13 12:21:39 -07:00
yuneng-jiang
ca2033036f [Fix] Populate _hidden_params.model_id in batch terminal-state shortcut path
The terminal-state DB shortcut in retrieve_batch returned a LiteLLMBatch
with empty _hidden_params, causing the managed_files hook to skip encoding
output_file_id into a unified ID. This adds the same model_id extraction
from unified_batch_id that the non-terminal path already has.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:14:58 -07:00
yuneng-jiang
5b755db329 [Fix] Correct mypy fixes for realtime_api and presidio
- realtime_api/main.py: Revert param types to Dict, explicitly construct
  RealtimeSessionConfig/RealtimeExpiresAfter before passing to
  RealtimeClientSecretRequest
- presidio.py: Move type:ignore[override] to def line where mypy reports it

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:10:27 -07:00
yuneng-jiang
1f71578de2 [Fix] Add flaky reruns to test_e2e_managed_batch
The test_e2e_managed_batch test intermittently fails during cleanup
when deleting the input file — the batch cost tracking hasn't finished
processing yet (batch_processed=true not set), causing a 400 error.
This is a timing race condition unrelated to batch retrieval logic.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 11:57:22 -07:00
yuneng-jiang
e40ebf262a Revert "[Fix] Populate _hidden_params.model_id in batch terminal-state shortcut path"
This reverts commit 1642a2f7ac.
2026-03-13 11:57:22 -07:00
yuneng-jiang
25e161a0fa fix(tests): remove test_completion_bedrock_claude_sts_oidc_auth and test_completion_bedrock_httpx_command_r_sts_oidc_auth that depend on external infra
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 11:53:53 -07:00
yuneng-jiang
efe6ddfc68
Merge pull request #23577 from Sameerlite/litellm_gpt54-tools-reasoning-routing
feat(openai): route gpt-5.4+ tools+reasoning to Responses API
2026-03-13 11:49:46 -07:00
Sameer Kankute
7dce61ce48 fix(tests): update TestGPT5ReasoningEffortPreservation for dict normalization
Made-with: Cursor
2026-03-14 00:13:16 +05:30
yuneng-jiang
a6ab172db0 [Fix] Use type:ignore instead of Union return type for realtime endpoint
The Union[RealtimeClientSecretResponse, Response] annotation breaks
FastAPI's response model generation. Revert to the original annotation
and suppress mypy on the error-path return instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 11:42:26 -07:00
yuneng-jiang
57397e0d26
Merge pull request #23576 from Sameerlite/litellm_gpt54-tools-reasoning-routing
Litellm gpt54 tools reasoning routing
2026-03-13 11:38:50 -07:00
yuneng-jiang
1642a2f7ac [Fix] Populate _hidden_params.model_id in batch terminal-state shortcut path
The terminal-state DB shortcut in retrieve_batch returned a LiteLLMBatch
with empty _hidden_params, causing the managed_files hook to skip encoding
output_file_id into a unified ID. This adds the same model_id extraction
from unified_batch_id that the non-terminal path already has.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 11:38:09 -07:00
Sameer Kankute
408b717cb9 Fix gpt 5 transformation tests 2026-03-14 00:00:02 +05:30
Sameer Kankute
30645d683f Reserve reasoning for responses via chat completion 2026-03-13 23:59:57 +05:30
Sameer Kankute
7abbe2dc06 Fix routing of tool call + reasoning effor for gpt-5.4 2026-03-13 23:59:53 +05:30
Sameer Kankute
3596464d11 Revert "feat(openai): drop reasoning_effort for gpt-5.4 when tools present"
This reverts commit 14b52b1318.
2026-03-13 23:59:48 +05:30
yuneng-jiang
e88ee338bd [Fix] Resolve 7 mypy linting errors across 5 files
- realtime_api/main.py: Widen param types to accept both Dict and Pydantic models
- proxy/realtime_endpoints/endpoints.py: Widen return type to Union[..., Response]
- proxy/guardrails/guardrail_hooks/presidio.py: Add type:ignore[override] for bytes in streaming return
- proxy/_experimental/mcp_server/rest_endpoints.py: Annotate _oauth2_flow with Literal type
- proxy/management_endpoints/ui_sso.py: Add httpx import under TYPE_CHECKING, remove invalid timeout kwarg from AsyncHTTPHandler.get()

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 11:21:49 -07:00
yuneng-jiang
6a90596377 updating Dockerfile to tar 7.5.11 2026-03-13 11:16:17 -07:00
Ishaan Jaff
1b96064600
fix(proxy): prevent OOM/Prisma connection loss from unbounded managed-object poll (#23472)
* fix(proxy): cap managed-object poll size + expire stale rows + kill-switch flag to prevent OOM/Prisma connection loss

* fix(constants): simplify PROXY_BATCH_POLLING_ENABLED readability

* docs+test: document new polling env vars, add pagination+stale-cleanup tests

* fix: exclude stale_expired from batch poll queries; fix update_many assertions in tests

* fix: scope stale cleanup to file_purpose, fix file_object mocks, add CheckBatchCost tests

* fix: avoid duplicate cost logging in fallback path; guard integer constants against zero/negative values

* fix: cache _has_batch_processed_column; guard cleanup from aborting poll; narrow fallback except

* fix: add complete/completed to primary query not_in; fix vacuous test assertion

- Primary find_many was missing "complete" and "completed" in its not_in
  filter, creating asymmetry with the fallback query. A job whose status
  was set to "complete" but whose batch_processed flag update failed would
  be silently re-fetched and re-processed every cycle, emitting duplicate
  cost logs.

- test_fallback_completion_update_omits_batch_processed patched
  _is_base64_encoded_unified_file_id to return None, causing an immediate
  continue — so update() was never called and the assertion looped over an
  empty list (vacuously true). Rewrote the test to mock the full
  completion pipeline, verify update() is called exactly once, and assert
  batch_processed is absent from the update data.

- Added symmetric test (primary path) proving batch_processed IS included
  when the column exists.

Made-with: Cursor
2026-03-13 11:01:40 -07:00
yuneng-jiang
488a4d2b63 bumping tar for security 2026-03-13 10:43:16 -07:00
yuneng-jiang
0fbfb8e772 fix(tests): remove test_oidc_circle_v1_with_amazon_fips that depends on external infra
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 10:33:52 -07:00
yuneng-jiang
9ad2223531 [Fix] Convert _has_attribute_error_in_chain from recursive to iterative
The recursive implementation was flagged by the recursive function detector
lint check. Converted to an iterative approach using an explicit stack and
seen set, with depth capped at DEFAULT_MAX_RECURSE_DEPTH.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 10:24:01 -07:00
yuneng-jiang
4c3a4e6c38
Merge pull request #23566 from BerriAI/revert-23535-litellm_improve_qa-5.4
Revert "QA:  improve gpt-5.4 code/bugs"
2026-03-13 10:16:34 -07:00
yuneng-jiang
2b71b0fb25
Revert "QA: improve gpt-5.4 code/bugs" 2026-03-13 10:15:47 -07:00
yuneng-jiang
8dc198eccf
Merge pull request #23535 from Sameerlite/litellm_improve_qa-5.4
QA:  improve gpt-5.4 code/bugs
2026-03-13 09:37:30 -07:00
yuneng-jiang
6ebd457146 fix(tests): update remaining PKCE SSO tests to mock get_async_httpx_client
The previous fix (124b44ec) only updated 3 tests but missed 10 more
that still patched the old `ui_sso.httpx.AsyncClient` path. Also
updated credential assertions to check Authorization header instead
of httpx.BasicAuth kwargs, matching the production code change.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 09:13:05 -07:00
yuneng-jiang
11cf288f98 fix(tests): fix broken test_router_fallbacks_with_cooldowns_and_model_id
The test used fallbacks=[{"gpt-3.5-turbo": ["123"]}] where "123" is a
model_id, but the fallback mechanism treats values as model group names.
This caused a ValueError since no model group "123" exists. Additionally,
mock_response propagates to fallback calls, making mock-based fallback
tests unreliable.

Simplified the test to verify that a RateLimitError doesn't permanently
cool down a deployment for subsequent requests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 09:10:41 -07:00
yuneng-jiang
61cee53200 fix(tests): fix flaky qwen global endpoint test by mocking AsyncHTTPHandler at class level
The test was creating a real AsyncHTTPHandler instance and patching its
post method, but the internal code creates its own handler, bypassing
the mock. This caused real API calls to Vertex AI, resulting in 401
auth errors in CI. Switched to patching AsyncHTTPHandler at the class
level, matching the pattern used by the passing GPT-OSS test.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 09:07:48 -07:00
yuneng-jiang
b98ecd8c1d fix(tests): quarantine flaky test_oidc_circle_v1_with_amazon
The test fails with InvalidIdentityToken because the OIDC provider is
no longer configured in the third-party AWS account (ai.moda). This
matches the existing quarantine on test_oidc_circleci_with_azure.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 09:04:42 -07:00
Ishaan Jaff
2b61f2a41b
ui logo (#23556) 2026-03-13 08:44:08 -07:00
Ishaan Jaffer
4e42333925 fix claude.md 2026-03-13 08:32:07 -07:00
Sameer Kankute
9b3ffd04ef Reserve reasoning for responses via chat completion 2026-03-13 14:19:40 +05:30
Sameer Kankute
288b08fd25 Fix routing of tool call + reasoning effor for gpt-5.4 2026-03-13 14:19:04 +05:30
Sameer Kankute
90b03f6c67 Revert "feat(openai): drop reasoning_effort for gpt-5.4 when tools present"
This reverts commit 14b52b1318.
2026-03-13 13:40:29 +05:30
yuneng-jiang
b08f464ee8 fix(tests): replace deprecated model refs in cost and model_info tests
Models removed from pricing JSON:
- gemini-1.5-pro-002, gemini-1.5-flash, gemini-1.5-flash-latest -> gemini-2.0-flash
- gpt-4o-audio-preview-2024-10-01 -> gpt-4o-audio-preview
- Tests using per-character pricing updated to per-token (no gemini models have per-character pricing now)
- Removed above_128k parametrization (no gemini models have tiered 128k pricing now)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 00:39:35 -07:00
yuneng-jiang
3012c6d070 fix(tests): replace fixed sleeps with polling in spend accuracy tests
The spend accuracy tests were flaky because they used fixed sleeps
(45s/30s) to wait for the batch writer to flush. Under CI load, the
batch writer scheduler can be delayed beyond these windows, causing
all spend values to remain 0.0 and the test to fail.

Replace fixed sleeps with a polling loop that checks key spend every
10s for up to 120s, only proceeding once spend becomes non-zero.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 00:06:09 -07:00