diff --git a/vllm/entrypoints/openai/serving_chat.py b/vllm/entrypoints/openai/serving_chat.py index 32a3cf04951e..5a916f39b128 100644 --- a/vllm/entrypoints/openai/serving_chat.py +++ b/vllm/entrypoints/openai/serving_chat.py @@ -659,9 +659,14 @@ async def chat_completion_stream_generator( "Tokenizer not available when `skip_tokenizer_init=True`" ) + # Pass the same chat template kwargs as used in tokenization + chat_template_kwargs = self._prepare_extra_chat_template_kwargs( + request.chat_template_kwargs, + self.default_chat_template_kwargs, + ) reasoning_parser = self.reasoning_parser( tokenizer, - chat_template_kwargs=request.chat_template_kwargs, # type: ignore + chat_template_kwargs=chat_template_kwargs, # type: ignore[call-arg] ) except RuntimeError as e: logger.exception("Error in reasoning parser creation.") @@ -1437,9 +1442,14 @@ async def chat_completion_full_generator( "Tokenizer not available when `skip_tokenizer_init=True`" ) + # Pass the same chat template kwargs as used in tokenization + chat_template_kwargs = self._prepare_extra_chat_template_kwargs( + request.chat_template_kwargs, + self.default_chat_template_kwargs, + ) reasoning_parser = self.reasoning_parser( tokenizer, - chat_template_kwargs=request.chat_template_kwargs, # type: ignore + chat_template_kwargs=chat_template_kwargs, # type: ignore[call-arg] ) except RuntimeError as e: logger.exception("Error in reasoning parser creation.") diff --git a/vllm/entrypoints/openai/serving_engine.py b/vllm/entrypoints/openai/serving_engine.py index f1c4ab63f05b..e65141edd144 100644 --- a/vllm/entrypoints/openai/serving_engine.py +++ b/vllm/entrypoints/openai/serving_engine.py @@ -1146,6 +1146,18 @@ def _validate_chat_template( ) return None + @staticmethod + def _prepare_extra_chat_template_kwargs( + request_chat_template_kwargs: dict[str, Any] | None = None, + default_chat_template_kwargs: dict[str, Any] | None = None, + ) -> dict[str, Any]: + """Helper to merge server-default and request-specific chat template kwargs.""" + request_chat_template_kwargs = request_chat_template_kwargs or {} + if default_chat_template_kwargs is None: + return request_chat_template_kwargs + # Apply server defaults first, then request kwargs override. + return default_chat_template_kwargs | request_chat_template_kwargs + async def _preprocess_chat( self, request: ChatLikeRequest | ResponsesRequest, @@ -1184,9 +1196,10 @@ async def _preprocess_chat( tools=tool_dicts, documents=documents, ) - if default_chat_template_kwargs: - _chat_template_kwargs.update(default_chat_template_kwargs) - _chat_template_kwargs.update(chat_template_kwargs or {}) + _chat_template_kwargs |= self._prepare_extra_chat_template_kwargs( + chat_template_kwargs, + default_chat_template_kwargs, + ) request_prompt: str | list[int]