This document explains the different service implementations and their purposes in the PgVector ADK Memory Service.
Purpose: Raw pgvector implementation with all database logic
class PgVectorMemoryService:
"""Core implementation with direct database operations"""
async def add_memories_from_session(self, session) -> None:
# Extracts and stores memories from session
async def search_memory(self, app_name: str, user_id: str, query: str) -> SearchMemoryResponse:
# Performs vector similarity search
async def health_check(self) -> Dict[str, Any]:
# Database health monitoringKey Features:
- Direct PostgreSQL + pgvector operations
- Embedding generation and text chunking
- Database connection pooling
- Memory extraction from sessions
- Vector similarity search
Purpose: ADK-compatible interface wrapper
class PgVectorADKMemoryService:
"""Wrapper that provides ADK-compatible interface"""
def __init__(self, config):
self._pgvector_service = PgVectorMemoryService(config) # Wraps core service
async def add_session_to_memory(self, session) -> None:
# ADK interface method - calls core service
await self._pgvector_service.add_memories_from_session(session)
async def search_memory(self, app_name: str, user_id: str, query: str) -> SearchMemoryResponse:
# ADK interface method - calls core service
return await self._pgvector_service.search_memory(app_name, user_id, query)Key Features:
- Provides ADK-compatible interface
- Wraps core service functionality
- Error handling and logging
- Auto-initialization
Purpose: Direct extension of Google ADK's BaseMemoryService
try:
from google.adk.memory.base_memory_service import BaseMemoryService
class PgVectorADKMemoryService(BaseMemoryService): # ✅ Direct extension!
"""Direct extension of Google ADK's BaseMemoryService"""
def __init__(self, config):
super().__init__() # Call parent constructor
self._pgvector_service = PgVectorMemoryService(config)
async def add_session_to_memory(self, session) -> None:
# Implements BaseMemoryService abstract method
await self._pgvector_service.add_memories_from_session(session)
async def search_memory(self, app_name: str, user_id: str, query: str) -> SearchMemoryResponse:
# Implements BaseMemoryService abstract method
return await self._pgvector_service.search_memory(app_name, user_id, query)
except ImportError:
# Fallback to wrapper if Google ADK not available
class PgVectorADKMemoryService(PgVectorBaseMemoryService):
passKey Features:
- Directly extends
BaseMemoryServicewhen Google ADK is available - Implements all required abstract methods
- Follows exact same pattern as Google's Vertex AI service
- Graceful fallback when Google ADK is not available
┌─────────────────────────────────────────────────────────────┐
│ User Application │
└─────────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ PgVectorADKMemoryService │
│ (adk_base_service.py - extends BaseMemoryService) │
└─────────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ PgVectorMemoryService │
│ (service.py) │
└─────────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ PostgreSQL + pgvector │
│ Database │
└─────────────────────────────────────────────────────────────┘
from pgvector_adk_memory import PgVectorADKMemoryService
# This automatically extends BaseMemoryService if Google ADK is available
service = PgVectorADKMemoryService(config)
await service.add_session_to_memory(session)
results = await service.search_memory("app", "user", "query")from google.adk.memory.base_memory_service import BaseMemoryService
from pgvector_adk_memory import PgVectorADKMemoryService
class MyCustomMemoryService(BaseMemoryService):
def __init__(self):
self._pgvector_service = PgVectorADKMemoryService()
async def add_session_to_memory(self, session):
await self._pgvector_service.add_session_to_memory(session)
async def search_memory(self, app_name: str, user_id: str, query: str):
return await self._pgvector_service.search_memory(app_name, user_id, query)from pgvector_adk_memory import PgVectorMemoryService
# Use core service directly for custom implementations
service = PgVectorMemoryService(config)
await service.add_memories_from_session(session)
results = await service.search_memory("app", "user", "query")| Aspect | service.py |
adk_service.py |
adk_base_service.py |
|---|---|---|---|
| Purpose | Core implementation | ADK wrapper | Direct ADK extension |
| Extends | Nothing | Nothing | BaseMemoryService |
| Dependencies | PostgreSQL, pgvector | Core service | Core service + Google ADK |
| Interface | Raw methods | ADK-compatible | ADK-compatible |
| Error Handling | Basic | Enhanced | Enhanced |
| Auto-init | Manual | Yes | Yes |
| Google ADK | Independent | Independent | Direct extension |
- Core Service: Handles all database and vector operations
- ADK Wrapper: Provides ADK-compatible interface
- Base Extension: Direct Google ADK integration
- Can use core service independently
- Can use ADK wrapper without Google ADK
- Can use direct extension with full Google ADK integration
- Core service has minimal dependencies
- ADK integration is optional
- Graceful fallbacks when dependencies are missing
- Follows Google ADK patterns exactly
- Comprehensive error handling
- Proper resource management
- Extensive testing
Use PgVectorADKMemoryService from adk_base_service.py - it provides the best of all worlds:
- ✅ Directly extends
BaseMemoryServicewhen Google ADK is available - ✅ Graceful fallback when Google ADK is not available
- ✅ Same interface regardless of availability
- ✅ Follows Google's official patterns exactly