diff --git a/vllm/entrypoints/openai/chat_completion/protocol.py b/vllm/entrypoints/openai/chat_completion/protocol.py index 9763f2e5c..1bf0de53f 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 531de984b..226dd6c1a 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: