@@ -771,10 +771,22 @@ def _get_new_history(
771771 )
772772 if existing_index is not None :
773773 new_history = old_history .copy ()
774- if event .type == "message" and event .content is not None and len (event .content ) > 0 :
775- existing_item = old_history [existing_index ]
776- if existing_item .type == "message" :
777- # Merge content preserving existing transcript/text when incoming entry is empty
774+ existing_item = old_history [existing_index ]
775+
776+ # If it's a message, try to merge/preserve content while applying new status.
777+ if event .type == "message" and existing_item .type == "message" :
778+ # Start with the incoming event but ensure we don't lose content if it's empty.
779+ incoming_item = event
780+ if not event .content :
781+ # Preserve existing content but update status and other metadata.
782+ incoming_item = existing_item .model_copy (
783+ update = {
784+ "status" : event .status ,
785+ "previous_item_id" : event .previous_item_id or existing_item .previous_item_id ,
786+ }
787+ )
788+ else :
789+ # Specialized merge logic for non-empty content
778790 if event .role == "assistant" and existing_item .role == "assistant" :
779791 assistant_existing_content = existing_item .content
780792 assistant_incoming = event .content
@@ -799,10 +811,9 @@ def _get_new_history(
799811 assistant_new_content .append (assistant_current )
800812 else :
801813 assistant_new_content .append (ac )
802- updated_assistant = event .model_copy (
814+ incoming_item = event .model_copy (
803815 update = {"content" : assistant_new_content }
804816 )
805- new_history [existing_index ] = updated_assistant
806817 elif event .role == "user" and existing_item .role == "user" :
807818 user_existing_content = existing_item .content
808819 user_incoming = event .content
@@ -860,8 +871,7 @@ def _image_url_str(val: object) -> str | None:
860871 else :
861872 merged .append (uc )
862873
863- updated_user = event .model_copy (update = {"content" : merged })
864- new_history [existing_index ] = updated_user
874+ incoming_item = event .model_copy (update = {"content" : merged })
865875 elif event .role == "system" and existing_item .role == "system" :
866876 system_existing_content = existing_item .content
867877 system_incoming = event .content
@@ -877,14 +887,13 @@ def _image_url_str(val: object) -> str | None:
877887 system_new_content .append (system_current )
878888 else :
879889 system_new_content .append (sc )
880- updated_system = event .model_copy (update = {"content" : system_new_content })
881- new_history [existing_index ] = updated_system
882- else :
883- # Role changed or mismatched; just replace
884- new_history [existing_index ] = event
885- else :
886- # If the existing item is not a message, just replace it.
887- new_history [existing_index ] = event
890+ incoming_item = event .model_copy (update = {"content" : system_new_content })
891+
892+ new_history [existing_index ] = incoming_item
893+ else :
894+ # For non-messages (e.g. tool calls) or mismatches, just replace.
895+ # This ensures status updates for tool calls are applied.
896+ new_history [existing_index ] = event
888897 return new_history
889898
890899 # Otherwise, insert it after the previous_item_id if that is set
0 commit comments