From 3a4bf5c0d310b2066e76f5d8ccb1a04a1164ad8e Mon Sep 17 00:00:00 2001 From: umut-polat <52835619+umut-polat@users.noreply.github.com> Date: Fri, 27 Feb 2026 17:34:58 +0000 Subject: [PATCH 1/2] Add missing @classmethod to ResponsesRequest model validators The four model validators on ResponsesRequest (validate_background, validate_prompt, check_cache_salt_support, function_call_parsing) were missing the @classmethod decorator. All other model validators in the codebase (completion, chat_completion protocols) use @classmethod with @model_validator(mode='before') for consistency. Signed-off-by: umut-polat <52835619+umut-polat@users.noreply.github.com> --- vllm/entrypoints/openai/responses/protocol.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vllm/entrypoints/openai/responses/protocol.py b/vllm/entrypoints/openai/responses/protocol.py index b0ffd0314792..ed60cf49b2f5 100644 --- a/vllm/entrypoints/openai/responses/protocol.py +++ b/vllm/entrypoints/openai/responses/protocol.py @@ -378,6 +378,7 @@ def is_include_output_logprobs(self) -> bool: ) @model_validator(mode="before") + @classmethod def validate_background(cls, data): if not data.get("background"): return data @@ -386,6 +387,7 @@ def validate_background(cls, data): return data @model_validator(mode="before") + @classmethod def validate_prompt(cls, data): if data.get("prompt") is not None: raise VLLMValidationError( @@ -394,6 +396,7 @@ def validate_prompt(cls, data): return data @model_validator(mode="before") + @classmethod def check_cache_salt_support(cls, data): if data.get("cache_salt") is not None and ( not isinstance(data["cache_salt"], str) or not data["cache_salt"] @@ -404,6 +407,7 @@ def check_cache_salt_support(cls, data): return data @model_validator(mode="before") + @classmethod def function_call_parsing(cls, data): """Parse function_call dictionaries into ResponseFunctionToolCall objects. This ensures Pydantic can properly resolve union types in the input field. From 0437db9d1679002185c5a6cb695e1970edbee869 Mon Sep 17 00:00:00 2001 From: umut-polat <52835619+umut-polat@users.noreply.github.com> Date: Fri, 27 Feb 2026 17:37:10 +0000 Subject: [PATCH 2/2] Use VLLMValidationError in ResponsesRequest validators Replace bare ValueError with VLLMValidationError in three places in ResponsesRequest for consistency with the completion and chat_completion protocols. VLLMValidationError includes the parameter name, giving clients more actionable 400 responses. Signed-off-by: umut-polat <52835619+umut-polat@users.noreply.github.com> --- vllm/entrypoints/openai/responses/protocol.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/vllm/entrypoints/openai/responses/protocol.py b/vllm/entrypoints/openai/responses/protocol.py index ed60cf49b2f5..1ec88ccc3aa6 100644 --- a/vllm/entrypoints/openai/responses/protocol.py +++ b/vllm/entrypoints/openai/responses/protocol.py @@ -328,8 +328,9 @@ def to_sampling_params( # Also check text.format for OpenAI-style json_schema if self.text is not None and self.text.format is not None: if structured_outputs is not None: - raise ValueError( - "Cannot specify both structured_outputs and text.format" + raise VLLMValidationError( + "Cannot specify both structured_outputs and text.format", + parameter="structured_outputs", ) response_format = self.text.format if ( @@ -383,7 +384,10 @@ def validate_background(cls, data): if not data.get("background"): return data if not data.get("store", True): - raise ValueError("background can only be used when `store` is true") + raise VLLMValidationError( + "background can only be used when `store` is true", + parameter="background", + ) return data @model_validator(mode="before") @@ -401,8 +405,9 @@ def check_cache_salt_support(cls, data): if data.get("cache_salt") is not None and ( not isinstance(data["cache_salt"], str) or not data["cache_salt"] ): - raise ValueError( - "Parameter 'cache_salt' must be a non-empty string if provided." + raise VLLMValidationError( + "Parameter 'cache_salt' must be a non-empty string if provided.", + parameter="cache_salt", ) return data