Commit graph

5535 commits

Author SHA1 Message Date
Sameer Kankute
3eb3594ab7
Merge pull request #19346 from Chesars/fix/drop-params-prompt-cache-key-19225
fix: drop_params not dropping prompt_cache_key for non-OpenAI providers
2026-01-20 10:15:45 +05:30
Sameer Kankute
931998f170
Merge pull request #19266 from VedantMadane/fix-prompt-caching-string-content
Fix extract_cacheable_prefix to handle string content with message-level cache_control
2026-01-20 10:11:48 +05:30
victorigualada
7d6d419a67
fix: preserve tool output ordering for gemini in responses bridge (#19360)
* fix: preserve tool output ordering for gemini in responses bridge

- Keep function_call_output adjacent to its function_call when building chat messages
- Normalize function_call_output.output lists (input_* parts) into tool message content

* fix test

* small improvements
2026-01-19 20:37:59 -08:00
victorigualada
581d086c20
fix(responses): stream tool call events in completion bridge (#19368)
Emit Responses API streaming events for tool calls when the underlying chat stream contains tool_call deltas, and recover tool calls into the stream when they only appear in the final response.
2026-01-19 20:29:50 -08:00
이명현
0dfc3fad5a
Fix: bedrock invoke claude 4 optional params #19318 (#19381) 2026-01-19 19:14:58 -08:00
Ryan Malloy
58c8c2b7b1
fix: HTTP client memory leaks in Presidio, OpenAI, and Gemini (#19190)
* fix: prevent HTTP client memory leaks in Presidio and OpenAI wrappers

Fixes multiple memory leak issues reported in #14540 and related tickets:

**Presidio Guardrail Fix (#14540)**
- Problem: Every guardrail check created a new aiohttp.ClientSession
- Impact: High-traffic proxies accumulated thousands of unclosed sessions
- Solution: Share a single session across all guardrail checks
  - Added `self._http_session` instance variable
  - Lazy session creation via `_get_http_session()`
  - Proper cleanup via `_close_http_session()` and `__del__()`
- Files: litellm/proxy/guardrails/guardrail_hooks/presidio.py

**OpenAI HTTP Client Caching (#14540)**
- Problem: `_get_async_http_client()` created new httpx.AsyncClient on each call
- Impact: OpenAI/Azure completions bypassed client caching system
- Solution: Route through `get_async_httpx_client()` for TTL-based caching
  - Caches clients by provider and SSL config
  - Fallback to direct creation if caching fails
  - Applied to both async and sync client methods
- Files: litellm/llms/openai/common_utils.py

**Test Script**
- Added validation script to demonstrate fixes
- Counts file descriptors and unclosed session objects
- Files: test_oom_fixes.py

Related issues: #14384, #13251, #12443

* fix(oom): prevent memory leaks in Presidio guardrails and OpenAI client creation

Fixes two high-impact memory leaks:

1. Presidio Guardrail Session Leak (issue #14540)
   - Problem: Created new aiohttp.ClientSession on every guardrail check
   - Impact: Runs on EVERY proxy request when PII masking enabled
   - Fix: Shared session pattern with lifecycle management
   - Files: litellm/proxy/guardrails/guardrail_hooks/presidio.py

2. OpenAI HTTP Client Cache Bypass (issue #14540)
   - Problem: _get_async_http_client() created new httpx.AsyncClient, bypassing TTL cache
   - Impact: Every completion created new client with own connection pool
   - Fix: Route through get_async_httpx_client() for proper caching
   - Critical: Include SSL config in cache key for correctness
   - Files: litellm/llms/openai/common_utils.py

Validation:
- Presidio: 100 requests → 0 new sessions (was 100)
- OpenAI: 100 calls → 1 unique client (was 100)
- test_oom_fixes.py: Automated validation script

* fix(oom): resolve Gemini aiohttp session leak (issue #12443)

Fixes persistent "Unclosed client session" warnings when using Gemini models.

Root Causes:
1. Broken atexit cleanup - get_event_loop() fails at exit time
2. On-demand session creation without reliable cleanup

Changes:

1. Fixed atexit Cleanup (async_client_cleanup.py)
   - OLD: Used get_event_loop() which fails when loop is closed
   - NEW: Always create fresh event loop at exit time
   - Ensures cleanup runs successfully even when main loop is closed

2. Added __del__ Cleanup (aiohttp_handler.py)
   - Defense-in-depth: cleanup on garbage collection
   - Handles abnormal termination cases
   - Similar pattern to Presidio guardrail fix

3. Enhanced Cleanup Scope (async_client_cleanup.py)
   - Now closes global base_llm_aiohttp_handler instance
   - Previously only checked cache, missed module-level handler

Validation:
- Test 1: __del__ cleanup → 0 sessions leaked ✓
- Test 2: atexit cleanup → 0 sessions leaked ✓
- test_gemini_session_leak.py: Automated validation

Related: #14540 (broader OOM issue tracking)

* fix(types): use LlmProviders enum for get_async_httpx_client

MyPy was failing because llm_provider parameter expects Union[LlmProviders, httpxSpecialProvider], not a string.

Changed from string "openai" to LlmProviders.OPENAI enum value.

* test: move validation tests to proper CI directories

- Move test_oom_fixes.py to tests/test_litellm/llms/
- Move test_gemini_session_leak.py to tests/test_litellm/llms/custom_httpx/
- Fix pytest warning: use pytest.skip() instead of return True

This ensures CI actually runs our OOM fix validation tests.

* fix(oom): add asyncio.Lock to prevent race conditions in Presidio session creation

- Make _get_http_session() async with asyncio.Lock protection
- Prevents multiple concurrent requests from creating orphaned sessions
- Add concurrent load test (50 parallel requests) to validate fix
- Test confirms only 1 session created under concurrent load

Critical fix: Previous implementation had race condition where
concurrent guardrail checks could create multiple sessions,
defeating the shared session pattern and causing memory leaks.

* fix(presidio): eliminate race condition in session lock initialization

Move asyncio.Lock creation from lazy initialization in _get_http_session()
to __init__. The previous lazy init had a race condition where concurrent
coroutines could both see _session_lock as None, both create locks, and
end up with different lock instances - defeating the synchronization.

asyncio.Lock() can be safely created without an event loop; it only
requires one when awaited.
2026-01-19 19:02:55 -08:00
南辰燏炚
004bde2c45
feat (volcengine) : Support Volcengine responses api (#18508)
* Add Volcengine responses adapter

* fix llms/volcengine/responses/transformation.py:507:9: F841 Local variable `origin` is assigned to but never used

fix llms/volcengine/responses/transformation.py:95: error: Argument "headers" to "VolcEngineError" has incompatible type

add more supported optional params

removed redundant manual logging/utils fallbacks so litellm/__init__.py uses the registry only.
2026-01-19 19:02:29 -08:00
Emerson Gomes
13d887a275
Fix queue persistence to Redis (#19304)
* Fix queue persistence to Redis

* add test
2026-01-19 19:01:34 -08:00
Ishaan Jaff
a82467d679
[Feat] - Add self hosted Claude Code Plugin Marketplace (#19378)
* init schema

* init endpoints

* fix: claude_code_marketplace_router

* refactor

* fix: claude_code_marketplace_router

* claude_code_marketplace_router
2026-01-19 14:05:47 -08:00
Ishaan Jaff
e817aa713e
[Fix] Claude Code x Bedrock Invoke fails with advanced-tool-use-2025-11-20 (#19373)
* _filter_unsupported_beta_headers_for_bedrock

* test_bedrock_sonnet_4_5_with_advanced_tool_use_beta_header
2026-01-19 10:16:18 -08:00
Sameer Kankute
ff7bb59824
Merge branch 'main' into litellm_fix_streaming_test 2026-01-19 19:43:16 +05:30
Sameer Kankute
c9de4776bc Fix test_process_chunk_exception_calls_handle_failure_once 2026-01-19 19:39:12 +05:30
Sameer Kankute
d6baa9a4ba
Merge pull request #19234 from BerriAI/litellm_staging_01_16_2026
Litellm staging 01 16 2026
2026-01-19 19:34:53 +05:30
Cesar Garcia
b49f0a91e4
fix(responses): resolve deepcopy error with tool_choice ValidatorIterator (#17192) (#17205)
Replace copy.deepcopy with model_dump + model_validate in streaming
iterator logging to handle Pydantic ValidatorIterator objects that
cannot be pickled when tool_choice uses allowed_tools mode.

Co-authored-by: Krish Dholakia <krrishdholakia@gmail.com>
2026-01-19 05:44:20 -08:00
Sameer Kankute
daf70f7221
Merge pull request #19329 from BerriAI/litellm_vector_store_sync
Fix: vector store sync issues
2026-01-19 19:11:48 +05:30
Sameer Kankute
574391c118
Revert "Fix audio cost per second override (#19158)"
This reverts commit 2a0f87bde0.
2026-01-19 18:51:08 +05:30
Sameer Kankute
480fa13b1d
Merge pull request #19343 from BerriAI/litellm_anthropic_header_fix_19_jan
Fix: anthropic-beta is getting overriden and set to anthropic-beta
2026-01-19 18:24:46 +05:30
Sameer Kankute
a9475be06d
Merge pull request #19338 from BerriAI/litellm_fix_managed_load_balancing_batches
Add managed files support when load_balancing is True
2026-01-19 18:24:21 +05:30
Sameer Kankute
a8883a45bf
Merge pull request #19327 from BerriAI/litellm_vertex_ai_file_upload
Fix: upload pdfs for file endpoint
2026-01-19 18:23:41 +05:30
Sameer Kankute
68294228c2
Merge pull request #19326 from BerriAI/litellm_handle_failer_2_times
Fix: _handle_failure method getting called 2 times
2026-01-19 18:22:44 +05:30
Sameer Kankute
896d1a7dad Fix Error: Found packages that need verification: 2026-01-19 18:18:24 +05:30
Sameer Kankute
c5a8d4e34e
Merge branch 'main' into litellm_staging_01_16_2026 2026-01-19 18:11:21 +05:30
Chesars
45eb35938b fix: drop_params not dropping prompt_cache_key for non-OpenAI providers
Fixes #19225

Add prompt_cache_key and other missing OpenAI Chat Completions params
to DEFAULT_CHAT_COMPLETION_PARAM_VALUES so drop_params: true works.

Also fix additional_drop_params to filter extra params for all providers,
not just OpenAI/Azure.
2026-01-19 08:49:03 -03:00
Sameer Kankute
d7b103158a Fix: anthropic-beta is getting overriden and set to anthropic-beta': 'structured-outputs-2025-11-13', 2026-01-19 16:43:27 +05:30
Sameer Kankute
eea24978b9 Add managed files support when load_balancing is True 2026-01-19 15:54:04 +05:30
Sameer Kankute
514ebb0d96 Fix: vector store sync issues 2026-01-19 13:17:08 +05:30
Sameer Kankute
480cb9c0d8 Fix: upload pdfs for file endpoint 2026-01-19 11:58:32 +05:30
YutaSaito
bb7aad9de1
Merge pull request #19319 from BerriAI/litellm_test_mcp_integration
[test] mcp integration test
2026-01-19 14:38:02 +09:00
Yuta Saito
44a166a792 fix: ci mcp version up 2026-01-19 14:27:00 +09:00
Yuta Saito
a141aa6026 test: temporary skip 2026-01-19 13:57:40 +09:00
Sameer Kankute
fbf2d83375 Fix: _handle_failure method getting called 2 times 2026-01-19 10:19:31 +05:30
Yuta Saito
1fbbe0a983 test: restore global MCP server manager after access-group test 2026-01-19 12:29:37 +09:00
Yuta Saito
30c4a38179 test: const 2026-01-19 12:03:26 +09:00
YutaSaito
14679cff3f
Merge pull request #19317 from BerriAI/litellm_fix-responses-api-non-openai-models
[fix] responses api non OpenAI models
2026-01-19 11:21:39 +09:00
Yuta Saito
20b6468222 test: refactor 2026-01-19 11:17:44 +09:00
Yuta Saito
c2b5e9c669 test: MCP E2E streamable_http 2026-01-19 11:12:36 +09:00
Yuta Saito
737fec600f test: add mcp e2e test 2026-01-19 10:49:39 +09:00
Yuta Saito
d31c609600 test: Let MCP tool-execution mock accept new kwargs for streaming tests 2026-01-19 07:00:14 +09:00
Yuta Saito
4ad78236ab test: Fail MCP streaming test when LiteLLM logs errors during follow-up calls 2026-01-19 06:46:39 +09:00
Yuta Saito
cd19039e39 test: Parametrize MCP streaming test to cover OpenAI and Anthropic models 2026-01-19 06:22:05 +09:00
Ishaan Jaffer
60dd04ac95 test_aiohttp_openai 2026-01-17 17:05:00 -08:00
Ishaan Jaffer
db7de13818 test_deepseek_mock_completion 2026-01-17 16:36:42 -08:00
Ishaan Jaffer
5812654bdd test_router_fallbacks_with_custom_model_costs 2026-01-17 16:34:46 -08:00
Ishaan Jaff
1417b002a3
[Feat] Claude Code x LiteLLM WebSearch - QA Fixes to work with Claude Code (#19294)
* fix websearch_interception_converted_stream

* test_websearch_interception_no_tool_call_streaming

* FakeAnthropicMessagesStreamIterator

* LITELLM_WEB_SEARCH_TOOL_NAME

* fixes tools def for litellm web search

* fixes FakeAnthropicMessagesStreamIterator

* test_litellm_standard_websearch_tool

* use new hook for modfying before any transfroms from litellm

* init WebSearchInterceptionLogger + ARCHITECTURE

* fix config.yaml

* init doc for claude code web search

* docs fix

* doc fix

* fix mypy linting
2026-01-17 16:30:31 -08:00
Ishaan Jaff
104283ae8f
[Feat] Claude Code - Add Websearch support using LiteLLM /search (using web search interception hook) (#19263)
* init WebSearchInterceptionLogger

* test_websearch_interception_real_call

* init async_should_run_agentic_completion

* async_should_run_agentic_loop

* async_run_agentic_loop

* refactor folder

* fix organization

* WebSearchTransformation

* WebSearchInterceptionLogger

* _call_agentic_completion_hooks

* WebSearch Interception Architecture

* test_websearch_interception_real_call

* add streaming

* add transform_request for streaming

* get_llm_provider

* test fix

* fix info

* init from config.yaml

* fixes

* test handler

* fix _is_streaming_response

* async_run_agentic_loop

* mypy fix
2026-01-16 21:10:05 -08:00
Vedant Madane
11a622aa5a Fix extract_cacheable_prefix to handle string content with message-level cache_control (fixes #19228) 2026-01-17 10:35:40 +05:30
yuneng-jiang
90dc0e9120 Merge remote-tracking branch 'origin' into litellm_deleted_keys_endpoint 2026-01-16 19:25:03 -08:00
yuneng-jiang
de84b2edce Fixing tests and adding proper returns 2026-01-16 19:24:51 -08:00
yuneng-jiang
6e8dd06d18 fixing test 2026-01-16 19:06:23 -08:00
yuneng-jiang
bb4b791746 Merge remote-tracking branch 'origin' into litellm_deleted_keys_endpoint 2026-01-16 18:15:37 -08:00