@@ -332,6 +332,10 @@ describe("translateToOpenAI (request side)", () => {
332332 { type : "text" , text : "4" } ,
333333 ] ,
334334 } ,
335+ {
336+ role : "user" ,
337+ content : "thanks" ,
338+ } ,
335339 ] ,
336340 }
337341 const result = translateToOpenAI ( payload )
@@ -366,6 +370,116 @@ describe("translateToOpenAI (request side)", () => {
366370 } ,
367371 ] )
368372 } )
373+
374+ test ( "strips a single trailing assistant prefill" , ( ) => {
375+ const payload : AnthropicMessagesPayload = {
376+ model : "claude-opus-4-5" ,
377+ max_tokens : 100 ,
378+ messages : [
379+ { role : "user" , content : "Write a greeting" } ,
380+ { role : "assistant" , content : "Hello" } ,
381+ ] ,
382+ }
383+
384+ const result = translateToOpenAI ( payload )
385+
386+ expect ( result . messages ) . toEqual ( [
387+ { role : "user" , content : "Write a greeting" } ,
388+ ] )
389+ } )
390+
391+ test ( "strips multiple trailing assistant prefill turns" , ( ) => {
392+ const payload : AnthropicMessagesPayload = {
393+ model : "claude-opus-4-5" ,
394+ max_tokens : 100 ,
395+ messages : [
396+ { role : "user" , content : "Summarize" } ,
397+ { role : "assistant" , content : "Draft one" } ,
398+ { role : "assistant" , content : "Draft two" } ,
399+ ] ,
400+ }
401+
402+ const result = translateToOpenAI ( payload )
403+
404+ expect ( result . messages ) . toEqual ( [ { role : "user" , content : "Summarize" } ] )
405+ } )
406+
407+ test ( "strips trailing assistant tool-call prefill" , ( ) => {
408+ const payload : AnthropicMessagesPayload = {
409+ model : "claude-opus-4-5" ,
410+ max_tokens : 100 ,
411+ messages : [
412+ { role : "user" , content : "Read a file" } ,
413+ {
414+ role : "assistant" ,
415+ content : [
416+ {
417+ type : "tool_use" ,
418+ id : "toolu_123" ,
419+ name : "Read" ,
420+ input : { file_path : "README.md" } ,
421+ } ,
422+ ] ,
423+ } ,
424+ ] ,
425+ }
426+
427+ const result = translateToOpenAI ( payload )
428+
429+ expect ( result . messages ) . toEqual ( [ { role : "user" , content : "Read a file" } ] )
430+ } )
431+
432+ test ( "keeps assistant tool call when followed by tool result" , ( ) => {
433+ const payload : AnthropicMessagesPayload = {
434+ model : "claude-opus-4-5" ,
435+ max_tokens : 100 ,
436+ messages : [
437+ { role : "user" , content : "Read a file" } ,
438+ {
439+ role : "assistant" ,
440+ content : [
441+ {
442+ type : "tool_use" ,
443+ id : "toolu_123" ,
444+ name : "Read" ,
445+ input : { file_path : "README.md" } ,
446+ } ,
447+ ] ,
448+ } ,
449+ {
450+ role : "user" ,
451+ content : [
452+ {
453+ type : "tool_result" ,
454+ tool_use_id : "toolu_123" ,
455+ content : "# Project" ,
456+ } ,
457+ ] ,
458+ } ,
459+ ] ,
460+ }
461+
462+ const result = translateToOpenAI ( payload )
463+
464+ expect ( result . messages ) . toEqual ( [
465+ { role : "user" , content : "Read a file" } ,
466+ {
467+ role : "assistant" ,
468+ content : null ,
469+ tool_calls : [
470+ {
471+ id : "toolu_123" ,
472+ type : "function" ,
473+ function : {
474+ name : "Read" ,
475+ arguments : JSON . stringify ( { file_path : "README.md" } ) ,
476+ } ,
477+ } ,
478+ ] ,
479+ } ,
480+ { role : "tool" , tool_call_id : "toolu_123" , content : "# Project" } ,
481+ ] )
482+ } )
369483} )
370484
371485// ── Stream translation ──────────────────────────────────────────────────────
0 commit comments