@@ -116,12 +116,29 @@ TEST_F(Phi4ResponseParserTest, ParseToolCallOutputWithContentAndSingleToolCall)
116
116
EXPECT_EQ (parsedResponse.toolCalls [0 ].arguments , " {\" arg1\" :\" value1\" ,\" arg2\" :42}" );
117
117
EXPECT_EQ (parsedResponse.toolCalls [0 ].id .empty (), false ); // ID should be generated
118
118
}
119
- TEST_F (Phi4ResponseParserTest, ParseToolCallOutputWithMultipleFunctoolsThrows ) {
119
+ TEST_F (Phi4ResponseParserTest, ParseToolCallOutputWithMultipleFunctoolsReturnsContentOnly ) {
120
120
std::string input = " functools[{\" name\" : \" tool1\" , \" arguments\" : {\" a\" : 1}}]\n\n This is some content\n\n functools[{\" name\" : \" tool2\" , \" arguments\" : {\" b\" : 2}}]" ;
121
121
auto generatedTensor = tokenizer->encode (input, ov::genai::add_special_tokens (false )).input_ids ;
122
122
std::vector<int64_t > generatedTokens (generatedTensor.data <int64_t >(), generatedTensor.data <int64_t >() + generatedTensor.get_size ());
123
- EXPECT_THROW ({
124
- responseParser->parse (generatedTokens);
125
- },
126
- std::runtime_error);
123
+ ParsedResponse parsedResponse = responseParser->parse (generatedTokens);
124
+ // Content after 'functools' cannot be parsed as array of JSON objects, so it is treated as content
125
+ EXPECT_EQ (parsedResponse.content , " functools[{\" name\" : \" tool1\" , \" arguments\" : {\" a\" : 1}}]\n\n This is some content\n\n functools[{\" name\" : \" tool2\" , \" arguments\" : {\" b\" : 2}}]" );
126
+ EXPECT_EQ (parsedResponse.reasoning , " " );
127
+ EXPECT_EQ (parsedResponse.reasoningTokenCount , 0 );
128
+ ASSERT_EQ (parsedResponse.toolCalls .size (), 0 ); // No valid tool calls parsed
129
+ }
130
+
131
+ TEST_F (Phi4ResponseParserTest, ParseToolCallOutputWithArrayArguments) {
132
+ std::string input = " functools[{\" name\" : \" extractLastTransactionId\" , \" arguments\" : { \" filepath\" : \" /var/log/db.log\" , \" status\" : [\" completed\" , \" failed\" ], \" encoding\" : \" utf-8\" , \" processFunction\" : \" processFunction\" }}]" ;
133
+ auto generatedTensor = tokenizer->encode (input, ov::genai::add_special_tokens (false )).input_ids ;
134
+ std::vector<int64_t > generatedTokens (generatedTensor.data <int64_t >(), generatedTensor.data <int64_t >() + generatedTensor.get_size ());
135
+ ParsedResponse parsedResponse = responseParser->parse (generatedTokens);
136
+ EXPECT_EQ (parsedResponse.content , " " );
137
+ EXPECT_EQ (parsedResponse.reasoning , " " );
138
+ EXPECT_EQ (parsedResponse.reasoningTokenCount , 0 );
139
+ ASSERT_EQ (parsedResponse.toolCalls .size (), 1 );
140
+ EXPECT_EQ (parsedResponse.toolCalls [0 ].name , " extractLastTransactionId" );
141
+ // Parser removes whitespaces, so we expect arguments value to be without spaces
142
+ EXPECT_EQ (parsedResponse.toolCalls [0 ].arguments , " {\" filepath\" :\" /var/log/db.log\" ,\" status\" :[\" completed\" ,\" failed\" ],\" encoding\" :\" utf-8\" ,\" processFunction\" :\" processFunction\" }" );
143
+ EXPECT_EQ (parsedResponse.toolCalls [0 ].id .empty (), false ); // ID should be generated
127
144
}
0 commit comments