@@ -262,6 +262,27 @@ static void test_deepseek_v3_1_tool_calls() {
262262 assert_equals (variant, std::string (" " ), m.content );
263263 assert_equals (variant, std::string (" REASONING" ), m.reasoning_content );
264264 }
265+ // variant: simple + multiple tool calls
266+ {
267+ common_chat_syntax syntax = {
268+ /* .format = */ COMMON_CHAT_FORMAT_DEEPSEEK_V3_1,
269+ /* .reasoning_format = */ COMMON_REASONING_FORMAT_DEEPSEEK,
270+ /* .reasoning_in_content = */ false ,
271+ /* .thinking_forced_open = */ false ,
272+ /* .parse_tool_calls = */ true ,
273+ };
274+ const char * variant = " simple_multiple_tool_calls" ;
275+ const std::string in = " CONTENT<|tool▁calls▁begin|><|tool▁call▁begin|>get_time<|tool▁sep|>{\" city\" : \" Paris\" }<|tool▁call▁end|><|tool▁call▁begin|>get_weather<|tool▁sep|>{\" city\" : \" Paris\" }<|tool▁call▁end|><|tool▁calls▁end|>" ;
276+ auto m = common_chat_parse (in, false , syntax);
277+ assert_equals<std::size_t >(variant, 2 , m.tool_calls .size ());
278+ assert_equals (variant, std::string (" get_time" ), m.tool_calls [0 ].name );
279+ assert_equals (variant, std::string (" {\" city\" :\" Paris\" }" ), m.tool_calls [0 ].arguments );
280+ assert_equals (variant, std::string (" get_weather" ), m.tool_calls [1 ].name );
281+ assert_equals (variant, std::string (" {\" city\" :\" Paris\" }" ), m.tool_calls [1 ].arguments );
282+ assert_equals (variant, std::string (" CONTENT" ), m.content );
283+ assert_equals (variant, std::string (" " ), m.reasoning_content );
284+ }
285+
265286
266287 // variant: thinking forced open + tool call in reasoning content + function + fenced JSON
267288 {
0 commit comments