Skip to content

Commit d2f0bb2

Browse files
committed
fix
1 parent f0f4897 commit d2f0bb2

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

src/agents/memory/openai_responses_compaction_session.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ async def get_items(self, limit: int | None = None) -> list[TResponseInputItem]:
190190
return await self.underlying_session.get_items(limit)
191191

192192
async def _defer_compaction(self, response_id: str) -> None:
193+
if self._deferred_response_id is not None:
194+
return
193195
compaction_candidate_items, session_items = await self._ensure_compaction_candidates()
194196
should_compact = self.should_trigger_compaction(
195197
{
@@ -200,8 +202,6 @@ async def _defer_compaction(self, response_id: str) -> None:
200202
)
201203
if should_compact:
202204
self._deferred_response_id = response_id
203-
else:
204-
self._deferred_response_id = None
205205

206206
def _get_deferred_compaction_response_id(self) -> str | None:
207207
return self._deferred_response_id

tests/memory/test_openai_responses_compaction_session.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,50 @@ def should_trigger_compaction(context: dict[str, Any]) -> bool:
357357

358358
mock_client.responses.compact.assert_awaited_once()
359359

360+
@pytest.mark.asyncio
361+
async def test_deferred_compaction_persists_across_tool_turns(self) -> None:
362+
underlying = SimpleListSession()
363+
compacted = SimpleNamespace(
364+
output=[{"type": "compaction", "summary": "compacted"}],
365+
)
366+
mock_client = MagicMock()
367+
mock_client.responses.compact = AsyncMock(return_value=compacted)
368+
369+
should_compact_calls = {"count": 0}
370+
371+
def should_trigger_compaction(context: dict[str, Any]) -> bool:
372+
should_compact_calls["count"] += 1
373+
return should_compact_calls["count"] == 1
374+
375+
session = OpenAIResponsesCompactionSession(
376+
session_id="demo",
377+
underlying_session=underlying,
378+
client=mock_client,
379+
should_trigger_compaction=should_trigger_compaction,
380+
)
381+
382+
tool = get_function_tool(name="do_thing", return_value="done")
383+
model = FakeModel()
384+
model.add_multiple_turn_outputs(
385+
[
386+
[get_function_tool_call("do_thing")],
387+
[get_function_tool_call("do_thing")],
388+
[get_text_message("ok")],
389+
]
390+
)
391+
agent = Agent(
392+
name="assistant",
393+
model=model,
394+
tools=[tool],
395+
tool_use_behavior="stop_on_first_tool",
396+
)
397+
398+
await Runner.run(agent, "hello", session=session)
399+
await Runner.run(agent, "again", session=session)
400+
await Runner.run(agent, "final", session=session)
401+
402+
mock_client.responses.compact.assert_awaited_once()
403+
360404

361405
class TestTypeGuard:
362406
def test_is_compaction_aware_session_true(self) -> None:

0 commit comments

Comments
 (0)