[Misc] Use VLLMValidationError in chat_utils content-part validation (#49217)

Signed-off-by: Umut Polat <52835619+umut-polat@users.noreply.github.com>

Umut Polat committed Jul 23, 2026 at 08:48 UTC 239fc7355361ee60ea10756c10944041d8e38ded
1 file changed +27 -13
vllm/entrypoints/chat_utils.py
+27 -13
@@ -968,7 +968,9 @@ class MultiModalContentParser(BaseMultiModalContentParser):
968 `tensor.shape[0]` placeholder tokens after tokenization.
969 """
970 if not self.model_config.enable_prompt_embeds:
971 - raise ValueError(_ENABLE_PROMPT_EMBEDS_ERROR)
971 + raise VLLMValidationError(
972 + _ENABLE_PROMPT_EMBEDS_ERROR, parameter="prompt_embeds"
973 + )
974
975 tensor = safe_load_prompt_embeds(self.model_config, data.encode())
976 self._tracker.add("prompt_embeds", (tensor, None))
@@ -987,8 +989,9 @@ class MultiModalContentParser(BaseMultiModalContentParser):
989 ) -> None:
990 mm_config = self.model_config.get_multimodal_config()
991 if not mm_config.enable_mm_embeds:
990 - raise ValueError(
991 - "You must set `--enable-mm-embeds` to input `image_embeds`"
992 + raise VLLMValidationError(
993 + "You must set `--enable-mm-embeds` to input `image_embeds`",
994 + parameter="image_embeds",
995 )
996
997 if isinstance(image_embeds, dict):
@@ -1014,8 +1017,9 @@ class MultiModalContentParser(BaseMultiModalContentParser):
1017 ) -> None:
1018 mm_config = self.model_config.get_multimodal_config()
1019 if not mm_config.enable_mm_embeds:
1017 - raise ValueError(
1018 - "You must set `--enable-mm-embeds` to input `audio_embeds`"
1020 + raise VLLMValidationError(
1021 + "You must set `--enable-mm-embeds` to input `audio_embeds`",
1022 + parameter="audio_embeds",
1023 )
1024
1025 if isinstance(audio_embeds, dict):
@@ -1117,7 +1121,9 @@ class AsyncMultiModalContentParser(BaseMultiModalContentParser):
1121 thread-pool executor via `safe_load_prompt_embeds_async`.
1122 """
1123 if not self.model_config.enable_prompt_embeds:
1120 - raise ValueError(_ENABLE_PROMPT_EMBEDS_ERROR)
1124 + raise VLLMValidationError(
1125 + _ENABLE_PROMPT_EMBEDS_ERROR, parameter="prompt_embeds"
1126 + )
1127
1128 self._tracker.add(
1129 "prompt_embeds", partial(self._load_prompt_embeds_async, data.encode())
@@ -1151,8 +1157,9 @@ class AsyncMultiModalContentParser(BaseMultiModalContentParser):
1157 ) -> None:
1158 mm_config = self.model_config.get_multimodal_config()
1159 if not mm_config.enable_mm_embeds:
1154 - raise ValueError(
1155 - "You must set `--enable-mm-embeds` to input `image_embeds`"
1160 + raise VLLMValidationError(
1161 + "You must set `--enable-mm-embeds` to input `image_embeds`",
1162 + parameter="image_embeds",
1163 )
1164
1165 if isinstance(image_embeds, dict):
@@ -1178,8 +1185,9 @@ class AsyncMultiModalContentParser(BaseMultiModalContentParser):
1185 ) -> None:
1186 mm_config = self.model_config.get_multimodal_config()
1187 if not mm_config.enable_mm_embeds:
1181 - raise ValueError(
1182 - "You must set `--enable-mm-embeds` to input `audio_embeds`"
1188 + raise VLLMValidationError(
1189 + "You must set `--enable-mm-embeds` to input `audio_embeds`",
1190 + parameter="audio_embeds",
1191 )
1192
1193 if isinstance(audio_embeds, dict):
@@ -1592,10 +1600,14 @@ def _parse_chat_message_content_mm_part(
1600 tool_reference = tool_reference_params.get("name", None)
1601 return "tool_reference", tool_reference
1602 # Raise an error if no 'type' or direct URL is found.
1595 - raise ValueError("Missing 'type' field in multimodal part.")
1603 + raise VLLMValidationError(
1604 + "Missing 'type' field in multimodal part.", parameter="type"
1605 + )
1606
1607 if not isinstance(part_type, str):
1598 - raise ValueError("Invalid 'type' field in multimodal part.")
1608 + raise VLLMValidationError(
1609 + "Invalid 'type' field in multimodal part.", parameter="type"
1610 + )
1611 return part_type, "unknown part_type content"
1612
1613
@@ -1732,7 +1744,9 @@ def _parse_chat_message_content_part(
1744 modality = "audio"
1745 elif part_type == "prompt_embeds":
1746 if not content:
1735 - raise ValueError(_PROMPT_EMBEDS_MISSING_DATA_ERROR)
1747 + raise VLLMValidationError(
1748 + _PROMPT_EMBEDS_MISSING_DATA_ERROR, parameter="prompt_embeds"
1749 + )
1750 mm_parser.parse_prompt_embeds(cast(str, content))
1751 modality = "prompt_embeds"
1752 elif part_type == "audio_url":