[Bugfix] Avoid leaking Pydantic repr in tool_choice error message (#47028)

Signed-off-by: muhammadfawaz1 <[email protected]>
Co-authored-by: Mahad Durrani <[email protected]>
This commit is contained in:
Muhammad Fawaz
2026-07-08 15:00:59 +08:00
committed by GitHub
co-authored by Mahad Durrani
parent c0e8e1f12a
commit d35eba302f
2 changed files with 13 additions and 1 deletions
@@ -2124,6 +2124,13 @@ async def test_tool_choice_validation_without_parser():
assert isinstance(response_named, ErrorResponse)
assert "tool_choice" in response_named.error.message
assert "--tool-call-parser" in response_named.error.message
# The function name should appear in a clean, readable form -
# guards against leaking Pydantic's internal repr of the
# ChatCompletionNamedToolChoiceParam/ChatCompletionNamedFunction
# objects directly into the client-facing error message.
assert "get_weather" in response_named.error.message
assert "ChatCompletionNamedFunction" not in response_named.error.message
assert "ChatCompletionNamedToolChoiceParam" not in response_named.error.message
@pytest.mark.asyncio
+6 -1
View File
@@ -12,6 +12,7 @@ from vllm.entrypoints.chat_utils import (
ConversationMessage,
)
from vllm.entrypoints.openai.chat_completion.protocol import (
ChatCompletionNamedToolChoiceParam,
ChatCompletionRequest,
)
from vllm.entrypoints.openai.completion.protocol import (
@@ -134,8 +135,12 @@ class OnlineRenderer:
)
elif request.tool_choice != "auto":
# "required" or named tool requires tool parser
if isinstance(request.tool_choice, ChatCompletionNamedToolChoiceParam):
tool_choice_desc = f'function "{request.tool_choice.function.name}"'
else:
tool_choice_desc = f'"{request.tool_choice}"'
return self.create_error_response(
f'tool_choice="{request.tool_choice}" requires '
f"tool_choice={tool_choice_desc} requires "
"--tool-call-parser to be set"
)