From 67fd2ae6df1097ec2a5ff81573b5d83efc2394ab Mon Sep 17 00:00:00 2001 From: Kayvan Mivehnejad Date: Wed, 10 Dec 2025 20:00:45 -0500 Subject: [PATCH 1/5] Added a test for invalid inputs for parse_raw_prompts Signed-off-by: Kayvan Mivehnejad --- tests/test_inputs.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_inputs.py b/tests/test_inputs.py index c4339827de8b..c7038db704ec 100644 --- a/tests/test_inputs.py +++ b/tests/test_inputs.py @@ -33,6 +33,16 @@ slice(None, None, -2), ] +@pytest.mark.parametrize( + "invalid_input", + [ + ["foo", 1], # mixed of string and token + [["foo"], ["bar"]] # list of list of strings + ] +) +def test_invalid_input_raise_type_error(invalid_input): + with pytest.raises(TypeError): + parse_raw_prompts(invalid_input) def test_parse_raw_single_batch_empty(): with pytest.raises(ValueError, match="at least one prompt"): From 3d3a82399d3ce9b184412c7a8ada2a3d0dc817ef Mon Sep 17 00:00:00 2001 From: Kayvan Mivehnejad Date: Thu, 11 Dec 2025 13:31:34 -0500 Subject: [PATCH 2/5] Updated the invalid_input condition for parse_raw_prompt Signed-off-by: Kayvan Mivehnejad --- tests/test_inputs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_inputs.py b/tests/test_inputs.py index c7038db704ec..f6dbac5993c7 100644 --- a/tests/test_inputs.py +++ b/tests/test_inputs.py @@ -33,11 +33,11 @@ slice(None, None, -2), ] +# List of lists that prompt[0] passes test case#4, but no TypeError will be raised. @pytest.mark.parametrize( "invalid_input", [ - ["foo", 1], # mixed of string and token - [["foo"], ["bar"]] # list of list of strings + [[1, 2], ["foo", "bar"]] ] ) def test_invalid_input_raise_type_error(invalid_input): From f9e989ef21f87ef458538024d6470515678ca371 Mon Sep 17 00:00:00 2001 From: Kayvan Mivehnejad Date: Thu, 11 Dec 2025 14:29:50 -0500 Subject: [PATCH 3/5] Updated parse_raw_promptinput validation tests - uv pre-commit installed Signed-off-by: Kayvan Mivehnejad --- tests/test_inputs.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tests/test_inputs.py b/tests/test_inputs.py index f6dbac5993c7..a151bf531d55 100644 --- a/tests/test_inputs.py +++ b/tests/test_inputs.py @@ -33,17 +33,14 @@ slice(None, None, -2), ] + # List of lists that prompt[0] passes test case#4, but no TypeError will be raised. -@pytest.mark.parametrize( - "invalid_input", - [ - [[1, 2], ["foo", "bar"]] - ] -) +@pytest.mark.parametrize("invalid_input", [[[1, 2], ["foo", "bar"]]]) def test_invalid_input_raise_type_error(invalid_input): with pytest.raises(TypeError): parse_raw_prompts(invalid_input) + def test_parse_raw_single_batch_empty(): with pytest.raises(ValueError, match="at least one prompt"): parse_raw_prompts([]) From 65d1beead9c6c3285047b0c9a7603f97e2cc2188 Mon Sep 17 00:00:00 2001 From: Kayvan Mivehnejad Date: Thu, 11 Dec 2025 17:18:48 -0500 Subject: [PATCH 4/5] Updated misleading comment in invalid_input test per review feedback Signed-off-by: Kayvan Mivehnejad --- tests/test_inputs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_inputs.py b/tests/test_inputs.py index a151bf531d55..0821de3f803a 100644 --- a/tests/test_inputs.py +++ b/tests/test_inputs.py @@ -34,7 +34,7 @@ ] -# List of lists that prompt[0] passes test case#4, but no TypeError will be raised. +# Test that a nested mixed-type list of lists raises a TypeError. @pytest.mark.parametrize("invalid_input", [[[1, 2], ["foo", "bar"]]]) def test_invalid_input_raise_type_error(invalid_input): with pytest.raises(TypeError): From fae6f0de23c5e6866740ca8464f06a2b02d1bfc8 Mon Sep 17 00:00:00 2001 From: Kayvan Mivehnejad Date: Thu, 11 Dec 2025 17:54:16 -0500 Subject: [PATCH 5/5] Updated parse_raw_prompts test case#4 per review feedback v4 Signed-off-by: Kayvan Mivehnejad --- vllm/inputs/parse.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/vllm/inputs/parse.py b/vllm/inputs/parse.py index 211551be8e60..71289277eb98 100644 --- a/vllm/inputs/parse.py +++ b/vllm/inputs/parse.py @@ -33,22 +33,31 @@ def parse_raw_prompts( if len(prompt) == 0: raise ValueError("please provide at least one prompt") + # case 2: array of strings if is_list_of(prompt, str): - # case 2: array of strings prompt = cast(list[str], prompt) return [TextPrompt(prompt=elem) for elem in prompt] + + # case 3: array of tokens if is_list_of(prompt, int): - # case 3: array of tokens prompt = cast(list[int], prompt) return [TokensPrompt(prompt_token_ids=prompt)] + + # case 4: array of token arrays if is_list_of(prompt, list): - prompt = cast(list[list[int]], prompt) - if len(prompt[0]) == 0: - raise ValueError("please provide at least one prompt") + first = prompt[0] + if not isinstance(first, list): + raise ValueError("prompt expected to be a list of lists") - if is_list_of(prompt[0], int): - # case 4: array of token arrays - return [TokensPrompt(prompt_token_ids=elem) for elem in prompt] + if len(first) == 0: + raise ValueError("Please provide at least one prompt") + + # strict validation: every nested list must be list[int] + if not all(is_list_of(elem, int) for elem in prompt): + raise TypeError("Nested lists must contain only integers") + + prompt = cast(list[list[int]], prompt) + return [TokensPrompt(prompt_token_ids=elem) for elem in prompt] raise TypeError( "prompt must be a string, array of strings, "