@@ -490,6 +490,40 @@ describe("anthropic tool result history repair", () => {
490490 } ) ;
491491 } ) ;
492492
493+ test ( "reorders interleaved text after tool_use so Anthropic pairing stays valid (#620)" , async ( ) => {
494+ const adapter = createAnthropicAdapter ( { ...provider , adapter : "anthropic" } ) ;
495+ const request = await adapter . buildRequest ( {
496+ modelId : "claude-sonnet" ,
497+ context : {
498+ messages : [
499+ { role : "user" , content : "start" , timestamp : 0 } ,
500+ {
501+ role : "assistant" ,
502+ content : [
503+ { type : "text" , text : "before" } ,
504+ { type : "toolCall" , id : "call_a" , name : "first_tool" , arguments : { } } ,
505+ { type : "text" , text : "between steps" } ,
506+ { type : "toolCall" , id : "call_b" , name : "second_tool" , arguments : { } } ,
507+ ] ,
508+ model : "claude-sonnet" ,
509+ timestamp : 0 ,
510+ } ,
511+ { role : "toolResult" , toolCallId : "call_a" , toolName : "first_tool" , content : "one" , isError : false , timestamp : 0 } ,
512+ { role : "toolResult" , toolCallId : "call_b" , toolName : "second_tool" , content : "two" , isError : false , timestamp : 0 } ,
513+ ] ,
514+ } ,
515+ stream : true ,
516+ options : { } ,
517+ } ) ;
518+ const wire = JSON . parse ( request . body ) as { messages : Array < { role : string ; content : any } > } ;
519+ const assistant = wire . messages . find ( m => m . role === "assistant" && Array . isArray ( m . content ) && m . content . some ( ( c : { type ?: string } ) => c . type === "tool_use" ) ) ;
520+ expect ( assistant ) . toBeDefined ( ) ;
521+ const types = ( assistant ! . content as { type : string } [ ] ) . map ( c => c . type ) ;
522+ expect ( types ) . toEqual ( [ "text" , "text" , "tool_use" , "tool_use" ] ) ;
523+ expect ( wire . messages [ 2 ] . role ) . toBe ( "user" ) ;
524+ expect ( wire . messages [ 2 ] . content . map ( ( c : { tool_use_id ?: string } ) => c . tool_use_id ) ) . toEqual ( [ "call_a" , "call_b" ] ) ;
525+ } ) ;
526+
493527 test ( "preserves orphan tool results as text instead of invalid Anthropic tool_result blocks" , async ( ) => {
494528 const adapter = createAnthropicAdapter ( { ...provider , adapter : "anthropic" } ) ;
495529 const request = await adapter . buildRequest ( {
0 commit comments