@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 5828a205ef
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Fix Harmony tool descriptions for optional fields (#44686)

Signed-off-by: Varun Shenoy <varun.vinayak.shenoy@oracle.com> Co-authored-by: Codex <codex@openai.com>

Varun Vinayak Shenoy committed Jun 9, 2026 at 23:29 UTC 5828a205efeb79f0a55065cbc9b5bdd48e973a33
2 files changed +57 -2
tests/entrypoints/openai/parser/test_harmony_utils.py
+55
@@ -2,11 +2,14 @@
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 import pytest
5 +from openai.types.responses import FunctionTool
6 from openai_harmony import DeveloperContent, Message, Role
7
8 from tests.entrypoints.openai.utils import verify_harmony_messages
9 +from vllm.entrypoints.openai.chat_completion.protocol import ChatCompletionToolsParam
10 from vllm.entrypoints.openai.parser.harmony_utils import (
11 auto_drop_analysis_messages,
12 + create_tool_definition,
13 extract_function_from_recipient,
14 get_encoding,
15 get_system_message,
@@ -20,6 +23,58 @@ from vllm.entrypoints.openai.responses.harmony import (
23 response_previous_input_to_harmony,
24 )
25
26 +_TOOL_PARAMETERS = {
27 + "type": "object",
28 + "properties": {"status": {"type": "string"}},
29 + "required": ["status"],
30 + "additionalProperties": False,
31 +}
32 +
33 +
34 +class TestCreateToolDefinition:
35 + def test_chat_completion_omitted_description_defaults_to_empty_string(self):
36 + tool = ChatCompletionToolsParam(
37 + function={
38 + "name": "report_status",
39 + "parameters": _TOOL_PARAMETERS,
40 + }
41 + )
42 +
43 + tool_definition = create_tool_definition(tool)
44 +
45 + assert tool_definition.name == "report_status"
46 + assert tool_definition.description == ""
47 + assert tool_definition.parameters == _TOOL_PARAMETERS
48 +
49 + def test_chat_completion_none_description_defaults_to_empty_string(self):
50 + tool = ChatCompletionToolsParam(
51 + function={
52 + "name": "report_status",
53 + "description": None,
54 + "parameters": _TOOL_PARAMETERS,
55 + }
56 + )
57 +
58 + tool_definition = create_tool_definition(tool)
59 +
60 + assert tool_definition.name == "report_status"
61 + assert tool_definition.description == ""
62 + assert tool_definition.parameters == _TOOL_PARAMETERS
63 +
64 + def test_response_tool_none_description_defaults_to_empty_string(self):
65 + tool = FunctionTool(
66 + name="report_status",
67 + description=None,
68 + parameters=_TOOL_PARAMETERS,
69 + type="function",
70 + )
71 +
72 + tool_definition = create_tool_definition(tool)
73 +
74 + assert tool_definition.name == "report_status"
75 + assert tool_definition.description == ""
76 + assert tool_definition.parameters == _TOOL_PARAMETERS
77 +
78
79 class TestIsFunctionRecipient:
80 @pytest.mark.parametrize(
vllm/entrypoints/openai/parser/harmony_utils.py
+2 -2
@@ -150,12 +150,12 @@ def create_tool_definition(tool: ChatCompletionToolsParam | Tool):
150 if isinstance(tool, ChatCompletionToolsParam):
151 return ToolDescription.new(
152 name=tool.function.name,
153 - description=tool.function.description,
153 + description=tool.function.description or "",
154 parameters=tool.function.parameters,
155 )
156 return ToolDescription.new(
157 name=tool.name,
158 - description=tool.description,
158 + description=tool.description or "",
159 parameters=tool.parameters,
160 )
161