豆豆友情提示:这是一个非官方 GitHub 代理镜像,主要用于网络测试或访问加速。请勿在此进行登录、注册或处理任何敏感信息。进行这些操作请务必访问官方网站 github.com。 Raw 内容也通过此代理提供。
Skip to content

Commit ac9b7a4

Browse files
committed
fix(realtime): ensure history status is updated even with empty content
1 parent 67fb85a commit ac9b7a4

File tree

1 file changed

+25
-16
lines changed

1 file changed

+25
-16
lines changed

src/agents/realtime/session.py

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)