Skip to content

Commit 8511c50

Browse files
committed
fix(vllm): support both vLLM API versions and add grammar passthrough
- Handle both StructuredOutputsParams (vLLM latest) and GuidedDecodingParams (vLLM <=0.8.x) with graceful fallback - Use the correct SamplingParams field name for each version (structured_outputs vs guided_decoding) - Use 'json' parameter (not 'json_schema') matching both APIs - Re-add grammar (GBNF/BNF) passthrough — both vLLM APIs accept a 'grammar' parameter handled by xgrammar which supports GBNF - Priority: JSONSchema > json_object > Grammar Ref: #6857 Signed-off-by: eureka928 <meobius123@gmail.com>
1 parent d65b35f commit 8511c50

File tree

1 file changed

+22
-9
lines changed

1 file changed

+22
-9
lines changed

backend/python/vllm/backend.py

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,21 @@
1717
from vllm.engine.arg_utils import AsyncEngineArgs
1818
from vllm.engine.async_llm_engine import AsyncLLMEngine
1919
from vllm.sampling_params import SamplingParams
20+
21+
# vLLM renamed GuidedDecodingParams to StructuredOutputsParams in newer versions.
22+
# The corresponding SamplingParams field also changed from guided_decoding to structured_outputs.
2023
try:
21-
from vllm.sampling_params import GuidedDecodingParams
24+
from vllm.sampling_params import StructuredOutputsParams
25+
_structured_output_cls = StructuredOutputsParams
26+
_structured_output_field = "structured_outputs"
2227
except ImportError:
23-
GuidedDecodingParams = None
28+
try:
29+
from vllm.sampling_params import GuidedDecodingParams
30+
_structured_output_cls = GuidedDecodingParams
31+
_structured_output_field = "guided_decoding"
32+
except ImportError:
33+
_structured_output_cls = None
34+
_structured_output_field = None
2435
from vllm.utils import random_uuid
2536
from vllm.transformers_utils.tokenizer import get_tokenizer
2637
from vllm.multimodal.utils import fetch_image
@@ -234,16 +245,18 @@ async def _predict(self, request, context, streaming=False):
234245
if value not in (None, 0, [], False):
235246
setattr(sampling_params, param_field, value)
236247

237-
# Handle structured output via guided decoding
238-
if GuidedDecodingParams is not None:
239-
guided_decoding = None
248+
# Handle structured output via guided decoding / structured outputs
249+
if _structured_output_cls is not None:
250+
constraint = None
240251
if hasattr(request, 'JSONSchema') and request.JSONSchema:
241-
guided_decoding = GuidedDecodingParams(json_schema=request.JSONSchema)
252+
constraint = _structured_output_cls(json=request.JSONSchema)
242253
elif hasattr(request, 'ResponseFormat') and request.ResponseFormat == "json_object":
243-
guided_decoding = GuidedDecodingParams(json_object=True)
254+
constraint = _structured_output_cls(json_object=True)
255+
elif hasattr(request, 'Grammar') and request.Grammar:
256+
constraint = _structured_output_cls(grammar=request.Grammar)
244257

245-
if guided_decoding is not None:
246-
sampling_params.guided_decoding = guided_decoding
258+
if constraint is not None:
259+
setattr(sampling_params, _structured_output_field, constraint)
247260

248261
# Extract image paths and process images
249262
prompt = request.Prompt

0 commit comments

Comments
 (0)