From a4ce73785bb6c024b6b8690cfbc0b15f2ca7c6a5 Mon Sep 17 00:00:00 2001 From: HughhhhCoder Date: Wed, 2 Sep 2026 19:24:24 +0800 Subject: [PATCH 1/2] fix(memory): merge base session settings into subclasses --- src/agents/memory/session_settings.py | 6 ++++-- tests/memory/test_session.py | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/agents/memory/session_settings.py b/src/agents/memory/session_settings.py index eb42f617f2..6f2ee60116 100644 --- a/src/agents/memory/session_settings.py +++ b/src/agents/memory/session_settings.py @@ -51,10 +51,10 @@ def resolve(self, override: SessionSettings | dict[str, Any] | None) -> SessionS override = _coerce_session_settings(override, settings_type=type(self)) changes = { - field.name: getattr(override, field.name) + field.name: getattr(override, field.name, None) for field in fields(self) if (override_fields is None or field.name in override_fields) - and getattr(override, field.name) is not None + and getattr(override, field.name, None) is not None } return replace(self, **changes) @@ -76,6 +76,8 @@ def _coerce_session_settings( *, settings_type: type[SessionSettings], ) -> SessionSettings: + if isinstance(value, SessionSettings): + return value return coerce_dataclass_config(value, settings_type, parameter_name="session") diff --git a/tests/memory/test_session.py b/tests/memory/test_session.py index 9667c5b23c..0ccdabd654 100644 --- a/tests/memory/test_session.py +++ b/tests/memory/test_session.py @@ -962,6 +962,25 @@ async def test_session_settings_resolve(): assert final_none.limit == 100 +def test_session_settings_resolve_accepts_base_override_for_subclass() -> None: + """A subclass can resolve settings produced by the base RunConfig type.""" + from pydantic.dataclasses import dataclass + + @dataclass + class TenantSessionSettings(SessionSettings): + tenant: str = "default" + + base = TenantSessionSettings(limit=100, tenant="acme") + run_config = RunConfig(session_settings={"limit": 50}) + + final = base.resolve(run_config.session_settings) + + assert isinstance(final, TenantSessionSettings) + assert final.limit == 50 + assert final.tenant == "acme" + assert base.limit == 100 + + @pytest.mark.asyncio async def test_runner_with_session_settings_override(): """Test that RunConfig can override session's default settings.""" From 1cc89176df3dabc6679352ef5b8622d5fa4c2e92 Mon Sep 17 00:00:00 2001 From: HughhhhCoder Date: Thu, 3 Sep 2026 18:51:51 +0800 Subject: [PATCH 2/2] fix(memory): reject incompatible session setting overrides --- src/agents/memory/session_settings.py | 7 ++++++- tests/memory/test_session.py | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/agents/memory/session_settings.py b/src/agents/memory/session_settings.py index 6f2ee60116..0389b8c1de 100644 --- a/src/agents/memory/session_settings.py +++ b/src/agents/memory/session_settings.py @@ -77,7 +77,12 @@ def _coerce_session_settings( settings_type: type[SessionSettings], ) -> SessionSettings: if isinstance(value, SessionSettings): - return value + if type(value) is SessionSettings or isinstance(value, settings_type): + return value + raise TypeError( + f"Session settings override must be SessionSettings or an instance of " + f"{settings_type.__name__}; got {type(value).__name__}" + ) return coerce_dataclass_config(value, settings_type, parameter_name="session") diff --git a/tests/memory/test_session.py b/tests/memory/test_session.py index 0ccdabd654..4ff654bb73 100644 --- a/tests/memory/test_session.py +++ b/tests/memory/test_session.py @@ -981,6 +981,25 @@ class TenantSessionSettings(SessionSettings): assert base.limit == 100 +def test_session_settings_resolve_rejects_incompatible_subclass_override() -> None: + """A subclass must not silently discard fields from a sibling subclass.""" + from pydantic.dataclasses import dataclass + + @dataclass + class TenantSessionSettings(SessionSettings): + tenant: str = "default" + + @dataclass + class RegionSessionSettings(SessionSettings): + region: str = "default" + + base = TenantSessionSettings(limit=100, tenant="acme") + override = RegionSessionSettings(limit=50, region="us-east-1") + + with pytest.raises(TypeError, match="TenantSessionSettings"): + base.resolve(override) + + @pytest.mark.asyncio async def test_runner_with_session_settings_override(): """Test that RunConfig can override session's default settings."""