1+ using System . Text . Json ;
12using FluentAssertions ;
23using Microsoft . Extensions . AI ;
34using NUnit . Framework ;
89
910namespace Tests ;
1011
11- #pragma warning disable CS8602 // Dereference of a possibly null reference.
12- #pragma warning disable CS8604 // Possible null reference argument.
13-
14- public partial class AbstractionMapperTests
12+ public class AbstractionMapperTests
1513{
16- public partial class ToOllamaSharpChatRequestMethod : AbstractionMapperTests
14+ public class ToOllamaSharpChatRequestMethod : AbstractionMapperTests
1715 {
1816 [ Test ]
1917 public void Maps_Partial_Options_Class ( )
@@ -26,7 +24,7 @@ public void Maps_Partial_Options_Class()
2624
2725 var options = new ChatOptions { Temperature = 0.5f , /* other properties are left out */ } ;
2826
29- var request = AbstractionMapper . ToOllamaSharpChatRequest ( messages , options , stream : true ) ;
27+ var request = AbstractionMapper . ToOllamaSharpChatRequest ( messages , options , stream : true , JsonSerializerOptions . Default ) ;
3028
3129 request . Options . F16kv . Should ( ) . BeNull ( ) ;
3230 request . Options . FrequencyPenalty . Should ( ) . BeNull ( ) ;
@@ -95,7 +93,7 @@ public void Maps_Messages()
9593 } ,
9694 } ;
9795
98- var chatRequest = AbstractionMapper . ToOllamaSharpChatRequest ( chatMessages , null , stream : true ) ;
96+ var chatRequest = AbstractionMapper . ToOllamaSharpChatRequest ( chatMessages , null , stream : true , JsonSerializerOptions . Default ) ;
9997
10098 chatRequest . Messages . Should ( ) . HaveCount ( 3 ) ;
10199
@@ -148,7 +146,7 @@ public void Maps_Base64_Images()
148146 } ,
149147 } ;
150148
151- var chatRequest = AbstractionMapper . ToOllamaSharpChatRequest ( chatMessages , null , stream : true ) ;
149+ var chatRequest = AbstractionMapper . ToOllamaSharpChatRequest ( chatMessages , null , stream : true , JsonSerializerOptions . Default ) ;
152150
153151 chatRequest . Messages . Should ( ) . HaveCount ( 2 ) ;
154152
@@ -180,7 +178,7 @@ public void Maps_Byte_Array_Images()
180178 }
181179 } ;
182180
183- var request = AbstractionMapper . ToOllamaSharpChatRequest ( chatMessages , null , stream : true ) ;
181+ var request = AbstractionMapper . ToOllamaSharpChatRequest ( chatMessages , null , stream : true , JsonSerializerOptions . Default ) ;
184182 request . Messages . Single ( ) . Images . Single ( ) . Should ( ) . Be ( "QUJD" ) ;
185183 }
186184
@@ -207,7 +205,7 @@ public void Does_Not_Support_Image_Links()
207205
208206 Action act = ( ) =>
209207 {
210- var request = AbstractionMapper . ToOllamaSharpChatRequest ( chatMessages , null , stream : true ) ;
208+ var request = AbstractionMapper . ToOllamaSharpChatRequest ( chatMessages , null , stream : true , JsonSerializerOptions . Default ) ;
211209 request . Messages . Should ( ) . NotBeEmpty ( ) ; // access .Messages to invoke the evaluation of IEnumerable<Message>
212210 } ;
213211
@@ -234,7 +232,7 @@ public void Maps_Messages_With_Tools()
234232 Tools = [ new WeatherFunction ( ) ]
235233 } ;
236234
237- var chatRequest = AbstractionMapper . ToOllamaSharpChatRequest ( chatMessages , options , stream : true ) ;
235+ var chatRequest = AbstractionMapper . ToOllamaSharpChatRequest ( chatMessages , options , stream : true , JsonSerializerOptions . Default ) ;
238236
239237 var tool = chatRequest . Tools . Single ( ) ;
240238 tool . Function . Description . Should ( ) . Be ( "Gets the current weather for a current location" ) ;
@@ -251,6 +249,73 @@ public void Maps_Messages_With_Tools()
251249 tool . Type . Should ( ) . Be ( "function" ) ;
252250 }
253251
252+ [ Test ]
253+ public void Maps_Messages_With_ToolResponse ( )
254+ {
255+ var chatMessages = new List < Microsoft . Extensions . AI . ChatMessage >
256+ {
257+ new ( )
258+ {
259+ AdditionalProperties = [ ] ,
260+ AuthorName = "a1" ,
261+ RawRepresentation = null ,
262+ Role = Microsoft . Extensions . AI . ChatRole . Tool ,
263+ Text = "The weather in Honolulu is 25°C."
264+ }
265+ } ;
266+
267+ var chatRequest = AbstractionMapper . ToOllamaSharpChatRequest ( chatMessages , new ( ) , stream : true , JsonSerializerOptions . Default ) ;
268+
269+ var tool = chatRequest . Messages . Single ( ) ;
270+ tool . Content . Should ( ) . Contain ( "The weather in Honolulu is 25°C." ) ;
271+ tool . Role . Should ( ) . Be ( OllamaSharp . Models . Chat . ChatRole . Tool ) ;
272+ }
273+
274+ [ Test ]
275+ public void Maps_Messages_With_MultipleToolResponse ( )
276+ {
277+ var aiChatMessages = new List < Microsoft . Extensions . AI . ChatMessage >
278+ {
279+ new ( )
280+ {
281+ AdditionalProperties = [ ] ,
282+ AuthorName = "a1" ,
283+ RawRepresentation = null ,
284+ Role = Microsoft . Extensions . AI . ChatRole . User ,
285+ Contents = [
286+ new TextContent ( "I have found those 2 results" ) ,
287+ new FunctionResultContent (
288+ callId : "123" ,
289+ name : "Function1" ,
290+ result : new { Temperature = 40 } ) ,
291+
292+ new FunctionResultContent (
293+ callId : "456" ,
294+ name : "Function2" ,
295+ result : new { Summary = "This is a tool result test" }
296+ ) ,
297+ ]
298+ }
299+ } ;
300+
301+ var chatRequest = AbstractionMapper . ToOllamaSharpChatRequest ( aiChatMessages , new ( ) , stream : true , JsonSerializerOptions . Default ) ;
302+ var chatMessages = chatRequest . Messages ? . ToList ( ) ;
303+
304+ chatMessages . Should ( ) . HaveCount ( 3 ) ;
305+
306+ var user = chatMessages [ 0 ] ;
307+ var tool1 = chatMessages [ 1 ] ;
308+ var tool2 = chatMessages [ 2 ] ;
309+ tool1 . Content . Should ( ) . Contain ( "\" Temperature\" :40" ) ;
310+ tool1 . Content . Should ( ) . Contain ( "\" CallId\" :\" 123\" " ) ;
311+ tool1 . Role . Should ( ) . Be ( OllamaSharp . Models . Chat . ChatRole . Tool ) ;
312+ tool2 . Content . Should ( ) . Contain ( "\" Summary\" :\" This is a tool result test\" " ) ;
313+ tool2 . Content . Should ( ) . Contain ( "\" CallId\" :\" 456\" " ) ;
314+ tool2 . Role . Should ( ) . Be ( OllamaSharp . Models . Chat . ChatRole . Tool ) ;
315+ user . Content . Should ( ) . Contain ( "I have found those 2 results" ) ;
316+ user . Role . Should ( ) . Be ( OllamaSharp . Models . Chat . ChatRole . User ) ;
317+ }
318+
254319 [ Test ]
255320 public void Maps_Options ( )
256321 {
@@ -268,7 +333,7 @@ public void Maps_Options()
268333 TopP = 10.1f
269334 } ;
270335
271- var chatRequest = AbstractionMapper . ToOllamaSharpChatRequest ( chatMessages , options , stream : true ) ;
336+ var chatRequest = AbstractionMapper . ToOllamaSharpChatRequest ( chatMessages , options , stream : true , JsonSerializerOptions . Default ) ;
272337
273338 chatRequest . Format . Should ( ) . Be ( "json" ) ;
274339 chatRequest . Model . Should ( ) . Be ( "llama3.1:405b" ) ;
@@ -346,7 +411,7 @@ public void Maps_Ollama_Options()
346411 . AddOllamaOption ( OllamaOption . UseMmap , true )
347412 . AddOllamaOption ( OllamaOption . VocabOnly , false ) ;
348413
349- var ollamaRequest = AbstractionMapper . ToOllamaSharpChatRequest ( [ ] , options , stream : true ) ;
414+ var ollamaRequest = AbstractionMapper . ToOllamaSharpChatRequest ( [ ] , options , stream : true , JsonSerializerOptions . Default ) ;
350415
351416 ollamaRequest . Options . F16kv . Should ( ) . Be ( true ) ;
352417 ollamaRequest . Options . FrequencyPenalty . Should ( ) . Be ( 0.11f ) ;
@@ -507,7 +572,7 @@ public void Maps_ToolCalls()
507572 }
508573 }
509574
510- public partial class ToOllamaEmbedRequestMethod : AbstractionMapperTests
575+ public class ToOllamaEmbedRequestMethod : AbstractionMapperTests
511576 {
512577 [ Test ]
513578 public void Maps_Request ( )
@@ -544,7 +609,7 @@ public void Maps_KeepAlive_And_Truncate_From_AdditionalProperties()
544609 }
545610 }
546611
547- public partial class ToGeneratedEmbeddingsMethod : AbstractionMapperTests
612+ public class ToGeneratedEmbeddingsMethod : AbstractionMapperTests
548613 {
549614 [ Test ]
550615 public void Maps_Response ( )
@@ -575,7 +640,4 @@ public void Maps_Response()
575640 mappedResponse . Usage . TotalTokenCount . Should ( ) . Be ( 18 ) ;
576641 }
577642 }
578- }
579-
580- #pragma warning restore CS8602 // Dereference of a possibly null reference.
581- #pragma warning restore CS8604 // Possible null reference argument.
643+ }
0 commit comments