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