From af770b8e7bf77539fcbc81a9ff1974f12cdf87ff Mon Sep 17 00:00:00 2001 From: pks Date: Wed, 25 Feb 2026 07:00:03 +0100 Subject: [PATCH] [Bugfix] Fix AttributeError when passing StructuredOutputsParams to CompletionRequest (#35237) Signed-off-by: Patrick Simianer --- vllm/entrypoints/openai/chat_completion/protocol.py | 10 +++++++++- vllm/entrypoints/openai/completion/protocol.py | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/vllm/entrypoints/openai/chat_completion/protocol.py b/vllm/entrypoints/openai/chat_completion/protocol.py index 9763f2e5cd0..1bf0de53fa3 100644 --- a/vllm/entrypoints/openai/chat_completion/protocol.py +++ b/vllm/entrypoints/openai/chat_completion/protocol.py @@ -555,8 +555,16 @@ class ChatCompletionRequest(OpenAIBaseModel): return data structured_outputs_kwargs = data["structured_outputs"] + # structured_outputs may arrive as a dict (from JSON/raw kwargs) or + # as a StructuredOutputsParams dataclass instance. + is_dataclass = isinstance(structured_outputs_kwargs, StructuredOutputsParams) count = sum( - structured_outputs_kwargs.get(k) is not None + ( + getattr(structured_outputs_kwargs, k, None) + if is_dataclass + else structured_outputs_kwargs.get(k) + ) + is not None for k in ("json", "regex", "choice") ) # you can only use one kind of constraints for structured outputs diff --git a/vllm/entrypoints/openai/completion/protocol.py b/vllm/entrypoints/openai/completion/protocol.py index 531de984b92..226dd6c1a2b 100644 --- a/vllm/entrypoints/openai/completion/protocol.py +++ b/vllm/entrypoints/openai/completion/protocol.py @@ -320,8 +320,16 @@ class CompletionRequest(OpenAIBaseModel): return data structured_outputs_kwargs = data["structured_outputs"] + # structured_outputs may arrive as a dict (from JSON/raw kwargs) or + # as a StructuredOutputsParams dataclass instance. + is_dataclass = isinstance(structured_outputs_kwargs, StructuredOutputsParams) count = sum( - structured_outputs_kwargs.get(k) is not None + ( + getattr(structured_outputs_kwargs, k, None) + if is_dataclass + else structured_outputs_kwargs.get(k) + ) + is not None for k in ("json", "regex", "choice") ) if count > 1: