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

Commit 9f5575a

Browse files
authored
fix: #2798 avoid stale hydrated input ids in server conversation tracker (#2800)
1 parent a7b4851 commit 9f5575a

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

src/agents/run_internal/oai_conversation.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,11 @@ def hydrate_from_state(
156156
if isinstance(original_input, list):
157157
normalized_input = prepare_model_input_items(original_input)
158158

159+
# Hydrated initial input is reconstructed during resume, so object identity is not a
160+
# stable dedupe key and can later collide with unrelated freshly allocated items.
159161
for item in ItemHelpers.input_to_new_input_list(normalized_input):
160162
if item is None:
161163
continue
162-
self.sent_items.add(id(item))
163164
item_id = _normalize_server_item_id(
164165
item.get("id") if isinstance(item, dict) else getattr(item, "id", None)
165166
)

tests/test_server_conversation_tracker.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,41 @@ def test_prepare_input_filters_items_seen_by_server_and_tool_calls() -> None:
8484
assert tracker.remaining_initial_input is None
8585

8686

87+
def test_hydrate_from_state_does_not_track_string_initial_input_by_object_identity() -> None:
88+
tracker = OpenAIServerConversationTracker(
89+
conversation_id="conv-init-string", previous_response_id=None
90+
)
91+
92+
tracker.hydrate_from_state(
93+
original_input="hello",
94+
generated_items=[],
95+
model_responses=[],
96+
)
97+
98+
assert tracker.sent_items == set()
99+
assert tracker.sent_initial_input is True
100+
assert tracker.remaining_initial_input is None
101+
assert len(tracker.sent_item_fingerprints) == 1
102+
103+
104+
def test_hydrate_from_state_does_not_track_list_initial_input_by_object_identity() -> None:
105+
tracker = OpenAIServerConversationTracker(
106+
conversation_id="conv-init-list", previous_response_id=None
107+
)
108+
original_input = [cast(TResponseInputItem, {"role": "user", "content": "hello"})]
109+
110+
tracker.hydrate_from_state(
111+
original_input=original_input,
112+
generated_items=[],
113+
model_responses=[],
114+
)
115+
116+
assert tracker.sent_items == set()
117+
assert tracker.sent_initial_input is True
118+
assert tracker.remaining_initial_input is None
119+
assert len(tracker.sent_item_fingerprints) == 1
120+
121+
87122
def test_mark_input_as_sent_and_rewind_input_respects_remaining_initial_input() -> None:
88123
tracker = OpenAIServerConversationTracker(conversation_id="conv2", previous_response_id=None)
89124
pending_1: TResponseInputItem = cast(TResponseInputItem, {"id": "p-1", "type": "message"})

0 commit comments

Comments
 (0)