[Bugfix] Move chat completion response_format validation to Pydantic model_validator (#35510)

Signed-off-by: umut-polat <52835619+umut-polat@users.noreply.github.com>
This commit is contained in:
Umut Polat
2026-02-28 08:26:19 +03:00
committed by GitHub
parent 7b346ba8ed
commit 1d5ab5d603
2 changed files with 40 additions and 0 deletions

View File

@@ -370,3 +370,15 @@ def test_system_message_warns_on_video(video_content):
call_args = str(mock_logger.warning_once.call_args) call_args = str(mock_logger.warning_once.call_args)
assert "System messages should only contain text" in call_args assert "System messages should only contain text" in call_args
assert "video_url" in call_args assert "video_url" in call_args
def test_json_schema_response_format_missing_schema():
"""When response_format type is 'json_schema' but the json_schema field
is not provided, request construction should raise a validation error
so the API returns 400 instead of 500."""
with pytest.raises(Exception, match="json_schema.*must be provided"):
ChatCompletionRequest(
model=MODEL_NAME,
messages=[{"role": "user", "content": "hello"}],
response_format={"type": "json_schema"},
)

View File

@@ -502,6 +502,34 @@ class ChatCompletionRequest(OpenAIBaseModel):
skip_clone=True, # Created fresh per request, safe to skip clone skip_clone=True, # Created fresh per request, safe to skip clone
) )
@model_validator(mode="before")
@classmethod
def validate_response_format(cls, data):
response_format = data.get("response_format")
if response_format is None:
return data
rf_type = (
response_format.get("type")
if isinstance(response_format, dict)
else getattr(response_format, "type", None)
)
if rf_type == "json_schema":
json_schema = (
response_format.get("json_schema")
if isinstance(response_format, dict)
else getattr(response_format, "json_schema", None)
)
if json_schema is None:
raise VLLMValidationError(
"When response_format type is 'json_schema', the "
"'json_schema' field must be provided.",
parameter="response_format",
)
return data
@model_validator(mode="before") @model_validator(mode="before")
@classmethod @classmethod
def validate_stream_options(cls, data): def validate_stream_options(cls, data):