diff --git a/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py b/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py index 2ea46b740a8..b6eada59f69 100644 --- a/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py +++ b/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py @@ -852,6 +852,8 @@ async def handle_bedrock_passthrough_router_model( data["method"] = request.method data["endpoint"] = endpoint data["data"] = request_body + if isinstance(request_body.get("messages"), list): + data["messages"] = request_body["messages"] data["custom_llm_provider"] = "bedrock" # Use the common passthrough processing to handle metadata and hooks diff --git a/tests/test_litellm/proxy/pass_through_endpoints/test_llm_pass_through_endpoints.py b/tests/test_litellm/proxy/pass_through_endpoints/test_llm_pass_through_endpoints.py index d9969dd1dc9..54c09b8a2e3 100644 --- a/tests/test_litellm/proxy/pass_through_endpoints/test_llm_pass_through_endpoints.py +++ b/tests/test_litellm/proxy/pass_through_endpoints/test_llm_pass_through_endpoints.py @@ -1535,6 +1535,65 @@ class TestBedrockLLMProxyRoute: assert call_kwargs["model"] == "anthropic.claude-3-sonnet-20240229-v1:0" assert result == "success" + @pytest.mark.asyncio + async def test_bedrock_router_passthrough_preserves_messages_for_logging(self): + from litellm.proxy.pass_through_endpoints.llm_passthrough_endpoints import ( + handle_bedrock_passthrough_router_model, + ) + + mock_request = MagicMock(spec=Request) + mock_request.method = "POST" + mock_request.headers = {"content-type": "application/json"} + mock_request.query_params = {} + mock_request.url = MagicMock() + mock_request.url.path = "/bedrock/model/test-model/converse" + + request_messages = [ + { + "role": "user", + "content": [ + {"text": "Give me 5 Kubernetes image security best practices."} + ], + } + ] + mock_request_body = { + "messages": request_messages, + "inferenceConfig": {"maxTokens": 4096, "temperature": 1}, + } + + mock_processor = Mock() + mock_processor.base_passthrough_process_llm_request = AsyncMock( + return_value="success" + ) + + with patch( + "litellm.proxy.common_request_processing.ProxyBaseLLMRequestProcessing", + return_value=mock_processor, + ) as mock_processor_cls: + result = await handle_bedrock_passthrough_router_model( + model="test-model", + endpoint="model/test-model/converse", + request=mock_request, + request_body=mock_request_body, + llm_router=Mock(), + user_api_key_dict=Mock(), + proxy_logging_obj=Mock(), + general_settings={}, + proxy_config=None, + select_data_generator=None, + user_model=None, + user_temperature=None, + user_request_timeout=None, + user_max_tokens=None, + user_api_base=None, + version=None, + ) + + initialized_data = mock_processor_cls.call_args.kwargs["data"] + assert initialized_data["data"] == mock_request_body + assert initialized_data["messages"] == request_messages + assert result == "success" + @pytest.mark.asyncio async def test_bedrock_error_handling_returns_actual_error(self): """