Skip to content

Commit ea64ba0

Browse files
committed
Honor session settings in async SQLite sessions
1 parent 92e014a commit ea64ba0

2 files changed

Lines changed: 80 additions & 5 deletions

File tree

src/agents/extensions/memory/async_sqlite_session.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
from ...items import TResponseInputItem
1313
from ...memory import SessionABC
14-
from ...memory.session_settings import SessionSettings
14+
from ...memory.session_settings import SessionSettings, resolve_session_limit
1515

1616

1717
class AsyncSQLiteSession(SessionABC):
@@ -30,6 +30,7 @@ def __init__(
3030
db_path: str | Path = ":memory:",
3131
sessions_table: str = "agent_sessions",
3232
messages_table: str = "agent_messages",
33+
session_settings: SessionSettings | None = None,
3334
):
3435
"""Initialize the async SQLite session.
3536
@@ -39,8 +40,11 @@ def __init__(
3940
sessions_table: Name of the table to store session metadata. Defaults to
4041
'agent_sessions'
4142
messages_table: Name of the table to store message data. Defaults to 'agent_messages'
43+
session_settings: Session configuration settings including default limit for
44+
retrieving items. If None, uses default SessionSettings().
4245
"""
4346
self.session_id = session_id
47+
self.session_settings = session_settings or SessionSettings()
4448
self.db_path = db_path
4549
self.sessions_table = sessions_table
4650
self.messages_table = messages_table
@@ -106,15 +110,17 @@ async def get_items(self, limit: int | None = None) -> list[TResponseInputItem]:
106110
"""Retrieve the conversation history for this session.
107111
108112
Args:
109-
limit: Maximum number of items to retrieve. If None, retrieves all items.
113+
limit: Maximum number of items to retrieve. If None, uses session_settings.limit.
110114
When specified, returns the latest N items in chronological order.
111115
112116
Returns:
113117
List of input items representing the conversation history
114118
"""
115119

120+
session_limit = resolve_session_limit(limit, self.session_settings)
121+
116122
async with self._locked_connection() as conn:
117-
if limit is None:
123+
if session_limit is None:
118124
cursor = await conn.execute(
119125
f"""
120126
SELECT message_data FROM {self.messages_table}
@@ -131,13 +137,13 @@ async def get_items(self, limit: int | None = None) -> list[TResponseInputItem]:
131137
ORDER BY id DESC
132138
LIMIT ?
133139
""",
134-
(self.session_id, limit),
140+
(self.session_id, session_limit),
135141
)
136142

137143
rows = list(await cursor.fetchall())
138144
await cursor.close()
139145

140-
if limit is not None:
146+
if session_limit is not None:
141147
rows = rows[::-1]
142148

143149
items: list[TResponseInputItem] = []

tests/extensions/memory/test_async_sqlite_session.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
from agents import Agent, Runner, TResponseInputItem
1717
from agents.extensions.memory import AsyncSQLiteSession
18+
from agents.memory import SessionSettings
1819
from tests.fake_model import FakeModel
1920
from tests.test_responses import get_text_message
2021

@@ -140,6 +141,74 @@ async def test_async_sqlite_session_get_items_limit():
140141
await session.close()
141142

142143

144+
async def test_async_sqlite_session_session_settings_default():
145+
"""Test that session_settings defaults to empty SessionSettings."""
146+
session = AsyncSQLiteSession("async_default_settings")
147+
148+
assert isinstance(session.session_settings, SessionSettings)
149+
assert session.session_settings.limit is None
150+
151+
await session.close()
152+
153+
154+
async def test_async_sqlite_session_session_settings_constructor():
155+
"""Test passing session_settings via constructor."""
156+
session = AsyncSQLiteSession(
157+
"async_constructor_settings",
158+
session_settings=SessionSettings(limit=5),
159+
)
160+
161+
assert session.session_settings is not None
162+
assert session.session_settings.limit == 5
163+
164+
await session.close()
165+
166+
167+
async def test_async_sqlite_session_get_items_uses_session_settings_limit():
168+
"""Test that get_items uses session_settings.limit as default."""
169+
with tempfile.TemporaryDirectory() as temp_dir:
170+
db_path = Path(temp_dir) / "async_settings_limit.db"
171+
session = AsyncSQLiteSession(
172+
"async_settings_limit",
173+
db_path,
174+
session_settings=SessionSettings(limit=3),
175+
)
176+
177+
items: list[TResponseInputItem] = [
178+
{"role": "user", "content": f"Message {i}"} for i in range(5)
179+
]
180+
await session.add_items(items)
181+
182+
retrieved = await session.get_items()
183+
assert retrieved == items[-3:]
184+
185+
await session.close()
186+
187+
188+
async def test_async_sqlite_session_explicit_limit_overrides_session_settings():
189+
"""Test that explicit limit parameter overrides session_settings."""
190+
with tempfile.TemporaryDirectory() as temp_dir:
191+
db_path = Path(temp_dir) / "async_settings_override.db"
192+
session = AsyncSQLiteSession(
193+
"async_settings_override",
194+
db_path,
195+
session_settings=SessionSettings(limit=5),
196+
)
197+
198+
items: list[TResponseInputItem] = [
199+
{"role": "user", "content": f"Message {i}"} for i in range(10)
200+
]
201+
await session.add_items(items)
202+
203+
retrieved = await session.get_items(limit=2)
204+
assert retrieved == items[-2:]
205+
206+
no_items = await session.get_items(limit=0)
207+
assert no_items == []
208+
209+
await session.close()
210+
211+
143212
async def test_async_sqlite_session_unicode_content():
144213
"""Test AsyncSQLiteSession stores unicode content."""
145214
session = AsyncSQLiteSession("async_unicode")

0 commit comments

Comments
 (0)