9
9
from PIL import Image , ImageChops
10
10
from transformers import AutoConfig , AutoTokenizer
11
11
12
- from vllm .multimodal .utils import (async_fetch_image , fetch_image ,
12
+ from vllm .multimodal .utils import (MediaConnector ,
13
13
repeat_and_pad_placeholder_tokens )
14
14
15
15
# Test different image extensions (JPG/PNG) and formats (gray/RGB/RGBA)
23
23
24
24
@pytest .fixture (scope = "module" )
25
25
def url_images () -> Dict [str , Image .Image ]:
26
- return {image_url : fetch_image (image_url ) for image_url in TEST_IMAGE_URLS }
26
+ connector = MediaConnector ()
27
+
28
+ return {
29
+ image_url : connector .fetch_image (image_url )
30
+ for image_url in TEST_IMAGE_URLS
31
+ }
27
32
28
33
29
34
def get_supported_suffixes () -> Tuple [str , ...]:
@@ -43,8 +48,10 @@ def _image_equals(a: Image.Image, b: Image.Image) -> bool:
43
48
@pytest .mark .asyncio
44
49
@pytest .mark .parametrize ("image_url" , TEST_IMAGE_URLS )
45
50
async def test_fetch_image_http (image_url : str ):
46
- image_sync = fetch_image (image_url )
47
- image_async = await async_fetch_image (image_url )
51
+ connector = MediaConnector ()
52
+
53
+ image_sync = connector .fetch_image (image_url )
54
+ image_async = await connector .fetch_image_async (image_url )
48
55
assert _image_equals (image_sync , image_async )
49
56
50
57
@@ -53,6 +60,7 @@ async def test_fetch_image_http(image_url: str):
53
60
@pytest .mark .parametrize ("suffix" , get_supported_suffixes ())
54
61
async def test_fetch_image_base64 (url_images : Dict [str , Image .Image ],
55
62
image_url : str , suffix : str ):
63
+ connector = MediaConnector ()
56
64
url_image = url_images [image_url ]
57
65
58
66
try :
@@ -75,48 +83,49 @@ async def test_fetch_image_base64(url_images: Dict[str, Image.Image],
75
83
base64_image = base64 .b64encode (f .read ()).decode ("utf-8" )
76
84
data_url = f"data:{ mime_type } ;base64,{ base64_image } "
77
85
78
- data_image_sync = fetch_image (data_url )
86
+ data_image_sync = connector . fetch_image (data_url )
79
87
if _image_equals (url_image , Image .open (f )):
80
88
assert _image_equals (url_image , data_image_sync )
81
89
else :
82
90
pass # Lossy format; only check that image can be opened
83
91
84
- data_image_async = await async_fetch_image (data_url )
92
+ data_image_async = await connector . fetch_image_async (data_url )
85
93
assert _image_equals (data_image_sync , data_image_async )
86
94
87
95
88
96
@pytest .mark .asyncio
89
97
@pytest .mark .parametrize ("image_url" , TEST_IMAGE_URLS )
90
98
async def test_fetch_image_local_files (image_url : str ):
99
+ connector = MediaConnector ()
100
+
91
101
with TemporaryDirectory () as temp_dir :
92
- origin_image = fetch_image (image_url )
102
+ local_connector = MediaConnector (allowed_local_media_path = temp_dir )
103
+
104
+ origin_image = connector .fetch_image (image_url )
93
105
origin_image .save (os .path .join (temp_dir , os .path .basename (image_url )),
94
106
quality = 100 ,
95
107
icc_profile = origin_image .info .get ('icc_profile' ))
96
108
97
- image_async = await async_fetch_image (
98
- f"file://{ temp_dir } /{ os .path .basename (image_url )} " ,
99
- allowed_local_media_path = temp_dir )
100
-
101
- image_sync = fetch_image (
102
- f"file://{ temp_dir } /{ os .path .basename (image_url )} " ,
103
- allowed_local_media_path = temp_dir )
109
+ image_async = await local_connector .fetch_image_async (
110
+ f"file://{ temp_dir } /{ os .path .basename (image_url )} " )
111
+ image_sync = local_connector .fetch_image (
112
+ f"file://{ temp_dir } /{ os .path .basename (image_url )} " )
104
113
# Check that the images are equal
105
114
assert not ImageChops .difference (image_sync , image_async ).getbbox ()
106
115
107
- with pytest .raises (ValueError ):
108
- await async_fetch_image (
109
- f"file://{ temp_dir } /../{ os .path .basename (image_url )} " ,
110
- allowed_local_media_path = temp_dir )
111
- with pytest .raises (ValueError ):
112
- await async_fetch_image (
116
+ with pytest .raises (ValueError , match = "must be a subpath" ):
117
+ await local_connector .fetch_image_async (
118
+ f"file://{ temp_dir } /../{ os .path .basename (image_url )} " )
119
+ with pytest .raises (RuntimeError , match = "Cannot load local files" ):
120
+ await connector .fetch_image_async (
113
121
f"file://{ temp_dir } /../{ os .path .basename (image_url )} " )
114
122
115
- with pytest .raises (ValueError ):
116
- fetch_image (f"file://{ temp_dir } /../{ os .path .basename (image_url )} " ,
117
- allowed_local_media_path = temp_dir )
118
- with pytest .raises (ValueError ):
119
- fetch_image (f"file://{ temp_dir } /../{ os .path .basename (image_url )} " )
123
+ with pytest .raises (ValueError , match = "must be a subpath" ):
124
+ local_connector .fetch_image (
125
+ f"file://{ temp_dir } /../{ os .path .basename (image_url )} " )
126
+ with pytest .raises (RuntimeError , match = "Cannot load local files" ):
127
+ connector .fetch_image (
128
+ f"file://{ temp_dir } /../{ os .path .basename (image_url )} " )
120
129
121
130
122
131
@pytest .mark .parametrize ("model" , ["llava-hf/llava-v1.6-mistral-7b-hf" ])
0 commit comments