Skip to content

fix(cli): retain sessions for SQLite memory URIs - #7406

Open
jabrailkhalil wants to merge 1 commit into
google:mainfrom
jabrailkhalil:fix/sqlite-memory-session-uri
Open

jabrailkhalil wants to merge 1 commit into
google:mainfrom
jabrailkhalil:fix/sqlite-memory-session-uri

Conversation

@jabrailkhalil

Copy link
Copy Markdown

Link to Issue or Description of Change

Closes: #7405.

Using sqlite:///:memory: or sqlite:/// as the session service URI creates a session, then fails on the next read or append with sqlite3.OperationalError: no such table: sessions. The registry selects SqliteSessionService, whose per-operation connections discard a temporary database when each operation finishes.

I route an empty database path and :memory: through the existing in-memory session factory after normalizing the URI path. File-backed SQLite paths and the separate SQLAlchemy factory retain their existing behavior. I added real-service regression tests for all three temporary URI forms and a file-backed control that reloads state and an event through a new service instance.

Testing Plan

Unit tests

  • I added regression tests and ran the existing unit tests.
  • Before the fix: 2 failed, 2 passed, 21 deselected. The two failures reproduce the missing-table error; sqlite:// and the file-backed control pass.
  • Final registry suite: 25 passed on each of Python 3.10–3.14.
  • Full tox unit suites pass on all five versions:
Python Passed Skipped Xfailed Xpassed
3.10 17,413 88 25 2
3.11 17,422 87 25 2
3.12 17,413 88 25 2
3.13 17,413 88 25 2
3.14 17,413 88 25 2

I ran tox run-parallel -p 2 --parallel-no-spinner -x 'testenv.commands=pytest tests/unittests -n 4'. The initial Python 3.10 run hit the existing LiveKit test's one-second timeout; a complete retry with tox run -e py310 -x 'testenv.commands=pytest tests/unittests -n 2' passed. A focused run against the baseline also passed, so I have not reproduced a baseline flake.

  • pre-commit run --files src/google/adk/cli/service_registry.py tests/unittests/cli/test_service_registry.py and git diff --check pass.

Manual End-to-End (E2E) tests

I built the wheel with uv build, installed it into a clean virtual environment with uv pip install --python /tmp/adk-wheel-env/bin/python dist/google_adk-2.11.0-py3-none-any.whl 'sqlalchemy[asyncio]', and ran an offline model through the real CLI factory and Runner from the installed package. Each URI completes two turns, retains both user messages, and deletes the session successfully. The SQLAlchemy URI serves as an unchanged control. No external model calls or credentials are needed.

sqlite:///:memory: -> InMemorySessionService -> PASS
sqlite:/// -> InMemorySessionService -> PASS
sqlite:// -> InMemorySessionService -> PASS
sqlite+aiosqlite:///:memory: -> DatabaseSessionService -> PASS
Each case: Seen 1 user turns; Seen 2 user turns; deletion verified.

The standalone E2E harness, reproduction commands and installed-wheel log are available for review.

Checklist

  • I read CONTRIBUTING and reviewed the patch.
  • I added regression tests and ran the unit suites.
  • I manually tested the fix end-to-end from an installed wheel.

The documentation companion is google/adk-docs#2328. I am keeping it in draft until this fix lands and its supporting release is confirmed; there is no downstream dependency needed to land the code fix.

Route temporary SQLite session URI aliases through the existing in-memory
factory. Per-operation SQLite connections otherwise discard the database
after creating a session.

Add real-service regressions for session state and events, plus a file-backed
reopening control.

Closes google#7405
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SQLite memory session URIs lose their database after creating a session

2 participants