Skip to content

Commit ed9da3f

Browse files
GWealecopybara-github
authored andcommitted
feat!: Introduction of ADK folder for local session and artifact storage
Default CLI session storage to SQLite instead of in-memory Previously, adk run and adk web used in-memory session storage by default, causing sessions to be lost on restart. Now sessions persist to .adk/session.db automatically. To use in-memory storage, pass --session-service-uri memory:// Co-authored-by: George Weale <[email protected]> PiperOrigin-RevId: 838975328
1 parent dd827af commit ed9da3f

File tree

4 files changed

+42
-10
lines changed

4 files changed

+42
-10
lines changed

src/google/adk/cli/cli.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,10 @@
2626
from ..agents.llm_agent import LlmAgent
2727
from ..apps.app import App
2828
from ..artifacts.base_artifact_service import BaseArtifactService
29-
from ..artifacts.in_memory_artifact_service import InMemoryArtifactService
3029
from ..auth.credential_service.base_credential_service import BaseCredentialService
3130
from ..auth.credential_service.in_memory_credential_service import InMemoryCredentialService
3231
from ..runners import Runner
3332
from ..sessions.base_session_service import BaseSessionService
34-
from ..sessions.in_memory_session_service import InMemorySessionService
3533
from ..sessions.session import Session
3634
from ..utils.context_utils import Aclosing
3735
from ..utils.env_utils import is_env_enabled
@@ -162,8 +160,9 @@ async def run_cli(
162160
user_id = 'test_user'
163161

164162
# Create session and artifact services using factory functions
163+
# Sessions persist under <agents_dir>/<agent>/.adk/session.db by default.
165164
session_service = create_session_service_from_options(
166-
base_dir=agent_root,
165+
base_dir=agent_parent_path,
167166
session_service_uri=session_service_uri,
168167
)
169168

src/google/adk/cli/utils/local_storage.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,32 @@ def create_local_database_session_service(
5757
return SqliteSessionService(db_path=str(session_db_path))
5858

5959

60+
def create_local_session_service(
61+
*,
62+
base_dir: Path | str,
63+
per_agent: bool = False,
64+
) -> BaseSessionService:
65+
"""Creates a local SQLite-backed session service.
66+
67+
Args:
68+
base_dir: The base directory for the agent(s).
69+
per_agent: If True, creates a PerAgentDatabaseSessionService that stores
70+
sessions in each agent's .adk folder. If False, creates a single
71+
SqliteSessionService at base_dir/.adk/session.db.
72+
73+
Returns:
74+
A BaseSessionService instance backed by SQLite.
75+
"""
76+
if per_agent:
77+
logger.info(
78+
"Using per-agent session storage rooted at %s",
79+
base_dir,
80+
)
81+
return PerAgentDatabaseSessionService(agents_root=base_dir)
82+
83+
return create_local_database_session_service(base_dir=base_dir)
84+
85+
6086
def create_local_artifact_service(
6187
*, base_dir: Path | str
6288
) -> BaseArtifactService:

src/google/adk/cli/utils/service_factory.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from ...sessions.base_session_service import BaseSessionService
2424
from ..service_registry import get_service_registry
2525
from .local_storage import create_local_artifact_service
26+
from .local_storage import create_local_session_service
2627

2728
logger = logging.getLogger("google_adk." + __name__)
2829

@@ -62,10 +63,8 @@ def create_session_service_from_options(
6263
)
6364
return DatabaseSessionService(db_url=session_service_uri, **fallback_kwargs)
6465

65-
logger.info("Using in-memory session service")
66-
from ...sessions.in_memory_session_service import InMemorySessionService
67-
68-
return InMemorySessionService()
66+
# Default to per-agent local SQLite storage in <agents_root>/<agent>/.adk/.
67+
return create_local_session_service(base_dir=base_path, per_agent=True)
6968

7069

7170
def create_memory_service_from_options(

tests/unittests/cli/utils/test_service_factory.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
from pathlib import Path
2020
from unittest.mock import Mock
2121

22+
from google.adk.cli.utils.local_storage import PerAgentDatabaseSessionService
2223
import google.adk.cli.utils.service_factory as service_factory
2324
from google.adk.memory.in_memory_memory_service import InMemoryMemoryService
2425
from google.adk.sessions.database_session_service import DatabaseSessionService
25-
from google.adk.sessions.in_memory_session_service import InMemorySessionService
2626
import pytest
2727

2828

@@ -44,12 +44,20 @@ def test_create_session_service_uses_registry(tmp_path: Path, monkeypatch):
4444
)
4545

4646

47-
def test_create_session_service_defaults_to_memory(tmp_path: Path):
47+
@pytest.mark.asyncio
48+
async def test_create_session_service_defaults_to_per_agent_sqlite(
49+
tmp_path: Path,
50+
) -> None:
51+
agent_dir = tmp_path / "agent_a"
52+
agent_dir.mkdir()
4853
service = service_factory.create_session_service_from_options(
4954
base_dir=tmp_path,
5055
)
5156

52-
assert isinstance(service, InMemorySessionService)
57+
assert isinstance(service, PerAgentDatabaseSessionService)
58+
session = await service.create_session(app_name="agent_a", user_id="user")
59+
assert session.app_name == "agent_a"
60+
assert (agent_dir / ".adk" / "session.db").exists()
5361

5462

5563
def test_create_session_service_fallbacks_to_database(

0 commit comments

Comments
 (0)