# SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project """Request-time validation of structured output requests.""" import pytest from vllm.config import StructuredOutputsConfig from vllm.sampling_params import SamplingParams, StructuredOutputsParams pytestmark = pytest.mark.cpu_test JSON_SCHEMA = { "type": "object", "properties": { "invoice_id": {"type": "string"}, "customer": {"type": "string"}, }, "required": ["invoice_id", "customer"], "additionalProperties": False, } class _StubModelConfig: def __init__(self, is_diffusion: bool): self.is_diffusion = is_diffusion def test_structured_outputs_rejected_for_diffusion_models(): """Diffusion LLMs denoise the canvas in parallel, which is incompatible with the token-by-token grammar FSM. The request must fail with a clear validation error instead of an FSM rejection mid-generation (#45436).""" params = SamplingParams( structured_outputs=StructuredOutputsParams(json=JSON_SCHEMA) ) with pytest.raises(ValueError, match="not yet supported for diffusion"): params._validate_structured_outputs( _StubModelConfig(is_diffusion=True), StructuredOutputsConfig(), tokenizer=None, ) def test_plain_request_allowed_for_diffusion_models(): """Requests without structured outputs are unaffected by the guard.""" params = SamplingParams() params._validate_structured_outputs( _StubModelConfig(is_diffusion=True), StructuredOutputsConfig(), tokenizer=None, )