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 <gweale@google.com>
PiperOrigin-RevId: 838975328
This commit is contained in:
George Weale
2025-12-01 16:22:35 -08:00
committed by Copybara-Service
parent dd827af2ee
commit ed9da3fa45
4 changed files with 42 additions and 10 deletions
+2 -3
View File
@@ -26,12 +26,10 @@ from pydantic import BaseModel
from ..agents.llm_agent import LlmAgent
from ..apps.app import App
from ..artifacts.base_artifact_service import BaseArtifactService
from ..artifacts.in_memory_artifact_service import InMemoryArtifactService
from ..auth.credential_service.base_credential_service import BaseCredentialService
from ..auth.credential_service.in_memory_credential_service import InMemoryCredentialService
from ..runners import Runner
from ..sessions.base_session_service import BaseSessionService
from ..sessions.in_memory_session_service import InMemorySessionService
from ..sessions.session import Session
from ..utils.context_utils import Aclosing
from ..utils.env_utils import is_env_enabled
@@ -162,8 +160,9 @@ async def run_cli(
user_id = 'test_user'
# Create session and artifact services using factory functions
# Sessions persist under <agents_dir>/<agent>/.adk/session.db by default.
session_service = create_session_service_from_options(
base_dir=agent_root,
base_dir=agent_parent_path,
session_service_uri=session_service_uri,
)
+26
View File
@@ -57,6 +57,32 @@ def create_local_database_session_service(
return SqliteSessionService(db_path=str(session_db_path))
def create_local_session_service(
*,
base_dir: Path | str,
per_agent: bool = False,
) -> BaseSessionService:
"""Creates a local SQLite-backed session service.
Args:
base_dir: The base directory for the agent(s).
per_agent: If True, creates a PerAgentDatabaseSessionService that stores
sessions in each agent's .adk folder. If False, creates a single
SqliteSessionService at base_dir/.adk/session.db.
Returns:
A BaseSessionService instance backed by SQLite.
"""
if per_agent:
logger.info(
"Using per-agent session storage rooted at %s",
base_dir,
)
return PerAgentDatabaseSessionService(agents_root=base_dir)
return create_local_database_session_service(base_dir=base_dir)
def create_local_artifact_service(
*, base_dir: Path | str
) -> BaseArtifactService:
+3 -4
View File
@@ -23,6 +23,7 @@ from ...memory.base_memory_service import BaseMemoryService
from ...sessions.base_session_service import BaseSessionService
from ..service_registry import get_service_registry
from .local_storage import create_local_artifact_service
from .local_storage import create_local_session_service
logger = logging.getLogger("google_adk." + __name__)
@@ -62,10 +63,8 @@ def create_session_service_from_options(
)
return DatabaseSessionService(db_url=session_service_uri, **fallback_kwargs)
logger.info("Using in-memory session service")
from ...sessions.in_memory_session_service import InMemorySessionService
return InMemorySessionService()
# Default to per-agent local SQLite storage in <agents_root>/<agent>/.adk/.
return create_local_session_service(base_dir=base_path, per_agent=True)
def create_memory_service_from_options(