From 16280d9fa93e0370fd132a9a72c151b56fdacc67 Mon Sep 17 00:00:00 2001 From: "Jugal D. Bhatt" <55304795+jugaldb@users.noreply.github.com> Date: Thu, 15 May 2025 10:31:37 -0500 Subject: [PATCH] added fix to resolve delete API (#10845) * added fix to resolve delete API * add get requests to ignore model and add test cases --- litellm/proxy/route_llm_request.py | 2 +- tests/litellm/proxy/test_route_llm_request.py | 68 +++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/litellm/proxy/route_llm_request.py b/litellm/proxy/route_llm_request.py index ef5edaff996..eea6f37189a 100644 --- a/litellm/proxy/route_llm_request.py +++ b/litellm/proxy/route_llm_request.py @@ -103,7 +103,7 @@ async def route_request( or len(llm_router.pattern_router.patterns) > 0 ): return getattr(llm_router, f"{route_type}")(**data) - elif route_type == "amoderation": + elif route_type in ["amoderation", "aget_responses", "adelete_responses"]: # moderation endpoint does not require `model` parameter return getattr(llm_router, f"{route_type}")(**data) diff --git a/tests/litellm/proxy/test_route_llm_request.py b/tests/litellm/proxy/test_route_llm_request.py index 6e8fedf0cb8..db6a23f9253 100644 --- a/tests/litellm/proxy/test_route_llm_request.py +++ b/tests/litellm/proxy/test_route_llm_request.py @@ -44,3 +44,71 @@ async def test_route_request_dynamic_credentials(route_type): assert response == "fake_response" # Now assert that the dynamic method was called once with the expected kwargs. getattr(llm_router, route_type).assert_called_once_with(**data) + +@pytest.mark.asyncio +async def test_route_request_no_model_required(): + """Test route types that don't require model parameter""" + test_cases = [ + "amoderation", + "aget_responses", + "adelete_responses" + ] + + for route_type in test_cases: + # Test data without model parameter + data = { + "input": "test input", + "api_key": "test-key" + } + + llm_router = MagicMock() + getattr(llm_router, route_type).return_value = "fake_response" + + response = await route_request(data, llm_router, None, route_type) + + # Verify response + assert response == "fake_response" + # Verify the method was called with correct parameters + getattr(llm_router, route_type).assert_called_once_with(**data) + + # Reset mock for next iteration + llm_router.reset_mock() + + +@pytest.mark.asyncio +async def test_route_request_no_model_required_with_router_settings(): + """Test route types that don't require model parameter with router settings""" + test_cases = [ + "amoderation", + "aget_responses", + "adelete_responses" + ] + + for route_type in test_cases: + # Test data with model parameter (it will be ignored for these route types) + data = { + "input": "test input", + "model": "test-model" # Include dummy model to avoid KeyError + } + + llm_router = MagicMock() + # Set up router settings + llm_router.router_general_settings.pass_through_all_models = False + llm_router.default_deployment = None + llm_router.pattern_router.patterns = [] + llm_router.model_names = [] # Empty model names list + llm_router.get_model_ids.return_value = [] # Empty model IDs + llm_router.model_group_alias = None # No model group alias + + # Mock the async route call + getattr(llm_router, route_type).return_value = "fake_response" + + # Run the request + response = await route_request(data, llm_router, None, route_type) + + # Assert the mocked method was called with expected input + assert response == "fake_response" + getattr(llm_router, route_type).assert_called_once_with(**data) + + # Reset the mock for the next route + llm_router.reset_mock() \ No newline at end of file