From 3a56358fd5e2524cda706386366cde0de651c7ef Mon Sep 17 00:00:00 2001 From: puffer <389053104@qq.com> Date: Thu, 23 Jul 2026 10:22:27 +0800 Subject: [PATCH] fix(responses): preserve websocket api key --- litellm/responses/main.py | 1 + .../test_responses_websocket_all_providers.py | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/litellm/responses/main.py b/litellm/responses/main.py index 206736f501a..8f7b3177cba 100644 --- a/litellm/responses/main.py +++ b/litellm/responses/main.py @@ -2031,6 +2031,7 @@ async def _aresponses_websocket( resolved_api_base = dynamic_api_base or litellm_params.api_base or litellm.api_base or None resolved_api_key = ( dynamic_api_key + or api_key or litellm_params.api_key or litellm.api_key or litellm.openai_key diff --git a/tests/test_litellm/responses/test_responses_websocket_all_providers.py b/tests/test_litellm/responses/test_responses_websocket_all_providers.py index 4509abc7749..8097305fd8d 100644 --- a/tests/test_litellm/responses/test_responses_websocket_all_providers.py +++ b/tests/test_litellm/responses/test_responses_websocket_all_providers.py @@ -102,6 +102,32 @@ class TestResponsesAPIWebSocketSupport: def test_openai_model_in_websocket_url_default(self): assert OpenAIResponsesAPIConfig().model_in_websocket_url() is True + @pytest.mark.asyncio + async def test_openai_websocket_forwards_explicit_api_key(self, monkeypatch): + from unittest.mock import AsyncMock + + import litellm + from litellm.responses import main as responses_main + + websocket_handler = AsyncMock() + monkeypatch.setattr(litellm, "api_key", None) + monkeypatch.setattr(litellm, "openai_key", None) + monkeypatch.delenv("OPENAI_API_KEY", raising=False) + monkeypatch.setattr( + responses_main.base_llm_http_handler, + "async_responses_websocket", + websocket_handler, + ) + + await responses_main._aresponses_websocket.__wrapped__( + model="gpt-4o", + websocket=MagicMock(), + api_key="explicit-api-key", + litellm_logging_obj=MagicMock(), + ) + + assert websocket_handler.await_args.kwargs["api_key"] == "explicit-api-key" + def test_xai_uses_managed_websocket(self): """XAI should use managed websocket handler""" config = XAIResponsesAPIConfig()