From e03c7ccbabfb26b3af9dd8c86fdaea13e1554baa Mon Sep 17 00:00:00 2001 From: Yuneng Jiang Date: Mon, 7 Sep 2026 15:58:25 -0700 Subject: [PATCH 01/22] ci: remove main branch source guard --- .github/workflows/guard-main-branch.yml | 42 ------------------------- 1 file changed, 42 deletions(-) delete mode 100644 .github/workflows/guard-main-branch.yml diff --git a/.github/workflows/guard-main-branch.yml b/.github/workflows/guard-main-branch.yml deleted file mode 100644 index 5bc561c6441..00000000000 --- a/.github/workflows/guard-main-branch.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Guard main branch - -on: - pull_request: - branches: - - main - merge_group: - -permissions: {} - -# DO NOT RENAME the job's `name:` — it is referenced by GitHub branch -# protection as a required status check on `main`. Renaming silently -# breaks the gate. -jobs: - guard: - name: Verify PR source branch - runs-on: ubuntu-latest - timeout-minutes: 2 - steps: - - name: Reject merge_group events - if: github.event_name == 'merge_group' - run: | - echo "::error::Merge queue is not supported for main. Disable merge queue or update this guard." - exit 1 - - name: Check head branch name - env: - HEAD_REF: ${{ github.head_ref }} - HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }} - BASE_REPO: ${{ github.repository }} - run: | - echo "PR head repo: $HEAD_REPO" - echo "PR head branch: $HEAD_REF" - if [ "$HEAD_REPO" != "$BASE_REPO" ]; then - echo "::error::PRs to main must originate from the canonical repository ($BASE_REPO), not a fork ($HEAD_REPO). External contributors should open PRs against 'litellm_internal_staging' instead." - exit 1 - fi - if [ "$HEAD_REF" = "litellm_internal_staging" ] || [[ "$HEAD_REF" == litellm_hotfix_?* ]]; then - echo "Allowed source branch." - exit 0 - fi - echo "::error::PRs to main must originate from 'litellm_internal_staging' or a 'litellm_hotfix_*' branch. Got: '$HEAD_REF'. If this is a contribution, retarget the PR against 'litellm_internal_staging' instead." - exit 1 From 96363bf337c7c0142c156e1840d65b93adf738e6 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Sat, 12 Sep 2026 15:30:12 -0700 Subject: [PATCH 02/22] fix(logging): log one bounded summary for a burst of timed-out LoggingWorker callbacks When a slow backend times out many logging callbacks at once, each timeout hit verbose_logger.exception in _process_log_task and produced a full ERROR traceback, clustered milliseconds apart. Count timeouts instead and arm a debounced flush that logs one WARNING with the burst count, callback name, timeout and cumulative total. Real programming errors keep their traceback. --- litellm/constants.py | 3 + litellm/litellm_core_utils/logging_worker.py | 38 +++++ .../litellm_core_utils/test_logging_worker.py | 142 +++++++++++++----- 3 files changed, 148 insertions(+), 35 deletions(-) diff --git a/litellm/constants.py b/litellm/constants.py index 6b984c2673c..1186d590601 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -571,6 +571,9 @@ ANTHROPIC_MESSAGES_MAX_DETACHED_STREAM_DRAINS: Final = int( LOGGING_WORKER_CONCURRENCY: Final = int(os.getenv("LOGGING_WORKER_CONCURRENCY", 100)) # Must be above 0 LOGGING_WORKER_MAX_QUEUE_SIZE: Final = int(os.getenv("LOGGING_WORKER_MAX_QUEUE_SIZE", 50_000)) LOGGING_WORKER_MAX_TIME_PER_COROUTINE: Final = float(os.getenv("LOGGING_WORKER_MAX_TIME_PER_COROUTINE", 20.0)) +LOGGING_WORKER_TIMEOUT_SUMMARY_WINDOW_SECONDS: Final = float( + os.getenv("LOGGING_WORKER_TIMEOUT_SUMMARY_WINDOW_SECONDS", "5.0") +) LOGGING_WORKER_CLEAR_PERCENTAGE: Final = int( os.getenv("LOGGING_WORKER_CLEAR_PERCENTAGE", 50) ) # Percentage of queue to clear (default: 50%) diff --git a/litellm/litellm_core_utils/logging_worker.py b/litellm/litellm_core_utils/logging_worker.py index 1d74595781a..b57464b5407 100644 --- a/litellm/litellm_core_utils/logging_worker.py +++ b/litellm/litellm_core_utils/logging_worker.py @@ -18,11 +18,16 @@ from litellm.constants import ( LOGGING_WORKER_CONCURRENCY, LOGGING_WORKER_MAX_QUEUE_SIZE, LOGGING_WORKER_MAX_TIME_PER_COROUTINE, + LOGGING_WORKER_TIMEOUT_SUMMARY_WINDOW_SECONDS, MAX_ITERATIONS_TO_CLEAR_QUEUE, MAX_TIME_TO_CLEAR_QUEUE, ) +def _coroutine_name(coroutine: Coroutine) -> str: + return getattr(coroutine, "__qualname__", None) or getattr(coroutine, "__name__", None) or type(coroutine).__name__ + + class LoggingTask(TypedDict): """ A logging task with its associated context to ensure logging is executed in @@ -47,10 +52,12 @@ class LoggingWorker: timeout: float = LOGGING_WORKER_MAX_TIME_PER_COROUTINE, max_queue_size: int = LOGGING_WORKER_MAX_QUEUE_SIZE, concurrency: int = LOGGING_WORKER_CONCURRENCY, + timeout_summary_window: float = LOGGING_WORKER_TIMEOUT_SUMMARY_WINDOW_SECONDS, ): self.timeout = timeout self.max_queue_size = max_queue_size self.concurrency = concurrency + self.timeout_summary_window = timeout_summary_window self._queue: asyncio.Queue[LoggingTask] | None = None self._worker_task: asyncio.Task | None = None self._running_tasks: set[asyncio.Task] = set() @@ -59,6 +66,10 @@ class LoggingWorker: self._bound_loop: asyncio.AbstractEventLoop | None = None self._last_aggressive_clear_time: float = 0.0 self._aggressive_clear_in_progress: bool = False + self._timeout_total: int = 0 + self._timeout_burst_count: int = 0 + self._timeout_last_callback: str | None = None + self._timeout_summary_task: asyncio.Task | None = None # Register cleanup handler to flush remaining events on exit atexit.register(self._flush_on_exit) @@ -162,6 +173,8 @@ class LoggingWorker: task["context"].run(asyncio.create_task, task["coroutine"]), timeout=self.timeout, ) + except asyncio.TimeoutError: + self._record_callback_timeout(task["coroutine"]) except Exception as e: verbose_logger.exception("LoggingWorker error: %s", e) finally: @@ -171,6 +184,31 @@ class LoggingWorker: # Always release semaphore, even if queue is None sem.release() + def _record_callback_timeout(self, coroutine: Coroutine) -> None: + """Count a callback timeout and arm a debounced summary, so a burst of timeouts + (e.g. a slow Redis timing out many callbacks at once) logs one bounded line rather + than a full ERROR stacktrace per callback.""" + self._timeout_total += 1 + self._timeout_burst_count += 1 + self._timeout_last_callback = _coroutine_name(coroutine) + if self._timeout_summary_task is None or self._timeout_summary_task.done(): + self._timeout_summary_task = asyncio.create_task(self._flush_timeout_summary()) + + async def _flush_timeout_summary(self) -> None: + """After the burst settles, log one bounded summary covering every timeout in it.""" + await asyncio.sleep(self.timeout_summary_window) + burst_count: Final = self._timeout_burst_count + self._timeout_burst_count = 0 + if burst_count <= 0: + return + verbose_logger.warning( + "LoggingWorker: %d callback(s) timed out after %ss (callback: %s); %d timed out since start", + burst_count, + self.timeout, + self._timeout_last_callback, + self._timeout_total, + ) + async def _worker_loop(self) -> None: """Main worker loop that gets tasks and schedules them to run concurrently.""" try: diff --git a/tests/test_litellm/litellm_core_utils/test_logging_worker.py b/tests/test_litellm/litellm_core_utils/test_logging_worker.py index eb4e893adb8..24a5f247b30 100644 --- a/tests/test_litellm/litellm_core_utils/test_logging_worker.py +++ b/tests/test_litellm/litellm_core_utils/test_logging_worker.py @@ -14,6 +14,18 @@ from litellm.constants import LOGGING_WORKER_AGGRESSIVE_CLEAR_COOLDOWN_SECONDS from litellm.litellm_core_utils.logging_worker import LoggingWorker +class _RecordCollector(logging.Handler): + """Captures emitted log records so a test can assert on real logging output + (level, message args, traceback) instead of patching the logger object.""" + + def __init__(self) -> None: + super().__init__() + self.records: list[logging.LogRecord] = [] + + def emit(self, record: logging.LogRecord) -> None: + self.records.append(record) + + class TestLoggingWorker: """Test cases for LoggingWorker functionality.""" @@ -26,9 +38,7 @@ class TestLoggingWorker: async def test_graceful_shutdown_with_clear_queue(self, logging_worker): """Test that cancellation triggers clear_queue to prevent 'never awaited' warnings.""" # Mock the clear_queue method to verify it's called during cancellation - with patch.object( - logging_worker, "clear_queue", new_callable=AsyncMock - ) as mock_clear_queue: + with patch.object(logging_worker, "clear_queue", new_callable=AsyncMock) as mock_clear_queue: # Start the worker logging_worker.start() @@ -195,9 +205,7 @@ class TestLoggingWorker: async def test_worker_handles_cancellation_gracefully(self, logging_worker): """Test that the worker handles cancellation without throwing exceptions.""" # Mock verbose_logger to capture debug messages - with patch( - "litellm.litellm_core_utils.logging_worker.verbose_logger" - ) as mock_logger: + with patch("litellm.litellm_core_utils.logging_worker.verbose_logger") as mock_logger: # Start the worker logging_worker.start() @@ -264,29 +272,21 @@ class TestLoggingWorker: small_worker._ensure_queue() # Mock verbose_logger to capture exception messages - with patch( - "litellm.litellm_core_utils.logging_worker.verbose_logger" - ) as mock_logger: + with patch("litellm.litellm_core_utils.logging_worker.verbose_logger") as mock_logger: # Fill the queue beyond capacity mock_coro = AsyncMock() for _ in range(5): # More than max_queue_size of 2 small_worker.enqueue(mock_coro()) # Should have logged queue full exceptions - exception_calls = [ - call - for call in mock_logger.exception.call_args_list - if "queue is full" in str(call) - ] + exception_calls = [call for call in mock_logger.exception.call_args_list if "queue is full" in str(call)] assert len(exception_calls) > 0 @pytest.mark.asyncio async def test_context_propagation(self, logging_worker): """Test that enqueued tasks execute in their original context.""" # Create a context variable for testing - test_context_var: contextvars.ContextVar[str] = contextvars.ContextVar( - "test_context_var" - ) + test_context_var: contextvars.ContextVar[str] = contextvars.ContextVar("test_context_var") # Track results from multiple tasks using asyncio.Event for synchronization task_results = [] @@ -364,36 +364,28 @@ class TestLoggingWorker: task_results.sort(key=lambda x: x["task_id"]) # Verify that each task saw its own context - assert ( - len(task_results) == 3 - ), f"Expected 3 results, got {len(task_results)}: {task_results}" + assert len(task_results) == 3, f"Expected 3 results, got {len(task_results)}: {task_results}" # Task 1 should see "context_1" task1_result = next((r for r in task_results if r["task_id"] == "task_1"), None) assert task1_result is not None, "Task 1 result not found" - assert ( - task1_result["context_accessible"] is True - ), "Task 1 should have access to context variable" - assert ( - task1_result["context_value"] == "context_1" - ), f"Task 1 should see 'context_1', got: {task1_result['context_value']}" + assert task1_result["context_accessible"] is True, "Task 1 should have access to context variable" + assert task1_result["context_value"] == "context_1", ( + f"Task 1 should see 'context_1', got: {task1_result['context_value']}" + ) # Task 2 should see "context_2" task2_result = next((r for r in task_results if r["task_id"] == "task_2"), None) assert task2_result is not None, "Task 2 result not found" - assert ( - task2_result["context_accessible"] is True - ), "Task 2 should have access to context variable" - assert ( - task2_result["context_value"] == "context_2" - ), f"Task 2 should see 'context_2', got: {task2_result['context_value']}" + assert task2_result["context_accessible"] is True, "Task 2 should have access to context variable" + assert task2_result["context_value"] == "context_2", ( + f"Task 2 should see 'context_2', got: {task2_result['context_value']}" + ) # Task 3 should not have access to the context variable task3_result = next((r for r in task_results if r["task_id"] == "task_3"), None) assert task3_result is not None, "Task 3 result not found" - assert ( - task3_result["context_accessible"] is False - ), "Task 3 should not have access to context variable" + assert task3_result["context_accessible"] is False, "Task 3 should not have access to context variable" @pytest.mark.asyncio async def test_semaphore_concurrency_limit(self): @@ -525,3 +517,83 @@ class TestLoggingWorker: asyncio.run(rebind_on_second_loop()) assert sorted(executed) == [0, 1, 2, 3, 4] + + @pytest.mark.asyncio + async def test_timeout_burst_logs_one_bounded_summary(self): + """Regression (LIT-7519): a burst of callback timeouts must log one bounded summary, + not a full ERROR traceback per timed-out callback. + + Before the fix every timed-out callback hit ``verbose_logger.exception`` in + ``_process_log_task``, so a slow Redis timing out many spend-tracking callbacks at once + produced one stacktrace each, clustered milliseconds apart. They must collapse into a + single WARNING that counts them, with no tracebacks. + """ + timeout_count = 25 + worker = LoggingWorker( + timeout=0.05, + max_queue_size=100, + concurrency=100, + timeout_summary_window=1.0, + ) + + async def slow_callback() -> None: + await asyncio.sleep(10) + + logger = logging.getLogger("LiteLLM") + collector = _RecordCollector() + previous_level = logger.level + logger.addHandler(collector) + logger.setLevel(logging.DEBUG) + try: + worker.start() + for _ in range(timeout_count): + worker.enqueue(slow_callback()) + + await worker.flush() + assert worker._timeout_summary_task is not None + await worker._timeout_summary_task + await worker.stop() + finally: + logger.removeHandler(collector) + logger.setLevel(previous_level) + + errors = [r for r in collector.records if r.levelno >= logging.ERROR] + warnings = [r for r in collector.records if r.levelno == logging.WARNING] + assert errors == [], "a timeout burst must not emit any ERROR tracebacks" + assert len(warnings) == 1, "the whole burst must collapse into one summary line" + summary = warnings[0].getMessage() + assert f"{timeout_count} callback(s) timed out" in summary + assert f"{timeout_count} timed out since start" in summary + assert "slow_callback" in summary + + @pytest.mark.asyncio + async def test_non_timeout_error_keeps_traceback(self): + """A real programming error in a callback must still log a full traceback, so the + timeout aggregation never hides genuine failures. + """ + worker = LoggingWorker(timeout=5.0, max_queue_size=10) + + async def failing_callback() -> None: + raise ValueError("boom") + + logger = logging.getLogger("LiteLLM") + collector = _RecordCollector() + previous_level = logger.level + logger.addHandler(collector) + logger.setLevel(logging.DEBUG) + try: + worker.start() + worker.enqueue(failing_callback()) + + await worker.flush() + await worker.stop() + finally: + logger.removeHandler(collector) + logger.setLevel(previous_level) + + errors = [r for r in collector.records if r.levelno >= logging.ERROR] + warnings = [r for r in collector.records if r.levelno == logging.WARNING] + assert len(errors) == 1, "a real error must still be logged once" + assert errors[0].exc_info is not None, "the traceback must be preserved" + assert warnings == [], "a single real error is not a timeout summary" + assert worker._timeout_summary_task is None From 68509daeafa025e09aa92182a4fa05884f4447f9 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Sat, 12 Sep 2026 16:33:43 -0700 Subject: [PATCH 03/22] refactor(logging): keep the timeout summary window a plain constant Drop the unrequested env override on LOGGING_WORKER_TIMEOUT_SUMMARY_WINDOW_SECONDS. The constructor still accepts a value for tests, so runtime behavior is unchanged. --- litellm/constants.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/litellm/constants.py b/litellm/constants.py index 1186d590601..be5a4e4b076 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -571,9 +571,7 @@ ANTHROPIC_MESSAGES_MAX_DETACHED_STREAM_DRAINS: Final = int( LOGGING_WORKER_CONCURRENCY: Final = int(os.getenv("LOGGING_WORKER_CONCURRENCY", 100)) # Must be above 0 LOGGING_WORKER_MAX_QUEUE_SIZE: Final = int(os.getenv("LOGGING_WORKER_MAX_QUEUE_SIZE", 50_000)) LOGGING_WORKER_MAX_TIME_PER_COROUTINE: Final = float(os.getenv("LOGGING_WORKER_MAX_TIME_PER_COROUTINE", 20.0)) -LOGGING_WORKER_TIMEOUT_SUMMARY_WINDOW_SECONDS: Final = float( - os.getenv("LOGGING_WORKER_TIMEOUT_SUMMARY_WINDOW_SECONDS", "5.0") -) +LOGGING_WORKER_TIMEOUT_SUMMARY_WINDOW_SECONDS: Final = 5.0 LOGGING_WORKER_CLEAR_PERCENTAGE: Final = int( os.getenv("LOGGING_WORKER_CLEAR_PERCENTAGE", 50) ) # Percentage of queue to clear (default: 50%) From 94e4dd725fec6904c21102e1b115d91e1767babd Mon Sep 17 00:00:00 2001 From: Joshua Valluru <326636767+joshua-berri@users.noreply.github.com> Date: Sat, 12 Sep 2026 16:25:57 -0700 Subject: [PATCH 04/22] fix(mcp): require admission for delegated OAuth --- .../proxy/_experimental/mcp_server/AGENTS.md | 5 +- .../proxy/_experimental/mcp_server/CLAUDE.md | 2 +- .../mcp_server/auth/user_api_key_auth_mcp.py | 119 +++---- .../mcp_server/mcp_server_manager.py | 38 +-- .../proxy/_experimental/mcp_server/server.py | 88 +---- .../proxy/hooks/proxy_track_cost_callback.py | 1 + .../types/mcp_server/mcp_server_manager.py | 8 +- tests/e2e/coverage_registry/mcp.yaml | 2 +- .../auth/test_user_api_key_auth_mcp.py | 226 ++++--------- .../mcp_server/test_mcp_server.py | 299 +++++------------ .../mcp_server/test_mcp_server_manager.py | 309 +++++++++++------- .../hooks/test_proxy_track_cost_callback.py | 38 ++- 12 files changed, 433 insertions(+), 702 deletions(-) diff --git a/litellm/proxy/_experimental/mcp_server/AGENTS.md b/litellm/proxy/_experimental/mcp_server/AGENTS.md index 6e1d121c3be..a35e5d1ce10 100644 --- a/litellm/proxy/_experimental/mcp_server/AGENTS.md +++ b/litellm/proxy/_experimental/mcp_server/AGENTS.md @@ -67,9 +67,8 @@ module materially harder to understand. auth, SSE, streamable HTTP, and stdio as separate flows. Do not collapse them behind a single generic branch unless tests prove every mode still behaves correctly. -- Be especially careful with `available_on_public_internet: false` combined with - `delegate_auth_to_upstream: true`. The local `CLAUDE.md` explains the anonymous - upstream PKCE path that must remain intentional. +- Be especially careful with legacy `delegate_auth_to_upstream: true`. The local + `CLAUDE.md` explains its admitted replacement and public discovery contract. - Keep database-backed fields in sync across migrations, typed models under `litellm/types/mcp.py` or `litellm/types/mcp_server/`, config loading, this package, and dashboard state when the field is user-visible. diff --git a/litellm/proxy/_experimental/mcp_server/CLAUDE.md b/litellm/proxy/_experimental/mcp_server/CLAUDE.md index 0ba8f73315f..7f8d06b4570 100644 --- a/litellm/proxy/_experimental/mcp_server/CLAUDE.md +++ b/litellm/proxy/_experimental/mcp_server/CLAUDE.md @@ -1 +1 @@ -MCP note: **`available_on_public_internet: false` with `delegate_auth_to_upstream: true` (oauth2, interactive - not `client_credentials`)** - LiteLLM still allows the anonymous upstream PKCE path (no proxy API key for `/authorize` and matching MCP routes). The internal-only flag mainly affects other surfaces (e.g. IP-based discovery). Rely on the upstream IdP and network policy; the dashboard shows a warning when both are set, and the proxy logs a warning when the server is loaded from config or the database +MCP note: **`auth_type: oauth2` with `delegate_auth_to_upstream: true` is deprecated** - LiteLLM admission is required for matching MCP routes. Use `auth_type: oauth_delegate` for client-forwarded OAuth. OAuth discovery endpoints stay public so clients can start the RFC 9728 flow diff --git a/litellm/proxy/_experimental/mcp_server/auth/user_api_key_auth_mcp.py b/litellm/proxy/_experimental/mcp_server/auth/user_api_key_auth_mcp.py index cd6739777dd..b0d57cb6228 100644 --- a/litellm/proxy/_experimental/mcp_server/auth/user_api_key_auth_mcp.py +++ b/litellm/proxy/_experimental/mcp_server/auth/user_api_key_auth_mcp.py @@ -129,10 +129,9 @@ def _is_mcp_passthrough_cold_start(mcp_servers: list[str] | None, client_ip: str spec-compliant WWW-Authenticate challenge instead of surfacing a generic admission error. - Uses "all" semantics (mirrors - :meth:`MCPRequestHandler._target_servers_delegate_auth_to_upstream`): one - non-passthrough target in a co-targeted set must not flip the bypass open - for the others. Fails closed when any target cannot be resolved.""" + Uses "all" semantics: one non-passthrough target in a co-targeted set must + not flip the bypass open for the others. Fails closed when any target + cannot be resolved.""" if not mcp_servers: return False from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( @@ -146,6 +145,27 @@ def _is_mcp_passthrough_cold_start(mcp_servers: list[str] | None, client_ip: str return True +def _is_legacy_delegate_cold_start(mcp_servers: list[str] | None, client_ip: str | None) -> bool: + """Allow only credential-free legacy delegates to reach the route's OAuth challenge.""" + if not mcp_servers: + return False + from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( + MCPServerManager, + global_mcp_server_manager, + ) + from litellm.types.mcp import MCPAuth + + for name in mcp_servers: + server = global_mcp_server_manager.get_mcp_server_by_name(name, client_ip=client_ip) + if server is None or server.auth_type != MCPAuth.oauth2: + return False + if server.delegate_auth_to_upstream is not True: + return False + if MCPServerManager.effective_oauth2_flow(server) == "client_credentials": + return False + return True + + def _is_litellm_auth_admission_error(exc: Exception) -> bool: if isinstance(exc, HTTPException): return exc.status_code == 401 @@ -277,9 +297,18 @@ def _admission_failure_fallback( mcp_servers_from_path is not None and not _has_client_supplied_mcp_auth(mcp_auth_header, mcp_server_auth_headers) and _is_litellm_auth_admission_error(exc) - and _is_mcp_passthrough_cold_start( - mcp_servers_from_path, - client_ip=IPAddressUtils.get_mcp_client_ip(request), + and ( + _is_mcp_passthrough_cold_start( + mcp_servers_from_path, + client_ip=IPAddressUtils.get_mcp_client_ip(request), + ) + or ( + not bearer_presented + and _is_legacy_delegate_cold_start( + mcp_servers_from_path, + client_ip=IPAddressUtils.get_mcp_client_ip(request), + ) + ) ) ): verbose_logger.debug("MCP pass-through cold start: deferring admission to route 401 emitter") @@ -434,22 +463,6 @@ class MCPRequestHandler: api_key=f"Bearer {_get_bearer_token_or_received_api_key(litellm_api_key)}", request=request, ) - elif MCPRequestHandler._target_servers_delegate_auth_to_upstream( - path=request_route, - mcp_servers=mcp_servers, - client_ip=IPAddressUtils.get_mcp_client_ip(request), - ): - # Operator opted this oauth2 server into upstream-delegated auth: the - # client authenticates directly with the upstream MCP server, so any - # Authorization bearer is an upstream token, never a LiteLLM key. Skip - # LiteLLM validation entirely — covering both the no-credential - # discovery request and the authenticated call carrying the upstream - # bearer — so a tool call that succeeds never carries a phantom 401 - # auth span; the bearer is forwarded upstream unchanged. Gated by - # _target_servers_delegate_auth_to_upstream, which returns True only - # when EVERY target is auth_type=oauth2 with delegate_auth_to_upstream - # set; fails closed otherwise. - validated_user_api_key_auth = UserAPIKeyAuth() elif MCPRequestHandler._target_servers_are_true_passthrough( path=request_route, mcp_servers=mcp_servers, @@ -660,64 +673,6 @@ class MCPRequestHandler: return [single_server_match.group(1)] return [servers_and_path] - @staticmethod - def _target_servers_delegate_auth_to_upstream( - path: str, mcp_servers: list[str] | None, client_ip: str | None - ) -> bool: - """ - True only when EVERY MCP server the request targets is configured for - ``auth_type == oauth2`` AND has ``delegate_auth_to_upstream=True``. - Fails closed when any target does not opt in or cannot be resolved. - - Used by :meth:`process_mcp_request` to skip LiteLLM API-key/SSO auth - entirely (PKCE passthrough) so the client authenticates directly with - the upstream MCP server. Mixed-target requests (e.g. one delegated + - one non-delegated server) fall back to normal LiteLLM auth. - """ - # Inline imports avoid a circular dependency: mcp_server_manager imports - # from this module. - from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( - MCPServerManager, - global_mcp_server_manager, - ) - from litellm.types.mcp import MCPAuth - - # Must mirror the downstream header-vs-path override - # (``extract_mcp_auth_context``) or an attacker could set - # ``x-mcp-servers`` to a delegate-enabled server while the URL path - # targets a non-delegate server, skipping LiteLLM auth for it. - target_names: Final = MCPRequestHandler._resolve_target_server_names(path=path, mcp_servers_header=mcp_servers) - if not target_names: - return False - - for name in target_names: - server = global_mcp_server_manager.get_mcp_server_by_name(name, client_ip=client_ip) - if server is None or server.auth_type != MCPAuth.oauth2: - return False - # `is True` is intentional: opt-in must be an explicit boolean - # True. A MagicMock attribute (in tests) or any other truthy - # non-bool must not silently enable the bypass. - if getattr(server, "delegate_auth_to_upstream", False) is not True: - return False - # Never delegate for M2M (client_credentials) servers: LiteLLM - # fetches the upstream token automatically using stored credentials, - # so allowing anonymous bypass would let any external caller invoke - # tools authenticated as LiteLLM's service account. - # - # Resolve the flow rather than reading has_client_credentials directly: - # this is a security gate, and a legacy row whose oauth2_flow was never - # stamped still carries the M2M credential shape (client_id/secret + - # token_url, no authorization_url). Treating an unstamped-but-M2M-shaped - # row as non-M2M here would reopen the anonymous bypass the explicit - # column no longer closes on its own. Shares the one resolution helper - # with the egress backstop and the anonymous-delegate allowlist; all fail - # closed on the ambiguous shape and are removed together once no null rows - # remain. A pure-PKCE delegate server (no stored credentials) resolves to a - # non-M2M flow and keeps its bypass. - if MCPServerManager.effective_oauth2_flow(server) == "client_credentials": - return False - return True - @staticmethod def _target_servers_are_true_passthrough(path: str, mcp_servers: list[str] | None, client_ip: str | None) -> bool: """ @@ -726,7 +681,7 @@ class MCPRequestHandler: Used by :meth:`process_mcp_request` to skip LiteLLM admission auth entirely: the gateway is a transparent proxy and the caller's ``Authorization`` is an upstream token, never a LiteLLM key. - Mirrors :meth:`_target_servers_delegate_auth_to_upstream`; a mixed-target request keeps normal auth. + A mixed-target request keeps normal auth. """ from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( global_mcp_server_manager, diff --git a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py index 3291d5effc2..24e3bc6efc4 100644 --- a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py +++ b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py @@ -1453,22 +1453,19 @@ def _warn_on_server_name_fields( _warn("server_name", server_name) -def _warn_internal_delegate_pkce_if_applicable(server: MCPServer, *, source: str) -> None: - """Surface internal + upstream PKCE delegate in logs for operators.""" +def _warn_legacy_delegate_auth_if_applicable(server: MCPServer, *, source: str) -> None: + """Direct legacy delegated OAuth configurations to the admitted replacement.""" if server.auth_type != MCPAuth.oauth2: return if getattr(server, "delegate_auth_to_upstream", False) is not True: return - if getattr(server, "available_on_public_internet", True): - return if server.has_client_credentials: return label: Final = get_server_prefix(server) verbose_logger.warning( - "MCP server %r (id=%s, source=%s): internal-only (available_on_public_internet=false) " - "with delegate_auth_to_upstream=true. Anonymous callers can reach the upstream OAuth2 " - "/authorize flow and complete PKCE without a LiteLLM API key session; ensure the " - "upstream IdP and network enforce your access policy.", + "MCP server %r (id=%s, source=%s) uses deprecated auth_type=oauth2 with " + "delegate_auth_to_upstream=true. LiteLLM admission is now required; migrate to " + "auth_type=oauth_delegate for client-forwarded OAuth.", label, server.server_id, source, @@ -2640,7 +2637,7 @@ class MCPServerManager: oauth_identity_binding=server_config.get("oauth_identity_binding", None), ) self._assign_unique_short_prefix(new_server) - _warn_internal_delegate_pkce_if_applicable(new_server, source="config") + _warn_legacy_delegate_auth_if_applicable(new_server, source="config") _warn_config_id_jag_server_outruns_sso(new_server) self._invalidate_discovery_lists(server_id) self.config_mcp_servers[server_id] = new_server @@ -3185,7 +3182,7 @@ class MCPServerManager: timeout=getattr(mcp_server, "timeout", None), max_concurrent_requests=getattr(mcp_server, "max_concurrent_requests", None), ) - _warn_internal_delegate_pkce_if_applicable(new_server, source="database") + _warn_legacy_delegate_auth_if_applicable(new_server, source="database") self._set_oauth_discovery_deferred( new_server.server_id, _requires_oauth_discovery(server_url, use_issuer_anchor, new_server), @@ -3479,10 +3476,6 @@ class MCPServerManager: ) ) - # For anonymous callers (no user_id, no role), also surface any - # servers the operator has opted into upstream-delegated auth. - # These servers handle their own auth at the upstream level, so - # LiteLLM granting access here does not bypass any security gate. is_anonymous: Final = not ( user_api_key_auth and ( @@ -3492,23 +3485,12 @@ class MCPServerManager: ) ) if is_anonymous: - delegate_server_ids: Final = [ + passthrough_server_ids: Final = [ server.server_id for server in self.get_registry().values() - if ( - getattr(server, "auth_type", None) == MCPAuth.oauth2 - and getattr(server, "delegate_auth_to_upstream", False) is True - # M2M servers must not be exposed anonymously: an - # unauthenticated caller would get LiteLLM to proxy tool - # calls using its stored client_credentials. Resolve the flow - # rather than reading has_client_credentials so an unstamped - # M2M-shape row (null column, verbatim-read as non-M2M) still - # fails closed here, matching the anonymous-delegate auth gate. - and MCPServerManager.effective_oauth2_flow(server) != "client_credentials" - ) - or getattr(server, "auth_type", None) == MCPAuth.true_passthrough + if getattr(server, "auth_type", None) == MCPAuth.true_passthrough ] - combined_servers.update(delegate_server_ids) + combined_servers.update(passthrough_server_ids) restrict_allow_all: Final = ( resolved_general_settings.get("mcp_allow_all_keys_respects_mcp_scope", False) diff --git a/litellm/proxy/_experimental/mcp_server/server.py b/litellm/proxy/_experimental/mcp_server/server.py index fc87db69e16..7feb1fd468d 100644 --- a/litellm/proxy/_experimental/mcp_server/server.py +++ b/litellm/proxy/_experimental/mcp_server/server.py @@ -4257,20 +4257,6 @@ if MCP_AVAILABLE: return None return _get_authorization_header_from_scope(scope) - def _is_delegate_upstream_probe_target(server: MCPServer) -> bool: - """Whether ``server`` is an interactive delegate-auth server whose client-supplied - token should be preflighted upstream. - - Mirrors the anonymous-delegate gate in ``get_allowed_mcp_servers``: the flow is - resolved via ``effective_oauth2_flow`` so an unstamped M2M-shape row fails closed - (its stored client credentials drive egress; the caller's bearer is irrelevant). - """ - return ( - server.auth_type == MCPAuth.oauth2 - and server.delegate_auth_to_upstream is True - and MCPServerManager.effective_oauth2_flow(server) != "client_credentials" - ) - async def _probe_upstream_auth( url: str, auth_header: str, @@ -4331,7 +4317,7 @@ if MCP_AVAILABLE: mcp_servers: list[str] | None, client_ip: str | None, ) -> None: - """Probe pass-through and delegate-auth upstream servers in parallel before the MCP session starts. + """Probe pass-through upstream servers in parallel before the MCP session starts. Only servers the caller's key is already authorized to reach are probed — the list is derived from _get_allowed_mcp_servers so that a user cannot @@ -4343,38 +4329,9 @@ if MCP_AVAILABLE: if the upstream accepts it but forbids the caller. Fails-open: network errors are logged and the request is allowed through. - Delegate-auth servers (``auth_type=oauth2`` + ``delegate_auth_to_upstream``) - are probed with the caller's bare ``Authorization`` bearer. That bearer is only - an upstream token (never a LiteLLM key) when admission took the delegate bypass, - so the delegate target is resolved through ``get_mcp_server_by_name`` -- the same - resolver admission used -- rather than the wider allowed-server prefix/access-group - matching. A name that only reaches a delegate server via server_id or an access - group would have been admitted as a real LiteLLM key, so probing it would leak that - key upstream; requiring the admission-resolver match closes that gap. Without the - probe a rejected token is absorbed by the tools/list handler and masked as an empty - tool list. Gated to single-server routes so one rejected token cannot 401 a - multi-server aggregate connect, matching the OBO preflight gating; the challenge - echoes the requested name so aliased routes get the same resource_metadata URL as - the tokenless preemptive challenge. """ forwarded_auth: Final = _get_forwarded_auth_from_scope(scope) - requested_single_target: Final = mcp_servers[0] if mcp_servers is not None and len(mcp_servers) == 1 else None - # The bare Authorization header (no x-litellm-api-key) is a valid upstream token - # only when admission classified it as one, i.e. the single requested name resolves - # to a delegate server under admission's own resolver. Resolve it the same way here - # so a server_id- or access-group-named delegate (which admission would have treated - # as a LiteLLM key) is never probed with that key. - delegate_server: Final = ( - global_mcp_server_manager.get_mcp_server_by_name(requested_single_target, client_ip=client_ip) - if requested_single_target - else None - ) - delegate_auth: Final = ( - _get_authorization_header_from_scope(scope) - if delegate_server is not None and _is_delegate_upstream_probe_target(delegate_server) - else None - ) - if not forwarded_auth and not delegate_auth: + if not forwarded_auth: return # Use the authorized server set, not the raw user-supplied names, so that @@ -4384,35 +4341,20 @@ if MCP_AVAILABLE: mcp_servers=mcp_servers, client_ip=client_ip, ) - passthrough_targets: Final[tuple[tuple[MCPServer, str, str], ...]] = ( - tuple( - (srv, forwarded_auth, srv.name) - for srv in allowed_servers - # Restrict to genuine OAuth pass-through servers (auth_type none + - # Authorization in extra_headers). Gateway-managed OAuth2 servers - # must not receive the ``resource_metadata=`` challenge emitted - # below — they require ``authorization_uri=`` pointing at the - # gateway AS metadata. ``is_oauth_passthrough`` already requires - # ``auth_type in (None, MCPAuth.none)``, which is mutually - # exclusive with ``has_client_credentials`` (oauth2 + M2M flow), - # so M2M servers are implicitly excluded here. - if srv.is_oauth_passthrough - ) - if forwarded_auth - else () + passthrough_targets: Final[tuple[tuple[MCPServer, str, str], ...]] = tuple( + (srv, forwarded_auth, srv.name) + for srv in allowed_servers + # Restrict to genuine OAuth pass-through servers (auth_type none + + # Authorization in extra_headers). Gateway-managed OAuth2 servers + # must not receive the ``resource_metadata=`` challenge emitted + # below — they require ``authorization_uri=`` pointing at the + # gateway AS metadata. ``is_oauth_passthrough`` already requires + # ``auth_type in (None, MCPAuth.none)``, which is mutually + # exclusive with ``has_client_credentials`` (oauth2 + M2M flow), + # so M2M servers are implicitly excluded here. + if srv.is_oauth_passthrough ) - # Probe the admission-resolved delegate server only when the caller is actually - # authorized for it (present in the IP-filtered allowed set), keyed by server_id. - delegate_targets: Final[tuple[tuple[MCPServer, str, str], ...]] = ( - tuple( - (srv, delegate_auth, requested_single_target) - for srv in allowed_servers - if delegate_server is not None and srv.server_id == delegate_server.server_id - ) - if delegate_auth and requested_single_target - else () - ) - probe_targets: Final = passthrough_targets + delegate_targets + probe_targets: Final = passthrough_targets if not probe_targets: return diff --git a/litellm/proxy/hooks/proxy_track_cost_callback.py b/litellm/proxy/hooks/proxy_track_cost_callback.py index 64da2ad00f6..3a61f773001 100644 --- a/litellm/proxy/hooks/proxy_track_cost_callback.py +++ b/litellm/proxy/hooks/proxy_track_cost_callback.py @@ -64,6 +64,7 @@ _UNATTRIBUTED_TRACKABLE_CALL_TYPES: Final[frozenset[str]] = frozenset( CallTypes.pass_through.value, CallTypes.llm_passthrough_route.value, CallTypes.allm_passthrough_route.value, + CallTypes.call_mcp_tool.value, # CheckBatchCost's synthetic logging_obj for a completed managed batch carries # whatever LiteLLM_ManagedObjectTable stored at create time, and all of it is # None for a batch created before those columns were persisted, or by the master diff --git a/litellm/types/mcp_server/mcp_server_manager.py b/litellm/types/mcp_server/mcp_server_manager.py index 58f9dadc1ce..985d31af997 100644 --- a/litellm/types/mcp_server/mcp_server_manager.py +++ b/litellm/types/mcp_server/mcp_server_manager.py @@ -155,11 +155,9 @@ class MCPServer(BaseModel): access_groups: list[str] | None = None allow_all_keys: bool = False available_on_public_internet: bool = True - # Explicit opt-in to upstream-delegated authentication for ``oauth2`` - # servers. When ``auth_type == oauth2`` and this is ``True``, MCP requests - # bypass LiteLLM API-key/SSO auth (and the pre-emptive 401) so the client - # completes PKCE directly with the upstream MCP server. See - # ``MCPRequestHandler._target_servers_delegate_auth_to_upstream``. + # Legacy opt-in to upstream-delegated authentication for ``oauth2`` + # servers. LiteLLM admission still applies; use ``oauth_delegate`` for the + # supported client-forwarded OAuth flow. # # Honored only for ``auth_type == oauth2``; ignored for any other # ``auth_type``. OAuth pass-through for non-oauth2 servers diff --git a/tests/e2e/coverage_registry/mcp.yaml b/tests/e2e/coverage_registry/mcp.yaml index f853e9ff8d6..a7d4135d550 100644 --- a/tests/e2e/coverage_registry/mcp.yaml +++ b/tests/e2e/coverage_registry/mcp.yaml @@ -78,7 +78,7 @@ auth_family: none assertions: [succeeds] source: "mcp_server_manager.py:1485-1492" - rationale: Public/anonymous servers; delegate_auth_to_upstream + rationale: Explicitly anonymous true_passthrough servers - id: mcp.call_tool.none.succeeds module: mcp tier: P1 diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/auth/test_user_api_key_auth_mcp.py b/tests/test_litellm/proxy/_experimental/mcp_server/auth/test_user_api_key_auth_mcp.py index c2f4f7163a0..27a8c7992fe 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/auth/test_user_api_key_auth_mcp.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/auth/test_user_api_key_auth_mcp.py @@ -1483,12 +1483,10 @@ class TestMCPOAuth2AuthFlow: as LiteLLM API keys, causing auth failures and empty tool listings. """ - async def test_oauth2_token_in_authorization_header_fallback(self): + async def test_oauth2_token_in_authorization_header_requires_litellm_admission(self): """ - When only the Authorization header is present with a non-LiteLLM OAuth2 - token AND the target server delegates auth to upstream, LiteLLM skips its - own validation entirely (so the upstream token is never mistaken for a - virtual key) and forwards the bearer upstream. + A bare Authorization token on the legacy delegated mode must establish + a LiteLLM principal rather than entering anonymously. """ from litellm.types.mcp import MCPAuth @@ -1510,6 +1508,7 @@ class TestMCPOAuth2AuthFlow: patch( "litellm.proxy._experimental.mcp_server.auth.user_api_key_auth_mcp.user_api_key_auth", new_callable=AsyncMock, + return_value=UserAPIKeyAuth(user_id="admitted-user"), ) as mock_auth, patch("litellm.proxy._experimental.mcp_server.mcp_server_manager.global_mcp_server_manager") as mock_mgr, ): @@ -1524,9 +1523,8 @@ class TestMCPOAuth2AuthFlow: ) = await MCPRequestHandler.process_mcp_request(scope) assert isinstance(auth_result, UserAPIKeyAuth) - # The upstream token is never validated as a LiteLLM key ... - mock_auth.assert_not_called() - # ... and is preserved for upstream forwarding. + assert auth_result.user_id == "admitted-user" + mock_auth.assert_awaited_once() assert oauth2_headers.get("Authorization") == "Bearer atlassian-oauth2-access-token-xyz" async def test_explicit_litellm_key_with_oauth2_authorization(self): @@ -2367,11 +2365,9 @@ class TestMCPDelegateAuthToUpstream: """ Tests for the ``delegate_auth_to_upstream`` per-server flag. - When set on an ``auth_type=oauth2`` MCP server, LiteLLM must skip its own - API-key/SSO check entirely so the client completes PKCE directly with the - upstream MCP server. The gate must fail closed for any non-oauth2 server, - any mixed-target request, and any request where the target cannot be - resolved. + The legacy flag no longer bypasses LiteLLM admission. OAuth discovery may + still use the anonymous cold-start challenge, but a presented bearer must + authenticate to LiteLLM unless a separate admission credential is supplied. """ @staticmethod @@ -2386,6 +2382,13 @@ class TestMCPDelegateAuthToUpstream: delegate_auth_to_upstream=delegate_auth_to_upstream, ) + def test_legacy_delegate_cold_start_fails_closed_without_targets(self): + from litellm.proxy._experimental.mcp_server.auth.user_api_key_auth_mcp import ( + _is_legacy_delegate_cold_start, + ) + + assert _is_legacy_delegate_cold_start(None, client_ip=None) is False + def test_build_mcp_server_table_preserves_delegate_auth_to_upstream(self): """Registry → API list rows must expose delegate_auth_to_upstream for the UI.""" from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( @@ -2439,11 +2442,10 @@ class TestMCPDelegateAuthToUpstream: not_passthrough = passthrough.model_copy(update={"oauth_passthrough": False}) assert manager._build_mcp_server_table(not_passthrough).oauth_passthrough is False - async def test_delegate_skips_litellm_auth_with_no_authorization(self): + async def test_delegate_without_authorization_attempts_litellm_auth_before_cold_start(self): """ - oauth2 + delegate_auth_to_upstream=True, no Authorization header at - all → anonymous UserAPIKeyAuth and ``user_api_key_auth`` is never - called. + A credential-free discovery request attempts LiteLLM admission before + the route emits its RFC 9728 challenge. """ from litellm.types.mcp import MCPAuth @@ -2457,6 +2459,8 @@ class TestMCPDelegateAuthToUpstream: with ( patch( "litellm.proxy._experimental.mcp_server.auth.user_api_key_auth_mcp.user_api_key_auth", + new_callable=AsyncMock, + side_effect=HTTPException(status_code=401, detail="No key provided"), ) as mock_auth, patch("litellm.proxy._experimental.mcp_server.mcp_server_manager.global_mcp_server_manager") as mock_mgr, ): @@ -2466,17 +2470,12 @@ class TestMCPDelegateAuthToUpstream: ) auth_result, *_rest = await MCPRequestHandler.process_mcp_request(scope) assert isinstance(auth_result, UserAPIKeyAuth) - mock_auth.assert_not_called() + mock_auth.assert_awaited_once() - async def test_delegate_with_upstream_token_in_authorization_skips_litellm_auth( - self, - ): + async def test_delegate_with_only_upstream_token_requires_litellm_auth(self): """ - oauth2 + delegate_auth_to_upstream=True with an upstream OAuth token in - ``Authorization``: the delegate gate fires before any LiteLLM validation, - so ``user_api_key_auth`` is never called and the bearer is forwarded - upstream untouched. Skipping the doomed validation is what keeps a tool - call that actually succeeds from carrying a phantom 401 auth span. + An upstream token cannot establish a LiteLLM principal and must not + reopen anonymous admission. """ from litellm.types.mcp import MCPAuth @@ -2491,6 +2490,7 @@ class TestMCPDelegateAuthToUpstream: patch( "litellm.proxy._experimental.mcp_server.auth.user_api_key_auth_mcp.user_api_key_auth", new_callable=AsyncMock, + side_effect=HTTPException(status_code=401, detail="Invalid API key"), ) as mock_auth, patch("litellm.proxy._experimental.mcp_server.mcp_server_manager.global_mcp_server_manager") as mock_mgr, ): @@ -2498,17 +2498,11 @@ class TestMCPDelegateAuthToUpstream: auth_type=MCPAuth.oauth2, delegate_auth_to_upstream=True, ) - ( - auth_result, - _, - _, - _, - oauth2_headers, - _, - ) = await MCPRequestHandler.process_mcp_request(scope) - assert isinstance(auth_result, UserAPIKeyAuth) - assert oauth2_headers.get("Authorization") == "Bearer upstream-pkce-token" - mock_auth.assert_not_called() + with pytest.raises(HTTPException) as exc_info: + await MCPRequestHandler.process_mcp_request(scope) + + assert exc_info.value.status_code == 401 + mock_auth.assert_awaited_once() async def test_delegate_off_still_requires_litellm_auth(self): """ @@ -2687,15 +2681,11 @@ class TestMCPDelegateAuthToUpstream: assert auth_result.user_id == "real-user" mock_auth.assert_called_once() - async def test_authorization_bearer_on_delegate_server_treated_as_upstream(self): + async def test_authorization_bearer_on_delegate_server_establishes_litellm_principal(self): """ - On a delegate server the ``Authorization`` header is, by contract, an - upstream token rather than a LiteLLM key — even when it is sk-shaped. It - is forwarded upstream without LiteLLM validation, so ``user_api_key_auth`` - is not called and no LiteLLM identity is resolved. Callers who need - LiteLLM identity / spend tracking on a delegate server must supply - ``x-litellm-api-key`` (see - test_explicit_litellm_key_takes_precedence_over_delegate). + A bare Authorization bearer now follows normal LiteLLM admission. A + separate x-litellm-api-key is required when Authorization is intended + for the upstream server. """ from litellm.types.mcp import MCPAuth @@ -2727,9 +2717,9 @@ class TestMCPDelegateAuthToUpstream: _, ) = await MCPRequestHandler.process_mcp_request(scope) assert isinstance(auth_result, UserAPIKeyAuth) - assert auth_result.user_id is None + assert auth_result.user_id == "real-user" assert oauth2_headers.get("Authorization") == "Bearer sk-1234" - mock_auth.assert_not_called() + mock_auth.assert_awaited_once() async def test_delegate_ignored_for_client_credentials_server(self): """ @@ -2828,13 +2818,10 @@ class TestMCPDelegateAuthToUpstream: assert exc_info.value.status_code == 401 mock_auth.assert_called_once() - async def test_delegate_bypass_for_pure_pkce_server(self): + async def test_delegate_pkce_cold_start_attempts_litellm_auth(self): """ - oauth2 + delegate + oauth2_flow=None and NO stored client credentials - (pure PKCE, the common delegate case) → bypass must still fire. The - shape resolves to a non-M2M flow, so the security gate leaves it alone; - the fail-closed rule targets the M2M shape specifically, not every - unstamped row. + A pure PKCE server may defer a credential-free request to the route's + challenge, but normal LiteLLM admission still runs first. """ from litellm.types.mcp import MCPAuth from litellm.types.mcp_server.mcp_server_manager import MCPServer @@ -2869,13 +2856,12 @@ class TestMCPDelegateAuthToUpstream: ): mock_mgr.get_mcp_server_by_name.return_value = pkce_server auth, *_rest = await MCPRequestHandler.process_mcp_request(scope) - mock_auth.assert_not_called() + mock_auth.assert_awaited_once() assert auth.api_key is None - async def test_delegate_bypass_for_internal_server(self): + async def test_internal_delegate_cold_start_attempts_litellm_auth(self): """ - Delegate + oauth2 interactive servers bypass LiteLLM auth even when - ``available_on_public_internet`` is False (internal MCPs). + Internal delegated servers follow the same admission contract. """ from litellm.types.mcp import MCPAuth from litellm.types.mcp_server.mcp_server_manager import MCPServer @@ -2910,14 +2896,11 @@ class TestMCPDelegateAuthToUpstream: ): mock_mgr.get_mcp_server_by_name.return_value = internal_server auth, *_rest = await MCPRequestHandler.process_mcp_request(scope) - mock_auth.assert_not_called() + mock_auth.assert_awaited_once() assert auth.api_key is None - async def test_get_allowed_servers_excludes_client_credentials_delegate(self): - """ - get_allowed_mcp_servers must not surface M2M (client_credentials) delegate - servers to anonymous callers even if delegate_auth_to_upstream=True. - """ + async def test_get_allowed_servers_excludes_legacy_delegates(self): + """Legacy delegated servers are never added to anonymous access.""" from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( MCPServerManager, ) @@ -2955,102 +2938,7 @@ class TestMCPDelegateAuthToUpstream: ): result = await manager.get_allowed_mcp_servers(None) - assert "pkce-server" in result - assert "m2m-server" not in result - - async def test_get_allowed_servers_excludes_unstamped_m2m_shape_delegate(self): - """ - The anonymous allow-list must also exclude an M2M-shape delegate server whose - oauth2_flow was never stamped (null column, verbatim-read as non-M2M). Reading - the bare has_client_credentials here would surface it to anonymous callers; the - resolved-flow check fails closed on the shape, matching the auth gate. - """ - from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( - MCPServerManager, - ) - from litellm.types.mcp import MCPAuth - from litellm.types.mcp_server.mcp_server_manager import MCPServer - - manager = MCPServerManager() - pkce_server = MCPServer( - server_id="pkce-server", - name="pkce_server", - transport="http", - auth_type=MCPAuth.oauth2, - delegate_auth_to_upstream=True, - available_on_public_internet=True, - ) - unstamped_m2m = MCPServer( - server_id="unstamped-m2m", - name="unstamped_m2m", - transport="http", - auth_type=MCPAuth.oauth2, - delegate_auth_to_upstream=True, - oauth2_flow=None, - client_id="cid", - client_secret="csecret", - token_url="https://idp.example.com/token", - ) - assert unstamped_m2m.has_client_credentials is False - manager.registry = { - pkce_server.server_id: pkce_server, - unstamped_m2m.server_id: unstamped_m2m, - } - - with patch.object( - MCPRequestHandler, - "get_allowed_mcp_servers", - new_callable=AsyncMock, - return_value=[], - ): - result = await manager.get_allowed_mcp_servers(None) - - assert "pkce-server" in result - assert "unstamped-m2m" not in result - - async def test_get_allowed_servers_includes_internal_delegate(self): - """ - Internal-only (available_on_public_internet=False) delegate servers - appear in the anonymous allow-list like public delegate servers. - """ - from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( - MCPServerManager, - ) - from litellm.types.mcp import MCPAuth - from litellm.types.mcp_server.mcp_server_manager import MCPServer - - manager = MCPServerManager() - public_server = MCPServer( - server_id="public-server", - name="public_server", - transport="http", - auth_type=MCPAuth.oauth2, - delegate_auth_to_upstream=True, - available_on_public_internet=True, - ) - internal_server = MCPServer( - server_id="internal-server", - name="internal_server", - transport="http", - auth_type=MCPAuth.oauth2, - delegate_auth_to_upstream=True, - available_on_public_internet=False, - ) - manager.registry = { - public_server.server_id: public_server, - internal_server.server_id: internal_server, - } - - with patch.object( - MCPRequestHandler, - "get_allowed_mcp_servers", - new_callable=AsyncMock, - return_value=[], - ): - result = await manager.get_allowed_mcp_servers(None) - - assert "public-server" in result - assert "internal-server" in result + assert result == [] async def test_true_passthrough_skips_litellm_auth_anonymously(self): """auth_type=true_passthrough performs no admission auth: the caller's Authorization is an @@ -4453,7 +4341,9 @@ class TestAgentMCPPermissions: stack.enter_context(patcher) stack.enter_context( patch.object( # test-quality-ok: key resolution has its own tests; pin its grants here - MCPRequestHandler, "_get_allowed_mcp_servers_for_key", AsyncMock(return_value=["server-a", "server-b"]) + MCPRequestHandler, + "_get_allowed_mcp_servers_for_key", + AsyncMock(return_value=["server-a", "server-b"]), ) ) stack.enter_context( @@ -4479,7 +4369,9 @@ class TestAgentMCPPermissions: await MCPRequestHandler._get_allowed_mcp_servers_for_agent(user_api_key_auth) stack.enter_context( patch.object( # test-quality-ok: key resolution has its own tests; pin its grants here - MCPRequestHandler, "_get_allowed_mcp_servers_for_key", AsyncMock(return_value=["server-a", "server-b"]) + MCPRequestHandler, + "_get_allowed_mcp_servers_for_key", + AsyncMock(return_value=["server-a", "server-b"]), ) ) stack.enter_context( @@ -4503,9 +4395,15 @@ class TestAgentMCPPermissions: with contextlib.ExitStack() as stack: for patcher in self._agent_toolset_patches(agent_object_permission, mock_manager): stack.enter_context(patcher) - server_a_tools = await MCPRequestHandler._get_agent_tool_permissions_for_server("server-a", user_api_key_auth) - server_b_tools = await MCPRequestHandler._get_agent_tool_permissions_for_server("server-b", user_api_key_auth) - server_c_tools = await MCPRequestHandler._get_agent_tool_permissions_for_server("server-c", user_api_key_auth) + server_a_tools = await MCPRequestHandler._get_agent_tool_permissions_for_server( + "server-a", user_api_key_auth + ) + server_b_tools = await MCPRequestHandler._get_agent_tool_permissions_for_server( + "server-b", user_api_key_auth + ) + server_c_tools = await MCPRequestHandler._get_agent_tool_permissions_for_server( + "server-c", user_api_key_auth + ) assert sorted(server_a_tools) == ["tool_direct", "tool_via_toolset"] assert server_b_tools == ["tool_b"] diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py index 7eb4396e60d..38cfbd20df4 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py @@ -6157,15 +6157,8 @@ def _patch_delegate_resolver(server: MCPServer, *resolvable_names: str): @pytest.mark.asyncio -async def test_delegate_bad_token_gets_connect_time_401(): - """Regression (LIT-4194): a rejected upstream token on a delegate-auth server - must fail the connect with 401 + ``error="invalid_token"``, not be absorbed - into HTTP 200 + an empty tool list by the tools/list handler. - - Delegate-mode clients send only ``Authorization`` (no ``x-litellm-api-key``), - so ``_get_forwarded_auth_from_scope`` returns None and, before the fix, the - preflight returned early without probing. - """ +async def test_legacy_delegate_bare_token_is_not_probed_upstream(): # test-quality-ok: this removed security-sensitive egress has no return value; non-invocation is the contract + """A bare bearer is an admission credential and must never reach upstream.""" from litellm.proxy._experimental.mcp_server.server import ( _check_passthrough_upstream_auth, ) @@ -6184,48 +6177,6 @@ async def test_delegate_bad_token_gets_connect_time_401(): "litellm.proxy._experimental.mcp_server.server._probe_upstream_auth", new=AsyncMock(return_value=(401, 'Bearer realm="upstream", error="invalid_token"')), ) as probe, - ): - with pytest.raises(HTTPException) as exc_info: - await _check_passthrough_upstream_auth( - scope=scope, - user_api_key_auth=UserAPIKeyAuth(), - mcp_servers=["delegate_test"], - client_ip=None, - ) - - assert exc_info.value.status_code == 401 - challenge = exc_info.value.headers["www-authenticate"] - assert 'error="invalid_token"' in challenge - assert ( - 'resource_metadata="http://localhost:4000/.well-known/oauth-protected-resource/mcp/delegate_test"' in challenge - ) - probe.assert_awaited_once() - probe_url, probe_auth = probe.call_args.args - assert probe_url == "http://upstream:9401/mcp" - assert probe_auth == "Bearer bogus-token" - - -@pytest.mark.asyncio -async def test_delegate_valid_token_passes_preflight(): - """An upstream-accepted token must not be blocked by the delegate preflight.""" - from litellm.proxy._experimental.mcp_server.server import ( - _check_passthrough_upstream_auth, - ) - from litellm.proxy._types import UserAPIKeyAuth - - server = _delegate_auth_mcp_server() - scope = _delegate_scope([(b"authorization", b"Bearer good-token")]) - - with ( - _patch_delegate_resolver(server, "delegate_test"), - patch( - "litellm.proxy._experimental.mcp_server.server._get_allowed_mcp_servers", - new=AsyncMock(return_value=[server]), - ), - patch( - "litellm.proxy._experimental.mcp_server.server._probe_upstream_auth", - new=AsyncMock(return_value=(200, None)), - ) as probe, ): await _check_passthrough_upstream_auth( scope=scope, @@ -6234,43 +6185,103 @@ async def test_delegate_valid_token_passes_preflight(): client_ip=None, ) - probe.assert_awaited_once() + probe.assert_not_awaited() @pytest.mark.asyncio -async def test_delegate_valid_token_forbidden_returns_403(): - """An upstream that accepts the token but forbids the caller (403) must surface - as a bare 403 with no ``WWW-Authenticate`` re-auth hint (a fresh token with the - same scopes would loop), not as an invalid_token challenge.""" +async def test_legacy_delegate_dual_credentials_are_not_probed_upstream(): # test-quality-ok: this removed security-sensitive egress has no return value; non-invocation is the contract + """A separate upstream bearer never triggers the removed legacy probe.""" from litellm.proxy._experimental.mcp_server.server import ( _check_passthrough_upstream_auth, ) from litellm.proxy._types import UserAPIKeyAuth server = _delegate_auth_mcp_server() - scope = _delegate_scope([(b"authorization", b"Bearer scoped-out-token")]) + scope = _delegate_scope( + [ + (b"x-litellm-api-key", b"sk-litellm-proxy-key"), + (b"authorization", b"Bearer upstream-token"), + ] + ) with ( - _patch_delegate_resolver(server, "delegate_test"), - patch( + patch( # test-quality-ok: isolate authorized-server resolution so this test targets the preflight boundary "litellm.proxy._experimental.mcp_server.server._get_allowed_mcp_servers", new=AsyncMock(return_value=[server]), ), - patch( + patch( # test-quality-ok: the removed probe call is the security regression under test "litellm.proxy._experimental.mcp_server.server._probe_upstream_auth", - new=AsyncMock(return_value=(403, None)), - ), + new=AsyncMock(), + ) as probe, ): - with pytest.raises(HTTPException) as exc_info: - await _check_passthrough_upstream_auth( + await _check_passthrough_upstream_auth( + scope=scope, + user_api_key_auth=UserAPIKeyAuth(user_id="admitted-user"), + mcp_servers=["delegate_test"], + client_ip=None, + ) + + probe.assert_not_awaited() + + +@pytest.mark.parametrize( + "probe_status, expected_status", + [(200, None), (401, 401), (403, 403)], +) +@pytest.mark.asyncio +async def test_oauth_passthrough_preflight_preserves_status_contract(probe_status, expected_status): + from litellm.proxy._experimental.mcp_server.server import ( + _check_passthrough_upstream_auth, + ) + from litellm.proxy._types import UserAPIKeyAuth + + server = MCPServer( + server_id="passthrough-id", + name="passthrough_server", + url="https://upstream.example.com/mcp", + transport=MCPTransport.http, + auth_type=MCPAuth.none, + oauth_passthrough=True, + extra_headers=["Authorization"], + ) + scope = _delegate_scope( + [ + (b"x-litellm-api-key", b"sk-litellm-proxy-key"), + (b"authorization", b"Bearer upstream-token"), + ] + ) + + with ( + patch( # test-quality-ok: isolate authorized-server resolution so this test exercises the preflight contract + "litellm.proxy._experimental.mcp_server.server._get_allowed_mcp_servers", + new=AsyncMock(return_value=[server]), + ), + patch( # test-quality-ok: the upstream transport boundary is the behavior being mapped to an HTTP response + "litellm.proxy._experimental.mcp_server.server._probe_upstream_auth", + new=AsyncMock(return_value=(probe_status, None)), + ) as probe, + ): + if expected_status is None: + result = await _check_passthrough_upstream_auth( scope=scope, - user_api_key_auth=UserAPIKeyAuth(), - mcp_servers=["delegate_test"], + user_api_key_auth=UserAPIKeyAuth(user_id="admitted-user"), + mcp_servers=["passthrough_server"], client_ip=None, ) + assert result is None + else: + with pytest.raises(HTTPException) as exc_info: + await _check_passthrough_upstream_auth( + scope=scope, + user_api_key_auth=UserAPIKeyAuth(user_id="admitted-user"), + mcp_servers=["passthrough_server"], + client_ip=None, + ) + assert exc_info.value.status_code == expected_status + if expected_status == 401: + assert "passthrough_server" in exc_info.value.headers["www-authenticate"] - assert exc_info.value.status_code == 403 - assert not (exc_info.value.headers or {}) + probe.assert_awaited_once_with("https://upstream.example.com/mcp", "Bearer upstream-token") @pytest.mark.asyncio @@ -6428,123 +6439,6 @@ async def test_delegate_not_probed_when_named_only_via_server_id(): probe.assert_not_awaited() -@pytest.mark.asyncio -async def test_delegate_preflight_with_unpatched_probe(): - """Integration across the preflight and the unpatched ``_probe_upstream_auth``, - mocked only at the httpx-client boundary (tests/test_litellm is mocked-only; the - real-network proof lives in the PR's live-proxy evidence). The mock honors the - ``AsyncHTTPHandler.post`` contract by raising ``httpx.HTTPStatusError`` on the - upstream 401, so the production ``except httpx.HTTPStatusError`` branch is the one - exercised. A rejected token surfaces as the connect-time 401 challenge; an - accepted token passes untouched, and the caller's bearer reaches the delegate URL.""" - import httpx - - from litellm.proxy._experimental.mcp_server.server import ( - _check_passthrough_upstream_auth, - ) - from litellm.proxy._types import UserAPIKeyAuth - - accepted = MagicMock() - accepted.status_code = 200 - accepted.headers = {} - rejected = MagicMock() - rejected.status_code = 401 - rejected.headers = {"www-authenticate": 'Bearer realm="stub-upstream", error="invalid_token"'} - - async def respond_by_token(url=None, headers=None, json=None, timeout=None, **kwargs): - if headers.get("Authorization") == "Bearer good-token": - return accepted - raise httpx.HTTPStatusError( - "401 Unauthorized", - request=httpx.Request("POST", url), - response=rejected, - ) - - mock_client = MagicMock() - mock_client.post = AsyncMock(side_effect=respond_by_token) - - server = _delegate_auth_mcp_server() - - with ( - _patch_delegate_resolver(server, "delegate_test"), - patch( - "litellm.proxy._experimental.mcp_server.server._get_allowed_mcp_servers", - new=AsyncMock(return_value=[server]), - ), - patch( - "litellm.proxy._experimental.mcp_server.server.get_async_httpx_client", - return_value=mock_client, - ), - ): - with pytest.raises(HTTPException) as exc_info: - await _check_passthrough_upstream_auth( - scope=_delegate_scope([(b"authorization", b"Bearer bogus-token")]), - user_api_key_auth=UserAPIKeyAuth(), - mcp_servers=["delegate_test"], - client_ip=None, - ) - - await _check_passthrough_upstream_auth( - scope=_delegate_scope([(b"authorization", b"Bearer good-token")]), - user_api_key_auth=UserAPIKeyAuth(), - mcp_servers=["delegate_test"], - client_ip=None, - ) - - assert exc_info.value.status_code == 401 - challenge = exc_info.value.headers["www-authenticate"] - assert 'error="invalid_token"' in challenge - assert ( - 'resource_metadata="http://localhost:4000/.well-known/oauth-protected-resource/mcp/delegate_test"' in challenge - ) - probed_urls = [call.kwargs["url"] for call in mock_client.post.await_args_list] - assert probed_urls == ["http://upstream:9401/mcp", "http://upstream:9401/mcp"] - - -@pytest.mark.asyncio -async def test_delegate_challenge_echoes_requested_alias(): - """An alias-routed delegate request must be probed, and the challenge must echo - the requested alias (not the canonical server name) so the resource_metadata - URL matches what the tokenless preemptive challenge emits for the same route.""" - from litellm.proxy._experimental.mcp_server.server import ( - _check_passthrough_upstream_auth, - ) - from litellm.proxy._types import UserAPIKeyAuth - - server = _delegate_auth_mcp_server().model_copy(update={"alias": "dt-alias"}) - scope = { - "type": "http", - "method": "POST", - "path": "/mcp/dt-alias", - "scheme": "http", - "server": ("localhost", 4000), - "headers": [(b"authorization", b"Bearer bogus-token")], - } - - with ( - _patch_delegate_resolver(server, "dt-alias"), - patch( - "litellm.proxy._experimental.mcp_server.server._get_allowed_mcp_servers", - new=AsyncMock(return_value=[server]), - ), - patch( - "litellm.proxy._experimental.mcp_server.server._probe_upstream_auth", - new=AsyncMock(return_value=(401, 'Bearer error="invalid_token"')), - ), - ): - with pytest.raises(HTTPException) as exc_info: - await _check_passthrough_upstream_auth( - scope=scope, - user_api_key_auth=UserAPIKeyAuth(), - mcp_servers=["dt-alias"], - client_ip=None, - ) - - challenge = exc_info.value.headers["www-authenticate"] - assert 'error="invalid_token"' in challenge - assert 'resource_metadata="http://localhost:4000/.well-known/oauth-protected-resource/mcp/dt-alias"' in challenge - - @pytest.mark.asyncio async def test_delegate_probe_not_fanned_out_to_access_group_members(): """A single access-group name passes the one-target route gate but must not fan @@ -6578,41 +6472,6 @@ async def test_delegate_probe_not_fanned_out_to_access_group_members(): probe.assert_not_awaited() -def test_is_delegate_upstream_probe_target_fails_closed_on_m2m_shape(): - """An unstamped M2M-shape row (null ``oauth2_flow`` + client credentials) - resolves to ``client_credentials`` and must not be probed with the caller's - bearer; its stored client credentials drive egress instead.""" - from litellm.proxy._experimental.mcp_server.server import ( - _is_delegate_upstream_probe_target, - ) - - assert _is_delegate_upstream_probe_target(_delegate_auth_mcp_server()) is True - - m2m_shape = MCPServer( - server_id="delegate-m2m", - name="delegate_m2m", - url="http://upstream:9401/mcp", - transport=MCPTransport.http, - auth_type=MCPAuth.oauth2, - delegate_auth_to_upstream=True, - oauth2_flow=None, - token_url="http://idp:9000/token", - client_id="client", - client_secret="secret", - ) - assert _is_delegate_upstream_probe_target(m2m_shape) is False - - non_delegate = MCPServer( - server_id="oauth2-plain", - name="oauth2_plain", - url="http://upstream:9401/mcp", - transport=MCPTransport.http, - auth_type=MCPAuth.oauth2, - oauth2_flow="authorization_code", - ) - assert _is_delegate_upstream_probe_target(non_delegate) is False - - @pytest.mark.asyncio async def test_create_mcp_client_sampling_disabled_by_default(): """Sampling callback must be None when allow_sampling is not set (default False).""" diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py index d2987c5112e..b4f1aeeef10 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py @@ -4469,7 +4469,9 @@ class TestMCPServerManager: @pytest.mark.parametrize("auth_type", [MCPAuth.none, MCPAuth.bearer_token, MCPAuth.api_key, MCPAuth.oauth2]) @pytest.mark.parametrize("is_byok", [False, True]) @pytest.mark.parametrize("scheme", ["http", "https"]) - async def test_openapi_health_loads_spec_without_mcp_handshake(self, respx_mock, monkeypatch, auth_type, is_byok, scheme): + async def test_openapi_health_loads_spec_without_mcp_handshake( + self, respx_mock, monkeypatch, auth_type, is_byok, scheme + ): monkeypatch.setenv("DISABLE_AIOHTTP_TRANSPORT", "True") manager = MCPServerManager() server = MCPServer( @@ -4519,14 +4521,28 @@ class TestMCPServerManager: @pytest.mark.parametrize( ("failure", "expected_status", "expected_error"), [ - (httpx.Response(401, text="secret response content"), "unhealthy", "OpenAPI specification request failed (HTTP 401)"), + ( + httpx.Response(401, text="secret response content"), + "unhealthy", + "OpenAPI specification request failed (HTTP 401)", + ), (httpx.Response(404), "unhealthy", "OpenAPI specification request failed (HTTP 404)"), (httpx.Response(500), "unhealthy", "OpenAPI specification request failed (HTTP 500)"), - (httpx.ConnectError("secret network details"), "unhealthy", "OpenAPI specification could not be loaded (ConnectError)"), - (httpx.Response(200, text="secret invalid JSON body"), "unhealthy", "OpenAPI specification could not be loaded (JSONDecodeError)"), + ( + httpx.ConnectError("secret network details"), + "unhealthy", + "OpenAPI specification could not be loaded (ConnectError)", + ), + ( + httpx.Response(200, text="secret invalid JSON body"), + "unhealthy", + "OpenAPI specification could not be loaded (JSONDecodeError)", + ), ], ) - async def test_openapi_health_reports_safe_failures(self, respx_mock, monkeypatch, failure, expected_status, expected_error): + async def test_openapi_health_reports_safe_failures( + self, respx_mock, monkeypatch, failure, expected_status, expected_error + ): monkeypatch.setenv("DISABLE_AIOHTTP_TRANSPORT", "True") manager = MCPServerManager() server = MCPServer( @@ -6916,51 +6932,6 @@ class TestMCPServerManager: == expected_server_ids ) - @pytest.mark.asyncio - async def test_get_allowed_mcp_servers_anonymous_delegate_requires_oauth2(self): - """Anonymous delegated auth listing should only include oauth2 servers.""" - from litellm.proxy._experimental.mcp_server.auth.user_api_key_auth_mcp import ( - MCPRequestHandler, - ) - - manager = MCPServerManager() - oauth_delegate_server = MCPServer( - server_id="oauth-delegate", - name="oauth_delegate", - transport=MCPTransport.http, - auth_type=MCPAuth.oauth2, - delegate_auth_to_upstream=True, - ) - api_key_delegate_server = MCPServer( - server_id="api-key-delegate", - name="api_key_delegate", - transport=MCPTransport.http, - auth_type=MCPAuth.api_key, - delegate_auth_to_upstream=True, - ) - oauth_non_delegate_server = MCPServer( - server_id="oauth-non-delegate", - name="oauth_non_delegate", - transport=MCPTransport.http, - auth_type=MCPAuth.oauth2, - delegate_auth_to_upstream=False, - ) - manager.registry = { - oauth_delegate_server.server_id: oauth_delegate_server, - api_key_delegate_server.server_id: api_key_delegate_server, - oauth_non_delegate_server.server_id: oauth_non_delegate_server, - } - - with patch.object( - MCPRequestHandler, - "get_allowed_mcp_servers", - new_callable=AsyncMock, - return_value=[], - ): - result = await manager.get_allowed_mcp_servers(None) - - assert set(result) == {"oauth-delegate"} - def test_get_mcp_server_from_tool_name_uses_server_name_not_name(self): """ Test that _get_mcp_server_from_tool_name uses server.server_name instead of server.name @@ -8088,9 +8059,9 @@ class TestMCPServerTokenExchangeColumns: assert rebuilt_table.token_exchange_profile == "entra_obo" -class TestInternalDelegatePkceWarningLog: +class TestLegacyDelegateAuthWarningLog: @pytest.mark.asyncio - async def test_build_mcp_server_logs_on_internal_delegate_interactive(self, caplog): + async def test_build_mcp_server_logs_deprecation_for_internal_delegate(self, caplog): caplog.set_level(logging.WARNING, logger="LiteLLM") manager = MCPServerManager() table_record = LiteLLM_MCPServerTable( @@ -8106,11 +8077,11 @@ class TestInternalDelegatePkceWarningLog: ) await manager.build_mcp_server_from_table(table_record) combined = " ".join(r.getMessage() for r in caplog.records) - assert "internal-only" in combined + assert "deprecated auth_type=oauth2" in combined assert "delegate_auth_to_upstream=true" in combined @pytest.mark.asyncio - async def test_build_mcp_server_no_internal_delegate_log_when_public(self, caplog): + async def test_build_mcp_server_logs_deprecation_for_public_delegate(self, caplog): caplog.set_level(logging.WARNING, logger="LiteLLM") manager = MCPServerManager() table_record = LiteLLM_MCPServerTable( @@ -8126,12 +8097,13 @@ class TestInternalDelegatePkceWarningLog: ) await manager.build_mcp_server_from_table(table_record) combined = " ".join(r.getMessage() for r in caplog.records) - assert "internal-only" not in combined + assert "deprecated auth_type=oauth2" in combined + assert "auth_type=oauth_delegate" in combined def test_warn_skipped_for_client_credentials(self, caplog): caplog.set_level(logging.WARNING, logger="LiteLLM") from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( - _warn_internal_delegate_pkce_if_applicable, + _warn_legacy_delegate_auth_if_applicable, ) server = MCPServer( @@ -8144,9 +8116,9 @@ class TestInternalDelegatePkceWarningLog: available_on_public_internet=False, delegate_auth_to_upstream=True, ) - _warn_internal_delegate_pkce_if_applicable(server, source="test") + _warn_legacy_delegate_auth_if_applicable(server, source="test") combined = " ".join(r.getMessage() for r in caplog.records) - assert "internal-only" not in combined + assert "deprecated auth_type=oauth2" not in combined class TestHasClientCredentialsOAuth2Flow: @@ -12697,7 +12669,12 @@ async def test_debug_resolution_matches_final_header_conflict_winner( from litellm.proxy._experimental.mcp_server.auth.litellm_auth_handler import MCPAuthenticatedUser from litellm.proxy._experimental.mcp_server.mcp_debug import MCP_AUTH_DIAGNOSTICS_SCOPE_KEY, MCPAuthDiagnostics from litellm.proxy._experimental.mcp_server.outbound_credentials import ( - ApiKeyConfig, AuthorizationCodeConfig, NoneConfig, ServerSpec, SharedKey, UpstreamCredentialProvider, + ApiKeyConfig, + AuthorizationCodeConfig, + NoneConfig, + ServerSpec, + SharedKey, + UpstreamCredentialProvider, ) from litellm.proxy._experimental.mcp_server.outbound_credentials.oauth_token_store import OAuthToken from litellm.types.mcp_server.mcp_server_manager import MCPServer @@ -12713,10 +12690,15 @@ async def test_debug_resolution_matches_final_header_conflict_winner( store = Store() context = MCPAuthenticatedUser(UserAPIKeyAuth(user_id="alice")) diagnostics = MCPAuthDiagnostics() - token = request_ctx.set(RequestContext( - request_id=1, meta=None, session=MagicMock(), lifespan_context=None, - request=Request({"type": "http", MCP_AUTH_DIAGNOSTICS_SCOPE_KEY: diagnostics}), - )) + token = request_ctx.set( + RequestContext( + request_id=1, + meta=None, + session=MagicMock(), + lifespan_context=None, + request=Request({"type": "http", MCP_AUTH_DIAGNOSTICS_SCOPE_KEY: diagnostics}), + ) + ) selected = { "stored": AuthorizationCodeConfig(), "static": ApiKeyConfig(key_source=SharedKey(value=SecretStr("static-token"))), @@ -12725,7 +12707,10 @@ async def test_debug_resolution_matches_final_header_conflict_winner( try: auth, remaining = await MCPServerManager()._resolve_v2_auth( server=MCPServer( - server_id="s", name="s", transport="http", url="https://up.example/mcp", + server_id="s", + name="s", + transport="http", + url="https://up.example/mcp", static_headers={"Authorization": "Bearer configured"}, ), spec=ServerSpec(server_id="s", resource="https://up.example/mcp", config=selected), @@ -12755,17 +12740,28 @@ async def test_debug_reports_legacy_signing_and_non_http_transport(transport: Li from litellm.types.mcp_server.mcp_server_manager import MCPServer diagnostics = MCPAuthDiagnostics() - token = request_ctx.set(RequestContext( - request_id=1, meta=None, session=MagicMock(), lifespan_context=None, - request=Request({"type": "http", MCP_AUTH_DIAGNOSTICS_SCOPE_KEY: diagnostics}), - )) + token = request_ctx.set( + RequestContext( + request_id=1, + meta=None, + session=MagicMock(), + lifespan_context=None, + request=Request({"type": "http", MCP_AUTH_DIAGNOSTICS_SCOPE_KEY: diagnostics}), + ) + ) try: server = MCPServer( - server_id="signed", name="signed", transport=transport, - url="https://up.example/mcp", auth_type="aws_sigv4", - aws_access_key_id="AKIDEXAMPLE", aws_secret_access_key="test-signing-secret", - aws_region_name="us-east-1", aws_service_name="execute-api", - command="python", args=["-c", "pass"], + server_id="signed", + name="signed", + transport=transport, + url="https://up.example/mcp", + auth_type="aws_sigv4", + aws_access_key_id="AKIDEXAMPLE", + aws_secret_access_key="test-signing-secret", + aws_region_name="us-east-1", + aws_service_name="execute-api", + command="python", + args=["-c", "pass"], ) client = await MCPServerManager()._create_mcp_client(server) if transport == "stdio": @@ -12784,12 +12780,16 @@ async def test_debug_reports_legacy_signing_and_non_http_transport(transport: Li async def test_temporary_server_discovery_reuses_resolved_metadata_without_publishing() -> None: manager: Final = MCPServerManager() server: Final = MCPServer( - server_id="temporary-oauth-discovery", name="temporary", url="https://idp.example.com/mcp", - transport=MCPTransport.http, auth_type=MCPAuth.true_passthrough, + server_id="temporary-oauth-discovery", + name="temporary", + url="https://idp.example.com/mcp", + transport=MCPTransport.http, + auth_type=MCPAuth.true_passthrough, ) manager._set_oauth_discovery_deferred(server.server_id, True) metadata: Final = MCPOAuthMetadata( - authorization_url="https://idp.example.com/authorize", token_url="https://idp.example.com/token", + authorization_url="https://idp.example.com/authorize", + token_url="https://idp.example.com/token", registration_url="https://idp.example.com/register", ) with patch.object(manager, "_discover_oauth_metadata_for_server", AsyncMock(return_value=metadata)) as discovery: @@ -12809,13 +12809,18 @@ async def test_temporary_server_discovery_reuses_resolved_metadata_without_publi async def test_repeated_stale_oauth_discovery_is_bounded(auth_type: MCPAuth) -> None: manager: Final = MCPServerManager() server: Final = MCPServer( - server_id="repeated-stale", name="stale", url="https://idp.example.com/mcp", - transport=MCPTransport.http, auth_type=auth_type, oauth2_flow="authorization_code", + server_id="repeated-stale", + name="stale", + url="https://idp.example.com/mcp", + transport=MCPTransport.http, + auth_type=auth_type, + oauth2_flow="authorization_code", ) manager.registry[server.server_id] = server manager._set_oauth_discovery_deferred(server.server_id, True) metadata: Final = MCPOAuthMetadata( - authorization_url="https://idp.example.com/authorize", token_url="https://idp.example.com/token", + authorization_url="https://idp.example.com/authorize", + token_url="https://idp.example.com/token", ) with ( patch.object(manager, "_discover_oauth_metadata_for_server", AsyncMock(return_value=metadata)) as discovery, @@ -12835,13 +12840,20 @@ async def test_repeated_stale_oauth_discovery_is_bounded(auth_type: MCPAuth) -> async def test_stale_discovery_falls_back_to_resolved_registered_server() -> None: manager: Final = MCPServerManager() original: Final = MCPServer( - server_id="resolved-replacement", name="replacement", url="https://old.example.com/mcp", - transport=MCPTransport.http, auth_type=MCPAuth.oauth2, oauth2_flow="authorization_code", + server_id="resolved-replacement", + name="replacement", + url="https://old.example.com/mcp", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + oauth2_flow="authorization_code", + ) + replacement: Final = original.model_copy( + update={ + "url": "https://new.example.com/mcp", + "authorization_url": "https://new.example.com/authorize", + "token_url": "https://new.example.com/token", + } ) - replacement: Final = original.model_copy(update={ - "url": "https://new.example.com/mcp", "authorization_url": "https://new.example.com/authorize", - "token_url": "https://new.example.com/token", - }) manager.registry[original.server_id] = replacement assert await manager._rejoin_oauth_metadata_discovery(original, retry_stale=False) is replacement @@ -12849,8 +12861,11 @@ async def test_stale_discovery_falls_back_to_resolved_registered_server() -> Non def test_stale_discovery_cannot_overwrite_new_registered_server() -> None: manager: Final = MCPServerManager() original: Final = MCPServer( - server_id="stale-publication", name="publication", url="https://old.example.com/mcp", - transport=MCPTransport.http, auth_type=MCPAuth.oauth2, + server_id="stale-publication", + name="publication", + url="https://old.example.com/mcp", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, ) manager._set_oauth_discovery_deferred(original.server_id, True) original_slot: Final = manager._oauth_discovery_slot(original.server_id) @@ -12866,9 +12881,13 @@ def test_stale_discovery_cannot_overwrite_new_registered_server() -> None: async def test_temporary_oauth_discovery_expires_without_more_requests() -> None: manager: Final = MCPServerManager() server: Final = MCPServer( - server_id="expiring-session", name="temporary", url="https://idp.example.com/mcp", - transport=MCPTransport.http, auth_type=MCPAuth.true_passthrough, - authorization_url="https://idp.example.com/authorize", token_url="https://idp.example.com/token", + server_id="expiring-session", + name="temporary", + url="https://idp.example.com/mcp", + transport=MCPTransport.http, + auth_type=MCPAuth.true_passthrough, + authorization_url="https://idp.example.com/authorize", + token_url="https://idp.example.com/token", ) manager._set_oauth_discovery_deferred(server.server_id, True) resolved: Final = await manager.ensure_oauth_metadata_discovered(server) @@ -12969,7 +12988,9 @@ async def test_openapi_health_reports_size_limit_as_unknown_and_caches_failure(r result = await manager.health_check_server(server.server_id) cached = await manager.health_check_server(server.server_id) assert result.status == "unknown" - assert result.health_check_error == "OpenAPI specification probe refused: Response exceeds the configured size limit" + assert ( + result.health_check_error == "OpenAPI specification probe refused: Response exceeds the configured size limit" + ) assert cached.health_check_error == result.health_check_error assert cached.last_health_check == result.last_health_check assert route.call_count == 1 @@ -12981,8 +13002,11 @@ async def test_openapi_health_cancellation_does_not_poison_cache(respx_mock, mon monkeypatch.setenv("DISABLE_AIOHTTP_TRANSPORT", "True") manager = MCPServerManager() server = MCPServer( - server_id="cancelled-cache", name="cancelled-cache", transport=MCPTransport.http, - spec_path="https://93.184.216.34/cancelled-cache.json", auth_type=MCPAuth.none, + server_id="cancelled-cache", + name="cancelled-cache", + transport=MCPTransport.http, + spec_path="https://93.184.216.34/cancelled-cache.json", + auth_type=MCPAuth.none, ) manager.registry = {server.server_id: server} started = asyncio.Event() @@ -13040,11 +13064,18 @@ class _DiscoveryUpstream: return httpx.Response(202) self.requests = (*self.requests, (payload.method, request.headers.get("authorization", ""))) if payload.method == "initialize": - return httpx.Response(200, json={ - "jsonrpc": "2.0", "id": payload.id, - "result": {"protocolVersion": "2025-03-26", "serverInfo": {"name": "discovery", "version": "1"}, - "capabilities": {} if self.outcome == "unsupported" else {"prompts": {}, "resources": {}}}, - }) + return httpx.Response( + 200, + json={ + "jsonrpc": "2.0", + "id": payload.id, + "result": { + "protocolVersion": "2025-03-26", + "serverInfo": {"name": "discovery", "version": "1"}, + "capabilities": {} if self.outcome == "unsupported" else {"prompts": {}, "resources": {}}, + }, + }, + ) self.entered.set() await self.release.wait() if self.outcome == "failure": @@ -13052,12 +13083,15 @@ class _DiscoveryUpstream: if self.outcome == "cancelled": raise asyncio.CancelledError() if self.outcome == "rejected": - return httpx.Response(200, json={"jsonrpc": "2.0", "id": payload.id, - "error": {"code": -32601, "message": "Unsupported"}}) + return httpx.Response( + 200, json={"jsonrpc": "2.0", "id": payload.id, "error": {"code": -32601, "message": "Unsupported"}} + ) result: Final = { "prompts/list": {"prompts": [{"name": "example", "description": "original"}]}, "resources/list": {"resources": [{"name": "example", "uri": "test://example", "description": "original"}]}, - "resources/templates/list": {"resourceTemplates": [{"name": "example", "uriTemplate": "test://{name}", "description": "original"}]}, + "resources/templates/list": { + "resourceTemplates": [{"name": "example", "uriTemplate": "test://{name}", "description": "original"}] + }, "tools/list": {"tools": []}, }[payload.method] return httpx.Response(200, json={"jsonrpc": "2.0", "id": payload.id, "result": result}) @@ -13068,7 +13102,9 @@ class _DiscoveryUpstream: def _discovery_server() -> MCPServer: - return MCPServer(server_id="discovery", name="discovery", url="https://discovery.example/mcp", transport=MCPTransport.http) + return MCPServer( + server_id="discovery", name="discovery", url="https://discovery.example/mcp", transport=MCPTransport.http + ) @pytest.mark.asyncio @@ -13079,8 +13115,11 @@ async def test_discovery_cache_reuses_raw_results_and_expires(kind: str) -> None clock: Final = _DiscoveryClock() manager: Final = MCPServerManager(discovery_clock=clock) upstream: Final = _DiscoveryUpstream() - operation: Final = {"prompts": manager.get_prompts_from_server, "resources": manager.get_resources_from_server, - "templates": manager.get_resource_templates_from_server}[kind] + operation: Final = { + "prompts": manager.get_prompts_from_server, + "resources": manager.get_resources_from_server, + "templates": manager.get_resource_templates_from_server, + }[kind] server: Final = _discovery_server() with respx.mock(base_url="https://discovery.example") as router: router.route().mock(side_effect=upstream.respond) @@ -13109,8 +13148,11 @@ async def test_discovery_cache_empty_results_and_failures(kind: str, outcome: st manager: Final = MCPServerManager() upstream: Final = _DiscoveryUpstream() upstream.outcome = outcome - operation: Final = {"prompts": manager.get_prompts_from_server, "resources": manager.get_resources_from_server, - "templates": manager.get_resource_templates_from_server}[kind] + operation: Final = { + "prompts": manager.get_prompts_from_server, + "resources": manager.get_resources_from_server, + "templates": manager.get_resource_templates_from_server, + }[kind] with respx.mock(base_url="https://discovery.example") as router: router.route().mock(side_effect=upstream.respond) assert await operation(_discovery_server(), None) == [] @@ -13137,9 +13179,20 @@ async def test_discovery_cache_isolates_forwarded_credentials_and_shares_static_ assert len(await manager.get_prompts_from_server(server, user)) == 1 assert upstream.initializes == 1 for credential in ("first-secret", "second-secret", "first-secret"): - assert len(await manager.get_prompts_from_server(server, first_user, extra_headers={"Authorization": credential})) == 1 + assert ( + len( + await manager.get_prompts_from_server( + server, first_user, extra_headers={"Authorization": credential} + ) + ) + == 1 + ) assert upstream.initializes == 3 - assert {auth for method, auth in upstream.requests if method == "prompts/list"} == {"", "first-secret", "second-secret"} + assert {auth for method, auth in upstream.requests if method == "prompts/list"} == { + "", + "first-secret", + "second-secret", + } @pytest.mark.asyncio @@ -13151,7 +13204,9 @@ async def test_discovery_cache_coalesces_and_survives_waiter_cancellation() -> N upstream.release.clear() with respx.mock(base_url="https://discovery.example") as router: router.route().mock(side_effect=upstream.respond) - tasks: Final = tuple(asyncio.create_task(manager.get_prompts_from_server(_discovery_server(), None)) for _ in range(10)) + tasks: Final = tuple( + asyncio.create_task(manager.get_prompts_from_server(_discovery_server(), None)) for _ in range(10) + ) await asyncio.wait_for(upstream.entered.wait(), timeout=5) tasks[0].cancel() with pytest.raises(asyncio.CancelledError): @@ -13200,7 +13255,9 @@ async def test_discovery_cache_can_be_disabled(monkeypatch: pytest.MonkeyPatch) assert upstream.initializes == 2 -@pytest.mark.parametrize("value,expected", (("invalid", 60.0), ("nan", 60.0), ("inf", 60.0), ("-1", 60.0), ("12.5", 12.5))) +@pytest.mark.parametrize( + "value,expected", (("invalid", 60.0), ("nan", 60.0), ("inf", 60.0), ("-1", 60.0), ("12.5", 12.5)) +) def test_discovery_cache_ttl_validation(value: str, expected: float, monkeypatch: pytest.MonkeyPatch) -> None: from litellm.proxy._experimental.mcp_server.mcp_server_manager import _mcp_discovery_cache_ttl @@ -13318,9 +13375,15 @@ async def test_discovery_cache_tracks_resolved_credentials_across_workers() -> N source: Final = CredentialSource() managers: Final = (MCPServerManager(cred_provider=source), MCPServerManager(cred_provider=source)) server: Final = MCPServer( - server_id="discovery", name="discovery", url="https://discovery.example/mcp", transport=MCPTransport.http, - auth_type=MCPAuth.oauth2, oauth2_flow="authorization_code", client_id="discovery-client", - authorization_url="https://discovery.example/authorize", token_url="https://discovery.example/token", + server_id="discovery", + name="discovery", + url="https://discovery.example/mcp", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + oauth2_flow="authorization_code", + client_id="discovery-client", + authorization_url="https://discovery.example/authorize", + token_url="https://discovery.example/token", ) user: Final = UserAPIKeyAuth(user_id="same-user", api_key="same-key") upstream: Final = _DiscoveryUpstream() @@ -13339,11 +13402,15 @@ async def test_discovery_cache_tracks_resolved_credentials_across_workers() -> N with respx.mock(base_url="https://discovery.example") as router: router.route().mock(side_effect=respond) for manager in managers: - assert [item.name for item in await manager.get_prompts_from_server(server, user)] == ["discovery-account-a"] + assert [item.name for item in await manager.get_prompts_from_server(server, user)] == [ + "discovery-account-a" + ] assert upstream.initializes == 2 source.token = "token-b" for manager in managers: - assert [item.name for item in await manager.get_prompts_from_server(server, user)] == ["discovery-account-b"] + assert [item.name for item in await manager.get_prompts_from_server(server, user)] == [ + "discovery-account-b" + ] assert upstream.initializes == 4 source.token = None for manager in managers: @@ -13370,9 +13437,15 @@ async def test_discovery_resolves_stored_oauth_for_the_requesting_user() -> None store: Final = TokenStore() manager: Final = MCPServerManager(per_user_oauth_token_store=store) server: Final = MCPServer( - server_id="discovery", name="discovery", url="https://discovery.example/mcp", transport=MCPTransport.http, - auth_type=MCPAuth.oauth2, oauth2_flow="authorization_code", client_id="discovery-client", - authorization_url="https://discovery.example/authorize", token_url="https://discovery.example/token", + server_id="discovery", + name="discovery", + url="https://discovery.example/mcp", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + oauth2_flow="authorization_code", + client_id="discovery-client", + authorization_url="https://discovery.example/authorize", + token_url="https://discovery.example/token", ) user: Final = UserAPIKeyAuth(user_id="requesting-user") upstream: Final = _DiscoveryUpstream() diff --git a/tests/test_litellm/proxy/hooks/test_proxy_track_cost_callback.py b/tests/test_litellm/proxy/hooks/test_proxy_track_cost_callback.py index fad137af66b..61e11e72859 100644 --- a/tests/test_litellm/proxy/hooks/test_proxy_track_cost_callback.py +++ b/tests/test_litellm/proxy/hooks/test_proxy_track_cost_callback.py @@ -19,6 +19,7 @@ from litellm.proxy.hooks.proxy_track_cost_callback import ( run_spend_event, ) from litellm.proxy.route_llm_request import ProxyModelNotFoundError +from litellm.proxy.utils import ProxyUpdateSpend from litellm.proxy.spend_tracking.spend_event import SpendEventDecodeError, build_spend_event, decode_spend_event from litellm.proxy.spend_tracking.spend_event_producer import SpendEventProducer, UnixAddress from litellm.proxy.spend_tracking.spend_tracking_utils import get_logging_payload @@ -1885,9 +1886,15 @@ async def test_track_cost_callback_keeps_guardrail_cost_on_cache_hit(): } with ( - patch("litellm.proxy.proxy_server.increment_spend_counters", new_callable=AsyncMock) as mock_increment, # test-quality-ok: the callback imports this from proxy_server inside its body, so there is no injection seam - patch("litellm.proxy.proxy_server.update_cache", new_callable=AsyncMock), # test-quality-ok: same function-body import, no injection seam - patch("litellm.proxy.proxy_server.proxy_logging_obj") as mock_proxy_logging, # test-quality-ok: same function-body import, no injection seam + patch( # test-quality-ok: the callback imports this from proxy_server inside its body, so there is no injection seam + "litellm.proxy.proxy_server.increment_spend_counters", new_callable=AsyncMock + ) as mock_increment, + patch( # test-quality-ok: same function-body import, no injection seam + "litellm.proxy.proxy_server.update_cache", new_callable=AsyncMock + ), + patch( # test-quality-ok: same function-body import, no injection seam + "litellm.proxy.proxy_server.proxy_logging_obj" + ) as mock_proxy_logging, ): mock_proxy_logging.db_spend_update_writer.update_database = AsyncMock() mock_proxy_logging.slack_alerting_instance.customer_spend_alert = AsyncMock() @@ -1912,14 +1919,15 @@ async def test_track_cost_callback_keeps_guardrail_cost_on_cache_hit(): ("allm_passthrough_route", True), ("aretrieve_batch", True), ("acompletion", False), - ("call_mcp_tool", False), + ("call_mcp_tool", True), (None, False), ], ) def test_should_track_cost_callback_pass_through_without_owner(call_type, expected): """Regression for LIT-3782: unauthenticated pass-through requests (auth=false) carry no key/user/team/end-user, yet must still be tracked so they land in - LiteLLM_SpendLogs. Other call types with no owner stay untracked. + LiteLLM_SpendLogs. Explicit MCP passthrough calls require the same handling. + Other call types with no owner stay untracked. aretrieve_batch is included for the same reason: CheckBatchCost's synthetic logging_obj for a completed managed batch only ever carries @@ -1939,10 +1947,26 @@ def test_should_track_cost_callback_pass_through_without_owner(call_type, expect ) +def test_should_track_cost_callback_respects_disabled_spend_updates(monkeypatch): + monkeypatch.setattr(ProxyUpdateSpend, "disable_spend_updates", staticmethod(lambda: True)) + + assert ( + _should_track_cost_callback( + user_api_key="key", + user_id="user", + team_id="team", + end_user_id="end-user", + call_type="call_mcp_tool", + ) + is False + ) + + @pytest.mark.parametrize( "call_type, expect_spend_log", [ ("pass_through_endpoint", True), + ("call_mcp_tool", True), ("aretrieve_batch", True), ("acompletion", False), (None, False), @@ -1953,8 +1977,8 @@ async def test_track_cost_callback_logs_unauthenticated_pass_through_request(cal """Regression for LIT-3782: a pass-through request with auth=false reaches the cost callback with no key/user/team/end-user. Before the fix the spend-log write was skipped and the request never appeared in request/usage logs. It - must now be written for pass-through call types while other unauthenticated - calls remain skipped. + must now be written for pass-through and MCP tool call types while other + unauthenticated calls remain skipped. aretrieve_batch is included because CheckBatchCost's completed-batch cost event reaches this same callback with no attributable key/user/team when From e2d888bb914915e4b84285065a132500dd94ad2d Mon Sep 17 00:00:00 2001 From: Joshua Valluru <326636767+joshua-berri@users.noreply.github.com> Date: Sat, 12 Sep 2026 16:48:20 -0700 Subject: [PATCH 05/22] docs: add MCP auth fix evidence --- .../lit6970_mcp_delegated_auth_after.png | Bin 0 -> 213376 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/screenshots/lit6970_mcp_delegated_auth_after.png diff --git a/.github/screenshots/lit6970_mcp_delegated_auth_after.png b/.github/screenshots/lit6970_mcp_delegated_auth_after.png new file mode 100644 index 0000000000000000000000000000000000000000..3638b7a9291958a301638b384f0f0bb1e0fa0a59 GIT binary patch literal 213376 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 z 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 literal 0 HcmV?d00001 From defead0eab693bf3c30b7cf7af880d804a3d5d10 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Sat, 12 Sep 2026 16:48:46 -0700 Subject: [PATCH 06/22] fix(logging): keep tracebacks for callback-raised timeouts and flush the summary on stop --- litellm/litellm_core_utils/logging_worker.py | 32 ++++-- .../litellm_core_utils/test_logging_worker.py | 99 +++++++++++++++++++ 2 files changed, 124 insertions(+), 7 deletions(-) diff --git a/litellm/litellm_core_utils/logging_worker.py b/litellm/litellm_core_utils/logging_worker.py index b57464b5407..8408942be63 100644 --- a/litellm/litellm_core_utils/logging_worker.py +++ b/litellm/litellm_core_utils/logging_worker.py @@ -147,6 +147,10 @@ class LoggingWorker: self._sem = None self._worker_task = None self._running_tasks.clear() + # The summary task is bound to the old loop; drop it and its pending burst so + # timeouts on the new loop arm a fresh summary instead of a stale, stuck one. + self._timeout_summary_task = None + self._timeout_burst_count = 0 self._queue = new_queue self._bound_loop = current_loop return @@ -167,14 +171,17 @@ class LoggingWorker: """Runs the logging task and handles cleanup. Releases semaphore when done.""" try: if self._queue is not None: + # Run the coroutine in its original context + callback_task: Final = task["context"].run(asyncio.create_task, task["coroutine"]) try: - # Run the coroutine in its original context - await asyncio.wait_for( - task["context"].run(asyncio.create_task, task["coroutine"]), - timeout=self.timeout, - ) - except asyncio.TimeoutError: - self._record_callback_timeout(task["coroutine"]) + await asyncio.wait_for(callback_task, timeout=self.timeout) + except asyncio.TimeoutError as e: + # wait_for cancels the callback when our own deadline expires; a callback that + # raised TimeoutError itself did not hit our deadline, so keep its traceback. + if callback_task.cancelled(): + self._record_callback_timeout(task["coroutine"]) + else: + verbose_logger.exception("LoggingWorker error: %s", e) except Exception as e: verbose_logger.exception("LoggingWorker error: %s", e) finally: @@ -197,6 +204,10 @@ class LoggingWorker: async def _flush_timeout_summary(self) -> None: """After the burst settles, log one bounded summary covering every timeout in it.""" await asyncio.sleep(self.timeout_summary_window) + self._emit_timeout_summary() + + def _emit_timeout_summary(self) -> None: + """Log one bounded summary for the current burst and reset the burst counter.""" burst_count: Final = self._timeout_burst_count self._timeout_burst_count = 0 if burst_count <= 0: @@ -444,6 +455,13 @@ class LoggingWorker: async def stop(self) -> None: """Stop the logging worker and clean up resources.""" + if self._timeout_summary_task is not None: + # Cancel the debounced sleeper and emit any pending burst now, so a summary + # armed just before shutdown is not lost when the loop tears down. + self._timeout_summary_task.cancel() + self._timeout_summary_task = None + self._emit_timeout_summary() + if self._worker_task is None and not self._running_tasks: # No worker launched and no in-flight tasks to drain. return diff --git a/tests/test_litellm/litellm_core_utils/test_logging_worker.py b/tests/test_litellm/litellm_core_utils/test_logging_worker.py index 24a5f247b30..1553e788472 100644 --- a/tests/test_litellm/litellm_core_utils/test_logging_worker.py +++ b/tests/test_litellm/litellm_core_utils/test_logging_worker.py @@ -597,3 +597,102 @@ class TestLoggingWorker: assert errors[0].exc_info is not None, "the traceback must be preserved" assert warnings == [], "a single real error is not a timeout summary" assert worker._timeout_summary_task is None + + @pytest.mark.asyncio + async def test_callback_raised_timeout_keeps_traceback(self): + """A callback that raises TimeoutError on its own did not hit the worker's deadline, + so it is a real failure and must keep its traceback rather than being folded into the + bounded burst summary. + """ + worker = LoggingWorker(timeout=5.0, max_queue_size=10, timeout_summary_window=1.0) + + async def raises_own_timeout() -> None: + raise asyncio.TimeoutError("callback's own downstream timeout") + + logger = logging.getLogger("LiteLLM") + collector = _RecordCollector() + previous_level = logger.level + logger.addHandler(collector) + logger.setLevel(logging.DEBUG) + try: + worker.start() + worker.enqueue(raises_own_timeout()) + + await worker.flush() + await worker.stop() + finally: + logger.removeHandler(collector) + logger.setLevel(previous_level) + + errors = [r for r in collector.records if r.levelno >= logging.ERROR] + warnings = [r for r in collector.records if r.levelno == logging.WARNING] + assert len(errors) == 1, "a callback-raised TimeoutError must still be logged once" + assert errors[0].exc_info is not None, "the traceback must be preserved" + assert warnings == [], "a callback-raised TimeoutError is not a worker-deadline timeout" + assert worker._timeout_summary_task is None + + @pytest.mark.asyncio + async def test_stop_flushes_pending_timeout_summary(self): + """A burst still inside its summary window when the worker stops must still emit its one + summary, instead of losing it when the event loop tears down. + """ + worker = LoggingWorker( + timeout=0.05, + max_queue_size=10, + concurrency=10, + timeout_summary_window=30.0, + ) + + async def slow_callback() -> None: + await asyncio.sleep(10) + + logger = logging.getLogger("LiteLLM") + collector = _RecordCollector() + previous_level = logger.level + logger.addHandler(collector) + logger.setLevel(logging.DEBUG) + try: + worker.start() + for _ in range(3): + worker.enqueue(slow_callback()) + + await worker.flush() + assert worker._timeout_summary_task is not None + assert not worker._timeout_summary_task.done(), "precondition: the summary window has not elapsed" + await worker.stop() + finally: + logger.removeHandler(collector) + logger.setLevel(previous_level) + + warnings = [r for r in collector.records if r.levelno == logging.WARNING] + assert len(warnings) == 1, "stop must flush the pending summary exactly once" + assert "3 callback(s) timed out" in warnings[0].getMessage() + assert worker._timeout_summary_task is None + + def test_loop_change_resets_timeout_summary_state(self): + """On an event-loop change the summary task is bound to the dead loop; it and the pending + burst count must reset so timeouts on the new loop arm a fresh summary rather than a stale, + stuck one that silently drops later summaries. + """ + worker = LoggingWorker(timeout=1.0, max_queue_size=10, timeout_summary_window=30.0) + + async def timed_out_callback() -> None: + await asyncio.sleep(10) + + async def arm_on_first_loop() -> None: + worker._ensure_queue() + coro = timed_out_callback() + worker._record_callback_timeout(coro) + coro.close() + assert worker._timeout_summary_task is not None + assert worker._timeout_burst_count == 1 + + asyncio.run(arm_on_first_loop()) + assert worker._timeout_summary_task is not None + + async def rebind_on_second_loop() -> None: + worker._ensure_queue() + assert worker._timeout_summary_task is None, "stale summary task must drop on loop change" + assert worker._timeout_burst_count == 0, "stale burst count must reset on loop change" + + asyncio.run(rebind_on_second_loop()) From 97b964dd9a5712ff0b01ce3c2f73c2a94a137447 Mon Sep 17 00:00:00 2001 From: Joshua Valluru <326636767+joshua-berri@users.noreply.github.com> Date: Sat, 12 Sep 2026 17:00:21 -0700 Subject: [PATCH 07/22] fix(mcp): prevent delegated admission key forwarding --- .../mcp_server/mcp_server_manager.py | 9 ++- .../mcp_server/test_mcp_server.py | 57 +++++++++++++++++++ .../mcp_server/test_mcp_server_manager.py | 43 ++++++++++++++ 3 files changed, 106 insertions(+), 3 deletions(-) diff --git a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py index 24e3bc6efc4..d186b4178b4 100644 --- a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py +++ b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py @@ -1055,7 +1055,7 @@ def _should_strip_caller_authorization( pass-through cold-start case (RFC 9728) the bearer in ``Authorization`` is the upstream OAuth token and must be forwarded, so we keep it. - - **oauth_delegate servers**: admission always runs and there is no + - **Delegated OAuth servers**: admission always runs and there is no anonymous path, so the caller's separate ``Authorization`` is forwarded only when a distinct ``x-litellm-api-key`` carried admission. Without that header the ``Authorization`` *was* the @@ -1075,11 +1075,14 @@ def _should_strip_caller_authorization( # upstream — it would override another user's stored credential. Delegate and # pass-through return None from to_server_spec and keep forwarding the bearer. return True - if not (mcp_server.is_oauth_passthrough or mcp_server.is_oauth_delegate): + is_delegated_oauth: Final = mcp_server.is_oauth_delegate or ( + mcp_server.auth_type == MCPAuth.oauth2 and mcp_server.delegate_auth_to_upstream + ) + if not (mcp_server.is_oauth_passthrough or is_delegated_oauth): return False has_explicit_litellm_admission_header: Final = _has_explicit_litellm_admission_header(raw_headers) - if mcp_server.is_oauth_delegate: + if is_delegated_oauth: return not has_explicit_litellm_admission_header return _authorization_is_litellm_admission_credential(raw_headers, user_api_key_auth) or ( user_api_key_auth is None and not has_explicit_litellm_admission_header diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py index 38cfbd20df4..7dbf49788a0 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py @@ -521,6 +521,63 @@ def test_prepare_mcp_server_headers_oauth2_interactive_drops_caller_authorizatio assert extra_headers is None +def test_prepare_mcp_server_headers_legacy_delegate_strips_admission_authorization(): + from litellm.proxy._experimental.mcp_server.server import ( + _prepare_mcp_server_headers, + ) + from litellm.proxy._types import UserAPIKeyAuth + + server = MCPServer( + server_id="legacy-delegate-admission", + name="legacy-delegate", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + delegate_auth_to_upstream=True, + ) + + server_auth_header, extra_headers = _prepare_mcp_server_headers( + server=server, + mcp_server_auth_headers=None, + mcp_auth_header=None, + oauth2_headers={"Authorization": "Bearer sk-litellm-key"}, + raw_headers={"authorization": "Bearer sk-litellm-key"}, + user_api_key_auth=UserAPIKeyAuth(api_key="sk-litellm-key"), + ) + + assert server_auth_header is None + assert extra_headers is None + + +def test_prepare_mcp_server_headers_legacy_delegate_preserves_separate_upstream_authorization(): + from litellm.proxy._experimental.mcp_server.server import ( + _prepare_mcp_server_headers, + ) + from litellm.proxy._types import UserAPIKeyAuth + + server = MCPServer( + server_id="legacy-delegate-dual-credential", + name="legacy-delegate", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + delegate_auth_to_upstream=True, + ) + + server_auth_header, extra_headers = _prepare_mcp_server_headers( + server=server, + mcp_server_auth_headers=None, + mcp_auth_header=None, + oauth2_headers={"Authorization": "Bearer upstream-token"}, + raw_headers={ + "x-litellm-api-key": "Bearer sk-litellm-key", + "authorization": "Bearer upstream-token", + }, + user_api_key_auth=UserAPIKeyAuth(api_key="sk-litellm-key"), + ) + + assert server_auth_header is None + assert extra_headers == {"Authorization": "Bearer upstream-token"} + + def test_prepare_mcp_server_headers_m2m_skips_authorization_from_raw_extra_headers(): """M2M must not merge caller Authorization from raw_headers when extra_headers lists it.""" try: diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py index b4f1aeeef10..dc4d7721190 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py @@ -3390,6 +3390,49 @@ class TestMCPServerManager: ) assert not extra_headers or "authorization" not in {k.lower() for k in extra_headers} + @pytest.mark.asyncio + async def test_call_regular_mcp_tool_legacy_delegate_never_forwards_admission_key(self): + from litellm.proxy._types import UserAPIKeyAuth + + server = MCPServer( + server_id="server-legacy-delegate-leak", + name="legacy-delegate", + url="https://example.com", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + delegate_auth_to_upstream=True, + ) + extra_headers = await self._capture_call_extra_headers( + server, + oauth2_headers={"Authorization": "Bearer sk-litellm-key"}, + raw_headers={"authorization": "Bearer sk-litellm-key"}, + user_api_key_auth=UserAPIKeyAuth(api_key="sk-litellm-key"), + ) + assert not extra_headers or "authorization" not in {k.lower() for k in extra_headers} + + @pytest.mark.asyncio + async def test_call_regular_mcp_tool_legacy_delegate_forwards_separate_authorization(self): + from litellm.proxy._types import UserAPIKeyAuth + + server = MCPServer( + server_id="server-legacy-delegate-dual-credential", + name="legacy-delegate", + url="https://example.com", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + delegate_auth_to_upstream=True, + ) + extra_headers = await self._capture_call_extra_headers( + server, + oauth2_headers={"Authorization": "Bearer upstream-token"}, + raw_headers={ + "x-litellm-api-key": "Bearer sk-litellm-key", + "authorization": "Bearer upstream-token", + }, + user_api_key_auth=UserAPIKeyAuth(api_key="sk-litellm-key"), + ) + assert extra_headers == {"Authorization": "Bearer upstream-token"} + def test_should_strip_caller_authorization_new_modes(self): from litellm.proxy._types import UserAPIKeyAuth From c69f2fe7def76bd99d49943e0d588247b527c2f5 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Sat, 12 Sep 2026 17:03:40 -0700 Subject: [PATCH 08/22] style(logging): drop explanatory comments per repo no-comments policy --- litellm/litellm_core_utils/logging_worker.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/litellm/litellm_core_utils/logging_worker.py b/litellm/litellm_core_utils/logging_worker.py index 8408942be63..5ccc5632646 100644 --- a/litellm/litellm_core_utils/logging_worker.py +++ b/litellm/litellm_core_utils/logging_worker.py @@ -147,8 +147,6 @@ class LoggingWorker: self._sem = None self._worker_task = None self._running_tasks.clear() - # The summary task is bound to the old loop; drop it and its pending burst so - # timeouts on the new loop arm a fresh summary instead of a stale, stuck one. self._timeout_summary_task = None self._timeout_burst_count = 0 self._queue = new_queue @@ -176,8 +174,6 @@ class LoggingWorker: try: await asyncio.wait_for(callback_task, timeout=self.timeout) except asyncio.TimeoutError as e: - # wait_for cancels the callback when our own deadline expires; a callback that - # raised TimeoutError itself did not hit our deadline, so keep its traceback. if callback_task.cancelled(): self._record_callback_timeout(task["coroutine"]) else: @@ -456,8 +452,6 @@ class LoggingWorker: async def stop(self) -> None: """Stop the logging worker and clean up resources.""" if self._timeout_summary_task is not None: - # Cancel the debounced sleeper and emit any pending burst now, so a summary - # armed just before shutdown is not lost when the loop tears down. self._timeout_summary_task.cancel() self._timeout_summary_task = None self._emit_timeout_summary() From 364e466210a92cae9f60acf605a7257698b5f9d3 Mon Sep 17 00:00:00 2001 From: Joshua Valluru <326636767+joshua-berri@users.noreply.github.com> Date: Sat, 12 Sep 2026 17:18:54 -0700 Subject: [PATCH 09/22] fix(mcp): strip duplicate delegated credentials --- .../mcp_server/mcp_server_manager.py | 14 ++++----- .../mcp_server/test_mcp_server.py | 30 +++++++++++++++++++ .../mcp_server/test_mcp_server_manager.py | 23 ++++++++++++++ 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py index d186b4178b4..fb0c623473a 100644 --- a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py +++ b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py @@ -1083,7 +1083,9 @@ def _should_strip_caller_authorization( has_explicit_litellm_admission_header: Final = _has_explicit_litellm_admission_header(raw_headers) if is_delegated_oauth: - return not has_explicit_litellm_admission_header + return not has_explicit_litellm_admission_header or _authorization_is_litellm_admission_credential( + raw_headers, user_api_key_auth + ) return _authorization_is_litellm_admission_credential(raw_headers, user_api_key_auth) or ( user_api_key_auth is None and not has_explicit_litellm_admission_header ) @@ -1110,15 +1112,11 @@ def _authorization_is_litellm_admission_credential( That is the case when no usable ``x-litellm-api-key`` was sent, or when the client repeated the same key in both headers. """ - if user_api_key_auth is None or not user_api_key_auth.api_key: - return False admission_header: Final = _raw_header_value(raw_headers, "x-litellm-api-key") - if not admission_header: - return True authorization: Final = _raw_header_value(raw_headers, "authorization") - return authorization is not None and strip_auth_scheme(authorization, "Bearer") == strip_auth_scheme( - admission_header, "Bearer" - ) + if admission_header and authorization: + return strip_auth_scheme(authorization, "Bearer") == strip_auth_scheme(admission_header, "Bearer") + return bool(user_api_key_auth and user_api_key_auth.api_key and not admission_header) def _format_byok_openapi_auth_header(mcp_server: MCPServer, mcp_auth_header: str) -> str: diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py index 7dbf49788a0..f5e4a420496 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py @@ -578,6 +578,36 @@ def test_prepare_mcp_server_headers_legacy_delegate_preserves_separate_upstream_ assert extra_headers == {"Authorization": "Bearer upstream-token"} +def test_prepare_mcp_server_headers_legacy_delegate_strips_repeated_admission_key(): + from litellm.proxy._experimental.mcp_server.server import ( + _prepare_mcp_server_headers, + ) + from litellm.proxy._types import UserAPIKeyAuth + + server = MCPServer( + server_id="legacy-delegate-repeated-key", + name="legacy-delegate", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + delegate_auth_to_upstream=True, + ) + + server_auth_header, extra_headers = _prepare_mcp_server_headers( + server=server, + mcp_server_auth_headers=None, + mcp_auth_header=None, + oauth2_headers={"Authorization": "Bearer sk-litellm-key"}, + raw_headers={ + "x-litellm-api-key": "Bearer sk-litellm-key", + "authorization": "Bearer sk-litellm-key", + }, + user_api_key_auth=UserAPIKeyAuth(api_key="sk-litellm-key"), + ) + + assert server_auth_header is None + assert extra_headers is None + + def test_prepare_mcp_server_headers_m2m_skips_authorization_from_raw_extra_headers(): """M2M must not merge caller Authorization from raw_headers when extra_headers lists it.""" try: diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py index dc4d7721190..3ccb388116b 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py @@ -3433,6 +3433,29 @@ class TestMCPServerManager: ) assert extra_headers == {"Authorization": "Bearer upstream-token"} + @pytest.mark.asyncio + async def test_call_regular_mcp_tool_legacy_delegate_strips_repeated_admission_key(self): + from litellm.proxy._types import UserAPIKeyAuth + + server = MCPServer( + server_id="server-legacy-delegate-repeated-key", + name="legacy-delegate", + url="https://example.com", + transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, + delegate_auth_to_upstream=True, + ) + extra_headers = await self._capture_call_extra_headers( + server, + oauth2_headers={"Authorization": "Bearer sk-litellm-key"}, + raw_headers={ + "x-litellm-api-key": "Bearer sk-litellm-key", + "authorization": "Bearer sk-litellm-key", + }, + user_api_key_auth=UserAPIKeyAuth(api_key="sk-litellm-key"), + ) + assert not extra_headers or "authorization" not in {k.lower() for k in extra_headers} + def test_should_strip_caller_authorization_new_modes(self): from litellm.proxy._types import UserAPIKeyAuth From f33bac8080fc1362953352edee1d2ac4a80b37b1 Mon Sep 17 00:00:00 2001 From: Joshua Valluru <326636767+joshua-berri@users.noreply.github.com> Date: Sat, 12 Sep 2026 17:29:26 -0700 Subject: [PATCH 10/22] test(mcp): model delegated hook credentials --- .../_experimental/mcp_server/test_mcp_hook_extra_headers.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_hook_extra_headers.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_hook_extra_headers.py index 67948375403..28faf375ab8 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_hook_extra_headers.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_hook_extra_headers.py @@ -597,7 +597,11 @@ class TestHookHeaderMergePriority: "Authorization": "Bearer oauth2-token", "X-OAuth": "yes", }, - raw_headers=None, + raw_headers={ + "x-litellm-api-key": "Bearer sk-litellm-key", + "authorization": "Bearer oauth2-token", + }, + user_api_key_auth=UserAPIKeyAuth(api_key="sk-litellm-key"), proxy_logging_obj=None, hook_extra_headers={ "Authorization": "Bearer hook-jwt", From 1d5ed799314ee8aa28d4c92d7fe749f3379800b7 Mon Sep 17 00:00:00 2001 From: Joshua Garnett Date: Sun, 9 Aug 2026 13:49:23 -0400 Subject: [PATCH 11/22] fix(responses): translate the reasoning object into a chat-completion reasoning effort The Responses API takes reasoning as an object, {effort, summary}. Chat Completions takes reasoning_effort as a string enum and has no equivalent of summary, but the completion bridge forwarded the whole object whenever summary was set, which agentic clients set on every request. Bedrock Converse guards its mapping with isinstance(value, str) and has no else branch, so the object fell through, thinking was never enabled, and the caller was billed for a non-thinking turn with nothing in the response to explain it. The object is still forwarded for the one caller that can consume it: a model whose cost-map mode is responses, which litellm.completion bridges back onto the Responses API and reassembles {effort, summary} there. That decision is delegated to responses_api_bridge_check, the same check litellm.completion runs, rather than a second copy of the rule that could drift from it. An object carrying no effort now yields no reasoning_effort at all. --- .../transformation.py | 87 ++++++++++++--- .../test_litellm_completion_responses.py | 102 ++++++++++++++++++ 2 files changed, 172 insertions(+), 17 deletions(-) diff --git a/litellm/responses/litellm_completion_transformation/transformation.py b/litellm/responses/litellm_completion_transformation/transformation.py index cc594f167c7..bd4108a0d27 100644 --- a/litellm/responses/litellm_completion_transformation/transformation.py +++ b/litellm/responses/litellm_completion_transformation/transformation.py @@ -309,6 +309,67 @@ class LiteLLMCompletionResponsesConfig: ) return supported_params is not None and "web_search_options" not in supported_params + @staticmethod + def _completion_bridges_back_to_responses_api( + model: str, + custom_llm_provider: str | None, + tools: Sequence[ChatCompletionToolParam | OpenAIMcpServerTool] | None, + web_search_options: OpenAIWebSearchOptions | None, + reasoning_param: Reasoning, + ) -> bool: + """ + Whether ``litellm.completion`` will route this model back onto the Responses API. + + Delegates to the same check ``litellm.completion`` itself runs, so the two cannot + disagree about which models take the Responses-shaped params. + """ + from litellm.main import responses_api_bridge_check + + try: + model_info, _ = responses_api_bridge_check( + model=model, + custom_llm_provider=custom_llm_provider or "", + web_search_options=web_search_options, + tools=tools, + reasoning_effort=reasoning_param, + reasoning_summary=reasoning_param.get("summary"), + ) + except Exception as e: # noqa: BLE001 # a capability probe must never fail the request it probes for + verbose_logger.debug(f"responses bridge: reasoning effort mode check failed: {e}") + return False + return model_info.get("mode") == "responses" + + @staticmethod + def _transform_reasoning_to_reasoning_effort( + reasoning_param: Reasoning | str | None, + model: str, + custom_llm_provider: str | None, + tools: Sequence[ChatCompletionToolParam | OpenAIMcpServerTool] | None = None, + web_search_options: OpenAIWebSearchOptions | None = None, + ) -> Reasoning | str | None: + """ + Map the Responses ``reasoning`` param onto Chat Completions ``reasoning_effort``. + + Chat Completions defines ``reasoning_effort`` as a string enum, and ``summary`` is a + Responses-only field with no Chat Completions equivalent. Sending the whole object to a + chat provider is rejected or silently discarded, which turns reasoning off. The object is + kept only when ``litellm.completion`` will bridge this model back onto the Responses API, + the one caller that can consume it. + """ + if not reasoning_param: + return None + if isinstance(reasoning_param, str): + return reasoning_param + if LiteLLMCompletionResponsesConfig._completion_bridges_back_to_responses_api( + model=model, + custom_llm_provider=custom_llm_provider, + tools=tools, + web_search_options=web_search_options, + reasoning_param=reasoning_param, + ): + return reasoning_param + return reasoning_param.get("effort") + @staticmethod def transform_responses_api_request_to_chat_completion_request( model: str, @@ -339,23 +400,15 @@ class LiteLLMCompletionResponsesConfig: if text_param: response_format = LiteLLMCompletionResponsesConfig._transform_text_format_to_response_format(text_param) - # Extract reasoning_effort from reasoning parameter - reasoning_effort: Reasoning | str | None = None - reasoning_param: Final = responses_api_request.get("reasoning") - if reasoning_param: - if isinstance(reasoning_param, dict): - # reasoning can be {"effort": "low|medium|high", "summary": "detailed"} - # Keep the full dict when summary is set so the responses API bridge can - # forward it; otherwise use the effort string for chat completion (e.g. Gemini). - if "summary" in reasoning_param: - reasoning_effort = reasoning_param - elif "effort" in reasoning_param: - reasoning_effort = reasoning_param.get("effort") - else: - reasoning_effort = reasoning_param - elif isinstance(reasoning_param, str): - # reasoning could be a string directly - reasoning_effort = reasoning_param + reasoning_effort: Final[Reasoning | str | None] = ( + LiteLLMCompletionResponsesConfig._transform_reasoning_to_reasoning_effort( + reasoning_param=responses_api_request.get("reasoning"), + model=model, + custom_llm_provider=custom_llm_provider, + tools=tools, + web_search_options=web_search_options, + ) + ) litellm_completion_request: dict = { "messages": LiteLLMCompletionResponsesConfig.transform_responses_api_input_to_messages( diff --git a/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py b/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py index 342ec4435a7..8e76ee315b7 100644 --- a/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py +++ b/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py @@ -2527,6 +2527,108 @@ class TestToolTransformation: "type": "object", } + @pytest.mark.parametrize( + "model, custom_llm_provider", + [ + ("bedrock/converse/global.anthropic.claude-sonnet-5", "bedrock_converse"), + ("anthropic.claude-sonnet-4-5-20250929-v1:0", "bedrock"), + ("claude-sonnet-5", "vertex_ai"), + ("gemini-3.1-pro-preview", "vertex_ai"), + ("moonshotai.kimi-k2-thinking", "bedrock_mantle"), + ], + ) + def test_reasoning_summary_still_yields_a_string_reasoning_effort(self, model, custom_llm_provider): + """ + A Responses request carrying ``reasoning.summary`` must still reach a chat provider as a + plain ``reasoning_effort`` string. ``summary`` is Responses-only, and forwarding the whole + object turns reasoning off: Bedrock Converse and Vertex silently discard a non-string + ``reasoning_effort``, and Bedrock Mantle rejects the request outright. + """ + responses_api_request = {"reasoning": {"effort": "medium", "summary": "auto"}} + + result = LiteLLMCompletionResponsesConfig.transform_responses_api_request_to_chat_completion_request( + model=model, + input="hi", + responses_api_request=responses_api_request, + custom_llm_provider=custom_llm_provider, + ) + + assert result["reasoning_effort"] == "medium" + + def test_responses_mode_model_keeps_the_whole_reasoning_object(self): + """ + The one consumer of the object form is ``litellm.completion`` bridging a ``mode: responses`` + model back onto the Responses API, which has no native Responses config of its own. That + path reassembles ``{effort, summary}``, so the object must survive for it. + """ + responses_api_request = {"reasoning": {"effort": "medium", "summary": "auto"}} + + result = LiteLLMCompletionResponsesConfig.transform_responses_api_request_to_chat_completion_request( + model="gpt-5.4-pro", + input="hi", + responses_api_request=responses_api_request, + custom_llm_provider="azure_ai", + ) + + assert result["reasoning_effort"] == {"effort": "medium", "summary": "auto"} + + @pytest.mark.parametrize( + "reasoning, expected", + [ + ({"effort": "high"}, "high"), + ("low", "low"), + ({"summary": "auto"}, None), + ({}, None), + (None, None), + ], + ) + def test_reasoning_param_shapes_map_to_reasoning_effort(self, reasoning, expected): + """ + An object without ``effort`` carries nothing Chat Completions can use, so no + ``reasoning_effort`` is sent at all (the bridge drops None-valued params). + """ + result = LiteLLMCompletionResponsesConfig.transform_responses_api_request_to_chat_completion_request( + model="anthropic.claude-sonnet-4-5-20250929-v1:0", + input="hi", + responses_api_request={"reasoning": reasoning}, + custom_llm_provider="bedrock", + ) + + assert result.get("reasoning_effort") == expected + assert ("reasoning_effort" in result) is (expected is not None) + + @pytest.mark.parametrize( + "model, expected_thinking", + [ + ("global.anthropic.claude-sonnet-5", {"type": "adaptive"}), + ( + "anthropic.claude-sonnet-4-5-20250929-v1:0", + {"type": "enabled", "budget_tokens": 2048}, + ), + ], + ) + def test_reasoning_summary_still_enables_thinking_on_bedrock(self, model, expected_thinking): + """ + End to end through Bedrock Converse's own param mapping: the effort a Responses request asks + for must survive into ``thinking``, whether the model takes an adaptive effort or a legacy + token budget. Forwarding the object instead leaves ``thinking`` unset and the model never + reasons, which is the failure this guards. + """ + from litellm.llms.bedrock.chat.converse_transformation import AmazonConverseConfig + + bridged = LiteLLMCompletionResponsesConfig.transform_responses_api_request_to_chat_completion_request( + model=model, + input="hi", + responses_api_request={"reasoning": {"effort": "medium", "summary": "auto"}}, + custom_llm_provider="bedrock", + ) + + mapped = AmazonConverseConfig().map_openai_params( + {"reasoning_effort": bridged["reasoning_effort"]}, {}, model, True + ) + + assert mapped["thinking"] == expected_thinking + def test_bedrock_anthropic_responses_tools_yield_only_function_toolspec(self): """ End-to-end (no network) of the LIT-3858 acceptance criterion: the mixed tools array From 3d648b7fe1adb0c36bf2615e9a06fe153e8f9122 Mon Sep 17 00:00:00 2001 From: Joshua Garnett Date: Sun, 9 Aug 2026 13:58:23 -0400 Subject: [PATCH 12/22] fix(responses): pass api_base to the responses bridge check The bridge probe called responses_api_bridge_check without api_base, so it resolved the OpenAI base from globals and environment rather than from the request, while litellm.completion runs the same check with the caller's value. Today the two cannot disagree: this path always supplies a reasoning_effort, which short-circuits the endpoint term in the only arm that reads it. Passing it anyway keeps the probe a faithful mirror of the definitive check rather than one that happens to agree. --- .../litellm_completion_transformation/transformation.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/litellm/responses/litellm_completion_transformation/transformation.py b/litellm/responses/litellm_completion_transformation/transformation.py index bd4108a0d27..8d790024cfe 100644 --- a/litellm/responses/litellm_completion_transformation/transformation.py +++ b/litellm/responses/litellm_completion_transformation/transformation.py @@ -316,6 +316,7 @@ class LiteLLMCompletionResponsesConfig: tools: Sequence[ChatCompletionToolParam | OpenAIMcpServerTool] | None, web_search_options: OpenAIWebSearchOptions | None, reasoning_param: Reasoning, + api_base: str | None, ) -> bool: """ Whether ``litellm.completion`` will route this model back onto the Responses API. @@ -333,6 +334,7 @@ class LiteLLMCompletionResponsesConfig: tools=tools, reasoning_effort=reasoning_param, reasoning_summary=reasoning_param.get("summary"), + api_base=api_base, ) except Exception as e: # noqa: BLE001 # a capability probe must never fail the request it probes for verbose_logger.debug(f"responses bridge: reasoning effort mode check failed: {e}") @@ -346,6 +348,7 @@ class LiteLLMCompletionResponsesConfig: custom_llm_provider: str | None, tools: Sequence[ChatCompletionToolParam | OpenAIMcpServerTool] | None = None, web_search_options: OpenAIWebSearchOptions | None = None, + api_base: str | None = None, ) -> Reasoning | str | None: """ Map the Responses ``reasoning`` param onto Chat Completions ``reasoning_effort``. @@ -366,6 +369,7 @@ class LiteLLMCompletionResponsesConfig: tools=tools, web_search_options=web_search_options, reasoning_param=reasoning_param, + api_base=api_base, ): return reasoning_param return reasoning_param.get("effort") @@ -407,6 +411,7 @@ class LiteLLMCompletionResponsesConfig: custom_llm_provider=custom_llm_provider, tools=tools, web_search_options=web_search_options, + api_base=kwargs.get("api_base"), ) ) From 216af3826e6dce1516d36b6f99a9335f276dee35 Mon Sep 17 00:00:00 2001 From: Joshua Garnett Date: Sun, 9 Aug 2026 14:16:59 -0400 Subject: [PATCH 13/22] fix(responses): log the bridge check failure lazily The debug call built its message with an f-string, which test_logging_calls_do_not_build_their_message_eagerly rejects. Pass the exception as a %-style argument so the message is only built when the log is emitted. --- .../litellm_completion_transformation/transformation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/responses/litellm_completion_transformation/transformation.py b/litellm/responses/litellm_completion_transformation/transformation.py index 8d790024cfe..c7f8ab24de4 100644 --- a/litellm/responses/litellm_completion_transformation/transformation.py +++ b/litellm/responses/litellm_completion_transformation/transformation.py @@ -337,7 +337,7 @@ class LiteLLMCompletionResponsesConfig: api_base=api_base, ) except Exception as e: # noqa: BLE001 # a capability probe must never fail the request it probes for - verbose_logger.debug(f"responses bridge: reasoning effort mode check failed: {e}") + verbose_logger.debug("responses bridge: reasoning effort mode check failed: %s", e) return False return model_info.get("mode") == "responses" From 239bcbc21423ee09bc8e58966e9d34a29a5bb6cb Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2026 00:44:30 +0000 Subject: [PATCH 14/22] fix(fireworks): resolve short model names to long cost map keys Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/utils.py | 5 +++ tests/test_litellm/test_utils.py | 69 ++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/litellm/utils.py b/litellm/utils.py index 394ab4b4094..4a92f9b1244 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -5556,6 +5556,11 @@ def _get_potential_model_names(model: str, custom_llm_provider: str | None) -> P split_model = strip_bedrock_routing_prefix(split_model) + if custom_llm_provider == "fireworks_ai": + from litellm.llms.fireworks_ai.common_utils import resolve_fireworks_resource_name + + provider_prefixed_model_name = f"fireworks_ai/{resolve_fireworks_resource_name(split_model)}" + return PotentialModelNamesAndCustomLLMProvider( split_model=split_model, combined_model_name=combined_model_name, diff --git a/tests/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index 835e87aff88..02e2eeec467 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -4448,6 +4448,75 @@ def test_fireworks_models_in_backup_cost_map(): ), f"short-form {short_key} does not match long-form {long_key}" +@pytest.fixture +def fireworks_short_model_cost_map(monkeypatch: pytest.MonkeyPatch) -> Iterator[None]: + monkeypatch.setattr( + litellm, + "model_cost", + { + "fireworks_ai/accounts/fireworks/models/glm-5p3": { + "input_cost_per_token": 1e-6, + "output_cost_per_token": 2e-6, + "litellm_provider": "fireworks_ai", + "mode": "chat", + "max_tokens": 100, + }, + "fireworks_ai/accounts/fireworks/routers/glm-5p3-fast": { + "input_cost_per_token": 2.1e-6, + "output_cost_per_token": 6.6e-6, + "litellm_provider": "fireworks_ai", + "mode": "chat", + }, + "fireworks_ai/nomic-ai/nomic-embed-text-v1.5": { + "input_cost_per_token": 8e-9, + "output_cost_per_token": 0.0, + "litellm_provider": "fireworks_ai", + "mode": "embedding", + }, + }, + ) + litellm.get_model_info.cache_clear() + yield + litellm.get_model_info.cache_clear() + + +def test_fireworks_short_model_names_resolve_to_long_cost_map_keys(fireworks_short_model_cost_map: None) -> None: + model_info = litellm.get_model_info("fireworks_ai/glm-5p3") + assert model_info["key"] == "fireworks_ai/accounts/fireworks/models/glm-5p3" + assert model_info["input_cost_per_token"] == 1e-6 + assert model_info["max_tokens"] == 100 + + model_info = litellm.get_model_info("glm-5p3", custom_llm_provider="fireworks_ai") + assert model_info["key"] == "fireworks_ai/accounts/fireworks/models/glm-5p3" + + model_info = litellm.get_model_info("fireworks_ai/glm-5p3-fast") + assert model_info["key"] == "fireworks_ai/accounts/fireworks/routers/glm-5p3-fast" + assert model_info["input_cost_per_token"] == 2.1e-6 + + model_info = litellm.get_model_info("fireworks_ai/nomic-ai/nomic-embed-text-v1.5") + assert model_info["key"] == "fireworks_ai/nomic-ai/nomic-embed-text-v1.5" + + with pytest.raises(Exception, match="isn't mapped"): + litellm.get_model_info("fireworks_ai/does-not-exist") + + +def test_fireworks_short_model_names_price_with_completion_cost(fireworks_short_model_cost_map: None) -> None: + from litellm.types.utils import ModelResponse + + response = ModelResponse( + model="fireworks_ai/glm-5p3", + usage=Usage(prompt_tokens=10, completion_tokens=5, total_tokens=15), + ) + + cost = litellm.completion_cost( + completion_response=response, + model="fireworks_ai/glm-5p3", + custom_llm_provider="fireworks_ai", + ) + + assert cost == pytest.approx(10 * 1e-6 + 5 * 2e-6) + + class TestBedrockBaseModelLabelKeepsTools: """Regression for #29618: a Bedrock deployment whose ``base_model`` is a friendly label must not silently drop ``tools``/``tool_choice`` under ``drop_params``.""" From 0c83e831db6f420845d3deec0484da7ff717036b Mon Sep 17 00:00:00 2001 From: ryan-crabbe-berri Date: Sat, 12 Sep 2026 17:49:30 -0700 Subject: [PATCH 15/22] fix(responses): carry the reasoning summary as an alias, not inside reasoning_effort The bridge probe asked `responses_api_bridge_check` with the summary read straight off the Responses object, but `litellm.completion` reads it from `optional_params` via `peek_reasoning_summary_aliases`, which the bridged request never populated. So gpt-5, gpt-5.1 and azure/gpt-5 answered "bridging" to the probe and "not bridging" for real, and the object still landed on Chat Completions, which only takes a string `reasoning_effort` is now always the effort string, and `summary` rides the `reasoning_summary` alias that main.py already reassembles into `{effort, summary}` on the bridged path. The alias is emitted only when the probe says the model bridges, so no chat provider ever sees it, and the probe is now asked with the exact params this transform emits --- .../transformation.py | 75 +++++++++------- .../test_litellm_completion_responses.py | 88 +++++++++++++++++-- 2 files changed, 125 insertions(+), 38 deletions(-) diff --git a/litellm/responses/litellm_completion_transformation/transformation.py b/litellm/responses/litellm_completion_transformation/transformation.py index c7f8ab24de4..e8aacac9e67 100644 --- a/litellm/responses/litellm_completion_transformation/transformation.py +++ b/litellm/responses/litellm_completion_transformation/transformation.py @@ -117,6 +117,14 @@ class ResponsesToolChatForm: web_search_options: OpenAIWebSearchOptions | None +@dataclass(frozen=True, slots=True) +class ResponsesReasoningChatForm: + """The Responses ``reasoning`` object as the two params Chat Completions takes.""" + + effort: str | None + summary: str | None + + if TYPE_CHECKING: from openai.types.responses.response_apply_patch_tool_call import ( ResponseApplyPatchToolCall, @@ -315,14 +323,15 @@ class LiteLLMCompletionResponsesConfig: custom_llm_provider: str | None, tools: Sequence[ChatCompletionToolParam | OpenAIMcpServerTool] | None, web_search_options: OpenAIWebSearchOptions | None, - reasoning_param: Reasoning, + reasoning_effort: str | None, + reasoning_summary: str | None, api_base: str | None, ) -> bool: """ Whether ``litellm.completion`` will route this model back onto the Responses API. - Delegates to the same check ``litellm.completion`` itself runs, so the two cannot - disagree about which models take the Responses-shaped params. + Delegates to the same check ``litellm.completion`` itself runs, and is asked with the + params this transform is about to emit, so the two cannot reach different answers. """ from litellm.main import responses_api_bridge_check @@ -332,8 +341,8 @@ class LiteLLMCompletionResponsesConfig: custom_llm_provider=custom_llm_provider or "", web_search_options=web_search_options, tools=tools, - reasoning_effort=reasoning_param, - reasoning_summary=reasoning_param.get("summary"), + reasoning_effort=reasoning_effort, + reasoning_summary=reasoning_summary, api_base=api_base, ) except Exception as e: # noqa: BLE001 # a capability probe must never fail the request it probes for @@ -342,37 +351,44 @@ class LiteLLMCompletionResponsesConfig: return model_info.get("mode") == "responses" @staticmethod - def _transform_reasoning_to_reasoning_effort( + def _transform_reasoning_for_chat_completion( reasoning_param: Reasoning | str | None, model: str, custom_llm_provider: str | None, tools: Sequence[ChatCompletionToolParam | OpenAIMcpServerTool] | None = None, web_search_options: OpenAIWebSearchOptions | None = None, api_base: str | None = None, - ) -> Reasoning | str | None: + ) -> ResponsesReasoningChatForm: """ - Map the Responses ``reasoning`` param onto Chat Completions ``reasoning_effort``. + Split the Responses ``reasoning`` object into the params Chat Completions understands. - Chat Completions defines ``reasoning_effort`` as a string enum, and ``summary`` is a - Responses-only field with no Chat Completions equivalent. Sending the whole object to a - chat provider is rejected or silently discarded, which turns reasoning off. The object is - kept only when ``litellm.completion`` will bridge this model back onto the Responses API, - the one caller that can consume it. + ``reasoning_effort`` is a string enum there, so the object is never forwarded whole: a chat + provider either rejects it or silently drops it, and dropping it turns reasoning off while + still billing for the turn. ``summary`` has no chat equivalent, so it rides the + ``reasoning_summary`` alias, which ``litellm.completion`` reassembles into ``{effort, + summary}`` when it bridges the model back onto the Responses API, and is sent to nothing + else. """ if not reasoning_param: - return None + return ResponsesReasoningChatForm(effort=None, summary=None) if isinstance(reasoning_param, str): - return reasoning_param - if LiteLLMCompletionResponsesConfig._completion_bridges_back_to_responses_api( + return ResponsesReasoningChatForm(effort=reasoning_param, summary=None) + + effort: Final = reasoning_param.get("effort") + summary: Final = reasoning_param.get("summary") + if summary is None: + return ResponsesReasoningChatForm(effort=effort, summary=None) + + bridges_back: Final = LiteLLMCompletionResponsesConfig._completion_bridges_back_to_responses_api( model=model, custom_llm_provider=custom_llm_provider, tools=tools, web_search_options=web_search_options, - reasoning_param=reasoning_param, + reasoning_effort=effort, + reasoning_summary=summary, api_base=api_base, - ): - return reasoning_param - return reasoning_param.get("effort") + ) + return ResponsesReasoningChatForm(effort=effort, summary=summary if bridges_back else None) @staticmethod def transform_responses_api_request_to_chat_completion_request( @@ -404,15 +420,13 @@ class LiteLLMCompletionResponsesConfig: if text_param: response_format = LiteLLMCompletionResponsesConfig._transform_text_format_to_response_format(text_param) - reasoning_effort: Final[Reasoning | str | None] = ( - LiteLLMCompletionResponsesConfig._transform_reasoning_to_reasoning_effort( - reasoning_param=responses_api_request.get("reasoning"), - model=model, - custom_llm_provider=custom_llm_provider, - tools=tools, - web_search_options=web_search_options, - api_base=kwargs.get("api_base"), - ) + reasoning: Final = LiteLLMCompletionResponsesConfig._transform_reasoning_for_chat_completion( + reasoning_param=responses_api_request.get("reasoning"), + model=model, + custom_llm_provider=custom_llm_provider, + tools=tools, + web_search_options=web_search_options, + api_base=kwargs.get("api_base"), ) litellm_completion_request: dict = { @@ -436,7 +450,8 @@ class LiteLLMCompletionResponsesConfig: "service_tier": kwargs.get("service_tier"), "web_search_options": web_search_options, "response_format": response_format, - "reasoning_effort": reasoning_effort, + "reasoning_effort": reasoning.effort, + "reasoning_summary": reasoning.summary, "context_management": responses_api_request.get("context_management"), # litellm specific params "custom_llm_provider": custom_llm_provider, diff --git a/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py b/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py index 8e76ee315b7..3c78bbf79d7 100644 --- a/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py +++ b/tests/test_litellm/responses/litellm_completion_transformation/test_litellm_completion_responses.py @@ -2555,22 +2555,94 @@ class TestToolTransformation: assert result["reasoning_effort"] == "medium" - def test_responses_mode_model_keeps_the_whole_reasoning_object(self): + @pytest.mark.parametrize( + "model, custom_llm_provider", + [ + ("gpt-5.4-pro", "azure_ai"), + ("gpt-5", "openai"), + ("gpt-5.1", "openai"), + ("gpt-5", "azure"), + ], + ) + def test_bridged_model_carries_the_summary_as_an_alias(self, model, custom_llm_provider): """ - The one consumer of the object form is ``litellm.completion`` bridging a ``mode: responses`` - model back onto the Responses API, which has no native Responses config of its own. That - path reassembles ``{effort, summary}``, so the object must survive for it. + ``summary`` reaches a bridged model through the ``reasoning_summary`` alias, never smuggled + inside ``reasoning_effort``. ``litellm.completion`` reads that alias back with + ``peek_reasoning_summary_aliases`` and reassembles ``{effort, summary}``, so the far end + gets the same object it always did while no chat provider ever sees a non-string effort. """ - responses_api_request = {"reasoning": {"effort": "medium", "summary": "auto"}} + result = LiteLLMCompletionResponsesConfig.transform_responses_api_request_to_chat_completion_request( + model=model, + input="hi", + responses_api_request={"reasoning": {"effort": "medium", "summary": "auto"}}, + custom_llm_provider=custom_llm_provider, + ) + + assert result["reasoning_effort"] == "medium" + assert result["reasoning_summary"] == "auto" + + @pytest.mark.parametrize( + "model, custom_llm_provider", + [ + ("gpt-5", "openai"), + ("gpt-5.1", "openai"), + ("gpt-5", "azure"), + ], + ) + def test_gpt_5_summary_survives_the_bridge_it_claims_to_take(self, model, custom_llm_provider): + """ + Regression for the probe disagreeing with the real decision. The transform asked + ``responses_api_bridge_check`` with ``reasoning_summary`` taken straight off the Responses + object, but ``litellm.completion`` reads it from ``optional_params`` via + ``peek_reasoning_summary_aliases``, which the bridged request never populated. So these + models answered "bridging" to the probe and "not bridging" for real, and the object landed + on Chat Completions, which only takes a string. Emitting the alias makes the two agree. + """ + from litellm.main import responses_api_bridge_check + from litellm.utils import get_optional_params, peek_reasoning_summary_aliases + + result = LiteLLMCompletionResponsesConfig.transform_responses_api_request_to_chat_completion_request( + model=model, + input="hi", + responses_api_request={"reasoning": {"effort": "medium", "summary": "auto"}}, + custom_llm_provider=custom_llm_provider, + ) + optional_params = get_optional_params( + model=model, + custom_llm_provider=custom_llm_provider, + reasoning_effort=result["reasoning_effort"], + reasoning_summary=result["reasoning_summary"], + ) + model_info, _ = responses_api_bridge_check( + model=model, + custom_llm_provider=custom_llm_provider, + reasoning_effort=result["reasoning_effort"], + reasoning_summary=peek_reasoning_summary_aliases(optional_params), + ) + + assert model_info.get("mode") == "responses" + + def test_a_failing_bridge_probe_falls_back_to_the_string_effort(self, monkeypatch): + """ + The probe is a capability question, so a model-info lookup blowing up must not fail the + request. It degrades to the chat-safe form: a string effort and no alias. + """ + import litellm.main + + def _boom(**_kwargs): + raise RuntimeError("model info unavailable") + + monkeypatch.setattr(litellm.main, "responses_api_bridge_check", _boom) result = LiteLLMCompletionResponsesConfig.transform_responses_api_request_to_chat_completion_request( model="gpt-5.4-pro", input="hi", - responses_api_request=responses_api_request, + responses_api_request={"reasoning": {"effort": "medium", "summary": "auto"}}, custom_llm_provider="azure_ai", ) - assert result["reasoning_effort"] == {"effort": "medium", "summary": "auto"} + assert result["reasoning_effort"] == "medium" + assert "reasoning_summary" not in result @pytest.mark.parametrize( "reasoning, expected", @@ -2627,7 +2699,7 @@ class TestToolTransformation: {"reasoning_effort": bridged["reasoning_effort"]}, {}, model, True ) - assert mapped["thinking"] == expected_thinking + assert expected_thinking.items() <= mapped["thinking"].items() def test_bedrock_anthropic_responses_tools_yield_only_function_toolspec(self): """ From f23ac2e1974b68eb16a3ef19faf9606b299f548f Mon Sep 17 00:00:00 2001 From: Joshua Valluru <326636767+joshua-berri@users.noreply.github.com> Date: Sat, 12 Sep 2026 18:18:10 -0700 Subject: [PATCH 16/22] docs: remove MCP evidence image from repository --- .../lit6970_mcp_delegated_auth_after.png | Bin 213376 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .github/screenshots/lit6970_mcp_delegated_auth_after.png diff --git a/.github/screenshots/lit6970_mcp_delegated_auth_after.png b/.github/screenshots/lit6970_mcp_delegated_auth_after.png deleted file mode 100644 index 3638b7a9291958a301638b384f0f0bb1e0fa0a59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213376 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 z 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 From 939fa4ee730f02ed26353e0929d8a99c3bc96ac2 Mon Sep 17 00:00:00 2001 From: Joshua Valluru <326636767+joshua-berri@users.noreply.github.com> Date: Sat, 12 Sep 2026 18:27:20 -0700 Subject: [PATCH 17/22] test(mcp): remove unrelated formatting changes --- .../auth/test_user_api_key_auth_mcp.py | 20 +- .../mcp_server/test_mcp_server_manager.py | 247 +++++------------- .../hooks/test_proxy_track_cost_callback.py | 12 +- 3 files changed, 73 insertions(+), 206 deletions(-) diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/auth/test_user_api_key_auth_mcp.py b/tests/test_litellm/proxy/_experimental/mcp_server/auth/test_user_api_key_auth_mcp.py index 27a8c7992fe..90ce821d62e 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/auth/test_user_api_key_auth_mcp.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/auth/test_user_api_key_auth_mcp.py @@ -4341,9 +4341,7 @@ class TestAgentMCPPermissions: stack.enter_context(patcher) stack.enter_context( patch.object( # test-quality-ok: key resolution has its own tests; pin its grants here - MCPRequestHandler, - "_get_allowed_mcp_servers_for_key", - AsyncMock(return_value=["server-a", "server-b"]), + MCPRequestHandler, "_get_allowed_mcp_servers_for_key", AsyncMock(return_value=["server-a", "server-b"]) ) ) stack.enter_context( @@ -4369,9 +4367,7 @@ class TestAgentMCPPermissions: await MCPRequestHandler._get_allowed_mcp_servers_for_agent(user_api_key_auth) stack.enter_context( patch.object( # test-quality-ok: key resolution has its own tests; pin its grants here - MCPRequestHandler, - "_get_allowed_mcp_servers_for_key", - AsyncMock(return_value=["server-a", "server-b"]), + MCPRequestHandler, "_get_allowed_mcp_servers_for_key", AsyncMock(return_value=["server-a", "server-b"]) ) ) stack.enter_context( @@ -4395,15 +4391,9 @@ class TestAgentMCPPermissions: with contextlib.ExitStack() as stack: for patcher in self._agent_toolset_patches(agent_object_permission, mock_manager): stack.enter_context(patcher) - server_a_tools = await MCPRequestHandler._get_agent_tool_permissions_for_server( - "server-a", user_api_key_auth - ) - server_b_tools = await MCPRequestHandler._get_agent_tool_permissions_for_server( - "server-b", user_api_key_auth - ) - server_c_tools = await MCPRequestHandler._get_agent_tool_permissions_for_server( - "server-c", user_api_key_auth - ) + server_a_tools = await MCPRequestHandler._get_agent_tool_permissions_for_server("server-a", user_api_key_auth) + server_b_tools = await MCPRequestHandler._get_agent_tool_permissions_for_server("server-b", user_api_key_auth) + server_c_tools = await MCPRequestHandler._get_agent_tool_permissions_for_server("server-c", user_api_key_auth) assert sorted(server_a_tools) == ["tool_direct", "tool_via_toolset"] assert server_b_tools == ["tool_b"] diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py index 3ccb388116b..d56f08c4e79 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server_manager.py @@ -4535,9 +4535,7 @@ class TestMCPServerManager: @pytest.mark.parametrize("auth_type", [MCPAuth.none, MCPAuth.bearer_token, MCPAuth.api_key, MCPAuth.oauth2]) @pytest.mark.parametrize("is_byok", [False, True]) @pytest.mark.parametrize("scheme", ["http", "https"]) - async def test_openapi_health_loads_spec_without_mcp_handshake( - self, respx_mock, monkeypatch, auth_type, is_byok, scheme - ): + async def test_openapi_health_loads_spec_without_mcp_handshake(self, respx_mock, monkeypatch, auth_type, is_byok, scheme): monkeypatch.setenv("DISABLE_AIOHTTP_TRANSPORT", "True") manager = MCPServerManager() server = MCPServer( @@ -4587,28 +4585,14 @@ class TestMCPServerManager: @pytest.mark.parametrize( ("failure", "expected_status", "expected_error"), [ - ( - httpx.Response(401, text="secret response content"), - "unhealthy", - "OpenAPI specification request failed (HTTP 401)", - ), + (httpx.Response(401, text="secret response content"), "unhealthy", "OpenAPI specification request failed (HTTP 401)"), (httpx.Response(404), "unhealthy", "OpenAPI specification request failed (HTTP 404)"), (httpx.Response(500), "unhealthy", "OpenAPI specification request failed (HTTP 500)"), - ( - httpx.ConnectError("secret network details"), - "unhealthy", - "OpenAPI specification could not be loaded (ConnectError)", - ), - ( - httpx.Response(200, text="secret invalid JSON body"), - "unhealthy", - "OpenAPI specification could not be loaded (JSONDecodeError)", - ), + (httpx.ConnectError("secret network details"), "unhealthy", "OpenAPI specification could not be loaded (ConnectError)"), + (httpx.Response(200, text="secret invalid JSON body"), "unhealthy", "OpenAPI specification could not be loaded (JSONDecodeError)"), ], ) - async def test_openapi_health_reports_safe_failures( - self, respx_mock, monkeypatch, failure, expected_status, expected_error - ): + async def test_openapi_health_reports_safe_failures(self, respx_mock, monkeypatch, failure, expected_status, expected_error): monkeypatch.setenv("DISABLE_AIOHTTP_TRANSPORT", "True") manager = MCPServerManager() server = MCPServer( @@ -12735,12 +12719,7 @@ async def test_debug_resolution_matches_final_header_conflict_winner( from litellm.proxy._experimental.mcp_server.auth.litellm_auth_handler import MCPAuthenticatedUser from litellm.proxy._experimental.mcp_server.mcp_debug import MCP_AUTH_DIAGNOSTICS_SCOPE_KEY, MCPAuthDiagnostics from litellm.proxy._experimental.mcp_server.outbound_credentials import ( - ApiKeyConfig, - AuthorizationCodeConfig, - NoneConfig, - ServerSpec, - SharedKey, - UpstreamCredentialProvider, + ApiKeyConfig, AuthorizationCodeConfig, NoneConfig, ServerSpec, SharedKey, UpstreamCredentialProvider, ) from litellm.proxy._experimental.mcp_server.outbound_credentials.oauth_token_store import OAuthToken from litellm.types.mcp_server.mcp_server_manager import MCPServer @@ -12756,15 +12735,10 @@ async def test_debug_resolution_matches_final_header_conflict_winner( store = Store() context = MCPAuthenticatedUser(UserAPIKeyAuth(user_id="alice")) diagnostics = MCPAuthDiagnostics() - token = request_ctx.set( - RequestContext( - request_id=1, - meta=None, - session=MagicMock(), - lifespan_context=None, - request=Request({"type": "http", MCP_AUTH_DIAGNOSTICS_SCOPE_KEY: diagnostics}), - ) - ) + token = request_ctx.set(RequestContext( + request_id=1, meta=None, session=MagicMock(), lifespan_context=None, + request=Request({"type": "http", MCP_AUTH_DIAGNOSTICS_SCOPE_KEY: diagnostics}), + )) selected = { "stored": AuthorizationCodeConfig(), "static": ApiKeyConfig(key_source=SharedKey(value=SecretStr("static-token"))), @@ -12773,10 +12747,7 @@ async def test_debug_resolution_matches_final_header_conflict_winner( try: auth, remaining = await MCPServerManager()._resolve_v2_auth( server=MCPServer( - server_id="s", - name="s", - transport="http", - url="https://up.example/mcp", + server_id="s", name="s", transport="http", url="https://up.example/mcp", static_headers={"Authorization": "Bearer configured"}, ), spec=ServerSpec(server_id="s", resource="https://up.example/mcp", config=selected), @@ -12806,28 +12777,17 @@ async def test_debug_reports_legacy_signing_and_non_http_transport(transport: Li from litellm.types.mcp_server.mcp_server_manager import MCPServer diagnostics = MCPAuthDiagnostics() - token = request_ctx.set( - RequestContext( - request_id=1, - meta=None, - session=MagicMock(), - lifespan_context=None, - request=Request({"type": "http", MCP_AUTH_DIAGNOSTICS_SCOPE_KEY: diagnostics}), - ) - ) + token = request_ctx.set(RequestContext( + request_id=1, meta=None, session=MagicMock(), lifespan_context=None, + request=Request({"type": "http", MCP_AUTH_DIAGNOSTICS_SCOPE_KEY: diagnostics}), + )) try: server = MCPServer( - server_id="signed", - name="signed", - transport=transport, - url="https://up.example/mcp", - auth_type="aws_sigv4", - aws_access_key_id="AKIDEXAMPLE", - aws_secret_access_key="test-signing-secret", - aws_region_name="us-east-1", - aws_service_name="execute-api", - command="python", - args=["-c", "pass"], + server_id="signed", name="signed", transport=transport, + url="https://up.example/mcp", auth_type="aws_sigv4", + aws_access_key_id="AKIDEXAMPLE", aws_secret_access_key="test-signing-secret", + aws_region_name="us-east-1", aws_service_name="execute-api", + command="python", args=["-c", "pass"], ) client = await MCPServerManager()._create_mcp_client(server) if transport == "stdio": @@ -12846,16 +12806,12 @@ async def test_debug_reports_legacy_signing_and_non_http_transport(transport: Li async def test_temporary_server_discovery_reuses_resolved_metadata_without_publishing() -> None: manager: Final = MCPServerManager() server: Final = MCPServer( - server_id="temporary-oauth-discovery", - name="temporary", - url="https://idp.example.com/mcp", - transport=MCPTransport.http, - auth_type=MCPAuth.true_passthrough, + server_id="temporary-oauth-discovery", name="temporary", url="https://idp.example.com/mcp", + transport=MCPTransport.http, auth_type=MCPAuth.true_passthrough, ) manager._set_oauth_discovery_deferred(server.server_id, True) metadata: Final = MCPOAuthMetadata( - authorization_url="https://idp.example.com/authorize", - token_url="https://idp.example.com/token", + authorization_url="https://idp.example.com/authorize", token_url="https://idp.example.com/token", registration_url="https://idp.example.com/register", ) with patch.object(manager, "_discover_oauth_metadata_for_server", AsyncMock(return_value=metadata)) as discovery: @@ -12875,18 +12831,13 @@ async def test_temporary_server_discovery_reuses_resolved_metadata_without_publi async def test_repeated_stale_oauth_discovery_is_bounded(auth_type: MCPAuth) -> None: manager: Final = MCPServerManager() server: Final = MCPServer( - server_id="repeated-stale", - name="stale", - url="https://idp.example.com/mcp", - transport=MCPTransport.http, - auth_type=auth_type, - oauth2_flow="authorization_code", + server_id="repeated-stale", name="stale", url="https://idp.example.com/mcp", + transport=MCPTransport.http, auth_type=auth_type, oauth2_flow="authorization_code", ) manager.registry[server.server_id] = server manager._set_oauth_discovery_deferred(server.server_id, True) metadata: Final = MCPOAuthMetadata( - authorization_url="https://idp.example.com/authorize", - token_url="https://idp.example.com/token", + authorization_url="https://idp.example.com/authorize", token_url="https://idp.example.com/token", ) with ( patch.object(manager, "_discover_oauth_metadata_for_server", AsyncMock(return_value=metadata)) as discovery, @@ -12906,20 +12857,13 @@ async def test_repeated_stale_oauth_discovery_is_bounded(auth_type: MCPAuth) -> async def test_stale_discovery_falls_back_to_resolved_registered_server() -> None: manager: Final = MCPServerManager() original: Final = MCPServer( - server_id="resolved-replacement", - name="replacement", - url="https://old.example.com/mcp", - transport=MCPTransport.http, - auth_type=MCPAuth.oauth2, - oauth2_flow="authorization_code", - ) - replacement: Final = original.model_copy( - update={ - "url": "https://new.example.com/mcp", - "authorization_url": "https://new.example.com/authorize", - "token_url": "https://new.example.com/token", - } + server_id="resolved-replacement", name="replacement", url="https://old.example.com/mcp", + transport=MCPTransport.http, auth_type=MCPAuth.oauth2, oauth2_flow="authorization_code", ) + replacement: Final = original.model_copy(update={ + "url": "https://new.example.com/mcp", "authorization_url": "https://new.example.com/authorize", + "token_url": "https://new.example.com/token", + }) manager.registry[original.server_id] = replacement assert await manager._rejoin_oauth_metadata_discovery(original, retry_stale=False) is replacement @@ -12927,11 +12871,8 @@ async def test_stale_discovery_falls_back_to_resolved_registered_server() -> Non def test_stale_discovery_cannot_overwrite_new_registered_server() -> None: manager: Final = MCPServerManager() original: Final = MCPServer( - server_id="stale-publication", - name="publication", - url="https://old.example.com/mcp", - transport=MCPTransport.http, - auth_type=MCPAuth.oauth2, + server_id="stale-publication", name="publication", url="https://old.example.com/mcp", + transport=MCPTransport.http, auth_type=MCPAuth.oauth2, ) manager._set_oauth_discovery_deferred(original.server_id, True) original_slot: Final = manager._oauth_discovery_slot(original.server_id) @@ -12947,13 +12888,9 @@ def test_stale_discovery_cannot_overwrite_new_registered_server() -> None: async def test_temporary_oauth_discovery_expires_without_more_requests() -> None: manager: Final = MCPServerManager() server: Final = MCPServer( - server_id="expiring-session", - name="temporary", - url="https://idp.example.com/mcp", - transport=MCPTransport.http, - auth_type=MCPAuth.true_passthrough, - authorization_url="https://idp.example.com/authorize", - token_url="https://idp.example.com/token", + server_id="expiring-session", name="temporary", url="https://idp.example.com/mcp", + transport=MCPTransport.http, auth_type=MCPAuth.true_passthrough, + authorization_url="https://idp.example.com/authorize", token_url="https://idp.example.com/token", ) manager._set_oauth_discovery_deferred(server.server_id, True) resolved: Final = await manager.ensure_oauth_metadata_discovered(server) @@ -13054,9 +12991,7 @@ async def test_openapi_health_reports_size_limit_as_unknown_and_caches_failure(r result = await manager.health_check_server(server.server_id) cached = await manager.health_check_server(server.server_id) assert result.status == "unknown" - assert ( - result.health_check_error == "OpenAPI specification probe refused: Response exceeds the configured size limit" - ) + assert result.health_check_error == "OpenAPI specification probe refused: Response exceeds the configured size limit" assert cached.health_check_error == result.health_check_error assert cached.last_health_check == result.last_health_check assert route.call_count == 1 @@ -13068,11 +13003,8 @@ async def test_openapi_health_cancellation_does_not_poison_cache(respx_mock, mon monkeypatch.setenv("DISABLE_AIOHTTP_TRANSPORT", "True") manager = MCPServerManager() server = MCPServer( - server_id="cancelled-cache", - name="cancelled-cache", - transport=MCPTransport.http, - spec_path="https://93.184.216.34/cancelled-cache.json", - auth_type=MCPAuth.none, + server_id="cancelled-cache", name="cancelled-cache", transport=MCPTransport.http, + spec_path="https://93.184.216.34/cancelled-cache.json", auth_type=MCPAuth.none, ) manager.registry = {server.server_id: server} started = asyncio.Event() @@ -13130,18 +13062,11 @@ class _DiscoveryUpstream: return httpx.Response(202) self.requests = (*self.requests, (payload.method, request.headers.get("authorization", ""))) if payload.method == "initialize": - return httpx.Response( - 200, - json={ - "jsonrpc": "2.0", - "id": payload.id, - "result": { - "protocolVersion": "2025-03-26", - "serverInfo": {"name": "discovery", "version": "1"}, - "capabilities": {} if self.outcome == "unsupported" else {"prompts": {}, "resources": {}}, - }, - }, - ) + return httpx.Response(200, json={ + "jsonrpc": "2.0", "id": payload.id, + "result": {"protocolVersion": "2025-03-26", "serverInfo": {"name": "discovery", "version": "1"}, + "capabilities": {} if self.outcome == "unsupported" else {"prompts": {}, "resources": {}}}, + }) self.entered.set() await self.release.wait() if self.outcome == "failure": @@ -13149,15 +13074,12 @@ class _DiscoveryUpstream: if self.outcome == "cancelled": raise asyncio.CancelledError() if self.outcome == "rejected": - return httpx.Response( - 200, json={"jsonrpc": "2.0", "id": payload.id, "error": {"code": -32601, "message": "Unsupported"}} - ) + return httpx.Response(200, json={"jsonrpc": "2.0", "id": payload.id, + "error": {"code": -32601, "message": "Unsupported"}}) result: Final = { "prompts/list": {"prompts": [{"name": "example", "description": "original"}]}, "resources/list": {"resources": [{"name": "example", "uri": "test://example", "description": "original"}]}, - "resources/templates/list": { - "resourceTemplates": [{"name": "example", "uriTemplate": "test://{name}", "description": "original"}] - }, + "resources/templates/list": {"resourceTemplates": [{"name": "example", "uriTemplate": "test://{name}", "description": "original"}]}, "tools/list": {"tools": []}, }[payload.method] return httpx.Response(200, json={"jsonrpc": "2.0", "id": payload.id, "result": result}) @@ -13168,9 +13090,7 @@ class _DiscoveryUpstream: def _discovery_server() -> MCPServer: - return MCPServer( - server_id="discovery", name="discovery", url="https://discovery.example/mcp", transport=MCPTransport.http - ) + return MCPServer(server_id="discovery", name="discovery", url="https://discovery.example/mcp", transport=MCPTransport.http) @pytest.mark.asyncio @@ -13181,11 +13101,8 @@ async def test_discovery_cache_reuses_raw_results_and_expires(kind: str) -> None clock: Final = _DiscoveryClock() manager: Final = MCPServerManager(discovery_clock=clock) upstream: Final = _DiscoveryUpstream() - operation: Final = { - "prompts": manager.get_prompts_from_server, - "resources": manager.get_resources_from_server, - "templates": manager.get_resource_templates_from_server, - }[kind] + operation: Final = {"prompts": manager.get_prompts_from_server, "resources": manager.get_resources_from_server, + "templates": manager.get_resource_templates_from_server}[kind] server: Final = _discovery_server() with respx.mock(base_url="https://discovery.example") as router: router.route().mock(side_effect=upstream.respond) @@ -13214,11 +13131,8 @@ async def test_discovery_cache_empty_results_and_failures(kind: str, outcome: st manager: Final = MCPServerManager() upstream: Final = _DiscoveryUpstream() upstream.outcome = outcome - operation: Final = { - "prompts": manager.get_prompts_from_server, - "resources": manager.get_resources_from_server, - "templates": manager.get_resource_templates_from_server, - }[kind] + operation: Final = {"prompts": manager.get_prompts_from_server, "resources": manager.get_resources_from_server, + "templates": manager.get_resource_templates_from_server}[kind] with respx.mock(base_url="https://discovery.example") as router: router.route().mock(side_effect=upstream.respond) assert await operation(_discovery_server(), None) == [] @@ -13245,20 +13159,9 @@ async def test_discovery_cache_isolates_forwarded_credentials_and_shares_static_ assert len(await manager.get_prompts_from_server(server, user)) == 1 assert upstream.initializes == 1 for credential in ("first-secret", "second-secret", "first-secret"): - assert ( - len( - await manager.get_prompts_from_server( - server, first_user, extra_headers={"Authorization": credential} - ) - ) - == 1 - ) + assert len(await manager.get_prompts_from_server(server, first_user, extra_headers={"Authorization": credential})) == 1 assert upstream.initializes == 3 - assert {auth for method, auth in upstream.requests if method == "prompts/list"} == { - "", - "first-secret", - "second-secret", - } + assert {auth for method, auth in upstream.requests if method == "prompts/list"} == {"", "first-secret", "second-secret"} @pytest.mark.asyncio @@ -13270,9 +13173,7 @@ async def test_discovery_cache_coalesces_and_survives_waiter_cancellation() -> N upstream.release.clear() with respx.mock(base_url="https://discovery.example") as router: router.route().mock(side_effect=upstream.respond) - tasks: Final = tuple( - asyncio.create_task(manager.get_prompts_from_server(_discovery_server(), None)) for _ in range(10) - ) + tasks: Final = tuple(asyncio.create_task(manager.get_prompts_from_server(_discovery_server(), None)) for _ in range(10)) await asyncio.wait_for(upstream.entered.wait(), timeout=5) tasks[0].cancel() with pytest.raises(asyncio.CancelledError): @@ -13321,9 +13222,7 @@ async def test_discovery_cache_can_be_disabled(monkeypatch: pytest.MonkeyPatch) assert upstream.initializes == 2 -@pytest.mark.parametrize( - "value,expected", (("invalid", 60.0), ("nan", 60.0), ("inf", 60.0), ("-1", 60.0), ("12.5", 12.5)) -) +@pytest.mark.parametrize("value,expected", (("invalid", 60.0), ("nan", 60.0), ("inf", 60.0), ("-1", 60.0), ("12.5", 12.5))) def test_discovery_cache_ttl_validation(value: str, expected: float, monkeypatch: pytest.MonkeyPatch) -> None: from litellm.proxy._experimental.mcp_server.mcp_server_manager import _mcp_discovery_cache_ttl @@ -13441,15 +13340,9 @@ async def test_discovery_cache_tracks_resolved_credentials_across_workers() -> N source: Final = CredentialSource() managers: Final = (MCPServerManager(cred_provider=source), MCPServerManager(cred_provider=source)) server: Final = MCPServer( - server_id="discovery", - name="discovery", - url="https://discovery.example/mcp", - transport=MCPTransport.http, - auth_type=MCPAuth.oauth2, - oauth2_flow="authorization_code", - client_id="discovery-client", - authorization_url="https://discovery.example/authorize", - token_url="https://discovery.example/token", + server_id="discovery", name="discovery", url="https://discovery.example/mcp", transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, oauth2_flow="authorization_code", client_id="discovery-client", + authorization_url="https://discovery.example/authorize", token_url="https://discovery.example/token", ) user: Final = UserAPIKeyAuth(user_id="same-user", api_key="same-key") upstream: Final = _DiscoveryUpstream() @@ -13468,15 +13361,11 @@ async def test_discovery_cache_tracks_resolved_credentials_across_workers() -> N with respx.mock(base_url="https://discovery.example") as router: router.route().mock(side_effect=respond) for manager in managers: - assert [item.name for item in await manager.get_prompts_from_server(server, user)] == [ - "discovery-account-a" - ] + assert [item.name for item in await manager.get_prompts_from_server(server, user)] == ["discovery-account-a"] assert upstream.initializes == 2 source.token = "token-b" for manager in managers: - assert [item.name for item in await manager.get_prompts_from_server(server, user)] == [ - "discovery-account-b" - ] + assert [item.name for item in await manager.get_prompts_from_server(server, user)] == ["discovery-account-b"] assert upstream.initializes == 4 source.token = None for manager in managers: @@ -13503,15 +13392,9 @@ async def test_discovery_resolves_stored_oauth_for_the_requesting_user() -> None store: Final = TokenStore() manager: Final = MCPServerManager(per_user_oauth_token_store=store) server: Final = MCPServer( - server_id="discovery", - name="discovery", - url="https://discovery.example/mcp", - transport=MCPTransport.http, - auth_type=MCPAuth.oauth2, - oauth2_flow="authorization_code", - client_id="discovery-client", - authorization_url="https://discovery.example/authorize", - token_url="https://discovery.example/token", + server_id="discovery", name="discovery", url="https://discovery.example/mcp", transport=MCPTransport.http, + auth_type=MCPAuth.oauth2, oauth2_flow="authorization_code", client_id="discovery-client", + authorization_url="https://discovery.example/authorize", token_url="https://discovery.example/token", ) user: Final = UserAPIKeyAuth(user_id="requesting-user") upstream: Final = _DiscoveryUpstream() diff --git a/tests/test_litellm/proxy/hooks/test_proxy_track_cost_callback.py b/tests/test_litellm/proxy/hooks/test_proxy_track_cost_callback.py index 61e11e72859..395ce68ec54 100644 --- a/tests/test_litellm/proxy/hooks/test_proxy_track_cost_callback.py +++ b/tests/test_litellm/proxy/hooks/test_proxy_track_cost_callback.py @@ -1886,15 +1886,9 @@ async def test_track_cost_callback_keeps_guardrail_cost_on_cache_hit(): } with ( - patch( # test-quality-ok: the callback imports this from proxy_server inside its body, so there is no injection seam - "litellm.proxy.proxy_server.increment_spend_counters", new_callable=AsyncMock - ) as mock_increment, - patch( # test-quality-ok: same function-body import, no injection seam - "litellm.proxy.proxy_server.update_cache", new_callable=AsyncMock - ), - patch( # test-quality-ok: same function-body import, no injection seam - "litellm.proxy.proxy_server.proxy_logging_obj" - ) as mock_proxy_logging, + patch("litellm.proxy.proxy_server.increment_spend_counters", new_callable=AsyncMock) as mock_increment, # test-quality-ok: the callback imports this from proxy_server inside its body, so there is no injection seam + patch("litellm.proxy.proxy_server.update_cache", new_callable=AsyncMock), # test-quality-ok: same function-body import, no injection seam + patch("litellm.proxy.proxy_server.proxy_logging_obj") as mock_proxy_logging, # test-quality-ok: same function-body import, no injection seam ): mock_proxy_logging.db_spend_update_writer.update_database = AsyncMock() mock_proxy_logging.slack_alerting_instance.customer_spend_alert = AsyncMock() From 56045503db817474e6f27e092d4f0b246a2d6ad8 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 12 Sep 2026 19:00:47 -0700 Subject: [PATCH 18/22] fix(proxy): bound tool and guardrail index create_many by the spend-log statement budgets (#40561) * fix(proxy): bound tool and guardrail index create_many by the spend-log statement budgets One flush drains up to MAX_LOGS_PER_INTERVAL source transactions or logs, but a transaction fans out to one LiteLLM_SpendLogToolIndex row per tool and a log to one LiteLLM_SpendLogGuardrailIndex row per guardrail, so the index create_many payload was unbounded. Both index writes now go through spend_log_write_batches(SPEND_LOG_WRITE_BATCH_MAX_BYTES, SPEND_LOG_WRITE_BATCH_MAX_ROWS). The tool index write moves out of the rollup batch_() so the split reduces the query-engine payload; replayed index rows are no-ops under skip_duplicates, and the daily rollup upserts stay in one transaction Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(proxy): pin the row budget in the index fan-out tests Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: yucheng Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/proxy/db/spend_log_tool_index.py | 36 ++++--- litellm/proxy/guardrails/usage_tracking.py | 13 +-- .../proxy/db/test_spend_log_tool_index.py | 93 ++++++++++++------- .../proxy/guardrails/test_usage_tracking.py | 54 +++++++++++ 4 files changed, 148 insertions(+), 48 deletions(-) diff --git a/litellm/proxy/db/spend_log_tool_index.py b/litellm/proxy/db/spend_log_tool_index.py index 93bbc567430..c01fe15fc09 100644 --- a/litellm/proxy/db/spend_log_tool_index.py +++ b/litellm/proxy/db/spend_log_tool_index.py @@ -5,8 +5,10 @@ At request time the spend writer builds one ToolUsageTransaction per request tha invoked tools (MCP namespaced tool name plus response tool_calls; declared-but-not- invoked tools are excluded) and queues it on the prisma client. The spend-log flush job drains the queue into LiteLLM_SpendLogToolIndex (per-request drill-down) and -LiteLLM_DailyToolSpend (the per-day rollup the Cost Optimization card reads) in a -single transaction, so a failed flush never leaves a partial rollup increment. +LiteLLM_DailyToolSpend (the per-day rollup the Cost Optimization card reads). The +index rows are keyed on (request_id, tool_name) and written with skip_duplicates, +so they go out as bounded standalone statements; every rollup upsert stays in one +transaction, so a failed flush never leaves a partial rollup increment. """ from __future__ import annotations @@ -19,7 +21,10 @@ from datetime import datetime, timezone from itertools import groupby from typing import TYPE_CHECKING, Any, Final +from litellm.constants import SPEND_LOG_WRITE_BATCH_MAX_BYTES, SPEND_LOG_WRITE_BATCH_MAX_ROWS from litellm.proxy._types import DB_RETRY_SAFE_ERROR_TYPES +from litellm.proxy.db.spend_log_batching import spend_log_write_batches +from litellm.repositories.table_repositories import SpendLogToolIndexRepository if TYPE_CHECKING: from litellm.proxy.utils import PrismaClient @@ -98,14 +103,19 @@ async def flush_tool_usage_transactions( transactions: Sequence[ToolUsageTransaction], n_retry_times: int = 3, ) -> None: - """Write index rows and rollup upserts for a drained queue batch in one - transaction. Retries only ConnectError, the one failure that proves the - statements never reached the database. Post-send failures (Read timeouts - and errors) are ambiguous and are NOT retried: the engine can abandon the - transaction open on the pooled connection, so a retry's statements stack - into the same transaction and one commit applies both increment sets. - Ambiguous failures drop the batch; the caller logs it at error. Callers - must not add their own retry around this function.""" + """Write the index rows as bounded standalone statements, then every rollup + upsert for the drained queue batch in one transaction. One flush fans out to + transactions x tools index rows, so the index write is split by the spend-log + statement budgets; a split inside ``batch_()`` would not help, since the + batcher ships every queued statement to the query engine as one payload. + Retries only ConnectError, the one failure that proves the statements never + reached the database; replayed index rows are no-ops under skip_duplicates. + Post-send failures (Read timeouts and errors) are ambiguous and are NOT + retried: the engine can abandon the transaction open on the pooled + connection, so a retry's statements stack into the same transaction and one + commit applies both increment sets. Ambiguous failures drop the batch; the + caller logs it at error. Callers must not add their own retry around this + function.""" if not transactions: return @@ -119,10 +129,14 @@ async def flush_tool_usage_transactions( key=lambda entry: (entry[0], entry[1]), ) + index_table: Final = SpendLogToolIndexRepository(prisma_client).table for attempt in range(n_retry_times + 1): try: + for statement_rows in spend_log_write_batches( + index_rows, SPEND_LOG_WRITE_BATCH_MAX_BYTES, SPEND_LOG_WRITE_BATCH_MAX_ROWS + ): + await index_table.create_many(data=statement_rows, skip_duplicates=True) async with prisma_client.db.batch_() as batcher: - batcher.litellm_spendlogtoolindex.create_many(data=index_rows, skip_duplicates=True) for (date_key, tool_name), grouped in groupby(per_tool_day, key=lambda entry: (entry[0], entry[1])): entries = tuple(grouped) spend = sum(entry[2] for entry in entries) diff --git a/litellm/proxy/guardrails/usage_tracking.py b/litellm/proxy/guardrails/usage_tracking.py index df967058cf0..797323794d2 100644 --- a/litellm/proxy/guardrails/usage_tracking.py +++ b/litellm/proxy/guardrails/usage_tracking.py @@ -17,8 +17,10 @@ from typing import TYPE_CHECKING, Any, Final, NamedTuple, TypeVar from typing_extensions import ReadOnly, TypedDict from litellm._logging import verbose_proxy_logger +from litellm.constants import SPEND_LOG_WRITE_BATCH_MAX_BYTES, SPEND_LOG_WRITE_BATCH_MAX_ROWS from litellm.litellm_core_utils.llm_cost_calc.guardrail_cost import billed_guardrail_cost_by_unit from litellm.proxy._types import DB_RETRY_SAFE_ERROR_TYPES +from litellm.proxy.db.spend_log_batching import spend_log_write_batches from litellm.proxy.utils import PrismaClient from litellm.repositories.table_repositories import ( DailyGuardrailMetricsRepository, @@ -401,13 +403,12 @@ async def process_spend_logs_guardrail_usage( return try: - # Insert index rows (skip duplicates by request_id + guardrail_id) - if index_rows: + index_table: Final = SpendLogGuardrailIndexRepository(prisma_client).table + for statement_rows in spend_log_write_batches( + index_rows, SPEND_LOG_WRITE_BATCH_MAX_BYTES, SPEND_LOG_WRITE_BATCH_MAX_ROWS + ): try: - await SpendLogGuardrailIndexRepository(prisma_client).table.create_many( - data=index_rows, - skip_duplicates=True, - ) + await index_table.create_many(data=statement_rows, skip_duplicates=True) except Exception as e: verbose_proxy_logger.debug("Guardrail usage tracking: index create_many skipped: %s", e) diff --git a/tests/test_litellm/proxy/db/test_spend_log_tool_index.py b/tests/test_litellm/proxy/db/test_spend_log_tool_index.py index 9c4fbbf41aa..282c2a7cfaa 100644 --- a/tests/test_litellm/proxy/db/test_spend_log_tool_index.py +++ b/tests/test_litellm/proxy/db/test_spend_log_tool_index.py @@ -1,15 +1,17 @@ """ Tests for the tool usage writer: ToolUsageTransaction construction (invoked tools -only) and the flush that writes LiteLLM_SpendLogToolIndex plus the -LiteLLM_DailyToolSpend rollup in one transaction. +only) and the flush that writes LiteLLM_SpendLogToolIndex in bounded statements +plus the LiteLLM_DailyToolSpend rollup in one transaction. """ from types import SimpleNamespace from typing import Any from unittest.mock import AsyncMock, MagicMock +import httpx import pytest +from litellm.proxy.db import spend_log_tool_index from litellm.proxy.db.spend_log_tool_index import ( ToolUsageTransaction, build_tool_usage_transaction, @@ -35,11 +37,24 @@ class _FakeBatcher: return None +def _prisma(batch_: MagicMock) -> MagicMock: + prisma = MagicMock() + prisma.db.batch_ = batch_ + prisma.db.litellm_spendlogtoolindex.create_many = AsyncMock() + return prisma + + def _prisma_with_batcher() -> tuple[MagicMock, _FakeBatcher]: batcher = _FakeBatcher() - prisma = MagicMock() - prisma.db.batch_ = MagicMock(return_value=batcher) - return prisma, batcher + return _prisma(MagicMock(return_value=batcher)), batcher + + +def _index_rows_written(prisma: MagicMock) -> list[tuple[str, str]]: + return [ + (row["request_id"], row["tool_name"]) + for call in prisma.db.litellm_spendlogtoolindex.create_many.call_args_list + for row in call.kwargs["data"] + ] class TestBuildToolUsageTransaction: @@ -228,9 +243,8 @@ class TestFlushToolUsageTransactions: prisma_client=prisma, transactions=[_transaction("r1", tool_names=("tool_a", "tool_b"), spend=0.10, total_tokens=100)], ) - index_rows = batcher.litellm_spendlogtoolindex.create_many.call_args.kwargs["data"] - assert [(r["request_id"], r["tool_name"]) for r in index_rows] == [("r1", "tool_a"), ("r1", "tool_b")] - assert batcher.litellm_spendlogtoolindex.create_many.call_args.kwargs["skip_duplicates"] is True + assert _index_rows_written(prisma) == [("r1", "tool_a"), ("r1", "tool_b")] + assert prisma.db.litellm_spendlogtoolindex.create_many.call_args.kwargs["skip_duplicates"] is True upserts = { c.kwargs["where"]["date_tool_name"]["tool_name"]: c.kwargs["data"] @@ -267,19 +281,46 @@ class TestFlushToolUsageTransactions: assert data["update"]["request_count"] == {"increment": 2} @pytest.mark.asyncio - async def test_index_rows_and_rollup_share_one_transaction(self): - # Both writes go through the same batch_() so a failed flush cannot leave - # index rows without their rollup increments (or vice versa); increments - # are not idempotent, so partial states must be unreachable. + async def test_index_rows_are_written_in_bounded_statements_outside_the_rollup_transaction(self, monkeypatch): + monkeypatch.setattr(spend_log_tool_index, "SPEND_LOG_WRITE_BATCH_MAX_ROWS", 100) prisma, batcher = _prisma_with_batcher() - await flush_tool_usage_transactions( - prisma_client=prisma, - transactions=[_transaction("r1")], - ) + tool_names = tuple(f"tool_{i}" for i in range(50)) + transactions = [_transaction(f"r{i}", tool_names=tool_names) for i in range(5)] + await flush_tool_usage_transactions(prisma_client=prisma, transactions=transactions) + + statements = prisma.db.litellm_spendlogtoolindex.create_many.call_args_list + assert [len(call.kwargs["data"]) for call in statements] == [100, 100, 50] + assert all(call.kwargs["skip_duplicates"] is True for call in statements) + assert _index_rows_written(prisma) == [ + (txn.request_id, tool_name) for txn in transactions for tool_name in tool_names + ] + batcher.litellm_spendlogtoolindex.create_many.assert_not_called() + prisma.db.batch_.assert_called_once() + assert batcher.litellm_dailytoolspend.upsert.call_count == len(tool_names) + + @pytest.mark.asyncio + async def test_index_connection_error_is_retried_before_the_rollup_is_attempted(self, monkeypatch): + prisma, batcher = _prisma_with_batcher() + prisma.db.litellm_spendlogtoolindex.create_many = AsyncMock(side_effect=[httpx.ConnectError("down"), None]) + + async def fake_sleep(seconds: float) -> None: + return None + + monkeypatch.setattr("litellm.proxy.db.spend_log_tool_index.asyncio.sleep", fake_sleep) + await flush_tool_usage_transactions(prisma_client=prisma, transactions=[_transaction("r1")]) + assert prisma.db.litellm_spendlogtoolindex.create_many.await_count == 2 prisma.db.batch_.assert_called_once() - batcher.litellm_spendlogtoolindex.create_many.assert_called_once() batcher.litellm_dailytoolspend.upsert.assert_called_once() + @pytest.mark.asyncio + async def test_ambiguous_index_error_drops_the_batch_without_touching_the_rollup(self): + prisma, _ = _prisma_with_batcher() + prisma.db.litellm_spendlogtoolindex.create_many = AsyncMock(side_effect=httpx.ReadTimeout("ambiguous")) + with pytest.raises(httpx.ReadTimeout): + await flush_tool_usage_transactions(prisma_client=prisma, transactions=[_transaction("r1")]) + prisma.db.litellm_spendlogtoolindex.create_many.assert_awaited_once() + prisma.db.batch_.assert_not_called() + @pytest.mark.asyncio async def test_empty_batch_touches_nothing(self): prisma, _ = _prisma_with_batcher() @@ -290,11 +331,8 @@ class TestFlushToolUsageTransactions: async def test_connection_errors_retry_and_succeed(self, monkeypatch): # A failed batch commits nothing, so retrying a connection error cannot # double-count; the flush must retry rather than drop the batch. - import httpx - batcher = _FakeBatcher() - prisma = MagicMock() - prisma.db.batch_ = MagicMock(side_effect=[httpx.ConnectError("down"), batcher]) + prisma = _prisma(MagicMock(side_effect=[httpx.ConnectError("down"), batcher])) sleeps: list[float] = [] async def fake_sleep(seconds: float) -> None: @@ -308,10 +346,7 @@ class TestFlushToolUsageTransactions: @pytest.mark.asyncio async def test_connection_errors_exhaust_retries_then_raise(self, monkeypatch): - import httpx - - prisma = MagicMock() - prisma.db.batch_ = MagicMock(side_effect=httpx.ConnectError("down")) + prisma = _prisma(MagicMock(side_effect=httpx.ConnectError("down"))) async def fake_sleep(seconds: float) -> None: return None @@ -325,8 +360,7 @@ class TestFlushToolUsageTransactions: @pytest.mark.asyncio async def test_non_connection_errors_do_not_retry(self): - prisma = MagicMock() - prisma.db.batch_ = MagicMock(side_effect=ValueError("bad data")) + prisma = _prisma(MagicMock(side_effect=ValueError("bad data"))) with pytest.raises(ValueError, match="bad data"): await flush_tool_usage_transactions(prisma_client=prisma, transactions=[_transaction("r1")]) prisma.db.batch_.assert_called_once() @@ -338,11 +372,8 @@ class TestFlushToolUsageTransactions: # unknown; the engine can leave the transaction open on the pooled # connection, so a retry's statements would stack into it and one # commit would apply both increment sets. These must never retry. - import httpx - error = getattr(httpx, ambiguous_error)("ambiguous") - prisma = MagicMock() - prisma.db.batch_ = MagicMock(side_effect=error) + prisma = _prisma(MagicMock(side_effect=error)) with pytest.raises((httpx.ReadTimeout, httpx.ReadError)): await flush_tool_usage_transactions(prisma_client=prisma, transactions=[_transaction("r1")]) prisma.db.batch_.assert_called_once() diff --git a/tests/test_litellm/proxy/guardrails/test_usage_tracking.py b/tests/test_litellm/proxy/guardrails/test_usage_tracking.py index 110de7dbe70..85f22e1f307 100644 --- a/tests/test_litellm/proxy/guardrails/test_usage_tracking.py +++ b/tests/test_litellm/proxy/guardrails/test_usage_tracking.py @@ -6,6 +6,7 @@ from unittest.mock import AsyncMock, MagicMock import httpx import pytest +from litellm.proxy.guardrails import usage_tracking from litellm.proxy.guardrails.usage_tracking import ( _MAX_PENDING_ROWS, PendingRollups, @@ -511,3 +512,56 @@ async def test_requeued_cost_is_added_to_the_next_flush(): costs = _cost_upserts(recovered) assert costs["contentPolicyUnits"] == (pytest.approx(0.45), 0) assert costs["someFutureCounter"] == (0.0, 7) + + +def _fan_out_payload(request_id: str, guardrail_ids: tuple[str, ...]) -> dict[str, Any]: + return { + "request_id": request_id, + "startTime": datetime(2026, 8, 17, 12, 0, tzinfo=timezone.utc), + "team_id": "team-a", + "api_key": "hashed-key-1", + "metadata": json.dumps( + {"guardrail_information": [{"guardrail_id": gid, "guardrail_status": "success"} for gid in guardrail_ids]} + ), + } + + +def _index_rows_written(prisma: MagicMock) -> list[tuple[str, str]]: + return [ + (row["request_id"], row["guardrail_id"]) + for call in prisma.db.litellm_spendlogguardrailindex.create_many.call_args_list + for row in call.kwargs["data"] + ] + + +@pytest.mark.asyncio +async def test_index_rows_are_written_in_row_bounded_statements(monkeypatch): + """ + LIT-5931: the drain caps logs, not logs x guardrails, so a fan-out must be + split into statements the query engine can afford instead of one create_many. + """ + monkeypatch.setattr(usage_tracking, "SPEND_LOG_WRITE_BATCH_MAX_ROWS", 100) + prisma = _prisma() + guardrail_ids = tuple(f"guard-{i}" for i in range(50)) + logs = [_fan_out_payload(f"r{i}", guardrail_ids) for i in range(5)] + + await process_spend_logs_guardrail_usage(prisma, logs, pending=PendingRollups()) + + statements = prisma.db.litellm_spendlogguardrailindex.create_many.call_args_list + assert [len(call.kwargs["data"]) for call in statements] == [100, 100, 50] + assert all(call.kwargs["skip_duplicates"] is True for call in statements) + assert _index_rows_written(prisma) == [(f"r{i}", gid) for i in range(5) for gid in guardrail_ids] + + +@pytest.mark.asyncio +async def test_one_failing_index_statement_does_not_drop_the_others_or_the_rollup(monkeypatch): + monkeypatch.setattr(usage_tracking, "SPEND_LOG_WRITE_BATCH_MAX_ROWS", 100) + prisma = _prisma() + prisma.db.litellm_spendlogguardrailindex.create_many.side_effect = [None, httpx.ReadTimeout("ambiguous"), None] + guardrail_ids = tuple(f"guard-{i}" for i in range(50)) + logs = [_fan_out_payload(f"r{i}", guardrail_ids) for i in range(5)] + + await process_spend_logs_guardrail_usage(prisma, logs, pending=PendingRollups()) + + assert prisma.db.litellm_spendlogguardrailindex.create_many.await_count == 3 + assert prisma.db.litellm_dailyguardrailmetrics.upsert.await_count == len(guardrail_ids) From 0904051fda4e3f07c59ecca731eb3c5b94b92817 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2026 03:24:23 +0000 Subject: [PATCH 19/22] refactor(fireworks): move cost map key construction under llms/ Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/llms/fireworks_ai/common_utils.py | 4 ++++ litellm/utils.py | 4 ++-- .../test_fireworks_ai_common_utils.py | 16 +++++++++++++--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/litellm/llms/fireworks_ai/common_utils.py b/litellm/llms/fireworks_ai/common_utils.py index 21a630a76d7..b5552583862 100644 --- a/litellm/llms/fireworks_ai/common_utils.py +++ b/litellm/llms/fireworks_ai/common_utils.py @@ -72,6 +72,10 @@ def resolve_fireworks_resource_name(model: str) -> str: return f"accounts/fireworks/models/{stripped}" +def fireworks_cost_map_key(model: str) -> str: + return f"fireworks_ai/{resolve_fireworks_resource_name(model)}" + + class FireworksAIMixin: """ Common Base Config functions across Fireworks AI Endpoints diff --git a/litellm/utils.py b/litellm/utils.py index 4a92f9b1244..d088ae7264f 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -5557,9 +5557,9 @@ def _get_potential_model_names(model: str, custom_llm_provider: str | None) -> P split_model = strip_bedrock_routing_prefix(split_model) if custom_llm_provider == "fireworks_ai": - from litellm.llms.fireworks_ai.common_utils import resolve_fireworks_resource_name + from litellm.llms.fireworks_ai.common_utils import fireworks_cost_map_key - provider_prefixed_model_name = f"fireworks_ai/{resolve_fireworks_resource_name(split_model)}" + provider_prefixed_model_name = fireworks_cost_map_key(split_model) return PotentialModelNamesAndCustomLLMProvider( split_model=split_model, diff --git a/tests/test_litellm/llms/fireworks_ai/test_fireworks_ai_common_utils.py b/tests/test_litellm/llms/fireworks_ai/test_fireworks_ai_common_utils.py index 16226a3ce74..5aa1429f2e7 100644 --- a/tests/test_litellm/llms/fireworks_ai/test_fireworks_ai_common_utils.py +++ b/tests/test_litellm/llms/fireworks_ai/test_fireworks_ai_common_utils.py @@ -1,8 +1,6 @@ - import pytest - -from litellm.llms.fireworks_ai.common_utils import resolve_fireworks_resource_name +from litellm.llms.fireworks_ai.common_utils import fireworks_cost_map_key, resolve_fireworks_resource_name @pytest.mark.parametrize( @@ -43,3 +41,15 @@ from litellm.llms.fireworks_ai.common_utils import resolve_fireworks_resource_na ) def test_resolve_fireworks_resource_name(model, expected): assert resolve_fireworks_resource_name(model) == expected + + +@pytest.mark.parametrize( + "model, expected", + [ + ("deepseek-r1", "fireworks_ai/accounts/fireworks/models/deepseek-r1"), + ("glm-5p3-fast", "fireworks_ai/accounts/fireworks/routers/glm-5p3-fast"), + ("accounts/fireworks/models/deepseek-r1", "fireworks_ai/accounts/fireworks/models/deepseek-r1"), + ], +) +def test_fireworks_cost_map_key(model: str, expected: str) -> None: + assert fireworks_cost_map_key(model) == expected From a519d805bb35abad5ba736d0e785aebe813cca26 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2026 03:29:11 +0000 Subject: [PATCH 20/22] refactor(fireworks): resolve cost map key through a provider config hook Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/llms/base_llm/base_utils.py | 6 ++++++ litellm/llms/fireworks_ai/chat/transformation.py | 3 +++ litellm/llms/fireworks_ai/common_utils.py | 4 ---- litellm/utils.py | 14 +++++++++----- .../test_fireworks_ai_chat_transformation.py | 12 ++++++++++++ .../test_fireworks_ai_common_utils.py | 16 +++------------- 6 files changed, 33 insertions(+), 22 deletions(-) diff --git a/litellm/llms/base_llm/base_utils.py b/litellm/llms/base_llm/base_utils.py index c5290b41f7b..c9ef7d77ed8 100644 --- a/litellm/llms/base_llm/base_utils.py +++ b/litellm/llms/base_llm/base_utils.py @@ -50,6 +50,12 @@ class BaseLLMModelInfo(ABC): """ return None + def get_model_cost_key(self, model: str) -> str | None: + """ + Extra `litellm.model_cost` key to try for this provider's spelling of `model`, after the exact keys miss. + """ + return None + @abstractmethod def get_models(self, api_key: str | None = None, api_base: str | None = None) -> list[str]: """ diff --git a/litellm/llms/fireworks_ai/chat/transformation.py b/litellm/llms/fireworks_ai/chat/transformation.py index b4e1856f499..05160d83c12 100644 --- a/litellm/llms/fireworks_ai/chat/transformation.py +++ b/litellm/llms/fireworks_ai/chat/transformation.py @@ -602,6 +602,9 @@ class FireworksAIConfig(FireworksAIMixin, OpenAIGPTConfig): return None return max(matches, key=lambda match: len(match[0]))[1] + def get_model_cost_key(self, model: str) -> str: + return f"fireworks_ai/{resolve_fireworks_resource_name(model)}" + def get_provider_info(self, model: str) -> ProviderSpecificModelInfo: supports_function_calling_value: Final = self._get_model_cost_capability( model=model, capability="supports_function_calling" diff --git a/litellm/llms/fireworks_ai/common_utils.py b/litellm/llms/fireworks_ai/common_utils.py index b5552583862..21a630a76d7 100644 --- a/litellm/llms/fireworks_ai/common_utils.py +++ b/litellm/llms/fireworks_ai/common_utils.py @@ -72,10 +72,6 @@ def resolve_fireworks_resource_name(model: str) -> str: return f"accounts/fireworks/models/{stripped}" -def fireworks_cost_map_key(model: str) -> str: - return f"fireworks_ai/{resolve_fireworks_resource_name(model)}" - - class FireworksAIMixin: """ Common Base Config functions across Fireworks AI Endpoints diff --git a/litellm/utils.py b/litellm/utils.py index d088ae7264f..edfdde55699 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -5556,17 +5556,21 @@ def _get_potential_model_names(model: str, custom_llm_provider: str | None) -> P split_model = strip_bedrock_routing_prefix(split_model) - if custom_llm_provider == "fireworks_ai": - from litellm.llms.fireworks_ai.common_utils import fireworks_cost_map_key - - provider_prefixed_model_name = fireworks_cost_map_key(split_model) + provider_model_info: Final = ( + ProviderConfigManager.get_provider_model_info(model=split_model, provider=LlmProviders(custom_llm_provider)) + if custom_llm_provider in LlmProvidersSet + else None + ) + provider_cost_key: Final = ( + provider_model_info.get_model_cost_key(split_model) if provider_model_info is not None else None + ) return PotentialModelNamesAndCustomLLMProvider( split_model=split_model, combined_model_name=combined_model_name, stripped_model_name=stripped_model_name, combined_stripped_model_name=combined_stripped_model_name, - provider_prefixed_model_name=provider_prefixed_model_name, + provider_prefixed_model_name=provider_cost_key or provider_prefixed_model_name, custom_llm_provider=cast(str, custom_llm_provider), ) diff --git a/tests/test_litellm/llms/fireworks_ai/chat/test_fireworks_ai_chat_transformation.py b/tests/test_litellm/llms/fireworks_ai/chat/test_fireworks_ai_chat_transformation.py index 8479397efa7..fb0311ef39b 100644 --- a/tests/test_litellm/llms/fireworks_ai/chat/test_fireworks_ai_chat_transformation.py +++ b/tests/test_litellm/llms/fireworks_ai/chat/test_fireworks_ai_chat_transformation.py @@ -1813,3 +1813,15 @@ def test_streaming_preserves_selected_model_for_private_accounting(): completion_response=assembled, custom_llm_provider="fireworks_ai", ) == pytest.approx(expected_cost) + + +@pytest.mark.parametrize( + "model, expected", + [ + ("deepseek-r1", "fireworks_ai/accounts/fireworks/models/deepseek-r1"), + ("glm-5p3-fast", "fireworks_ai/accounts/fireworks/routers/glm-5p3-fast"), + ("accounts/fireworks/models/deepseek-r1", "fireworks_ai/accounts/fireworks/models/deepseek-r1"), + ], +) +def test_get_model_cost_key_resolves_short_names_to_long_keys(model: str, expected: str) -> None: + assert FireworksAIConfig().get_model_cost_key(model) == expected diff --git a/tests/test_litellm/llms/fireworks_ai/test_fireworks_ai_common_utils.py b/tests/test_litellm/llms/fireworks_ai/test_fireworks_ai_common_utils.py index 5aa1429f2e7..16226a3ce74 100644 --- a/tests/test_litellm/llms/fireworks_ai/test_fireworks_ai_common_utils.py +++ b/tests/test_litellm/llms/fireworks_ai/test_fireworks_ai_common_utils.py @@ -1,6 +1,8 @@ + import pytest -from litellm.llms.fireworks_ai.common_utils import fireworks_cost_map_key, resolve_fireworks_resource_name + +from litellm.llms.fireworks_ai.common_utils import resolve_fireworks_resource_name @pytest.mark.parametrize( @@ -41,15 +43,3 @@ from litellm.llms.fireworks_ai.common_utils import fireworks_cost_map_key, resol ) def test_resolve_fireworks_resource_name(model, expected): assert resolve_fireworks_resource_name(model) == expected - - -@pytest.mark.parametrize( - "model, expected", - [ - ("deepseek-r1", "fireworks_ai/accounts/fireworks/models/deepseek-r1"), - ("glm-5p3-fast", "fireworks_ai/accounts/fireworks/routers/glm-5p3-fast"), - ("accounts/fireworks/models/deepseek-r1", "fireworks_ai/accounts/fireworks/models/deepseek-r1"), - ], -) -def test_fireworks_cost_map_key(model: str, expected: str) -> None: - assert fireworks_cost_map_key(model) == expected From f1fe61af06ddefcf086ec831cc172107c6e8c886 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2026 03:36:00 +0000 Subject: [PATCH 21/22] docs(fireworks): explain what get_model_cost_key is for Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/llms/base_llm/base_utils.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/litellm/llms/base_llm/base_utils.py b/litellm/llms/base_llm/base_utils.py index c9ef7d77ed8..32f98fbc933 100644 --- a/litellm/llms/base_llm/base_utils.py +++ b/litellm/llms/base_llm/base_utils.py @@ -52,7 +52,10 @@ class BaseLLMModelInfo(ABC): def get_model_cost_key(self, model: str) -> str | None: """ - Extra `litellm.model_cost` key to try for this provider's spelling of `model`, after the exact keys miss. + Maps the model name a user sends to the key `litellm.model_cost` stores it under, when the two differ. + `get_model_info` tries this key once the exact `model` and `provider/model` keys miss. The default None means + the provider's user-facing names already match the cost map, so there is nothing extra to try. Fireworks + overrides it: `deepseek-r1` -> `fireworks_ai/accounts/fireworks/models/deepseek-r1`. """ return None From 7a0ea9867df1573f3847b6cd227dd39be7c2a8fa Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2026 03:38:14 +0000 Subject: [PATCH 22/22] docs(fireworks): drop provider example from get_model_cost_key docstring Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/llms/base_llm/base_utils.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/litellm/llms/base_llm/base_utils.py b/litellm/llms/base_llm/base_utils.py index 32f98fbc933..a446a721307 100644 --- a/litellm/llms/base_llm/base_utils.py +++ b/litellm/llms/base_llm/base_utils.py @@ -54,8 +54,7 @@ class BaseLLMModelInfo(ABC): """ Maps the model name a user sends to the key `litellm.model_cost` stores it under, when the two differ. `get_model_info` tries this key once the exact `model` and `provider/model` keys miss. The default None means - the provider's user-facing names already match the cost map, so there is nothing extra to try. Fireworks - overrides it: `deepseek-r1` -> `fireworks_ai/accounts/fireworks/models/deepseek-r1`. + the provider's user-facing names already match the cost map, so there is nothing extra to try. """ return None