From 60ca7981bce1bd6e2155df1a58bc9f916f7c4093 Mon Sep 17 00:00:00 2001 From: Julien Denize <40604584+juliendenize@users.noreply.github.com> Date: Sat, 14 Feb 2026 05:04:01 +0100 Subject: [PATCH] Add explicit validation error for tool calls. (#34438) Signed-off-by: juliendenize --- vllm/tokenizers/mistral.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/vllm/tokenizers/mistral.py b/vllm/tokenizers/mistral.py index b56b2718c..347a8effe 100644 --- a/vllm/tokenizers/mistral.py +++ b/vllm/tokenizers/mistral.py @@ -17,6 +17,7 @@ from mistral_common.tokens.tokenizers.sentencepiece import ( SentencePieceTokenizer, ) from mistral_common.tokens.tokenizers.tekken import Tekkenizer +from pydantic import ValidationError from vllm.entrypoints.chat_utils import ChatCompletionMessageParam from vllm.entrypoints.openai.chat_completion.protocol import ChatCompletionRequest @@ -64,14 +65,16 @@ def maybe_serialize_tool_calls(request: "MistralChatCompletionRequest"): # TODO: remove when pydantic v2.11 is released for i, message in enumerate(request.messages): if message.get("role") == "assistant": - tool_calls_validator = message.get("tool_calls", ().__iter__()) - validated_tool_calls = [] - while True: + if (tool_calls_validator := message.get("tool_calls", None)) is not None: try: - tool_call = next(tool_calls_validator) # type: ignore - validated_tool_calls.append(tool_call) - except StopIteration: - break + validated_tool_calls = list(tool_calls_validator) + except ValidationError as e: + raise ValueError( + "Validating messages' `tool_calls` raised an error. " + "Please ensure `tool_calls` are iterable of tool calls." + ) from e + else: + validated_tool_calls = [] request.messages[i]["tool_calls"] = validated_tool_calls