This sample demonstrates how to use OpenMemory as a self-hosted memory backend for ADK agents.
- Python 3.9+ (Python 3.11+ recommended)
- Docker (for running OpenMemory)
- ADK installed with dependencies
Start OpenMemory using Docker:
docker run -p 3000:3000 cavira/openmemoryOr use the production network build:
docker run -p 3000:3000 cavira/openmemory:productionVerify it's running:
curl http://localhost:3000/healthInstall ADK with OpenMemory support:
pip install google-adk[openmemory]This installs httpx for making HTTP requests to the OpenMemory API.
Create a .env file in this directory (optional):
# Required: Google API key for the agent
GOOGLE_API_KEY=your-google-api-key
# Optional: OpenMemory base URL (defaults to localhost:3000)
OPENMEMORY_BASE_URL=http://localhost:3000
# Optional: API key if your OpenMemory instance requires authentication
# OPENMEMORY_API_KEY=your-api-keyNote: API key is only needed if your OpenMemory server is configured with authentication.
from google.adk.memory import OpenMemoryService
from google.adk.runners import Runner
# Create OpenMemory service with defaults
memory_service = OpenMemoryService(
base_url="http://localhost:3000"
)
# Use with runner
runner = Runner(
app_name="my_app",
agent=my_agent,
memory_service=memory_service
)from google.adk.memory import OpenMemoryService, OpenMemoryServiceConfig
# Custom configuration
config = OpenMemoryServiceConfig(
search_top_k=20, # Retrieve more memories per query
timeout=10.0, # Faster timeout for production
user_content_salience=0.9, # Higher importance for user messages
model_content_salience=0.75, # Medium importance for model responses
enable_metadata_tags=True # Use tags for filtering
)
memory_service = OpenMemoryService(
base_url="http://localhost:3000",
api_key="your-api-key",
config=config
)cd contributing/samples/open_memory
python main.py----Session to create memory: <session-id> ----------------------
** User says: {'role': 'user', 'parts': [{'text': 'Hi'}]}
** model: Hello! How can I help you today?
...
Saving session to memory service...
-------------------------------------------------------------------
----Session to use memory: <session-id> ----------------------
** User says: {'role': 'user', 'parts': [{'text': 'What do I like to do?'}]}
** model: You like badminton.
...
-------------------------------------------------------------------
search_top_k(int, default: 10): Maximum memories to retrieve per searchtimeout(float, default: 30.0): HTTP request timeout in secondsuser_content_salience(float, default: 0.8): Importance for user messagesmodel_content_salience(float, default: 0.7): Importance for model responsesdefault_salience(float, default: 0.6): Fallback importance valueenable_metadata_tags(bool, default: True): Include session/app tags
OpenMemory provides:
- Multi-sector embeddings: Factual, emotional, temporal, relational memory
- Graceful decay curves: Automatic reinforcement keeps relevant context sharp
- Self-hosted: Full data ownership, no vendor lock-in
- High performance: 2-3× faster than hosted alternatives
- Cost-effective: 6-10× cheaper than SaaS memory APIs