Files
openai--openai-agents-python/tests/memory/test_session_limit.py
T
2026-07-13 12:39:17 +08:00

177 lines
6.7 KiB
Python

"""Test session_limit parameter functionality via SessionSettings."""
import tempfile
from pathlib import Path
import pytest
from agents import Agent, RunConfig, SQLiteSession
from agents.memory import SessionSettings
from tests.fake_model import FakeModel
from tests.memory.test_session import run_agent_async
from tests.test_responses import get_text_message
@pytest.mark.parametrize("runner_method", ["run", "run_sync", "run_streamed"])
@pytest.mark.asyncio
async def test_session_limit_parameter(runner_method):
"""Test that session_limit parameter correctly limits conversation history
retrieved from session across all Runner methods."""
with tempfile.TemporaryDirectory() as temp_dir:
db_path = Path(temp_dir) / "test_limit.db"
session_id = "limit_test"
session = SQLiteSession(session_id, db_path)
model = FakeModel()
agent = Agent(name="test", model=model)
# Build up a longer conversation history
model.set_next_output([get_text_message("Reply 1")])
await run_agent_async(runner_method, agent, "Message 1", session=session)
model.set_next_output([get_text_message("Reply 2")])
await run_agent_async(runner_method, agent, "Message 2", session=session)
model.set_next_output([get_text_message("Reply 3")])
await run_agent_async(runner_method, agent, "Message 3", session=session)
# Verify we have 6 items in total (3 user + 3 assistant)
all_items = await session.get_items()
assert len(all_items) == 6
# Test session_limit via RunConfig - should only get last 2 history items + new input
model.set_next_output([get_text_message("Reply 4")])
await run_agent_async(
runner_method,
agent,
"Message 4",
session=session,
run_config=RunConfig(session_settings=SessionSettings(limit=2)),
)
# Verify model received limited history
last_input = model.last_turn_args["input"]
# Should have: 2 history items + 1 new message = 3 total
assert len(last_input) == 3
# First item should be "Message 3" (not Message 1 or 2)
assert last_input[0].get("content") == "Message 3"
# Assistant message has content as a list
assert last_input[1].get("content")[0]["text"] == "Reply 3"
assert last_input[2].get("content") == "Message 4"
session.close()
@pytest.mark.parametrize("runner_method", ["run", "run_sync", "run_streamed"])
@pytest.mark.asyncio
async def test_session_limit_zero(runner_method):
"""Test that session_limit=0 provides no history, only new message."""
with tempfile.TemporaryDirectory() as temp_dir:
db_path = Path(temp_dir) / "test_limit_zero.db"
session_id = "limit_zero_test"
session = SQLiteSession(session_id, db_path)
model = FakeModel()
agent = Agent(name="test", model=model)
# Build conversation history
model.set_next_output([get_text_message("Reply 1")])
await run_agent_async(runner_method, agent, "Message 1", session=session)
model.set_next_output([get_text_message("Reply 2")])
await run_agent_async(runner_method, agent, "Message 2", session=session)
# Test with limit=0 - should get NO history, just new message
model.set_next_output([get_text_message("Reply 3")])
await run_agent_async(
runner_method,
agent,
"Message 3",
session=session,
run_config=RunConfig(session_settings=SessionSettings(limit=0)),
)
# Verify model received only the new message
last_input = model.last_turn_args["input"]
assert len(last_input) == 1
assert last_input[0].get("content") == "Message 3"
session.close()
@pytest.mark.parametrize("runner_method", ["run", "run_sync", "run_streamed"])
@pytest.mark.asyncio
async def test_session_limit_none_gets_all_history(runner_method):
"""Test that session_limit=None retrieves entire history (default behavior)."""
with tempfile.TemporaryDirectory() as temp_dir:
db_path = Path(temp_dir) / "test_limit_none.db"
session_id = "limit_none_test"
session = SQLiteSession(session_id, db_path)
model = FakeModel()
agent = Agent(name="test", model=model)
# Build longer conversation
for i in range(1, 6):
model.set_next_output([get_text_message(f"Reply {i}")])
await run_agent_async(runner_method, agent, f"Message {i}", session=session)
# Verify 10 items in session (5 user + 5 assistant)
all_items = await session.get_items()
assert len(all_items) == 10
# Test with session_limit=None (default) - should get all history
model.set_next_output([get_text_message("Reply 6")])
await run_agent_async(
runner_method,
agent,
"Message 6",
session=session,
run_config=RunConfig(session_settings=SessionSettings(limit=None)),
)
# Verify model received all history + new message
last_input = model.last_turn_args["input"]
assert len(last_input) == 11 # 10 history + 1 new
assert last_input[0].get("content") == "Message 1"
assert last_input[-1].get("content") == "Message 6"
session.close()
@pytest.mark.parametrize("runner_method", ["run", "run_sync", "run_streamed"])
@pytest.mark.asyncio
async def test_session_limit_larger_than_history(runner_method):
"""Test that session_limit larger than history size returns all items."""
with tempfile.TemporaryDirectory() as temp_dir:
db_path = Path(temp_dir) / "test_limit_large.db"
session_id = "limit_large_test"
session = SQLiteSession(session_id, db_path)
model = FakeModel()
agent = Agent(name="test", model=model)
# Build small conversation
model.set_next_output([get_text_message("Reply 1")])
await run_agent_async(runner_method, agent, "Message 1", session=session)
# Test with limit=100 (much larger than actual history)
model.set_next_output([get_text_message("Reply 2")])
await run_agent_async(
runner_method,
agent,
"Message 2",
session=session,
run_config=RunConfig(session_settings=SessionSettings(limit=100)),
)
# Verify model received all available history + new message
last_input = model.last_turn_args["input"]
assert len(last_input) == 3 # 2 history + 1 new
assert last_input[0].get("content") == "Message 1"
# Assistant message has content as a list
assert last_input[1].get("content")[0]["text"] == "Reply 1"
assert last_input[2].get("content") == "Message 2"
session.close()