fix: do not strip whitespace from GLM tool call values (#20543)
Co-authored-by: Kangyan-Zhou <zky314343421@gmail.com>
This commit is contained in:
co-authored by
Kangyan-Zhou
parent
8b991d98a1
commit
8eb235ab51
@@ -759,7 +759,6 @@ class Glm47MoeDetector(BaseFormatDetector):
|
||||
arguments = {}
|
||||
for arg_key, arg_value in pairs:
|
||||
arg_key = arg_key.strip()
|
||||
arg_value = arg_value.strip()
|
||||
arg_type = get_argument_type(func_name, arg_key, tools)
|
||||
parsed_value, is_good_json = parse_arguments(arg_value, arg_type)
|
||||
|
||||
|
||||
@@ -613,7 +613,6 @@ class Glm4MoeDetector(BaseFormatDetector):
|
||||
arguments = {}
|
||||
for arg_key, arg_value in pairs:
|
||||
arg_key = arg_key.strip()
|
||||
arg_value = arg_value.strip()
|
||||
arg_type = get_argument_type(func_name, arg_key, tools)
|
||||
parsed_value, is_good_json = parse_arguments(arg_value, arg_type)
|
||||
|
||||
|
||||
@@ -2276,6 +2276,39 @@ class TestGlm4MoeDetector(unittest.TestCase):
|
||||
self.assertIsInstance(result, StreamingParseResult)
|
||||
self.assertEqual(result.calls, [])
|
||||
|
||||
def test_whitespace_preserved_in_arg_values(self):
|
||||
"""Test that leading/trailing whitespace in arg values is not stripped."""
|
||||
tools_with_string = [
|
||||
Tool(
|
||||
type="function",
|
||||
function=Function(
|
||||
name="apply_diff",
|
||||
description="Apply a diff",
|
||||
parameters={
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"old_string": {"type": "string"},
|
||||
"new_string": {"type": "string"},
|
||||
},
|
||||
"required": ["old_string", "new_string"],
|
||||
},
|
||||
),
|
||||
)
|
||||
]
|
||||
text = (
|
||||
"<tool_call>apply_diff\n"
|
||||
"<arg_key>old_string</arg_key>\n"
|
||||
"<arg_value> indented code</arg_value>\n"
|
||||
"<arg_key>new_string</arg_key>\n"
|
||||
"<arg_value> also indented</arg_value>\n"
|
||||
"</tool_call>"
|
||||
)
|
||||
result = self.detector.detect_and_parse(text, tools_with_string)
|
||||
self.assertEqual(len(result.calls), 1)
|
||||
params = json.loads(result.calls[0].parameters)
|
||||
self.assertEqual(params["old_string"], " indented code")
|
||||
self.assertEqual(params["new_string"], " also indented")
|
||||
|
||||
|
||||
class TestGlm47MoeDetector(unittest.TestCase):
|
||||
def setUp(self):
|
||||
@@ -2552,6 +2585,39 @@ class TestGlm47MoeDetector(unittest.TestCase):
|
||||
)
|
||||
check_single_todos(result, expected_output)
|
||||
|
||||
def test_whitespace_preserved_in_arg_values(self):
|
||||
"""Test that leading/trailing whitespace in arg values is not stripped."""
|
||||
tools_with_string = [
|
||||
Tool(
|
||||
type="function",
|
||||
function=Function(
|
||||
name="apply_diff",
|
||||
description="Apply a diff",
|
||||
parameters={
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"old_string": {"type": "string"},
|
||||
"new_string": {"type": "string"},
|
||||
},
|
||||
"required": ["old_string", "new_string"],
|
||||
},
|
||||
),
|
||||
)
|
||||
]
|
||||
text = (
|
||||
"<tool_call>apply_diff"
|
||||
"<arg_key>old_string</arg_key>"
|
||||
"<arg_value> indented code</arg_value>"
|
||||
"<arg_key>new_string</arg_key>"
|
||||
"<arg_value> also indented</arg_value>"
|
||||
"</tool_call>"
|
||||
)
|
||||
result = self.detector.detect_and_parse(text, tools_with_string)
|
||||
self.assertEqual(len(result.calls), 1)
|
||||
params = json.loads(result.calls[0].parameters)
|
||||
self.assertEqual(params["old_string"], " indented code")
|
||||
self.assertEqual(params["new_string"], " also indented")
|
||||
|
||||
|
||||
class TestJsonArrayParser(unittest.TestCase):
|
||||
def setUp(self):
|
||||
|
||||
Reference in New Issue
Block a user