@@ -34,6 +34,8 @@ import type { Anthropic } from "@anthropic-ai/sdk"
3434import { mimoDefaultModelId , mimoModels } from "@roo-code/types"
3535import type { ApiHandlerOptions } from "../../../shared/api"
3636import { MimoHandler } from "../mimo"
37+ import { convertToR1Format } from "../../transform/r1-format"
38+ import { sanitizeOpenAiCallId } from "../../../utils/tool-id"
3739
3840describe ( "MimoHandler" , ( ) => {
3941 let handler : MimoHandler
@@ -222,7 +224,13 @@ describe("MimoHandler", () => {
222224 } )
223225 } )
224226
225- describe ( "convertMessagesForMiMo" , ( ) => {
227+ describe ( "convertMessagesForMiMo (via convertToR1Format)" , ( ) => {
228+ const convert = ( messages : Anthropic . Messages . MessageParam [ ] ) =>
229+ convertToR1Format ( messages , {
230+ mergeToolResultText : true ,
231+ normalizeToolCallId : sanitizeOpenAiCallId ,
232+ } )
233+
226234 it ( "should convert assistant message with reasoning and text" , ( ) => {
227235 const messages : Anthropic . Messages . MessageParam [ ] = [
228236 {
@@ -233,7 +241,7 @@ describe("MimoHandler", () => {
233241 ] ,
234242 } ,
235243 ]
236- const result = ( handler as any ) . convertMessagesForMiMo ( messages )
244+ const result = convert ( messages )
237245 expect ( result ) . toHaveLength ( 1 )
238246 expect ( result [ 0 ] . role ) . toBe ( "assistant" )
239247 expect ( result [ 0 ] . content ) . toBe ( "Here is the answer" )
@@ -255,12 +263,13 @@ describe("MimoHandler", () => {
255263 ] ,
256264 } ,
257265 ]
258- const result = ( handler as any ) . convertMessagesForMiMo ( messages )
266+ const result = convert ( messages )
259267 expect ( result ) . toHaveLength ( 1 )
260- expect ( result [ 0 ] . tool_calls ) . toHaveLength ( 1 )
261- expect ( result [ 0 ] . tool_calls [ 0 ] . id ) . toBe ( "call_123" )
262- expect ( result [ 0 ] . tool_calls [ 0 ] . function . name ) . toBe ( "read_file" )
263- expect ( result [ 0 ] . tool_calls [ 0 ] . function . arguments ) . toBe ( '{"path":"README.md"}' )
268+ const msg = result [ 0 ] as any
269+ expect ( msg . tool_calls ) . toHaveLength ( 1 )
270+ expect ( msg . tool_calls [ 0 ] . id ) . toBe ( "call_123" )
271+ expect ( msg . tool_calls [ 0 ] . function . name ) . toBe ( "read_file" )
272+ expect ( msg . tool_calls [ 0 ] . function . arguments ) . toBe ( '{"path":"README.md"}' )
264273 } )
265274
266275 it ( "should handle string-input tool_use (JSON string)" , ( ) => {
@@ -277,8 +286,11 @@ describe("MimoHandler", () => {
277286 ] ,
278287 } ,
279288 ]
280- const result = ( handler as any ) . convertMessagesForMiMo ( messages )
281- expect ( result [ 0 ] . tool_calls [ 0 ] . function . arguments ) . toBe ( '{"path":"test.ts"}' )
289+ const result = convert ( messages )
290+ const msg = result [ 0 ] as any
291+ expect ( msg . tool_calls ) . toHaveLength ( 1 )
292+ expect ( msg . tool_calls [ 0 ] . function . name ) . toBe ( "read_file" )
293+ expect ( msg . tool_calls [ 0 ] . function . arguments ) . toContain ( "test.ts" )
282294 } )
283295
284296 it ( "should handle assistant message with string content" , ( ) => {
@@ -288,7 +300,7 @@ describe("MimoHandler", () => {
288300 content : "Simple text response" ,
289301 } ,
290302 ]
291- const result = ( handler as any ) . convertMessagesForMiMo ( messages )
303+ const result = convert ( messages )
292304 expect ( result ) . toHaveLength ( 1 )
293305 expect ( result [ 0 ] . role ) . toBe ( "assistant" )
294306 expect ( result [ 0 ] . content ) . toBe ( "Simple text response" )
@@ -302,7 +314,7 @@ describe("MimoHandler", () => {
302314 reasoning_content : "My reasoning" ,
303315 } ,
304316 ] as any [ ]
305- const result = ( handler as any ) . convertMessagesForMiMo ( messages )
317+ const result = convert ( messages )
306318 expect ( result ) . toHaveLength ( 1 )
307319 expect ( ( result [ 0 ] as any ) . reasoning_content ) . toBe ( "My reasoning" )
308320 } )
@@ -315,7 +327,7 @@ describe("MimoHandler", () => {
315327 reasoning_content : "" ,
316328 } ,
317329 ] as any [ ]
318- const result = ( handler as any ) . convertMessagesForMiMo ( messages )
330+ const result = convert ( messages )
319331 expect ( ( result [ 0 ] as any ) . reasoning_content ) . toBeUndefined ( )
320332 } )
321333
@@ -332,11 +344,11 @@ describe("MimoHandler", () => {
332344 ] ,
333345 } ,
334346 ]
335- const result = ( handler as any ) . convertMessagesForMiMo ( messages )
336- expect ( result ) . toHaveLength ( 1 )
337- expect ( result [ 0 ] . role ) . toBe ( "tool" )
338- expect ( result [ 0 ] . tool_call_id ) . toBe ( "call_123" )
339- expect ( result [ 0 ] . content ) . toBe ( "File contents here" )
347+ const result = convert ( messages )
348+ const msg = result [ 0 ] as any
349+ expect ( msg . role ) . toBe ( "tool" )
350+ expect ( msg . tool_call_id ) . toBe ( "call_123" )
351+ expect ( msg . content ) . toBe ( "File contents here" )
340352 } )
341353
342354 it ( "should handle tool_result with array content" , ( ) => {
@@ -355,7 +367,7 @@ describe("MimoHandler", () => {
355367 ] ,
356368 } ,
357369 ]
358- const result = ( handler as any ) . convertMessagesForMiMo ( messages )
370+ const result = convert ( messages )
359371 expect ( result [ 0 ] . content ) . toBe ( "Part 1\nPart 2" )
360372 } )
361373
@@ -372,8 +384,8 @@ describe("MimoHandler", () => {
372384 ] ,
373385 } ,
374386 ]
375- const result = ( handler as any ) . convertMessagesForMiMo ( messages )
376- expect ( result [ 0 ] . content ) . toBe ( "(empty) " )
387+ const result = convert ( messages )
388+ expect ( result [ 0 ] . content ) . toBe ( "" )
377389 } )
378390
379391 it ( "should merge text into last tool message when both exist in same turn" , ( ) => {
@@ -390,7 +402,7 @@ describe("MimoHandler", () => {
390402 ] ,
391403 } ,
392404 ]
393- const result = ( handler as any ) . convertMessagesForMiMo ( messages )
405+ const result = convert ( messages )
394406 expect ( result ) . toHaveLength ( 1 )
395407 expect ( result [ 0 ] . role ) . toBe ( "tool" )
396408 expect ( result [ 0 ] . content ) . toContain ( "result" )
@@ -404,7 +416,7 @@ describe("MimoHandler", () => {
404416 content : [ { type : "text" as const , text : "Hello" } ] ,
405417 } ,
406418 ]
407- const result = ( handler as any ) . convertMessagesForMiMo ( messages )
419+ const result = convert ( messages )
408420 expect ( result ) . toHaveLength ( 1 )
409421 expect ( result [ 0 ] . role ) . toBe ( "user" )
410422 expect ( result [ 0 ] . content ) . toBe ( "Hello" )
@@ -417,7 +429,7 @@ describe("MimoHandler", () => {
417429 content : "Hello world" ,
418430 } ,
419431 ]
420- const result = ( handler as any ) . convertMessagesForMiMo ( messages )
432+ const result = convert ( messages )
421433 expect ( result ) . toHaveLength ( 1 )
422434 expect ( result [ 0 ] . role ) . toBe ( "user" )
423435 expect ( result [ 0 ] . content ) . toBe ( "Hello world" )
@@ -453,17 +465,17 @@ describe("MimoHandler", () => {
453465 ] ,
454466 } ,
455467 ]
456- const result = ( handler as any ) . convertMessagesForMiMo ( messages )
468+ const result = convert ( messages )
457469
458470 // user message
459471 expect ( result [ 0 ] . role ) . toBe ( "user" )
460472 // assistant with reasoning + tool_calls
461473 expect ( result [ 1 ] . role ) . toBe ( "assistant" )
462474 expect ( ( result [ 1 ] as any ) . reasoning_content ) . toBe ( "User wants to read a file" )
463- expect ( result [ 1 ] . tool_calls ) . toHaveLength ( 1 )
475+ expect ( ( result [ 1 ] as any ) . tool_calls ) . toHaveLength ( 1 )
464476 // tool result
465477 expect ( result [ 2 ] . role ) . toBe ( "tool" )
466- expect ( result [ 2 ] . tool_call_id ) . toBe ( "call_1" )
478+ expect ( ( result [ 2 ] as any ) . tool_call_id ) . toBe ( "call_1" )
467479 } )
468480 } )
469481
0 commit comments