Commit graph

6351 commits

Author SHA1 Message Date
Ishaan Jaffer
c0f13c7153 test: Add unit test for migration failure exit behavior 2026-02-16 10:23:52 -08:00
michelligabriele
035f0916ad
fix(mcp): revert StreamableHTTPSessionManager to stateless mode (#21323)
PR #19809 changed stateless=True to stateless=False to enable progress
notifications for MCP tool calls. This caused the mcp library to enforce
mcp-session-id headers on all non-initialize requests, breaking MCP
Inspector, curl, and any client without automatic session management.

Revert to stateless=True to restore compatibility with all MCP clients.
The progress notification code already handles missing sessions gracefully
(defensive checks + try/except), so no other changes are needed.

Fixes #20242
2026-02-16 09:08:44 -08:00
Vincent Koc
0dcc744f7e
fix(proxy): handle missing DATABASE_URL in append_query_params (#21239)
* fix: handle missing database url in append_query_params

* Update litellm/proxy/proxy_cli.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-02-16 09:03:10 -08:00
Atharva Jaiswal
7bcef1490b
Fix: Exclude tool params for models without function calling support (#21125) (#21244)
* Fix tool params reported as supported for models without function calling (#21125)

JSON-configured providers (e.g. PublicAI) inherited all OpenAI params
including tools, tool_choice, function_call, and functions — even for
models that don't support function calling. This caused an inconsistency
where get_supported_openai_params included "tools" but
supports_function_calling returned False.

The fix checks supports_function_calling in the dynamic config's
get_supported_openai_params and removes tool-related params when the
model doesn't support it. Follows the same pattern used by OVHCloud
and Fireworks AI providers.

* Style: move verbose_logger to module-level import, remove redundant try/except

Address review feedback from Greptile bot:
- Move verbose_logger import to top-level (matches project convention)
- Remove redundant try/except around supports_function_calling() since it
  already handles exceptions internally via _supports_factory()
2026-02-16 08:36:32 -08:00
jquinter
bf93ce8841
Merge pull request #21284 from BerriAI/fix/mcp-server-test-mocks
fix(test): add cleanup fixture and no_parallel mark for MCP tests
2026-02-16 12:12:58 -03:00
jquinter
c3fb5e1ea5
Update tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-02-16 12:12:48 -03:00
jquinter
d84336bd07
Merge pull request #21283 from BerriAI/fix/video-generation-logging-mock
fix(test): correct async mock for video generation logging test
2026-02-16 12:12:20 -03:00
jquinter
87861549d8
Merge pull request #21282 from BerriAI/fix/cost-calculation-log-test-parallel
fix(test): replace caplog with custom handler for parallel execution
2026-02-16 12:11:48 -03:00
Harshit Jain
1308a2cd76
Merge pull request #20314 from Harshit28j/fix/sso_PKCE_deployments
fix: SSO PKCE support fails in multi-pod Kubernetes deployments
2026-02-16 19:40:44 +05:30
Harshit Jain
dd2111e664
Merge pull request #20321 from Harshit28j/litellm_fix-virtual-key-grace-period
fix: virutal key grace period from env/UI
2026-02-16 19:36:18 +05:30
Sameer Kankute
86a254a215
Merge pull request #21307 from BerriAI/litellm_oss_staging_02_14_20262
Litellm oss staging 02 14 20262
2026-02-16 19:10:59 +05:30
Sameer Kankute
27890dd46e
Merge pull request #21306 from mjkam/fix/bedrock-min-budget-tokens
fix(bedrock): clamp thinking.budget_tokens to minimum 1024
2026-02-16 18:31:28 +05:30
Sameer Kankute
72a1bd66c7
Merge pull request #21157 from Point72/ephrimstanley/s3-logger-skip-missing-standard-logging-object
Managed batches - Misc bug fixes
2026-02-16 18:29:59 +05:30
Emerson Gomes
06e7bfce2e perf(spend): avoid duplicate daily agent transaction computation (#21187) 2026-02-16 18:28:34 +05:30
Constantine
7ef9083812 fix(aiohttp): prevent closing shared ClientSession in AiohttpTransport (#21117)
When a shared ClientSession is passed to LiteLLMAiohttpTransport,
calling aclose() on the transport would close the shared session,
breaking other clients still using it.

Add owns_session parameter (default True for backwards compatibility)
to AiohttpTransport and LiteLLMAiohttpTransport. When a shared session
is provided in http_handler.py, owns_session=False is set to prevent
the transport from closing a session it does not own.

This aligns AiohttpTransport with the ownership pattern already used
in AiohttpHandler (aiohttp_handler.py).
2026-02-16 18:28:28 +05:30
Kristoffer Arlind
51b1b0339c Allow effort="max" for Claude Opus 4.6 (#21112) 2026-02-16 18:28:22 +05:30
Ephrim Stanley
a3762e7d49 Addressed greptile comments to extract common helpers and return 404 2026-02-16 07:58:04 -05:00
Fly
9c71d8b61b feat(s3): add support for virtual-hosted-style URLs (#21094)
Add s3_use_virtual_hosted_style parameter to support AWS S3 virtual-hosted-style URL format (bucket.endpoint/key) alongside the existing path-style format (endpoint/bucket/key).

This enables compatibility with S3-compatible services like MinIO and aligns with AWS S3 official terminology.
2026-02-16 18:26:44 +05:30
jquinter
43f9a588d9 fix: improve Langfuse test isolation to prevent flaky failures (#21093)
The test was creating fresh mocks but not fully isolating from setUp state,
causing intermittent CI failures with 'Expected generation to be called once.
Called 0 times.'

Instead of creating fresh mocks, properly reset the existing setUp mocks to
ensure clean state while maintaining proper mock chain configuration.
2026-02-16 18:26:37 +05:30
Sameer Kankute
70a49a4b35
Merge pull request #21295 from BerriAI/litellm_correct_converse_usage
Fix converse anthropic usage object according to v1/messages specs
2026-02-16 18:22:30 +05:30
mjkam
37da38fdaa fix(bedrock): clamp thinking.budget_tokens to minimum 1024
Bedrock rejects thinking.budget_tokens values below 1024 with a 400
error. This adds automatic clamping in the LiteLLM transformation
layer so callers (e.g. router with reasoning_effort="low") don't
need to know about the provider-specific minimum.

Fixes #21297

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 21:49:41 +09:00
Sameer Kankute
3347fabe6b
Merge pull request #21209 from jayy-77/fix/21193-chatgpt-codex-unsupported-params
Fix/21193 chatgpt codex unsupported params
2026-02-16 18:13:10 +05:30
Sameer Kankute
01cdec5771 Fix converse anthropic usage object according to v1/messages specs 2026-02-16 14:03:31 +05:30
Julio Quinteros Pro
f2b6c38c86 Remove redundant import inside test method
The module litellm.videos.main is already imported at the top of
the file (line 21), so the import inside the test method is redundant.

Addresses Greptile feedback (minor style issue).

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 21:15:52 -03:00
Julio Quinteros Pro
fe691cac08 Remove unused pytest import and add trailing newline
- Removed unused pytest import (caplog fixture was removed)
- Added missing trailing newline at end of file

Addresses Greptile feedback (minor style issues).

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 21:15:12 -03:00
jquinter
44bb1dafdb
Merge pull request #21286 from BerriAI/fix/proxy-config-callback-validation
fix(test): mock environment variables for callback validation test
2026-02-15 21:11:12 -03:00
jquinter
49fd1b5de4
Merge pull request #21279 from BerriAI/fix/tokenizer-cache-test-isolation
fix(test): clear tokenizer LRU cache for test isolation
2026-02-15 21:05:38 -03:00
Julio Quinteros Pro
2d41b03f8b fix(test): mock environment variables for callback validation test
The test test_proxy_config_state_post_init_callback_call was failing with:
```
ValidationError: 2 validation errors for TeamCallbackMetadata
callback_vars.langfuse_public_key
  Input should be a valid string [type=string_type, input_value=None, input_type=NoneType]
```

Root cause: The test uses environment variable references like
"os.environ/LANGFUSE_PUBLIC_KEY" which get resolved at runtime. In
parallel execution with --dist=loadscope, these environment variables
may not be set in all worker processes, causing the resolution to
return None, which fails Pydantic validation expecting strings.

Solution: Use monkeypatch to set the required environment variables
before the test runs. This ensures consistent behavior across all
test execution environments (local, CI, parallel workers).

Fixes test failure exposed by PR #21277.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 20:44:17 -03:00
Julio Quinteros Pro
cc2dff0581 fix(test): add cleanup fixture and no_parallel mark for MCP tests
Two MCP server tests were failing when run with pytest-xdist parallel
execution (--dist=loadscope):
- test_mcp_routing_with_conflicting_alias_and_group_name
- test_oauth2_headers_passed_to_mcp_client

Both tests showed assertion failures where mocks weren't being called
(0 times instead of expected 1 time).

Root cause: These tests rely on global_mcp_server_manager singleton
state and complex async mocking that doesn't work reliably with
parallel execution. Each worker process can have different state
and patches may not apply correctly.

Solution:
1. Added autouse fixture to clean up global_mcp_server_manager registry
   before and after each test for better isolation
2. Added @pytest.mark.no_parallel to these specific tests to ensure
   they run sequentially, avoiding parallel execution issues

This approach maintains test reliability while allowing other tests
in the file to still benefit from parallelization.

Fixes test failures exposed by PR #21277.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 20:42:03 -03:00
Julio Quinteros Pro
8ea0c93d67 fix(test): correct async mock for video generation logging test
The test was failing with AuthenticationError because the mock wasn't
intercepting the actual HTTP handler calls. This caused real API calls
with no API key, resulting in 401 errors.

Root cause: The test was patching the wrong target using string path
'litellm.videos.main.base_llm_http_handler' instead of using patch.object
on the actual handler instance. Additionally, it was mocking the sync
method instead of async_video_generation_handler.

Solution: Use patch.object with side_effect pattern on the correct
async handler method, following the same pattern used in
test_video_generation_async().

Fixes test failure in PR #21277 when running with --dist=loadscope.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 20:40:43 -03:00
Julio Quinteros Pro
4f2c7d3040 fix(test): replace caplog with custom handler for parallel execution
The cost calculation log level tests were failing when run with pytest-xdist
parallel execution because caplog doesn't work reliably across worker processes.
This causes "ValueError: I/O operation on closed file" errors.

Solution: Replace caplog fixture with a custom LogRecordHandler that directly
attaches to the logger. This approach works correctly in parallel execution
because each worker process has its own handler instance.

Fixes test failures in PR #21277 when running with --dist=loadscope.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 20:39:24 -03:00
Julio Quinteros Pro
706792ba96 refactor: simplify cache clearing to avoid over-engineering
Based on Greptile feedback:
- Removed autouse fixture (applied too broadly to unrelated tests)
- Removed setUpClass (redundant since setUp runs before every test)
- Kept module-level clear and setUp() method (sufficient for test isolation)
- Added blank line for proper formatting

The simplified approach still ensures test isolation under --dist=loadscope
while avoiding unnecessary complexity.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 20:36:24 -03:00
jquinter
bae8816c35
Update tests/test_litellm/litellm_core_utils/test_token_counter.py
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-02-15 20:27:29 -03:00
Julio Quinteros Pro
5f79bf4906 fix(test): clear tokenizer LRU cache for test isolation
The _select_tokenizer_helper function is decorated with @lru_cache, which
causes test failures when tests run sequentially with --dist=loadscope.
Previous tests' cached results prevent from_pretrained from being called,
causing mock assertions to fail.

Implemented triple-layer cache clearing:
1. Module-level clear on import
2. Class-level clear in setUpClass
3. Function-level clear in setUp + pytest fixture

This ensures test isolation while allowing --dist=loadscope to provide better
overall CI stability (70% pass rate vs 40% without loadscope).

Fixes the intermittent failure in TestTokenizerSelection where
'from_pretrained' mock was never called due to cache hits.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 20:23:27 -03:00
jquinter
e1e8a12bf2
Merge pull request #21217 from BerriAI/fix/anthropic-structured-output-test
fix(test): update test_other_constraints_preserved for new schema filtering
2026-02-15 20:20:49 -03:00
jquinter
682e8c0352
Merge pull request #21276 from BerriAI/fix/vertex-gpt-oss-test-mock
fix(test): mock vertexai module in GPT-OSS tests to prevent authentication
2026-02-15 19:50:32 -03:00
jquinter
b0f2b4bb2d
Merge pull request #21275 from BerriAI/fix/watsonx-gpt-oss-async-mock
fix(test): use async side_effect for client.post mock in watsonx test
2026-02-15 19:44:33 -03:00
Julio Quinteros Pro
03d67d7801 fix(test): mock vertexai module in GPT-OSS tests to prevent authentication
The test_vertex_ai_gpt_oss_simple_request and test_vertex_ai_gpt_oss_reasoning_effort
tests were failing in CI with 401 authentication errors. This was because the
vertexai module import was triggering authentication attempts even though the
_ensure_access_token method was mocked.

Added patch.dict('sys.modules', ...) to mock the vertexai module entirely,
preventing it from trying to authenticate when imported. This ensures tests
are fully isolated and don't attempt real API calls regardless of environment
variables or test execution order.

This follows the same pattern used in other Vertex AI tests and works in
combination with the autouse fixture that clears environment variables.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 19:44:23 -03:00
Julio Quinteros Pro
be63bac1c1 fix(test): use async side_effect for client.post mock in watsonx test
The test_watsonx_gpt_oss_prompt_transformation was using return_value to mock
an async method (AsyncHTTPHandler.post), which doesn't work correctly with
async/await. This could cause intermittent failures in CI due to test ordering.

Changed to use side_effect with an async function (mock_post_func) to properly
mock the async post method, following the same pattern used in other async
tests like test_vertex_ai_gpt_oss_reasoning_effort.

This ensures the mock is always called correctly regardless of test execution
order or parallel test execution.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 19:39:21 -03:00
jquinter
03215c6495
Merge pull request #21273 from BerriAI/fix/vertex-ai-qwen-test-isolation
fix(test): add environment cleanup for Vertex AI Qwen tests
2026-02-15 19:28:34 -03:00
jquinter
ddd71a155a
Merge pull request #21272 from BerriAI/fix/vertex-ai-gpt-oss-test-isolation
fix(test): add environment cleanup for Vertex AI GPT-OSS tests
2026-02-15 19:25:49 -03:00
jquinter
cdb0b6b9dc
Update tests/test_litellm/llms/vertex_ai/vertex_ai_partner_models/gpt_oss/test_vertex_ai_gpt_oss_transformation.py
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-02-15 19:25:35 -03:00
Julio Quinteros Pro
62ac8cee8e fix(test): add environment cleanup for Vertex AI Qwen tests
Add autouse pytest fixture to clear Google/Vertex AI environment
variables before each test, preventing authentication errors in CI.

Previous tests may set GOOGLE_APPLICATION_CREDENTIALS or other Vertex
environment variables and not clean them up, causing this test to
attempt real Google authentication instead of using mocks.

This fix:
- Adds clean_vertex_env fixture with autouse=True
- Saves and clears Google/Vertex env vars before each test
- Restores them after each test
- Prevents "AuthenticationError: Request had invalid authentication
  credentials" (401) in CI when run with other tests

Same fix pattern as PR #21268 (rerank) and PR #21272 (GPT-OSS).

Related: test was failing on PR #21217, but NOT caused by PR #21217
(which only modifies test_anthropic_structured_output.py). This is
another test isolation issue.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 19:19:43 -03:00
jquinter
f20dd25b37
Merge pull request #21271 from BerriAI/fix/anthropic-pass-through-reasoning-effort-test
fix(test): update reasoning_effort test to expect dict format
2026-02-15 19:18:21 -03:00
Julio Quinteros Pro
cf11867159 fix(test): add environment cleanup for Vertex AI GPT-OSS tests
Add autouse pytest fixture to clear Google/Vertex AI environment
variables before each test, preventing authentication errors in CI.

Previous tests may set GOOGLE_APPLICATION_CREDENTIALS or other Vertex
environment variables and not clean them up, causing this test to
attempt real Google authentication instead of using mocks.

This fix:
- Adds clean_vertex_env fixture with autouse=True
- Saves and clears Google/Vertex env vars before each test
- Restores them after each test
- Prevents "AuthenticationError: Request had invalid authentication
  credentials" in CI when run with other tests

Test makes real API calls in CI without this fix, gets 401 error.
Locally fails with "No module named 'vertexai'" (expected).

Related: test was failing on PR #21217, but NOT caused by PR #21217
(which only modifies test_anthropic_structured_output.py). This is
another test isolation issue.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 19:16:46 -03:00
Julio Quinteros Pro
7c3020c04a fix(test): update test_other_constraints_preserved for new schema filtering behavior
PR #20813 changed the Anthropic schema filter to remove string and numeric constraints
(minLength/maxLength, minimum/maximum) per Anthropic API requirements, but forgot to
update the corresponding test.

The new behavior (per Anthropic SDK):
1. Remove unsupported constraints from schema (Anthropic API doesn't support them)
2. Add constraint info to description field (e.g., "Note: minimum length: 1")

**Changes:**
- Updated test to expect constraints REMOVED from schema
- Added assertions to verify constraints are added to description
- Updated docstring to explain the new behavior

**Testing:**
-  test_other_constraints_preserved now passes
-  All 4 tests in test_anthropic_structured_output.py pass

**Related:**
- Fixes test broken by PR #20813
- Aligns with Anthropic API requirements documented in commit 84934a7258

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 19:10:44 -03:00
Julio Quinteros Pro
0812323aaf fix(test): update reasoning_effort test to expect dict format
Update test expectations to match the current code behavior where
reasoning_effort is transformed from a string to a dict with
'effort' and 'summary' fields.

The transformation happens in:
litellm/llms/anthropic/experimental_pass_through/adapters/handler.py:72-74

When reasoning_effort is a string like "minimal", it's converted to:
{"effort": "minimal", "summary": "detailed"}

The test was expecting just the string "minimal", causing it to fail.

Test now passes 

Related: test was failing on PR #21217, but NOT caused by PR #21217
(which only modifies test_anthropic_structured_output.py). This is a
pre-existing broken test that also fails on main branch.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 19:08:18 -03:00
Julio Quinteros Pro
28a0c61c51 fix(test): add environment cleanup for Vertex AI rerank tests
Add setup_method and teardown_method to clean up Google/Vertex AI
environment variables that may be left by previous tests.

Previous tests may set GOOGLE_APPLICATION_CREDENTIALS or other Vertex
environment variables and not clean them up, causing this test to
attempt real Google authentication instead of using mocks.

This fix:
- Saves and clears Google/Vertex env vars in setup_method
- Restores them in teardown_method
- Prevents "DefaultCredentialsError" in CI when run with other tests

Test passes in isolation but fails in CI due to test ordering. This
is another test isolation issue, NOT related to PR #21217.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 18:26:51 -03:00
Ephrim Stanley
7d794b567c fix: thread deployment model_info through batch cost calculation
batch_cost_calculator only checked the global cost map, ignoring
deployment-level custom pricing (input_cost_per_token_batches etc.).
Add optional model_info param through the batch cost chain and pass
it from CheckBatchCost.
2026-02-15 14:53:30 -05:00
Julio Quinteros Pro
d8dbb7f5ab refactor(test): remove redundant cache flush from test_openai_env_base
The manual cache flush is redundant since the autouse fixture
clear_client_cache (lines 21-32) already flushes the cache before
and after every test in this module.

The manual flush was added in Jan 2026 before the autouse fixture
existed. Now that the fixture handles it, the manual flush is unnecessary.

Related: greptile review comment on PR #21255

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 14:24:38 -03:00