@@ -433,6 +433,13 @@ def _fix_tool_message_ordering(
433
433
else :
434
434
other_messages .append ((i , message ))
435
435
436
+ # First, identify which tool results will be paired to avoid duplicates
437
+ paired_tool_result_indices = set ()
438
+ for tool_id in tool_call_messages :
439
+ if tool_id in tool_result_messages :
440
+ tool_result_idx , _ = tool_result_messages [tool_id ]
441
+ paired_tool_result_indices .add (tool_result_idx )
442
+
436
443
# Create the fixed message sequence
437
444
fixed_messages : list [ChatCompletionMessageParam ] = []
438
445
used_indices = set ()
@@ -463,14 +470,14 @@ def _fix_tool_message_ordering(
463
470
):
464
471
# Add tool_use → tool_result pair
465
472
_ , tool_call_msg = tool_call_messages [tool_id ]
466
- _ , tool_result_msg = tool_result_messages [tool_id ]
473
+ tool_result_idx , tool_result_msg = tool_result_messages [tool_id ]
467
474
468
475
fixed_messages .append (tool_call_msg )
469
476
fixed_messages .append (tool_result_msg )
470
477
471
478
# Mark both as used
472
479
used_indices .add (tool_call_messages [tool_id ][0 ])
473
- used_indices .add (tool_result_messages [ tool_id ][ 0 ] )
480
+ used_indices .add (tool_result_idx )
474
481
elif tool_id and tool_id in tool_call_messages :
475
482
# Tool call without result - add just the tool call
476
483
_ , tool_call_msg = tool_call_messages [tool_id ]
@@ -480,7 +487,9 @@ def _fix_tool_message_ordering(
480
487
used_indices .add (i ) # Mark original multi-tool message as used
481
488
482
489
elif role == "tool" :
483
- # Skip - these will be handled as part of tool pairs above
490
+ # Only preserve unmatched tool results to avoid duplicates
491
+ if i not in paired_tool_result_indices :
492
+ fixed_messages .append (original_message )
484
493
used_indices .add (i )
485
494
486
495
else :
0 commit comments