@@ -282,13 +282,34 @@ def _fix_broken_tool_use(self, messages: list[Message]) -> list[Message]:
282282 ]
283283
284284 # Check if there are more messages after the current toolUse message
285- tool_result_ids = [
286- content ["toolResult" ]["toolUseId" ]
287- for content in messages [index + 1 ]["content" ]
288- if "toolResult" in content
289- ]
285+ next_message_content = messages [index + 1 ]["content" ]
286+ seen_tool_result_ids : set [str ] = set ()
287+ cleaned_next_message_content = []
288+ removed_orphaned_tool_results = False
289+ for content in next_message_content :
290+ if "toolResult" not in content :
291+ cleaned_next_message_content .append (content )
292+ continue
293+
294+ tool_result_id = content ["toolResult" ]["toolUseId" ]
295+ if tool_result_id in tool_use_ids and tool_result_id not in seen_tool_result_ids :
296+ seen_tool_result_ids .add (tool_result_id )
297+ cleaned_next_message_content .append (content )
298+ else :
299+ removed_orphaned_tool_results = True
290300
291- missing_tool_use_ids = list (set (tool_use_ids ) - set (tool_result_ids ))
301+ if removed_orphaned_tool_results :
302+ logger .warning (
303+ "Session message history has orphaned or duplicate toolResult blocks. "
304+ "Removing them to keep toolUse/toolResult pairs valid."
305+ )
306+ messages [index + 1 ]["content" ] = cleaned_next_message_content
307+
308+ tool_result_ids = list (seen_tool_result_ids )
309+
310+ missing_tool_use_ids = [
311+ tool_use_id for tool_use_id in tool_use_ids if tool_use_id not in tool_result_ids
312+ ]
292313 # If there are missing tool use ids, that means the messages history is broken
293314 if missing_tool_use_ids :
294315 logger .warning (
0 commit comments