google / google/adk-python-community

feat(memory): add DatabaseMemoryService with SQL backend and agent scratchpad

Open
#99 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
184
Forks
76
PR merge metrics
No merged PRs in 30d

Description

## Feature Request

Add a durable, SQL-backed `DatabaseMemoryService` to `google-adk-community` as a self-hosted alternative to the volatile `InMemoryMemoryService`.

## Problem

The existing `InMemoryMemoryService` is explicitly test-only and loses all data on process restart. Developers not using Vertex AI RAG or Memory Bank have no persistent, self-hosted memory option out of the box.

Related: #46 (Add self-hosted option to manage working memory)

## Proposed Solution

A `DatabaseMemoryService` backed by SQLAlchemy async — the same ORM pattern already used by `DatabaseSessionService` in the core ADK. This enables any SQLAlchemy-compatible async database (SQLite, PostgreSQL, MySQL, MariaDB) as a memory backend.

### Components

- **`DatabaseMemoryService`** — implements `BaseMemoryService` with lazy table creation, idempotent session ingest (`add_session_to_memory`), and delta event ingestion (`add_events_to_memory`)
- **`MemorySearchBackend` ABC + `KeywordSearchBackend`** — pluggable search with LIKE/ILIKE and AND-first → OR-fallback tokenisation
- **Scratchpad subsystem** — KV store + append-only log exposed as four `BaseTool` subclasses (`ScratchpadGetTool`, `ScratchpadSetTool`, `ScratchpadAppendLogTool`, `ScratchpadGetLogTool`) for agent intermediate working memory

### Usage

```python
from google.adk_community.memory import DatabaseMemoryService
from google.adk_community.tools import scratchpad_get_tool, scratchpad_set_tool

# SQLite (zero config)
memory_service = DatabaseMemoryService("sqlite+aiosqlite:///agent_memory.db")

# PostgreSQL
memory_service = DatabaseMemoryService(
"postgresql+asyncpg://user:pass@host/dbname"
)
```

## Origin

This was originally submitted to `google/adk-python` ([#4736](https://github.com/google/adk-python/pull/4736)) and redirected here by maintainer [@rohityan](https://github.com/google/adk-python/pull/4736#issuecomment-2701940819).

## Implementation

PR: #98

Contributor guide

Open the contributing guide

Research direction

Start by reading the existing BaseMemoryService and the DatabaseSessionService pattern in core ADK. Review PR #98 and the requirements for SQL-backed memory, pluggable search, idempotent ingestion, and the four scratchpad tools. Done means the proposed services and tools work across the stated SQLAlchemy async backends with durable memory behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
python, sqlalchemy
Domain
backend, database
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.